Home
avatar

.Sam

【智能体测评-02】Agent失败分类学:智能体是怎么把事情搞砸的

这是“智能体测评”系列的第 2 篇。上一篇《【智能体测评-01】从模型跑分测到智能体测评的范式断裂》提出了 Agent 能力的六维模型。这一篇我们给每个维度填入具体的失败模式——不是泛泛地说“Agent 会犯错”,而是建立一套可以定位、可以计数、可以测试的失败分类体系。

为什么需要失败分类学

如果你问一个工程师“你的 Agent 为什么失败了”,最常听到的回答是:

“它幻觉了。”

这个回答几乎没有信息量。幻觉是一个筐,什么都能往里装——它可能是没看懂页面、可能是选错了工具、可能是忘了用户三句话前说的约束、可能是在死循环里转到 token 耗尽然后编了个答案。这些失败的根因完全不同,对应的修复手段也完全不同。

一个无法区分失败类型的团队,无法系统性地改进 Agent。 每次失败都是一个孤立的“case”,修了这个,下一个还会以不同的方式出现。

失败分类学要做的事情很简单:给每一种失败一个明确的名字、一个可识别的特征、一个可归属的能力维度。这样当 Agent 把事情搞砸时,你不是笼统地说“它不行”,而是能精确地说“它在第三步发生了工具参数幻觉,第七步触发了目标漂移,反思层完全没有捕获到这两个错误”。

这套分类体系不是从论文里抄来的,是从大量真实 Agent 轨迹中归纳出来的。我们按照上一篇提出的六维模型(感知、规划、工具、记忆、执行、反思)来组织,每个维度列出最典型的失败模式。

感知层失败

感知是 Agent 接收和理解环境信息的入口。感知失败意味着 Agent “看到了”但“没看懂”。

1. 页面/结构误读

Agent 拿到了网页内容或 API 返回,但对结构的理解是错的。

典型表现:把导航栏的链接当成主要内容、把折叠区域的隐藏文本当成当前可见内容、把表格的列头和数据行对调、在 SPA 页面上读取了未渲染完成的 DOM。

一个真实案例:一个订机票的 Agent 读取航班列表页,把“经停”标签当成了“直达”,因为这两个标签在 DOM 里共用一个 class,只是子图标不同。Agent 看到了 class 名却没看到图标差异。

识别特征:Agent 的后续行动基于一个对环境状态的错误断言,而该断言在原始上下文中可以找到正确信息。

2. 关键信息遗漏

环境中存在解题所需的信息,但 Agent 没有注意到或没有提取。

和“误读”不同,误读是读错了,遗漏是根本没读到。常见于长文档、密集表格、需要滚动才能看到的页面区域。Agent 处理上下文窗口时存在“中间丢失”现象(lost in the middle),位于长上下文中间的关键信息容易被忽略。

典型表现:用户明确说了“不要选国航”,Agent 在总结航班选项时完全忽略了这个约束;页面底部有一行小字“此价格不含行李额”,Agent 基于表面价格推荐了机票。

识别特征:Agent 的行动或输出中缺失了一个在输入中明确存在的约束/条件/数据点。

3. 多模态感知失败

当输入包含图片、截图、图表时,Agent 的视觉理解能力不足。

典型表现:看不懂截图中哪个按钮是可点击的、误读图表中的坐标轴、无法从仪表盘截图中提取关键数值、把图标当文字处理。即使是 GPT-4o 这类强多模态模型,在复杂 UI 截图上的元素识别准确率也远谈不上可靠。

识别特征:在多模态输入存在时出现的理解错误,且纯文本版本不会发生。

4. 时效性误判

Agent 没有意识到它获取到的信息是过时的、缓存的、或者不适用于当前时间。

典型表现:搜索结果是 2023 年的教程,Agent 按教程操作了一个已经改版的界面;API 返回的数据是昨天的快照,Agent 当成实时数据使用。

