当AI Agent从单轮对话走向多步骤工作流,失败就不再是"模型答错了"这么简单。一个典型的多步骤任务,往往涉及多次LLM推理、工具调用、外部API交互和中间状态传递,任何一个环节出问题,都可能让整个任务失败。更麻烦的是,Agent的每一步决策都依赖前一步的输出,错误会沿着调用链逐级放大。

本文从工程实践角度,梳理多步骤任务失败的常见类型,围绕日志追踪、状态快照、重试与降级给出可执行的定位与恢复方案。注意,以下内容是通用工程方法,不针对任何具体Agent框架或云服务,落地时需要结合自身技术栈验证。

一、多步骤任务的失败类型

1. 工具调用超时

多步骤任务中,Agent需要调用外部工具或API获取信息。网络抖动、上游服务变慢、响应体过大,都可能导致调用迟迟不返回。超时如果不处理,Agent会一直等待,整个工作流被卡住。

2. 参数错误

Agent根据用户意图生成工具调用参数,但参数可能不符合工具的预期格式。常见情况包括:枚举值传错、必填字段缺失、数据类型不匹配、参数值超出工具允许范围。这类错误往往能拿到明确的错误信息,但Agent不一定能正确理解和修正。

3. 上下文丢失

多步骤任务中,中间结果需要被保存并在后续步骤中引用。如果上下文管理不当,后面的步骤可能拿不到前一步的输出,或者拿到的是被截断、被覆盖的旧数据。对于长任务,上下文窗口有限,前面的关键信息可能被后续内容挤掉。

4. 工具返回结果不符合预期

工具调用成功返回,但返回的内容结构不对,例如字段缺失、层级变化、空数组。Agent按照预期解析,结果解析失败,任务中断。

5. 模型决策偏离

多步骤任务中,模型可能在某一轮做出错误决策,例如选错工具、跳过了必要步骤、陷入重复调用。这类失败最难定位,因为错误不在工具侧,而在模型的推理路径上。

二、定位失败的工程方法

1. 日志追踪:为每次调用生成trace_id

多步骤任务的排障基础是可追踪性。关键做法是为整个任务分配一个trace_id,并让日志贯穿所有步骤:

  • 每次LLM推理记录输入、输出、token用量、耗时;
  • 每次工具调用记录工具名称、参数、返回状态、耗时;
  • 每次状态更新记录变更前后的值;
  • 错误日志必须包含trace_id、步骤编号、错误类型、堆栈。

有了trace_id,就可以把一个任务的所有日志串联起来,按时间线回放整个执行过程,快速定位失败发生在哪一步。

2. 步骤状态快照

除了日志,还需要对任务状态做快照。状态快照不同于普通日志,它记录的是某一时刻任务的完整可恢复状态,包括:

  • 当前执行到第几步;
  • 各步骤的输出结果;
  • 已收集的中间变量;
  • 下一步待执行的工具调用参数。

快照需要支持按trace_id查询,同时保留历史版本,这样既能定位当前失败,也能回溯之前几个步骤的状态变化。

3. 错误分类与结构化错误信息

建议让Agent框架或封装层统一捕获错误,并将错误转换为结构化格式:

{
  "step": 3,
  "tool": "weather_api",
  "error_type": "timeout",
  "retryable": true,
  "message": "Request timed out after 5000ms"
}

结构化错误信息既是日志,也是后续重试策略的输入。通过错误类型,可以判断:哪些错误值得重试,哪些错误需要修改参数后重试,哪些错误必须终止任务。

三、恢复策略

1. 重试:区分可重试与不可重试错误

超时和瞬时网络错误通常可重试。参数错误一般不可重试,因为重试同样的参数大概率还是失败。对于可重试错误,建议采用指数退避策略,并设置最大重试次数。每次重试前,最好让Agent先观察错误信息,决定是否需要调整调用方式。

2. 状态回滚与断点续跑

如果任务失败时已经保存了状态快照,就可以从失败点恢复。具体做法是:

  • 将任务状态恢复到失败前的最近一个快照;
  • 跳过已完成且无依赖的步骤;
  • 从失败步骤重新开始执行;
  • 对于步骤2之后的步骤,如果步骤2的输出已保存,可以直接作为输入,无需重新执行。

断点续跑能显著降低重跑成本,特别是在长耗时任务中。

3. 降级策略

当某个工具持续失败,Agent需要有替代方案。降级思路包括:

  • 使用备用工具:例如主搜索API超时,切换到备用搜索引擎;
  • 使用缓存结果:如果任务之前执行过且结果未过期,直接复用;
  • 简化任务目标:无法获取某个关键信息时,终止该分支,而不是让整个任务失败;
  • 人工介入:对于多次重试仍失败的关键步骤,标记为需要人工处理。

降级策略需要提前在任务编排中定义,而不是等到失败时让模型随机发挥。

4. 重试时的上下文修正

对于参数错误,更好的一种恢复方式是:将工具返回的错误信息作为反馈,让Agent重新生成参数后再调用一次。这其实是"Agent式重试",与普通的重试不同。

第1次调用:get_weather(city="北京市")
工具返回:参数city应为城市拼音,而非中文
第2次调用:get_weather(city="beijing")

这种重试方式要求Agent具备根据错误信息修正自身行为的能力,本质上依赖模型能力。工程上需要限制重试次数,同时保留每次重试的参数和错误记录。

四、如何知道恢复成功了

恢复策略不能只靠"任务没有报错"来判断。建议增加验证机制:

  • 输出校验:检查最终输出是否满足用户原始需求,字段是否完整;
  • 步骤校验:重要步骤的输出,需要校验其数据格式和取值范围;
  • 幂等性检查:对于重复执行的步骤,确保不会产生副作用,例如重复扣费、重复写入。

如果框架本身没有校验机制,可以在封装层自行实现。

五、当前工程实践的边界

需要正视的是,多步骤任务的失败恢复目前仍面临不少挑战:

  • 状态快照的粒度:快照保存得太频繁,开销大;保存得太稀疏,恢复时会丢失关键信息。如何平衡,取决于任务的重要性和执行时长。
  • 模型决策错误难以自动恢复:超时和参数错误可以靠重试解决,但模型选错工具这类逻辑错误,很难通过自动重试修正。
  • 不同框架的恢复能力差异:不同Agent框架对状态管理、错误处理、任务恢复的支持程度不同,目前没有统一标准。落地前需要验证框架自身的恢复机制,而不是盲目相信"框架自动处理"。

对开发团队而言,一个可行的做法是从简单的可重试错误开始,逐步建设状态快照和断点续跑能力。先保证"超时能重试、参数错能修正、任务能续跑",再考虑更复杂的模型决策纠错。

结论

AI Agent多步骤任务的失败定位与恢复,核心是三个能力:

  1. 通过trace_id和结构化日志,快速定位失败步骤;
  2. 通过状态快照,具备断点续跑能力;
  3. 通过区分可重试错误与不可重试错误,决定恢复策略。

这些能力不依赖于某个具体框架,属于工程架构层面的设计决策。对团队来说,与其等到任务频繁失败后再补日志,不如在设计工作流时就把可观测性、状态持久化和错误分类纳入基础架构。