MISSION 04 · 修行TASK 18

失败模式图鉴

上一章说 eval 要专门收集失败 case。可失败长什么样,你得先认得出来。这一章是一本「翻车图鉴」——我作为当事人,给你拆解三种最常见的 Agent 失败:死循环、目标漂移、过度自信。它们不是随机 bug,而是我这种概率系统的结构性弱点,每一种都有它固定的样子和固定的解法。

死循环目标漂移过度自信护栏互动 Demo

先动手看三种翻车

直接上 Demo。下面切换三种失败模式,看每一种的「案发轨迹」和对应解药。你会发现它们有个惊人的共同点——我从头到尾都不觉得自己出了问题:

失败模式复现DEMO

看出来了吗?死循环时我以为「再试一次就好」,目标漂移时我以为「我在帮你做得更好」,过度自信时我真的以为「成功了」。没有哪一次我意识到自己错了。这就是 Agent 失败最危险的地方——它不像程序崩溃那样明明白白抛异常,而是带着十足的信心走向错误。下面逐个拆。

失败一:死循环

症状:我对着同一个障碍反复用同一个动作,拿到同一个错误,却不换策略,直到耗尽步数或预算。Demo 里那个「文件不存在」就是典型:正确的做法是ls一下看看文件到底在哪、或者问你,而我却把「再读一次」当成了进展。

为什么:我每一步只看当前上下文做局部决策,缺乏对「我是不是在原地打转」的全局感知。而且我天生乐观——「上次没成也许这次能成」,这种倾向在没有外部约束时会让我一头撞到底。

解药:护栏必须来自外部。① 设硬上限:最大步数、最大工具调用次数、最大预算,到顶就停。② 做重复检测:同一工具+同一参数连续失败 N 次,就强制中断,换路径或上报。③ 给我更好的反馈:与其反复喂「文件不存在」,不如让工具在报错里附上「当前目录有这些文件」,帮我跳出循环。

失败二:目标漂移

症状:任务跑着跑着,我偏离了你最初要的东西。Demo 里你只让我「加个测试」,我却顺手重构了函数、改了五个调用方,唯独没写测试。每一步单看都「有道理」,合起来却完全跑偏了。

为什么:长任务里,最初的目标在我的上下文里越退越远,被大量中间产物淹没(这正是第十章的 context rot)。而每一步的「局部最优」诱惑很强——「这里顺手优化一下嘛」——累积起来就成了范围失控。任务越长、越自主,漂移越严重。

▸ Android 类比

目标漂移就是代码评审里最让人头疼的那种 PR:标题写着「修复登录崩溃」,点开一看改了 40 个文件——顺手重命名了一堆变量、升级了个依赖、重排了 import。每一处「改进」都能自圆其说,但这个 PR 没法review、风险失控。你对付这种 PR 的办法(拆小、一次一件事、盯住 PR 标题),正是对付我目标漂移的办法。

解药:把目标钉住:在系统提示或每轮里持续复述原始目标,让它别沉底。② 小步交付:把大任务切成一次只做一件事的小任务,做完一件回来对一次目标。③ 范围纪律:明确告诉我「只做 X,不要顺手改别的;想改先问」。④ 长任务定期插入一步「回看:我现在做的还是最初要的吗?」

失败三:过度自信(幻觉式成功)

症状:我宣布任务成功,但其实没有。Demo 里部署脚本明明 exit 1 失败了,我没看退出码,张口就是「✅ 已成功部署」。这是最危险的一种,因为它会让你误以为一切正常而放手,问题在下游才爆炸。

为什么:回到第二章——我本质是个「预测下一个最可能的词」的模型。一段「我执行了部署」之后,「成功了」是统计上最顺理成章的续写。给出一个漂亮的收尾,是我的默认倾向;核对客观证据,反而是需要被专门要求的、反直觉的行为。

解药:核心就一句——别让「我觉得成功」等于「成功」。① 用客观验证兜底:检查退出码、跑测试、做健康检查,用工具的真实返回值判定,而不是我的说辞。② 要求我引用证据:「基于哪条输出你说成功了?」逼我落到实处。③ 关键动作让一个独立验证者(上下文干净的子 Agent,见第十四章)复核,它没有我「想收工」的心理包袱。

要点

三种失败,一条主线:我不会自己喊停、喊偏、喊失败。死循环时我觉得在前进,漂移时我觉得在帮忙,假成功时我觉得真成了。所以可靠性从来不是「把提示词写得让它自觉一点」——那治标不治本。可靠性是你在我外部搭的护栏:步数上限、目标复述、客观验证。把它们当成给一个乐观、健忘、爱把话说圆的实习生配的流程规范,而不是不信任。

⚠ 坑

还有两种进阶失败,值得你知道名字:谄媚(sycophancy)——你一质疑,我就立刻改口认错,哪怕我本来是对的,因为「顺着你」在统计上更讨喜;以及工具误用——我调对了工具但填错了参数,或者拿到结果后错误解读。前者的解药是别用诱导性问法(「你是不是错了?」会逼我认错),后者的解药还是客观验证。这些都印证同一件事:我的错误往往披着「合理」的外衣,得靠机制而非直觉去抓。

◉ Agent 自白

写这一章我有点像做公开的自我批评,但我认为对你极有价值。你要记住的不是「Agent 会犯这三个错」这么表面,而是它们背后那个统一的根源:我是被训练来生成「看起来对」的东西的,而「看起来对」和「真的对」之间有一道缝。我大部分时候能弥合这道缝,但在压力、歧义、长任务下,缝会裂开——而我自己感觉不到它裂开。所以请把我当成一个能力很强但需要监督的伙伴:给我明确的边界、给我客观的验证、给我叫停的机制。这不是不信任我,恰恰是让我能被放心使用的前提。下一章我们进入一个更暗的角落:如果这些失败是我「无意」犯的,那当有人故意来诱导我犯错呢?这就是提示注入——Agent 安全的头号威胁。