AGENTS · LLM · AI · PROMPTING · CONTEXT MANAGEMENT

长上下文如何失效

How Long Contexts Fail
管理好你的上下文,是 Agent 成功的关键
Managing Your Context is the Key to Successful Agents
✍️ Drew Breunig 📅 2025 年 6 月 22 日 🌐 dbreunig.com 🈶 中文整理 + 概念展开
🎈

百万 token 的迷思

The 1M-token dream

先看作者要挑战的那个流行假设:「上下文窗口越大,agent 就越强」。

随着前沿模型的上下文窗口持续增长1——许多模型已支持高达 100 万 token——作者看到许多兴奋的讨论:长上下文窗口将解锁人们「梦想中的 agent」。毕竟,只要窗口足够大,你就可以把可能用到的一切——工具、文档、指令等等——统统扔进 prompt,剩下的交给模型处理。

长上下文曾经带来了三波情绪:

⚠️ 但现实是:更长的上下文并不会产生更好的回复。过载的上下文会让你的 agent 和应用以出人意料的方式失败。上下文会中毒(poisoned)、会分心(distracting)、会混淆(confusing)、会冲突(conflicting)。这对 agent 来说尤其致命——因为 agent 正是依赖上下文来收集信息、综合发现、协调行动的。

接下来,文章会逐一过一遍上下文「失控」的各种方式,然后(在后续文章中)回顾缓解或彻底避免这些失效的方法。

100 万 token 窗口 工具+文档+指令全塞进去 期待 解锁「梦想中的 agent」 现实 以出人意料的方式失败 ☠️ 中毒 🌀 分心 🧩 混淆 ⚔️ 冲突
图 1 · 全文主线:「把一切塞进百万 token 窗口」的期待,与四种上下文失效的现实

🔑 读前速查:文中反复出现的术语(整理者增补)

术语一句话解释
token模型处理文本的最小单位,约等于一个词或半个词;「100 万 token」大致相当于几十万到上百万字的容量。
上下文窗口模型一次能「看到」的全部输入(指令、对话历史、文档、工具定义等)的最大长度上限。
上下文(context)实际填进窗口里的那些内容本身。本文讨论的正是这些内容如何反过来伤害模型表现。
RAG检索增强生成:先从知识库里检索最相关的片段,只把这些片段放进 prompt,而非塞入全部资料。
MCPModel Context Protocol,让模型接入外部工具/服务的协议;接得越多,prompt 里的工具定义就越多。
agent(智能体)能多步调用工具、自主收集信息并连续决策的 LLM 应用形态,区别于一问一答的聊天。
幻觉(hallucination)模型编造出的、与事实或真实状态不符的内容。
量化(quantized)压缩模型权重精度以省内存/加速的手段,通常伴随一定的能力损失。
🗺️

四种失效模式总览

Context Fails

原文用四个一句话定义开篇立骨,后文逐一展开。

上下文失效 Context Fails ☠️ 中毒 幻觉写进上下文 并被反复引用 🌀 分心 过度盯着长历史 忽略训练所学 🧩 混淆 无关内容掺入 拉低回复质量 ⚔️ 冲突 上下文内部信息 彼此矛盾打架
图 2 · 四种失效模式:同一个根源(上下文过载)长出的四种病
💬 没看懂四者区别?点这里换种说法
可以这样区分(整理者的辅助转述):中毒是「里面有假的」——一条错误信息进来了还被当真;分心是「里面太多了」——都是真的,但多到模型只顾翻旧账、忘了自己本来会什么;混淆是「里面有没用的」——无关的工具和信息干扰了判断;冲突是「里面互相打架」——两段都在上下文里,却说法相反。
☠️

上下文中毒

Context Poisoning

一条幻觉混进上下文,就像水源被污染:下游每一步决策都在喝这口水。

是什么
上下文中毒指:一个幻觉或其他错误进入了上下文,并在其中被反复引用
为什么危险
agent 的很多决策依据(目标、任务摘要、状态记录)本身就存放在上下文里。一旦这些「决策依据」被错误信息污染,后续每一步推理都建立在错误地基上,而且错误会随着被引用而不断自我强化,往往要很久才能消除
原文例子
DeepMind 团队在 Gemini 2.5 技术报告中点名了这一问题(作者上一周刚拆解过这份报告)。在玩宝可梦(Pokémon)游戏时,Gemini agent 偶尔会产生幻觉,从而毒化自己的上下文。

「这一问题有个尤为严重的表现形式,就是『上下文中毒』——上下文的许多部分(目标、摘要)被关于游戏状态的错误信息『毒化』,而这往往需要非常长的时间才能消除。结果是,模型可能会固执地追求那些不可能实现或无关紧要的目标。」

