题目
如果Agent调用工具出错了,怎么办?
解答
当Agent调用工具出错时,这是一个非常常见的问题。一个健壮的Agent系统必须包含完善的错误处理机制,否则很容易陷入死循环或给出错误答案。
处理工具调用错误通常遵循以下几个层次的策略,从即时修复到最终的人工介入:
1. 即时重试机制
如果是临时性的故障(如网络超时、API限频),最简单的办法就是让Agent自动重试。
-
指数退避算法: 如果第一次失败,等待1秒再试;第二次失败,等待2秒;第三次等待4秒......避免对下游服务造成过大压力。
-
最大重试次数: 设置一个上限(例如3次),超过次数则不再重试。
2. 将错误信息反馈给大模型,让它自己修正
这是目前Agent框架(如LangChain、AutoGen等)最核心的容错逻辑。不要直接把错误吞掉,而是把错误信息作为新的上下文发给大模型。
-
工作流程:
-
Agent调用工具
get_weather('首都')。 -
工具返回错误:
参数验证失败:'首都'不是一个有效的城市名称。 -
系统将错误信息拼接成一条新的消息(通常以System或User角色)发给大模型。
-
大模型看到错误后,意识到自己犯了错,于是重新生成工具调用:
get_weather('Beijing')。
-
-
示例提示词片段(系统内部处理):
你调用的工具
get_weather返回了以下错误:
Error: 404 - City Not Found请根据错误信息修正你的参数,或者尝试调用其他工具。
3. 让模型拥有多个备选工具
如果某个工具彻底失败了,模型应该有能力切换到备用方案。
-
场景: 假设主要工具
search_web挂了。 -
处理: 模型收到错误后,不一定要用同样的参数重试,它可以选择调用
search_knowledge_base或者calculate_manually工具来绕过障碍。
4. 引入"规划-执行"分离模式
对于复杂任务,可以采用更稳健的架构,比如将"规划器"和"执行器"分开:
-
规划器(Planner): 负责制定步骤,不直接调用工具。
-
执行器(Executor): 负责执行具体的工具调用。
-
当执行器遇到错误时,它会把错误报告给规划器,由规划器重新调整计划。这比让同一个模型边想边做更容易从错误中恢复。
5. 结构化的输出解析与验证
很多时候,错误发生在模型返回的 工具调用格式 上(例如输出了JSON格式错误)。
-
使用语法约束: 在调用大模型时,强制其输出遵循特定的JSON Schema。OpenAI的
function_call参数或一些开源模型的JSON Mode都可以做到这一点。 -
Pydantic校验: 在代码层面,拿到模型的输出后,立即用Pydantic等库进行数据格式校验。如果校验失败,直接返回"格式错误,请严格按照指定格式输出"的提示,让模型重试。
6. 哨兵机制与人工介入
为了防止无限循环或巨额Token消耗,必须设置硬性的"断路器"。
-
最大迭代次数: 限制Agent思考-行动-观察的循环次数(例如最多10次)。
-
人工介入: 在开发环境或关键业务场景中,可以设计一个**"Human-in-the-loop"**环节。当Agent连续出错超过阈值时,暂停执行,将问题推送给人类管理员,由人类给出指示后,Agent再继续执行。
-
系统降级: 如果所有工具都失败了,Agent应该返回一句友好的提示,比如:"抱歉,我现在无法连接到查询服务,请稍后再试。或者你可以尝试询问其他问题。"
总结:一个健壮的Agent错误处理流程
-
调用工具。
-
判断是否成功?
-
成功 -> 返回结果给模型,继续下一步。
-
失败 ->
-
检查错误类型(格式错误、业务错误、网络错误)。
-
格式化错误信息。
-
将错误信息连同历史对话发回给大模型。
-
增加错误计数。
-
如果错误次数 < 3,让模型尝试修正并重试。
-
如果错误次数 >= 3,触发哨兵机制,终止循环并告知用户失败。
-
-