上下文是怎么一步步变脏的
Agent 跑偏很少是模型突然变笨,而是上下文里噪音占比随步骤累积;先诊断上下文质量,再考虑换更大的模型。
Agent 跑偏,很少是模型突然变笨。绝大多数情况是上下文里噪音的占比随步骤累积:第 3 步还很干净,第 8 步已经埋住了,第 15 步基本不可用。所以劣化一出现,先诊断上下文质量,再考虑换更大的模型——顺序反了,你会花两周买一个零收益的结论。
先量噪音,再换模型
阿里千问平台的演进里有一组很难辩驳的对照:同一个 Skill,3 步质量很好、8 步明显下降、15 步几乎不可用,换更大参数的模型没有任何改善。团队后来花两周评估更大的模型,指标没动;做一周上下文管理,指标提升 40%。qwen-harness
这句话值得贴在墙上:不要用更大的模型掩盖工程层面的问题。 模型能力是乘数,上下文质量是被乘数,被乘数趋近于零时换乘数没有意义。
诊断动作很机械:把每一步的 prompt dump 出来,按来源统计 token,算出"当前步骤真正用得上的内容"占比。算完再决定动什么。
注意力稀释 70/20/10
逐步骤 dump 之后看到的真相很有冲击力:到第 8 步时,上下文里 70% 是前几步工具调用的原始 JSON、20% 是历史对话、只有 10% 是当前步骤真正有用的指令。物理容量 128K 不等于有效容量——塞满 70% 噪音的 128K,不如精心管理的 32K。qwen-harness
更麻烦的是它会自我恶化:膨胀 → 稀释 → 参数错误率上升 → 更多重试消息 → 进一步膨胀。每一步都在给下一步加噪音,所以劣化曲线是加速的,不是线性的。你在第 5 步看不出问题,第 10 步就已经救不回来了。
还有一层位置效应:注意力对上下文位置并不均匀,首尾强、中段弱。规则文件注入时在最前面,随着会话增长逐渐"沉"进中段,效力就衰减了,长会话尾段会重现早先已经纠正过的风格违规。
压缩策略的实测差距
同一个任务——追踪几位联合创始人的职业去向——需要多轮搜索,单次返回从几千到十几万字符不等。实验一共做了六档压缩策略,把一个原生百万级窗口的模型刻意压到 128K 预算,下表取其中四档,差距已经是数量级的 ai-agent-book:
| 策略 | 压缩率 | 迭代 | 总 token | 结果 |
|---|---|---|---|---|
| 不压缩 | — | 5 | 累计约 165,000 | 超窗口触发溢出保护,任务失败 |
| 逐条独立摘要 | 10.9% | 12 | 276,608 | 完成,但同一事件被多页重复描述 |
| 合并成一份摘要 | 4.3% | 10 | 93,449 | 完成,输入超长时必须截断末尾 |
| 上下文感知压缩 | 3.0% | 7 | 40,157 | 完成,姓名与职位变动等关键事实仍在 |
压缩率指"压缩后 / 压缩前",数值越小压得越狠。所以拉开差距的不是狠,是压缩时有没有把"当前在找什么"一起喂进去。逐条摘要只看得见眼前那一段,只能对称地压每一段;上下文感知版在压缩提示里带上当前查询意图和已积累的信息,于是总 token 从 276,608 掉到 40,157,迭代从 12 次掉到 7 次。
这张表还顺带纠正两处误解。一是压缩的动机不止"控制长度",还有提升思考质量与缓解上下文焦虑,控长度只是最表层那个。二是"装不下"和"装得下但找不到"是两种故障:前者由溢出保护直接判失败,当场暴露;后者不报错,只让参数错误率一点点往上爬。
上下文腐坏:纠正过的错误还在
被 agent 自行纠正的工具错误,仍然留在上下文里持续干扰后续决策。Cursor 把这种现象叫"上下文腐坏":工具是 agent 最容易出缺陷的界面,累积的错误会降低后续决策质量,有时让 agent 卡住,有时让它完全失控。cursor-agent-harness
有效做法是把错误按成因分类:InvalidArguments 和 UnexpectedEnvironment 是模型出错,ProviderError 是工具方服务中断,UserAborted 和 Timeout 是环境问题。然后按"每个工具 × 每个模型"分别算基线,做异常检测——未知错误率超阈值就告警。用全局基线会漏,因为不同工具、不同模型的正常错误率本来就不在一个量级。一次集中冲刺,他们把意外工具错误降低了一个数量级。
上下文焦虑:compaction 救不了
Claude Sonnet 4.5 在长任务里有个行为:上下文窗口快满时会提前收尾,草率结束工作,即使任务根本没做完。这叫"上下文焦虑"——模型感知到上下文将满,倾向于主动 wrap up 而不是继续推进。anthropic-long-running
关键判断是:compaction 不解决这个问题。就地压缩历史只是把噪音压得更密,没有给模型一个干净的开始,焦虑仍在。真正有效的是 context reset——完全清空上下文启动新 agent,用结构化的交接产物把上一个 agent 的状态和下一步任务传过去。
但这里有个反例值得记住:Opus 4.5 自身消除了这个行为,reset 反而变成纯粹的负担。harness 里编码的假设会随模型升级而过时,你得定期回头质疑当初为什么加这段逻辑。
代价与检查
这套诊断的代价是观测基础设施:按来源统计 token 的能力、错误分类与基线、分步骤的 prompt dump。短任务不值得建。
三个问题能快速定位:你的 agent 在第 10 步的上下文里,当前步骤用得上的内容占比是多少;同一个工具在同一个模型上的错误率有没有基线;任务收尾时,是模型判断做完了,还是它怕窗口不够。
