你让Agent查天气,它调用了API,结果返回500。接下来会发生什么?是傻傻重试十次,还是直接放弃,或者换个工具?这就是Agent的容错机制要解决的问题。一个好的容错设计,不是简单的try-catch,而是一套结合了重试、降级和人工介入的决策逻辑,让Agent在意外发生时,还能优雅地完成任务,或者至少不把事情搞砸。

错误,是Agent的日常
一旦Agent开始与外部世界交互——调用API、查询数据库、执行代码——失败就不可避免。常见失败原因包括:网络超时、服务端错误(5xx)、限流(429)、参数错误(400)、鉴权失败(403)、资源不存在(404),甚至工具本身返回格式异常。根据Anthropic的文档,工具调用可能会因为网络问题、服务器错误、超时等原因失败,即使是设计良好的API也无法保证100%可用来源。所以,不要幻想消灭所有错误,而要设计优雅的失败处理。
重试不是万能药,但也不能没有
很多人第一反应是加重试。但重试有讲究,不是“遇到错误就重试”。首先,你得区分错误类型:可重试的(如网络超时、503、429)和不可重试的(如400、403、404)。对参数错误重试,只会浪费资源,让Agent看起来很蠢。我最早写Agent时,就踩过这个坑:一个API因为参数格式错误返回400,Agent却重试了5次,每次都报同样的错,最后超时失败。后来我把错误码分类,400直接放弃重试,进入修正或降级。
可重试错误,要采用智能重试策略:指数退避(exponential backoff)加随机抖动(jitter),避免惊群效应。例如,LangChain的retry机制使用tenacity库实现重试,支持指数退避和最大重试次数来源。更高级的重试,是让LLM分析错误信息,调整参数再试。OpenAI的文档建议,当函数调用返回错误时,可以将错误信息作为消息返回给模型,让它修正参数重新生成调用来源。这充分利用了LLM的推理能力,把重试变成了自我修正。
降级,救场的关键
当重试耗尽或错误不可重试,就需要降级。降级不是放弃,而是换一种方式完成任务。常见降级策略:
- 工具替换:一个天气API挂了,切换到备用API,或者用搜索引擎抓取天气信息。
- 使用缓存:如果之前调用过同样的参数,返回缓存结果,并告知用户数据不是实时的。
- 简化任务:无法获取精确天气时,让LLM根据季节和地理位置推理一个大致穿衣建议,不依赖外部工具。
- 部分结果:如果任务需要多个工具,一个失败,其他成功,则返回部分结果,并说明哪些部分未完成。
降级方案需要提前设计。在Agent框架中,可以定义工具链的fallback,如LangChain支持在chain失败时执行另一个chain来源。如果没有备用工具,也可以让LLM直接生成一个“尽力而为”的答案,并标注不确定性。
最后一道防线:人工介入
当自动化降级也无法解决问题,或者结果影响重大,就需要人介入。常见方式:暂停任务,向用户提问:“我无法获取天气数据,请问您知道今天天气吗?或者您想让我用另一个不太准确的数据源?”;或者标记任务为“需要人工审核”,将上下文传递给人工操作员。在代码执行Agent中,如TaskWeaver,当代码修复多次失败后,会请求用户帮助来源。设计人工介入的触发条件很重要:不能频繁打扰用户。可以设置置信度阈值,或当降级后仍失败,再请求人工。关键是要让用户有控制权,同时不成为瓶颈。
从try-catch到Agent容错,思维升级
传统编程的异常处理是固定的:try { … } catch (Exception e) { … }。但Agent容错需要结合LLM的推理能力,动态决策。下面这张表对比了两种思维:
| 维度 | 传统异常处理 | Agent容错 |
|---|---|---|
| 决策逻辑 | 固定规则,如重试3次 | LLM根据错误信息动态调整策略 |
| 错误分类 | 依赖预定义异常类型 | LLM可以理解自然语言错误描述,分类更灵活 |
| 恢复能力 | 通常只能重试或回滚 | 可以替换工具、降级任务、请求人工 |
| 适应性 | 低,需要修改代码 | 高,可以通过提示词调整 |
我踩过的坑
除了重试不分错误类型,我还犯过一个错误:降级太粗暴。一个API挂了,我就让Agent直接返回“无法完成”,用户很沮丧。后来我学会了编织备用工具网络:每个关键工具准备2-3个替代方案,并让LLM在调用失败时自动选择备用工具。这需要事先设计好工具描述和优先级。另一个坑是忽略了错误日志,导致Agent静默失败,用户不知道发生了什么。现在我强制Agent在每次失败时记录日志,并适时向用户汇报进度,比如“正在重试…(第2次)”。
设计容错机制的几条原则
- 错误分类是基础:明确定义哪些错误可重试、哪些要降级、哪些要人工。
- 快速失败:在确定无法恢复时,立即失败比反复重试更好,节省资源和用户时间。
- 保持用户知情:不要默默失败,使用进度提示或错误摘要,让用户知道发生了什么事。
- 利用LLM的自我修正:把错误信息反馈给LLM,让它重新生成工具调用,这是Agent容错独有的武器。
- 记录并学习:收集错误数据,用于优化提示词和工具链设计。
一个真实案例:旅行规划Agent如何应对失败
假设我们有一个旅行规划Agent,需要调用机票、酒店、天气三个API。机票API返回503,Agent按指数退避重试3次后仍失败。它降级为使用缓存的上次搜索数据(并告知用户),或者切换到备用机票API。酒店API成功。天气API返回数据但缺少穿衣建议,Agent用LLM推理生成建议:“根据20℃和晴天,建议穿薄外套。”最后,机票完全无法获取,Agent暂停任务,请求用户输入城市,手动查询。整个过程,Agent既没有陷入死循环,也没有完全放弃,而是尽力提供了部分结果,并保持了与用户的沟通。
容错的边界与未来
当前Agent容错机制仍有局限:对于未预见的错误,LLM可能无法正确处理;多步任务中错误传播难以控制;人工介入的时机仍需优化。未来方向包括更智能的错误分类模型、基于LLM的自我修复,以及多Agent协作容错。但即使现在,合理设计重试、降级和人工介入,已经能让Agent从“脆弱”变得“坚韧”。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/108.html