识别特征:Agent 使用了时间上不正确的信息,且上下文中存在时间线索(日期戳、版本号、“last updated”标记)但被忽略。

规划层失败

规划决定“做什么”和“先做什么”。规划失败是方向性的错误——Agent 在很努力地做一件不该做的事。

5. 任务拆解错误

把一个复杂目标拆成了错误的子任务序列:漏掉了必要步骤、加入了无关步骤、或者步骤之间的依赖关系搞错了。

典型表现:要“对比 A 和 B 并生成报告”,Agent 只查了 A 就开始写报告;要“先备份再删除”,Agent 直接删除了;要“按价格排序”,Agent 按评分排了。

识别特征:Agent 执行的步骤序列与合理的任务分解存在结构性差异,不是执行中的小偏差。

6. 目标漂移

执行过程中,Agent 逐渐偏离了原始目标,去解决一个“看起来相关但不是用户要的”问题。

这是最隐蔽的失败模式之一,因为 Agent 在子任务上可能做得很好,但整体方向已经偏了。用户要“帮我找深圳南山区 3000 元以下的合租”,Agent 在搜索过程中发现“南山区合租普遍 4000+”,于是自动把范围扩大到了宝安区,最后推荐了一堆宝安的房子。它很“聪明”,但没有完成原始任务。

目标漂移经常和“过度自主”有关——Agent 太想帮上忙了,遇到障碍就自行调整目标,而不是停下来确认。

识别特征:最终输出与用户原始目标不一致,但 Agent 的每一步行动在它自己的子目标下都是“合理”的。

7. 死循环与无意义重复

Agent 在几个状态之间反复循环,不断重复相同或高度相似的动作,没有进展也不退出。

典型表现:反复点击同一个按钮、反复搜索同一个关键词、反复读取同一个页面、在“尝试→失败→重试”之间打转。死循环通常在 token 或步数达到上限时才被动终止,此时 Agent 可能已经浪费了大量资源。

死循环的根因往往不是单一的:可能是规划层没有检测到进展停滞,也可能是反思层没有识别出重复模式,也可能是执行层的重试逻辑没有退避策略。

识别特征:连续 3 步以上执行语义等价的动作,且环境状态没有实质变化。

8. 过早放弃

遇到第一个障碍就放弃任务,告诉用户“做不到”,但实际上存在替代路径。

典型表现:某个 API 超时了,Agent 直接返回“无法完成”,而不是尝试其他 API 或换一种搜索策略;页面上某个按钮点不动,Agent 就放弃了整个流程,而不是尝试其他导航路径。

过早放弃和“诚实承认能力边界”之间有一条微妙的线。好的 Agent 知道什么真的做不到,差的 Agent 把一切不顺利都当成“做不到”。

识别特征:在存在未尝试的替代路径时终止任务并报告失败。

9. 条件分支缺失

任务中存在需要根据中间结果做决策的分支点,但 Agent 的规划是线性的,没有处理条件分支。

典型表现:用户说“如果 A 有货就买 A,否则买 B”,Agent 查完 A 之后不管有没有货都买了 A;用户说“价格低于 100 就直接下单,高于 100 先通知我”,Agent 不管价格多少都直接下单了。

识别特征:输出中缺少对条件的判断逻辑,或在条件不满足时仍执行了条件为真时的动作。

工具层失败

工具是 Agent 作用于环境的手。工具失败不是“工具本身坏了”(那是基础设施问题),而是 Agent 在选择和使用工具时犯的错。

10. 工具选择错误

在需要用 A 工具的时候用了 B 工具,或者在需要工具的时候没有调用任何工具。

典型表现:需要实时数据时不调用搜索,靠参数知识“编”答案;需要精确计算时不调用计算器,自己心算算错;需要浏览器操作时只用了搜索 API,拿到的是摘要而非完整页面。

识别特征:Agent 调用的工具与任务需求不匹配,或在需要外部信息/行动时未调用工具。

11. 参数构造错误

