技术 · 熟练

上下文装不下,是因为你什么都往里装

指针进窗口,正文留在外面
上下文不是仓库,是工作台。工具一返回两万字日志,你就把两万字全摊在台上 —— 后面每一步都在为这堆东西重新付注意力、重新付钱。这一页给的是外置法:正文留在外面,窗口里只放一个能点回去的句柄。四种动作各治一种膨胀(外置 · 选择 · 压缩 · 隔离),再加一条最常被忽略的反向结论 —— 有些东西必须留在原地不动,挪了反而更贵。
方法 · 一图看懂
1
外置 — 大块内容存到文件或存储里,窗口只留 id / 路径 / 一句摘要
2
可逆 — 隐藏必须能恢复:占位行写「哪个 id · 约多少 token · 已隐藏」,随时可唤回
3
选择 — 按当步只取相关切片,不把整份结果递上去
4
压缩 — 旧历史摘要,最近几轮逐字保留;摘要复用父会话缓存
5
隔离 — 多 agent 各看各的,只交换句柄,不交换全文
原理 · 为什么有效
膨胀不是容量问题,是「每一步都在为同一堆死重量付费」。窗口里的每个 token 会跟着每一次循环重新参与注意力竞争、重新计费 —— 一次预加载五万 token,跑三十步就被读了三十遍。更麻烦的是注意力分布:越靠中段越容易被忽略,而你的关键约束往往正好在中段。
外置把「内容」和「引用」拆开:引用便宜、可寻址、永远指向最新;内容贵、占位、只在需要那一瞬进来。可逆是外置的保险丝 —— 不可逆的截断会让 agent 在自己「记得」的事情上出错,而它并不知道该回头重新取一次。
反向结论同样重要:稳定前缀(核心指令 · 必需工具 · 输出格式)应当预加载并保持字节稳定,因为上下文缓存让它几乎免费,而每轮改一个字都会让整段缓存失效。所以判据不是「越少越好」,而是「这一步会不会用到」:每步都用 ⇒ 留在原地别动;不一定用到 ⇒ 外置加句柄。
适用场景
适用:agent 跑到十几步就开始答非所问 · 工具一返回长日志后面全崩 · 账单随轮数线性上涨 · 多 agent 互相把对方的输出当噪声的人。
⛔ 不适用:单轮问答与短任务 —— 那点量直接给,外置的取回成本反而更高。
⚠️ 前提:你的工具层能返回「句柄 + 摘要」而不是只能返回全文;做不到就先从压缩一层开始。
自测 · 5 问
我最近一次「它答非所问」,是上下文太长,还是指令本身没说清?
我的窗口里,有多少内容是这一步根本用不到的?
隐藏掉的那段,我还能取回来吗?取回的方式写在哪?
最近五轮的工具输出,是不是全部原样留在窗口里?
每轮都在改的那段开头(角色、语气),是不是让缓存一直失效?
怎么上手 · 验证步骤
先只做一层,别一次上四种。挑一个「工具返回内容最长」的环节做外置:让它把结果写到文件或存储,返回一句「已存到某处 · 约多少字 · 需要时用哪个入口按段读取」。
然后跑三个真实任务,看两件事 —— ① 它在该用细节时会不会主动去取(不会 ⇒ 把「需要细节时先取再答」写进指令)② 账单与轮数有没有降(没降 ⇒ 你外置的其实是它每步都要用的东西,挪错了)。
最后再检查稳定前缀:把角色、输出格式、必需工具清单放在最前面,之后整轮一个字都别改 —— 这一段是唯一应当「一直躺在窗口里」的东西。
自检动作:随便找一轮对话,把窗口内容分成三堆 —— 这一步用到的 · 可能用到的 · 这一步肯定用不到的。第三堆超过一半,说明你还在把它们全摊在台上;第三堆为空,说明你已经在按步取用了。
[C级]The Next Gen Tech Insider《New DTOC Framework Prevents Context Rot in LLM Agents》(可逆占位 · 输入 token −10.3% / −12.7% · 解出率 1.5~2.5x · 消融显示可逆是关键) [C级]TrueFoundry《JIT Context: Why the Best Agents Load Late and Load Little》(四类策略与「稳定前缀必须字节稳定」的反向结论) [C级]AgentPatterns《Context Compression Strategies: Offloading and Summarization》(分层压缩 · 缓存断点 · 只留最近 5 对工具调用完成率 91.6% 对全量 71%) [C级]SkillByAI《Offloading to Files and Memory》(工具返回「路径 + 一句摘要 + 读取入口」而不是正文) 同类:上下文不是越摘越短,是越养越准 · 塞得越多,AI 反而越糊涂? · 压缩完那一段摘要,你得回头查三样东西
继续往下读
同级:塞得越多,AI 反而越糊涂? 随机一篇