AI Agent 如何处理失败、重试、循环终止与人工接管?
简化版
Agent 应把执行过程建模为可恢复的状态机,把失败分类(瞬时故障、参数错误、权限拒绝、业务失败)再决定重试、改参、回滚或人工接管。所有循环都要有最大步数、连续失败数、时间和费用预算;写操作只有具备幂等或状态确认机制时才能安全重试。核心——可靠性靠”状态可恢复、错误可分类、副作用可确认、循环有硬上限、必要时能交人”,而不是让模型无限自我纠错。
详细版
可靠运行时要保存任务状态、步骤输入输出、工具调用 ID、副作用、检查点。失败后先分类:瞬时错误有限退避;参数错误让模型修正;权限/策略拒绝直接停止;未知状态先查真实系统,不能立即重复写操作。
终止既含成功条件也含安全失败条件:超预算、重复相同动作、连续无信息增益、关键工具不可用、需要高风险决策时,停止自动循环并提供人工接管所需的摘要与证据。
完整版教学
一、为什么要用状态机
仅靠聊天历史很难判断「动作到底执行了没」。显式状态机把执行过程变成可追踪、可恢复的状态:
pending → running → succeeded
↓
failed → (分类后)重试/改参/停止
↓
waiting_approval → (人工批准后)running
每次关键状态变化【持久化检查点】→ 进程重启后从已确认状态继续(不重放全部对话)
二、错误分类:决定能不能重试
这是核心框架,不同错误处理完全不同:
| 错误类型 | 处理 | 能重试吗 |
|---|---|---|
| 超时/限流/暂时不可用 | 有限退避重试 | 能 |
| Schema/业务参数错误 | 让模型修改参数再试 | 改参后能 |
| 认证/授权/策略拒绝 | 停止,请求正确权限 | 不能 |
| 业务终态失败 | 记录原因,不盲目重试 | 不能 |
| 响应丢失/结果未知 | 先按请求 ID 查执行状态 | 先查再定 |
关键:错误码应来自工具,不让模型仅凭错误文本猜类别。
三、写操作与补偿(防重复副作用)
写操作(创建/付款/发信)用幂等键:
Agent 重试 → 服务端识别同一 idempotency_key → 返回首次结果,不重复执行
跨服务流程无法用单一事务时:为已完成步骤设计【补偿动作】(如"退款"补偿"扣款")
⚠️ 补偿不一定完全恢复原状(如已发的邮件收不回),可能需人工审批
⚠️ 回滚本身也是副作用操作,不能默认安全
四、循环检测:Prompt 说”别循环”不管用
除最大步数外,还要主动检测停滞:
检测信号:连续相同工具+参数、状态哈希无变化、重复错误码、单位成本的信息增益趋近 0
检测到停滞 → 缩小任务/切换策略一次 → 仍不行则转人工
记忆钩子:只在 Prompt 里要求”不要重复”无法提供硬保证——循环必须靠运行时的硬性检测和上限兜底。
五、人工接管:交接要给什么
适合接管的情况:不可逆动作、权限升级、证据冲突、预算耗尽、低置信度高影响决策。交接材料要完整:
原始目标 + 当前状态 + 已执行的副作用 + 关键证据 + 失败原因 + 待批准动作
人工批准要【绑定具体参数和有效期】;参数改了要重新审批
可观测与演练:记录完整轨迹(脱敏),统计成功率、恢复率、平均重试次数、循环率、人工接管率。用故障注入测试超时、重复响应、部分成功、进程重启,验证能否安全恢复。
六、常见误区与追问
- 误区:让模型自己无限纠错就能可靠。 可靠性靠状态机+错误分类+硬上限+人工接管,不是模型自我纠错。
- 误区:所有失败都能重试。 只有瞬时故障能退避重试,权限拒绝/业务终态失败不能,未知状态要先查。
- 误区:写操作直接重试安全。 会重复副作用,必须幂等键;补偿和回滚本身也是副作用不默认安全。
- 误区:Prompt 写”不要循环”能防死循环。 无硬保证,要运行时检测(相同动作/状态哈希/重复错误码)+ 最大步数。
- 追问:为什么用状态机? 聊天历史难判断动作是否执行,显式状态 + 检查点可恢复、可校验前置条件。
- 追问:错误怎么分类处理? 瞬时(退避重试)、参数错(改参重试)、权限拒绝(停止)、业务终态(不重试)、未知(先查状态)。
- 追问:响应丢失怎么办? 不能立即重试写操作,先按请求 ID 查真实执行状态,用幂等键防重复。
- 追问:什么时候该人工接管? 不可逆动作、权限升级、证据冲突、预算耗尽、低置信高影响决策,交接给完整状态和证据。
七、加强记忆
Agent 可靠性记「状态可恢复、错误可分类、副作用可确认、循环有硬上限、必要时能交人」:用状态机 + 检查点(可恢复,不重放全对话)、错误分类(瞬时退避/参数改/权限停/终态不重试/未知先查)、写操作幂等键(防重复副作用,补偿和回滚也是副作用)、循环硬检测(相同动作/状态哈希/重复错误码 + 最大步数,Prompt 说”别循环”不顶用)、人工接管(给完整状态证据、批准绑定参数和有效期)。用故障注入演练验证能安全恢复。