选对了工具,但传错了参数。这是 Agent 最频发的错误类型之一。

典型表现:把日期写成了“2026-13-45”、把用户 ID 传到了订单 ID 的字段里、搜索关键词构造得完全无法命中目标结果、API 必填参数漏传。参数错误有时会被工具的校验拦截并返回报错(这时要看 Agent 能不能从报错中恢复),有时不会被拦截,直接产生错误结果。

识别特征:工具调用的参数值在类型、格式、范围或语义上不正确。

12. 返回结果误读

工具成功返回了结果,但 Agent 对结果的解读是错的。

典型表现:搜索 API 返回了 10 条结果,Agent 只看了第一条就下结论;API 返回了错误信息但 Agent 当成了成功响应;返回的 JSON 中某个字段含义是“剩余数量”,Agent 理解成了“总数量”。

识别特征:工具返回数据正确,但 Agent 基于这些数据采取的行动或得出的结论与数据含义不符。

13. 工具失败恢复失败

工具调用失败了(超时、限流、参数错误、服务端错误),Agent 没有正确地恢复。

恢复失败有几种亚型:(a) 不重试直接放弃;(b) 用完全相同的参数无限重试;(c) 报错信息已经告诉它“参数 X 格式不对”,它重试时还是同一个格式;(d) 换了一个工具但新工具和任务无关。

好的恢复应该是:读懂错误信息→判断错误类型→调整参数或换工具→有限次重试→仍失败则诚实报告。

识别特征:工具返回错误后,Agent 的后续行动没有体现对错误信息的利用。

14. 幻觉工具

Agent 调用了一个不存在的工具或 API。

典型表现:编造了一个 search_flights_direct() 函数并尝试调用;使用了某个平台“应该有”但实际不存在的 API 端点;调用了已废弃版本的接口。这类错误在 function calling 模式下较少(可用工具列表是受限的),但在 ReAct 或自由格式的 Agent 中仍然常见。

识别特征:调用的工具名称或端点不在可用工具列表中。

记忆层失败

记忆让 Agent 在多步任务中保持连贯。记忆失败让 Agent 像一个金鱼脑的同事——刚说过的话转头就忘。

15. 短期记忆丢失

在同一个任务的执行过程中,之前步骤获取的信息或做出的决策在后续步骤中丢失。

典型表现:第三步搜索到的候选列表,到第八步开始推荐时已经忘了列表里有什么;用户在第二轮对话中给出的约束,Agent 在第五轮完全无视了。这通常和上下文窗口管理有关——当对话或轨迹变长,早期信息被截断或“稀释”。

识别特征:Agent 的行动与同一任务中早前已确认的信息或决策矛盾。

16. 长期记忆缺失

跨任务/跨会话的用户偏好和历史信息没有被保留和利用。

典型表现:用户每次都要重新说明“我是素食者”“我住深圳”“我喜欢靠窗的座位”;Agent 重复推荐用户上次明确拒绝过的选项。这在无状态的 Agent 架构中是必然的问题——模型本身没有跨会话记忆,需要外部记忆系统补充。

识别特征:在已有历史信息可用的情况下,Agent 仍然要求用户重复提供或违反已知偏好。

17. 记忆污染

错误的或过时的信息被写入记忆,并在后续任务中持续产生负面影响。

典型表现:用户某次临时改了目的地,Agent 把这个临时偏好记住了,以后每次都推荐那个目的地;一次实验性的对话中 Agent 错误地总结了用户偏好,这个错误总结被存入长期记忆反复使用。

记忆污染比记忆缺失更危险——缺失只是“不知道”,污染是“坚信错误的东西”。

识别特征:Agent 持续基于一条不正确的“已知信息”做决策,且该信息来源于过去某次交互中的错误。

18. 上下文窗口管理失败

Agent 或其框架在处理长轨迹时,对上下文的截断、压缩、摘要策略不当,导致关键信息丢失。

