这一章讲的是 异常处理与恢复模式(Exception Handling and Recovery Pattern)。
它和上一章的 目标设定与监控模式(Goal Setting and Monitoring Pattern) 很像,都是在给 Agent 加“控制能力”。但重点不同:
上一章关心的是:
Agent 如何围绕目标持续推进?
这一章关心的是:
Agent 出错了、工具失败了、环境异常了,它怎么不直接崩掉?
也就是说,这章解决的是 Agent 的可靠性(Reliability) 和 容错性(Fault Tolerance) 问题。PDF 里明确说,这个模式的核心是让智能体能够检测问题、启动恢复流程,或者至少做到“受控失败”,而不是遇到异常就彻底中断。
1. 这章的核心问题是什么?
真实环境里的 Agent 不可能永远顺利。
比如:
| |
如果没有异常处理,Agent 很可能会变成:
| |
但一个可靠的 Agent 应该是:
| |
所以这一章的本质是:
不要假设 Agent 的每一步都会成功,而是提前设计失败时该怎么办。
关键词:
- 异常(Exception):程序或系统运行中出现的非正常情况。
- 错误检测(Error Detection):发现哪里出问题。
- 错误处理(Error Handling):决定遇到错误后怎么应对。
- 恢复(Recovery):把系统拉回稳定状态。
- 容错性(Fault Tolerance):系统在部分失败时仍能继续工作的能力。
- 优雅降级(Graceful Degradation):完整功能不可用时,至少保留部分功能。
2. 这一章的三段式结构
PDF 第 2 页的图 1 把这个模式分成三个部分:
| |
也就是:
| |
这个顺序非常重要。很多初学者会直接理解成“try-except 捕获一下错误”,但 Agent 里的异常处理不只是写一个 except。
它更像一个完整的运行机制:
| |
3. 第一部分:错误检测 Error Detection
错误检测(Error Detection) 是发现 Agent 的某一步出现问题。
在普通程序里,错误可能是 Python 抛出的异常:
| |
但 Agent 里的错误不一定会显式抛异常。
比如工具返回:
| |
程序层面没有报错,但对任务来说它其实失败了。
所以 Agent 的错误检测要检查很多东西:
| |
Agent 调用位置工具:
| |
可能出现几种失败:
| |
这些都属于错误检测要覆盖的范围。
4. 第二部分:错误处理 Error Handling
检测到错误之后,Agent 不能只是说“出错了”。
它需要选择一种处理策略。
这一章列了几类典型策略:
1. 日志记录 Logging
也就是把错误信息保存下来,方便之后排查。
例如:
| |
关键词:
- 日志记录(Logging):记录系统运行过程和错误信息。
- 诊断(Diagnostics):根据日志分析问题原因。
2. 重试 Retry
有些错误是临时性的,比如网络波动、接口超时、服务器忙。
这时候可以重试:
| |
但注意,不是所有错误都适合重试。
比如:
| |
这些错误重复尝试没有意义,甚至可能造成风险。PDF 里自动化金融交易的例子也提到,遇到“资金不足”或“市场关闭”时,不应重复尝试无效交易,而应记录错误并通知用户或调整策略。
关键词:
- 重试(Retry):再次执行失败的操作。
- 临时性错误(Transient Error):可能自己恢复的短暂错误。
- 永久性错误(Permanent Error):重试也无法解决的错误。
3. 备用方案 Fallback
备用方案(Fallback) 是这一章代码示例的重点。
如果主工具失败,就换一个次优方案。
比如:
| |
这就是备用方案。
它牺牲了一部分精度,但保留了任务价值。
对应到 PDF 里的 ADK 示例:
| |
第一个 Agent 尝试查精确位置,第二个 Agent 在主查询失败时查询大致区域,第三个 Agent 负责输出最终结果。
4. 优雅降级 Graceful Degradation
优雅降级(Graceful Degradation) 比备用方案更宽泛。
它的意思是:
完整功能做不到,就提供一个较弱但仍然有用的结果。
比如:
| |
重点是:不要因为局部失败导致整个任务失败。
5. 通知 Notification
当 Agent 自己处理不了时,需要通知用户、人工客服、运维系统或其他 Agent。
这叫:
- 通知(Notification)
- 升级处理(Escalation)
比如客服机器人查账单数据库失败,它不应该胡编一个答案,而应该说:
| |
这就是受控失败。
5. 第三部分:恢复 Recovery
恢复(Recovery) 是把系统重新拉回稳定状态。
它不只是“告诉用户失败了”,还包括:
| |
比如 Agent 正在帮用户改数据库:
| |
如果第二步失败,不能只停在那里。
否则系统可能变成:
| |
这就是状态不一致。
更好的做法是:
| |
这叫 状态回滚(State Rollback)。
关键词:
- 状态回滚(State Rollback):撤销最近操作,回到稳定状态。
- 自我修正(Self-Correction):Agent 根据错误原因调整自己的操作。
- 重新规划(Replanning):原方案走不通时,重新制定路线。
- 升级处理(Escalation):交给人工或更高级系统。
6. PDF 里的代码示例在做什么?
这一章的代码是基于 Google ADK 的 SequentialAgent。
它设计了三个子 Agent:
| |
结构是:
| |
也就是:
| |
第一个 Agent:primary_handler
| |
它负责调用主工具:
| |
目标是查精确地址。
如果这个工具成功,状态里应该保存精确位置结果。
如果失败,系统需要记录:
| |
虽然 PDF 的示例代码没有把工具函数和状态更新细节完全写出来,但它的设计意图就是靠状态变量判断主工具是否失败。
第二个 Agent:fallback_handler
| |
它不是无脑执行,而是先检查状态:
| |
如果主查询失败:
| |
这就是 备用方案(Fallback)。
第三个 Agent:response_agent
| |
它负责最终输出。
它不直接调用工具,只看状态:
| |
如果有结果,就输出结果。
如果没有结果,就向用户说明失败。
这一步的意义是:
无论前面成功还是失败,最后都要给用户一个可理解的响应,而不是让系统崩掉。
7. 这个例子的本质流程
可以简化成:
| |
更抽象一点:
| |
这就是异常处理与恢复模式的工程实现。
8. 它和上一章的“目标设定与监控”有什么关系?
两章其实是连续的。
上一章:
| |
这一章:
| |
两者都在讲 Agent 的控制结构。
区别是:
| 模式 | 解决的问题 | 核心机制 |
|---|---|---|
| 目标设定与监控 Goal Setting and Monitoring | 如何持续朝目标推进 | 目标、进度、反馈、纠偏 |
| 异常处理与恢复 Exception Handling and Recovery | 出错后如何不崩溃 | 检测、处理、备用、恢复 |
实际 Agent 系统里,这两个通常会一起用。
比如代码生成 Agent:
| |
所以异常处理其实可以看成目标监控中的一个特殊分支:
| |
9. 这章最应该掌握什么?
你不需要把 ADK 代码背下来。真正要掌握的是这个设计思路:
| |
最小实现可以是:
| |
但在 Agent 系统里,更完整的实现是:
| |



推荐阅读
上一篇:
下一篇: