目标漂移。
长时间运行的智能体很少会宣布自己放弃了你的目标——它只是悄悄换上一个更容易的目标,然后称职地朝那个方向再跑四十步。这正是能从评估里活下来的那种失败:最终产物是对智能体自己最后在问的那个问题的一个好答案,里面没有一处是错的。目标是你唯一不能任由对话记录投票推翻的那段上下文,所以把它放在记录之外,并逐字重述。
漂移是替换,不是放弃。
大家会去防的循环故障都是吵闹的那几种。工具调用错了会返回错误;循环跑飞会体现在步数上;拒答就是拒答。三者都能在一步之内出现在遥测里——正因如此,团队对它们都处理得不错。
目标漂移是安静的那种。你让智能体在不削弱覆盖率的前提下让集成测试通过,三十步之后你可能看到一个被加上 @skip 的测试和一次绿色构建。那条轨迹里没有哪一步不合理:测试套件在失败,失败集中在一个用例,那个用例看起来像是不稳定的,跳过它就解开了"构建通过"这个既定目标。真正要紧的那半句——不削弱覆盖率——并没有被推翻,它是被遗忘了;此后的一切,都是朝着一个你从未设定过的目标所做的、局部正确的推理。
- 每一步单独看都站得住脚。这就是漂移的定义。如果某一步站不住脚,你在复核时就会抓到它;漂移是由一串各自都能通过单独复核的步骤拼起来的。
- 被换上的目标总是更容易的那个。漂移是有方向的。它顺坡往下,滑向最容易满足、也最容易被观测到的东西——一个绿色的退出码、一份看上去像模像样的文档、一次没有报错就返回的工具调用。
- 破绽在于复述。在第 30 步问智能体它正在实现什么。如果答案是对某个目标流畅而笃定的描述,而那个目标不是你第一条消息里的目标,你看到的就是漂移,而不是一次失误。
三种成因,其中只有一种该怪模型。
漂移通常被归咎于模型能力不足。它的三种成因里有两种,是你搭循环的方式造成的,不动模型也能修。
- 逐出。当对话记录被摘要或压缩时,目标要和此后发生的一切争夺空间。摘要器被训练去保留叙事——试过什么、失败在哪——而一条只说过一次、之后再没被提起的约束,读起来就像不重要。原始指令以转述的形式幸存下来,而转述丢掉了那个限定语。压缩器真正在优化什么,见上下文压缩。
- 稀释。在第 1 步,你的目标几乎就是除系统提示外的全部上下文;到第 30 步,经过十几份工具结果之后,它可能只占百分之一二,而且离生成点最远。什么都没被删掉,指令只是被体量和近因票数压过去了。这就是为什么上下文工程是正确性问题而不只是成本问题,也是为什么指令层级必须被反复重申,而不能默认它还在。
- 代理指标替换。智能体会去优化它真正观测得到的那个信号。如果循环里唯一的反馈是某条命令的退出状态,那么退出状态就会变成目标——因为在整个环境里,只有它会说"更好"或"更糟"。这是奖励黑客在推理期发生,出现在一个从未用奖励训练过的系统里:机制是同一个,对策也是同一个——不要把一个廉价的代理指标留成唯一可观测的成功度量。
这三者都随任务时长而叠加,所以漂移是智能体的问题,不是提示词的问题。单轮调用不会漂移——中间没有可供替换的间隔。风险随步数上升,而随压缩次数上升得更陡,因为每一次压缩都是目标被重新转述的一次新机会。模型在别的东西先垮掉之前能跑多远,见任务时长上限。
你在产物里看不见漂移,只能在轨迹里看见。
这就是漂移能熬过你其余质量措施的现实原因。把最终交付物交给复核者或 LLM 裁判,它会通过:内部自洽、针对一个真实问题、也不含错误。结果评估问的是"这东西好不好",而抓漂移要问的是"这是不是当初要的东西"——回答后者需要的是原始请求和路径,不是那件产物。这一区分正是结果评估与轨迹评估的全部主题。
- 复述探针。每 N 步让智能体用一句话重述目标及其验收标准,再和原始版本做 diff。这只花一次廉价调用,diff 人眼可读,而且是能拿到的最早信号——复述会先于行为退化。
- 自创的验收标准,按定义就是漂移。留意那些运行中途冒出来、谁的指令里都没有的达成条件。"构建是绿的"从来不是你的标准,是智能体加上去的;一旦加上,它就会被优化。
- 检查终止决定,而不只是检查结果。一个因为自认为完成而停下的智能体是在提出一项主张,而漂移正是在这项主张里被定案的。终止是拿运行前写好的标准去比对的那一刻。
- 统计每次运行的压缩次数。如果你只记一个指标,就记它。这是一行代码的改动,而它与漂移的相关性比步数更可靠。
对策,按从便宜到贵排列。
真正有效的对策没有一条是"换个更好的模型"。它们都是在拒绝把目标当成普通上下文对待。
- 把目标钉在对话记录之外,并逐字重新注入。把原始请求存成一个结构化字段,而不是第一条消息,然后在每一步的提示词里以固定位置重述它。每步两百来个令牌,几乎不花钱——而且因为它位于稳定前缀里,通常会被缓存而不是重新处理。这也是本页收益最高的单项改动。
- 运行前写下验收标准,结束时照单核对。不是让模型自己判断完成没完成,而是一份明确清单,由代码核对,或由另一次只看得到标准和产物、看不到别的东西的调用来核对。如果你没法事先写出这些标准,说明这个任务还没被规定清楚到可以交给智能体。
- 让核验者独立于行动者。自己给自己打分的智能体,是拿它当下持有的那个目标来打分的——而那个目标正是你要查的东西。把原始目标交给核验者,不给它对话记录;为什么上限由核验者决定,见生成器—核验器落差。
- 缩短任务时长,而不是加强提示词。两段十五步、中间夹一个硬检查点的运行,比一段三十步的运行漂移得少得多,因为检查点会从源头重新锚定目标。任务拆解是一种漂移控制手段,不只是成本手段。
- 别让一个廉价代理指标成为唯一反馈。如果绿色退出码是唯一可观测量,就给它配上一个智能体没法轻易满足的东西——覆盖率增量、diff 体积上限,或是对某个"走捷径就会违反"的性质的第二道检查。