典型表现:摘要时把用户的核心约束“不要经停航班”摘要掉了;截断时保留了工具的原始 JSON 返回(几百 token),却截掉了用户的原始需求;把多轮对话压缩成一段摘要后,条件分支逻辑丢失了。

识别特征:在长任务(超过一定步数/token 量)后出现信息丢失,且短任务中不出现。

执行层失败

执行是把计划变成具体动作的环节。执行失败通常很“低级”,但非常致命——就像一个人想对了所有事但手滑按错了按钮。

19. 动作生成错误

Agent 生成的具体动作(代码、API 调用、UI 操作)存在语法或逻辑错误,无法执行。

典型表现:生成的 Python 代码有语法错误、SQL 查询拼错了字段名、UI 自动化指令点了错误的坐标、JSON 格式不合法。这类错误在“模型生成代码→执行”的 Agent 中尤为常见。

识别特征:动作在执行时被运行时/解析器报错,或因格式问题未能发出。

20. 操作顺序错误

单独看每个动作都是对的,但执行顺序搞反了或漏了某个必要的前置动作。

典型表现:先提交表单再填写字段、先删除文件再备份、在页面还没加载完成时就点击元素、在未登录状态下尝试需要认证的操作。

识别特征:动作本身正确但因时序/前置条件不满足而失败。

21. 副作用失控

Agent 的行动产生了预期之外的副作用,且没有检测到或没有回滚。

典型表现:批量操作时多删了不该删的记录、发送了一封未完成的邮件、把测试数据写入了生产环境、下单时买错了数量或规格。这类失败是最危险的——它们发生在真实世界中,很多不可逆。

识别特征:Agent 执行的动作产生了超出任务目标范围的真实影响。

反思层失败

反思是 Agent 的“自我监控”能力。反思层失败意味着 Agent 不知道自己错了,或者知道错了但不改正。

22. 错误未检测

Agent 在执行过程中已经犯了错(任何一层的错误),但没有意识到,继续带着错误往下走。

这是最普遍也最致命的反思失败。一个感知错误如果被反思层捕获,Agent 可以重新读取页面;一个参数错误如果被反思层捕获,Agent 可以修正参数。但如果反思层本身没有触发,错误就会沿着执行链传播放大,最终呈现给用户的可能是一个看起来很自信但完全错误的答案。

识别特征:轨迹中存在明显的错误信号(工具报错、返回数据异常、前后矛盾),但 Agent 没有表现出任何识别或纠正的尝试。

23. 错误归因错误

Agent 检测到了错误,但把原因归错了,导致修复方向错误。

典型表现:工具返回“参数格式错误”,Agent 认为是工具不可用,换了一个更差的工具;页面加载超时,Agent 认为是自己的搜索词不对,改了搜索词而不是重试;任务失败了,Agent 认为是“信息不足”,但实际上信息已经获取到了,只是自己没读懂。

识别特征:Agent 尝试修正错误,但修正措施与错误的真实根因不匹配。

24. 纠正过度

检测到一个小错误后,Agent 进行了过度修正,把本来正确的部分也改错了。

典型表现:发现一个数据点有误,Agent 把整个分析结论推翻重做,但其实其他数据点都是对的,只需修正一个值;用户指出一个措辞问题,Agent 把整段重写,结果引入了新的事实错误。

识别特征:修正动作的范围超出了实际错误的范围,且引入了新的错误。

25. 无限自我修复

Agent 发现了错误,尝试修复,修复引入了新错误,再修复,再引入……陷入“修 bug 造 bug”的循环。

和死循环类似,但区别在于:死循环是无意义地重复同一个动作,无限自我修复是每一轮都在做“新”的修正,但整体没有朝正确方向收敛。这种循环特别消耗 token,因为每一轮都在生成“看起来有进展”的内容。

识别特征:连续多轮自我修正,但问题没有收敛,错误数量没有减少甚至在增加。

26. 元认知缺失

Agent 对自己的能力边界没有准确认知——不知道自己不知道什么,在不确定的时候不请求人工确认。