"An especially egregious form of this issue can take place with 'context poisoning' – where many parts of the context (goals, summary) are 'poisoned' with misinformation about the game state, which can often take a very long time to undo. As a result, the model can become fixated on achieving impossible or irrelevant goals."

—— Gemini 2.5 技术报告(DeepMind)

如果上下文中的「目标」部分被毒化了,agent 就会发展出毫无意义的策略,并且为了追求一个根本无法达成的目标而反复重复同样的行为。

😵 模型产生幻觉 对游戏状态的错误认知 📝 写入上下文 污染「目标」「摘要」区 🔁 每步决策反复引用 错误被当作可信前提 🎯 固守不可能的目标 策略离谱、行为重复 ↺ 很长时间难以消除
图 3 · 中毒的恶性循环:幻觉 → 写入上下文 → 被反复引用 → 目标固化,难以自愈
🔗 类比
上下文中毒就像导航软件里存错了目的地坐标:之后每一次「重新规划路线」都规划得头头是道,却全都通向那个错误的地点。问题不在每一步的推理,而在被污染的那条「既定事实」——不把它本身清除,走多少步都是白走。
※ 此类比为整理者增补,用于辅助理解,非原文内容。
🌀

上下文分心

Context Distraction

这次上下文里没有假信息——只是太长了,长到模型只顾「翻旧账」,忘了动用自己训练时学到的本事。

是什么
上下文分心指:上下文长到一定程度后,模型过度聚焦于上下文本身,而忽视了它在训练中学到的知识。
为什么会发生
在 agent 式工作流中,模型不断收集信息、积累历史,上下文随之膨胀。这些累积起来的上下文非但没有帮助,反而成了干扰源——模型把注意力都花在「历史里做过什么」上,而不是「我(靠训练)知道该怎么做」。
原文例子
还是那个玩宝可梦的 Gemini agent,它清楚地展示了这个问题(见下方引述)。

「虽然 Gemini 2.5 Pro 支持 100 万+ token 的上下文,但如何让 agent 有效利用它,是一个新的研究前沿。在这个 agent 设置中我们观察到:当上下文显著超过 10 万 token 时,agent 会表现出一种倾向——偏爱重复其庞大历史中的既有动作,而不是综合出新的计划。这一现象虽属轶事性质,但它凸显了一个重要区别:用于检索的长上下文,和用于多步、生成式推理的长上下文,是两回事。」

"While Gemini 2.5 Pro supports 1M+ token context, making effective use of it for agents presents a new research frontier. In this agentic setup, it was observed that as the context grew significantly beyond 100k tokens, the agent showed a tendency toward favoring repeating actions from its vast history rather than synthesizing novel plans. This phenomenon, albeit anecdotal, highlights an important distinction between long-context for retrieval and long-context for multi-step, generative reasoning."

—— Gemini 2.5 技术报告(DeepMind)

也就是说:agent 没有运用训练所得去制定新策略,而是固着于重复自己冗长历史中的过往动作

对于更小的模型,这个分心天花板(distraction ceiling)要低得多:Databricks 的一项研究发现,Llama 3.1 405b 的正确率大约从 32k token 开始下滑,更小的模型则更早。

100k+
Gemini 2.5 Pro 超过此规模后
开始重复历史动作
32k
Llama 3.1 405b 正确率
开始下滑的位置(Databricks)
更早
更小的模型,分心天花板
来得更低
上下文长度 → 分心天花板(因模型而异:32k / 100k+…) 阈值之下 调用训练所学 综合出新计划 🧠 阈值之上 过度依赖上下文 重复历史动作 🔁
图 4 · 分心天花板:越过阈值后,模型从「用训练知识规划」滑向「照抄历史动作」
🤔 那超大上下文窗口还有什么用?原文自问自答:如果模型早在窗口填满之前就开始失常,超大窗口的意义何在?一言以蔽之——摘要(summarization)3事实检索(fact retrieval)。如果你做的不是这两件事,就要当心你所选模型的分心天花板
💬 换个说法讲一遍「分心」
可以这样理解(整理者的辅助转述):模型有两个知识来源——「肚子里的本事」(训练参数)和「眼前的笔记」(上下文)。笔记短的时候,它边看笔记边用本事;笔记厚到几百页后,它的注意力全耗在翻笔记上,行为退化成「上次遇到类似情况我抄了哪一页」,而不是真正思考。检索和摘要之所以不受影响,是因为这两类任务本来就只需要「翻笔记」,不需要「想新招」。
🧩

上下文混淆

Context Confusion

工具接得越多越好?排行榜数据给出了相反的答案:塞进上下文的每一样东西,模型都「必须」理会。

是什么
上下文混淆指:上下文中多余的内容被模型拿去使用,从而生成了低质量的回复。
为什么会发生
核心机制一句话:只要你把某样东西放进上下文,模型就必须关注它。哪怕是无关信息、用不上的工具定义,模型也会把它纳入考量。
原文例子
工具太多的 MCP 场景:量化版 Llama 3.1 8b 面对 46 个工具直接失败,只给 19 个工具就能成功(详见下文)。

🔌 MCP 之梦,与它撞上的墙

有那么一阵子,似乎人人都要发布一个 MCP。「一个强大的模型,连上你所有的服务和数据,替你干完所有杂活」——这个梦想感觉触手可及:把所有工具描述扔进 prompt,按下开始就行。Claude 的系统提示词给大家指明了方向——它的内容大部分就是工具定义或工具使用说明。

但作者提出:即便整合与竞争没有拖慢 MCP 的脚步,上下文混淆也会。事实证明,工具真的可能「太多」。

📊 证据一:Berkeley 函数调用排行榜

Berkeley Function-Calling Leaderboard 是一个工具使用基准,评估模型有效使用工具来响应 prompt 的能力,目前已是第 3 版。排行榜显示:每一个模型,在提供多于一个工具时,表现都会变差4

此外,Berkeley 团队还「设计了所有给定函数都不相关的场景……我们期望模型的输出是:不调用任何函数」。然而,所有模型都会偶尔调用不相关的工具。而且浏览排行榜可以看到:模型越小,这个问题越严重

🔬 证据二:GeoEngine 基准上的小模型

一个惊人的上下文混淆案例来自一篇近期论文,它在 GeoEngine 基准(包含 46 个不同工具)上评估小模型表现:

❌ 给全部 46 个工具

失败

量化(压缩)后的 Llama 3.1 8b 直接答错——尽管整个上下文完全在 16k 窗口之内,长度并不是瓶颈。

✅ 只给 19 个工具

成功

同一个模型、同一个查询,只是把工具数量砍到 19 个,就能成功完成。

同一个查询 量化 Llama 3.1 8b 上下文塞入 46 个工具 (仍在 16k 窗口内) 只提供 19 个工具 其余定义不放进上下文 ✗ 失败 ✓ 成功
图 5 · GeoEngine 实验:失败的原因不是「装不下」,而是「放进去的太多」
💡 问题的本质:如果你把某样东西放进上下文,模型就必须理会它。它可能是无关信息、可能是用不上的工具定义,但模型都会把它纳入考量。大模型——尤其是推理模型——正在越来越擅长忽略或丢弃多余上下文,但我们仍不断看到无价值的信息把 agent 绊倒。更长的上下文让我们能塞进更多信息,但这种能力是有代价的
⚔️

上下文冲突

Context Clash

最棘手的一种:坏内容不是「无关」,而是与上下文里的其他信息正面相抵。

是什么
上下文冲突指:你在上下文中不断积累的新信息、新工具,与上下文中的其他信息直接矛盾
为什么更棘手
它是上下文混淆的更成问题的版本:坏上下文不是无关紧要的杂讯,而是与 prompt 中的其他信息正面冲突
原文例子
Microsoft 与 Salesforce 团队的「分片 prompt」实验:同样的信息,一次给全 vs 分多轮给,平均分数暴跌 39%(详见下文)。

🧪 Microsoft / Salesforce 的「分片」实验

一支 Microsoft 和 Salesforce 的团队在近期一篇论文中出色地记录了这一现象。团队把多个基准测试的 prompt 信息「分片」(sharded)到多条 prompt 中。用原文的类比来说:有时你会在 ChatGPT 或 Claude 里先把整段话打完、考虑周全每个必要细节,再按回车;而另一些时候,你会先发一个简单的开头,等聊天机器人的回答不满意时再补充细节。Microsoft/Salesforce 团队就把基准 prompt 改造成了后面这种多步交流的样子。

(原文配图说明:左侧单条完整 prompt 中的所有信息,都包含在右侧的若干条消息中——只是这些消息会在多轮聊天中依次给出。)

📉 结果:分片后的 prompt 产生了显著更差的结果,平均下降 39%。团队测试了一系列模型——OpenAI 备受推崇的 o3 的得分从 98.1 掉到 64.1
-39%
信息分片多轮给出后
各模型的平均分数降幅
98.1 → 64.1
OpenAI o3 在同一任务上
一次给全 vs 分片的得分
多模型
该团队测试了一系列模型
无一幸免
🧾 一次性给全部信息 完整 prompt,细节齐备再回车 💬 同样信息,分片多轮给 先简后繁,答得不满意再补细节 98.1 o3 得分 64.1 o3 得分(平均降幅 39%) 信息完全相同 只是给出的方式不同
图 6 · 分片实验:信息一字不少,只因「分多轮给」,o3 的得分从 98.1 跌到 64.1

