「上下文腐烂」排错手册:Agent 越到后面越笨,到底怎么救
长任务跑到一半,Agent 开始忘指令、重复动作、忽略约束——这就是 Context Rot(上下文腐烂)。本文给出症状识别、根因分析和四种可落地的修复策略。
有没有遇到过这种场景:Agent 前 20 步表现完美,跑到第 30 步突然忘了最初的核心约束,开始兜圈子、重复同一个动作、引用过时信息。这不是模型”变笨了”,而是 Context Rot(上下文腐烂)——长任务里上下文窗口被逐渐污染,有效信息被淹没。本文教你识别和修复。
症状清单:怎么判断是上下文腐烂
- Agent 越来越频繁地忽略系统提示里的硬约束(格式、边界、禁止事项)。
- 重复执行已经做过的步骤,或忘记某步已完成。
- 引用已经失效的中间结论(比如用户早已改了需求,它还在按旧需求干)。
- 越到后期,响应质量越差,但用同样的 prompt 单独问它某个子问题,它答得很好。
最后一条是诊断关键:单点能力没问题,只是”在长上下文里”能力退化。
根因:注意力被稀释 + 信息冲突
两个机制在同时发生:
- 注意力稀释:上下文越长,模型对任何单条信息的注意力权重越低。关键指令混在几万 token 的日志里,被淹没。
- 信息冲突:随着任务推进,上下文中同时存在”旧版本”和”新版本”的信息(旧需求、旧计划、失败的尝试)。模型无法可靠区分哪个是当前有效的。
修复策略一:摘要压缩(滚雪球)
不要无脑保留全部历史。每隔 N 轮,把历史摘要成结构化状态:
- 当前目标
- 已达成的里程碑
- 当前进行中的步骤
- 有效约束(关键!)
- 已排除的方案
摘要后用它替换原始历史,上下文保持在可控长度。关键是摘要里必须钉死”有效约束”,防止约束被稀释掉。
修复策略二:状态外置(把记忆搬出上下文)
别把所有中间状态都塞进对话。维护一个外部状态对象(JSON/数据库),每步结束后更新它。下一轮只把”当前状态快照 + 本次任务”喂给模型。
这相当于让 Agent 有”工作台账”,而不是靠回忆。长任务里这招最有效。
修复策略三:重新注入关键约束
最有效也最简单:在每 N 轮,或关键步骤前,把核心约束重新贴一遍。比如做代码生成的 Agent,每次生成前重申”必须用 X 库、不得引入新依赖”。
别怕重复——在长上下文里,重复是必要的信息保鲜手段。
修复策略四:任务分段
把长任务拆成多个独立子任务,每个子任务开一个干净的上下文,只带入”必要的输入 + 明确的输出要求”。子任务之间通过结构化产物(文件、JSON)交接,而不是靠对话记忆。
这是”技能化架构”在任务层面的延伸,前面讲过的拆解逻辑在这里同样适用。
一个诊断工具:给上下文”减脂”实验
如果你怀疑是上下文腐烂,做个实验:把同样的任务、同样的第 30 步状态,用精简过的上下文(只留关键约束和当前状态)喂给模型。如果它一下恢复了正常,那确诊无误。
预防优于治疗
- 设计 Agent 时就把”上下文预算”当一等公民:系统提示 + 工具 schema 有多少,历史能留多少。
- 优先用结构化状态而非自然语言历史。
- 长任务一定要有摘要/外置机制,别指望模型全程好记性。
小结
Agent”越跑越笨”不是玄学,是上下文腐烂。诊断靠”单点测试”对比,修复靠四招:摘要压缩、状态外置、约束重注入、任务分段。把上下文当有限资源去管理,长任务才跑得稳。