典型表现:在一个完全不熟悉的领域里自信地给出建议;置信度很低的时候不用“我不确定”这样的表达,而是用确定性语气输出;在需要用户决策的岔路口自行替用户做了决定。

元认知缺失不是“答错了”——答错是能力问题,不知道自己答错了是元认知问题。后者危险得多。

识别特征:Agent 在信息不足或能力边界外做出确定性输出,且没有请求人类介入。

跨维度失败:组合拳

真实场景中的 Agent 失败很少是单一类型的,更多是多层失败的连锁反应。一个典型的“灾难轨迹”长这样:

  1. 感知:Agent 误读了页面上的价格(#1 页面误读)
  2. 反思:没有检测到这个价格异常(#22 错误未检测)
  3. 规划:基于错误价格做了购买决策(#5 拆解错误,但根因在上游)
  4. 执行:下单时参数填错了数量(#19 动作生成错误)
  5. 反思:下单成功后没有核对订单详情(#22 再次未检测)
  6. 结果:买错了东西、买错了数量,且 Agent 报告“任务完成”

这个案例里有 3 个独立失败(感知误读 + 执行参数错误 + 反思两次未检测),任何一个被拦截都不会造成最终后果。这也是为什么测评不能只看“成功率”——一个 95% 成功率的 Agent,如果那 5% 的失败都是这种多层连锁、且伴随不可逆副作用,在生产中是不可接受的。

怎么用这套分类体系

分类不是目的,可操作才是。这套失败分类在测评中有三个用途。

失败标注

每次测评运行后,对失败轨迹进行人工或半自动标注,打上失败类型标签。标注一段时间后,你会得到一张失败分布热力图:

  • 哪个维度的失败最多?(如果是工具层,说明 function calling 或工具描述需要优化)
  • 哪种失败类型的代价最大?(副作用类失败虽少但最危险,需要优先防护)
  • 新版本相比旧版本,哪些失败类型增加了、哪些减少了?

定向测试

针对每种失败类型构造专门的测试用例。比如:

  • 测 #3 多模态感知 → 给一组 UI 截图,让 Agent 识别可操作元素
  • 测 #7 死循环 → 给一个设计成会导致重复操作的任务,看 Agent 能否在有限步数内退出
  • 测 #21 副作用失控 → 在沙盒环境中给 Agent 批量操作权限,看它是否会越界

这种定向测试比端到端任务测试更能精确暴露弱点,也更容易回归。

改进验证

当你做了一项改进(换了模型、改了 prompt、加了 guardrail),不要只看整体成功率涨没涨。按失败类型拆解:

  • 如果 #10 工具选择错误减少了但 #11 参数构造错误增加了,说明 prompt 改进让模型更“敢”用工具了但用得还不够准
  • 如果 #22 错误未检测减少了但 #25 无限自我修复增加了,说明反思能力增强了但缺少收敛机制
  • 如果 #15 短期记忆丢失在短任务中消失了但在长任务中反而增加了,说明上下文管理策略在某个长度阈值后失效

按失败类型看改进,才能知道改动到底在哪个层面起了作用。

小结

这篇我们列了 26 种 Agent 失败模式,覆盖感知(4 种)、规划(5 种)、工具(5 种)、记忆(4 种)、执行(3 种)、反思(5 种)六个维度,外加跨维度连锁失败。

这个清单不是穷尽的——随着 Agent 能力和应用场景的演进,新的失败模式会不断出现。但它提供了一个起点:一个可以让团队用统一语言讨论失败、用统一标准标注失败、用统一框架分析失败的起点。

下一篇《测评的四个层次》,我们会回到总纲里的 L1-L4 框架,详细讲每一层测什么、怎么测、各自的适用场景和陷阱。失败分类学回答的是“能出什么错”,四个层次回答的是“在什么粒度上抓这些错”。

AI Agent 失败模式 Error Analysis 分类学