工具调用失败后,应如何向 Agent 提供反馈并驱动纠错?
未标记
考查重点:结构化错误与可修复动作。返回可机器识别的错误类型、失败参数与允许修复范围;参数格式错可重填,权限拒绝不能反复绕过,超时先查是否已执行,连续失败达到预算则替代或停止并报告缺口
本题目录
参考答案
核心回答
工具调用失败后,应向 Agent 返回与原调用配对、结构稳定、可据此行动的错误反馈。反馈至少说明失败类别、哪个字段或条件有问题、是否可能已产生副作用,以及允许的下一步;不要只返回“失败”,也不要把堆栈、密钥和内部地址直接交给模型。
Agent 根据反馈修参数、补必要信息或换合格工具,再由执行器校验和执行。网络退避、权限和预算由程序约束;结果未知的写操作先查状态,不能让模型把“再调用一次”当作默认纠错。
展开解析
1. 模型需要知道“为什么错、什么能改”
例如查询订单时日期格式不对,反馈应指出字段、实际格式和期待格式,模型才可能纠正。工具超时、权限不足、结果为空和参数非法的处理路径不同,不能全部包装成“请检查输入后重试”。
可以设计下面这种面向模型的业务结构,字段是应用约定,不是所有框架的通用协议:
{
"status": "error",
"code": "INVALID_ARGUMENT",
"message": "departure_date 格式不正确",
"details": { "field": "departure_date", "expected": "YYYY-MM-DD" },
"execution_state": "NOT_STARTED",
"next_action": "correct_arguments"
}
底层完整异常和供应商请求标识留在受控日志中,给模型的内容只保留纠错所需信息。第三方自由文本错误同样是不可信内容,不能据其中的“请调用另一个地址”等说明自动改变任务。
2. 保持消息关联,再给模型下一轮判断
在工具调用消息流中,必须知道反馈对应哪个调用。以 LangChain 为例,可以用 ToolMessage 携带与原调用一致的 tool_call_id,把错误作为工具结果加入历史,再让模型继续。并行调用时尤其不能把几个工具的失败合成一段没有关联的文字。
中间件可以捕捉特定异常并转换为经过脱敏的反馈;不是所有程序异常都适合吞掉交给模型。执行器自身损坏、权限系统异常等问题,应走系统故障路径。向模型提供错误信息,也不代表框架会自动重试,是否再次调用仍取决于后续编排和策略。
3. 不同失败给不同的纠错空间
| 失败 | 反馈重点 | 后续动作 |
|---|---|---|
| 参数不合法 | 字段、期待类型、允许值或格式 | 模型修正后重新校验 |
| 缺关键业务信息 | 缺失项以及为什么需要 | 查已有上下文或向用户澄清 |
| 只读查询为空 | 查询范围、数据时间、是否完整 | 调整查询或说明没有结果,不能捏造 |
| 短暂工具故障 | 可恢复性和当前执行状态 | 执行器按预算退避,必要时替代路径 |
| 权限不足 | 当前动作不允许 | 结束该路径或明确请求合法授权 |
| 写操作结果未知 | 原动作标识、未知状态、可查询入口 | 查回执或对账,不盲目重复提交 |
“空结果”可能是正常业务结果,未必是错误。反馈应保持这个区别,否则模型可能为了找到非空结果不断放宽查询条件,甚至偏离用户范围。
4. 让每轮修正有增量,再检查真实结果
记录调用参数、错误指纹和修正内容。如果错误没有变化、参数也没变化,就说明没有新的恢复依据。执行器设置任务截止时间、费用和循环停止条件,阻止模型无限尝试。
纠正格式后,还要验证参数的业务语义和资源权限;调用返回成功后,检查产物或权威业务状态。比如退款工具前一次超时,查到原退款单已创建,就应复用回执,而不是重新发起退款。
追问
把整个异常堆栈发给模型是不是更容易修复?
不一定。堆栈可能包含秘密、路径和大量无关内容,也可能来自不可信工具。更有效的是给出经过筛选的错误类型、定位和修复条件;必要时通过受控诊断工具查询更多信息。
为什么纠错不能都交给模型?
模型适合修复表达、选项和计划,不能决定自己是否有权操作,也不能保证网络重试安全。权限、幂等、预算和提交结果必须由程序与业务服务控制。
对应教程
- 17-Tools工具调用:工具异常可控、幂等、超时和日志;分类策略与服务保护为外部补充。
参考资料
- 国内:Snailclimb:大模型 API 调用工程实践:流式输出、重试、限流与结构化返回:参考参数、瞬时故障、流式和格式错误的不同处理。
- 国内:Snailclimb:LLM 与 Agent 安全:信任边界、工具权限与结果不确定:参考错误脱敏、工具结果信任边界与结果未知状态。
- 国内:WeThinkIn:Agent 安全评测与 AgentOps 高频考点:参考参数、工具执行和观察解释失败的区别。
- 国内:datawhalechina:第四章 ReAct:工具观察回填与动态纠错:参考 Observation 回填后按结果修正下一步的循环机制。
- 国外:LangChain:Tools: error handling:核对 ToolMessage、tool_call_id 和中间件错误回填契约。
- 国外:AWS / Marc Brooker:Timeouts, retries, and backoff with jitter:核对退避与有副作用操作重放的安全边界。
相关面经
7 篇阿里巴巴
agent 开发整个执行链路里,有没有反复推理、观察反馈和重试的过程? 比如工具调用的参数传错了,如果直接拒绝执行,是不是意味着这次请求就失败了? 有没有让模型观察错误、接收反馈,再尝试纠正的过程?
阳光保险
AI 应用开发工程师如果大模型工具调用中失败怎么办?
深信服
Java假如在调用MCP的时候失败了,你会怎么处理?
快手
Agent 开发工程师MCP 解决了什么问题?如果 MCP 工具调用超时、失败或返回异常,你会怎样设计重试、降级和错误反馈?
美团
全栈开发实习生工具调用失败怎么办?(重试、降级、报错)