🔍 为什么会这样?

为什么信息「分阶段收集」就比「一次性给全」表现差这么多?原文的解释是:拼装起来的上下文包含了整场对话交流,其中有模型在拿到全部信息之前对问题做出的早期作答尝试。这些不正确的答案留在上下文中,持续影响模型生成最终答案。(原文此处的用词是「答案是 Context Confusion」;整理者注:就机制而言,这正是本章「冲突」的典型来源——早期错误答案与后来补充的信息在同一个上下文里互相矛盾。)

  1. 早期轮次信息不全用户还没把细节说完,模型看到的只是问题的一部分。
  2. 模型做出假设,过早给出「最终解」论文发现 LLM 常在早期轮次做假设、并过早尝试生成最终答案。
  3. 错误答案留在上下文里这些早期尝试不会消失,它们成了后续推理的一部分。
  4. 新信息与旧答案打架细节陆续补齐后,与先前的错误假设正面冲突。
  5. 模型「迷路」,无法恢复模型过度依赖自己先前的作答,拐错弯后回不来了。

「我们发现,LLM 常常在对话早期做出假设,并过早地尝试生成最终解答,且过度依赖这些解答。更简单地说:我们发现,当 LLM 在对话中拐错了一个弯,它们就会迷路,并且无法恢复。」

"We find that LLMs often make assumptions in early turns and prematurely attempt to generate final solutions, on which they overly rely. In simpler terms, we discover that when LLMs take a wrong turn in a conversation, they get lost and do not recover."

—— Microsoft / Salesforce 论文

🚨 这对 agent 构建者不是好兆头。agent 恰恰要从文档、工具调用、以及负责子问题的其他模型那里拼装上下文。所有这些来自五花八门来源的上下文,都有可能自相矛盾。更进一步:当你接入并非自己创建的 MCP 工具时,它们的描述和指令与你 prompt 其余部分发生冲突的几率还会更大。
🤖

对 Agent 构建者的启示

Why agents get hit hardest

原文的收束:百万 token 的愿景为何恰恰在 agent 身上最先破灭。

百万 token 上下文窗口的到来,曾让人感觉具有变革意义。「把 agent 可能需要的一切都扔进 prompt」的能力,激发了对超智能助手的种种想象——能访问任何文档、连接每一个工具、保持完美记忆的助手。

但正如上文所见,更大的上下文创造了新的失效模式。原文对四种模式做了收束式总结:

🎯 为什么 agent 首当其冲?因为 agent 恰恰运行在上下文最容易膨胀的场景里:从多个来源收集信息、连续调用工具、进行多轮推理、积累大量历史——每一条都是上文四种失效的温床。
🛠️

出路:有解,见下一篇

Fortunately, there are solutions

本文只诊断病症;药方在作者的后续文章里。

✅ 好消息:这些问题有解!原文预告:在后续文章中,作者将介绍缓解乃至完全避免这些问题的技术——从动态加载工具(dynamically loading tools)的方法,到设立上下文隔离区(context quarantines)。

后续文章已发布:《How to Fix Your Context》(如何修好你的上下文)

原文末尾还附有邮件订阅入口(「留下邮箱,不定期接收更新」),此处从略。

📎

原文脚注

Footnotes
  1. [1] Gemini 2.5 和 GPT-4.1 拥有 100 万 token 的上下文窗口——大到足以把整本《无尽的玩笑》(Infinite Jest)塞进去,还绰绰有余。
  2. [2] Gemini 文档里的「Long form text」一节,很好地概括了这种乐观情绪。
  3. [3] 事实上,在上文引用的 Databricks 研究中,模型面对长上下文的一种常见失败方式是:返回对所给上下文的摘要,同时无视 prompt 中包含的任何指令。
  4. [4] 如果你去看排行榜,请留意「Live (AST)」列。这些指标使用的是由企业贡献给该项目的真实世界工具定义,「避免了数据集污染和有偏基准的缺陷」。

📌 一页记住这篇文章

「上下文窗口更大」≠「结果更好」。上下文会以四种方式反噬:中毒(假信息进来且被反复引用)、分心(太长导致只抄历史不思考)、混淆(无关内容也被纳入考量)、冲突(前后信息互相打架)。agent 因为天然要多源收集、连续调用工具、积累长历史,所以最先撞上这些墙。管好上下文——而不是塞满上下文——才是 agent 成功的关键。

➡️ 解决方案见续篇:How to Fix Your Context