1. 引言:工具调用失败是一种常态,而不是意外
在 LLM Agent 系统中,"模型能不能调用对工具"只是入门题,"工具调用失败之后系统还能不能安全、优雅地继续运转"才是量产的分水岭。
很多人对 Agent 的认知停留在 Demo 阶段:模型输出一个tool_call,执行器跑一下工具,把结果塞回上下文,大功告成。但在真实生产环境里,这条链路每一环都可能断裂:
- 模型输出的 JSON 参数不合法,工具直接抛
ValidationError; - 第三方 API 返回
429 Too Many Requests或500 Internal Server Error; - 工具执行超过预设的 30 秒超时,任务被强制中断;
- 上游数据库短暂不可用,查询接口报连接池耗尽;
- 模型幻觉出一个根本不存在的工具名,调度器找不到实现;
- 网络抖动导致响应体只收到一半,客户端解析失败。
工具调用失败不是小概率事件,而是分布式系统里的必然事件。一个由多个工具调用串联而成的 Agent 工作流,假设单次工具调用成功率为 99%,那么一个需要 20 次工具调用的任务,整体成功率只有约 82%;如果是 50 次调用,成功率会跌到 60% 左右。这还没有考虑模型本身的非确定性。
因此,任何一个打算上生产的 Agent 系统,都必须把"失败处理"当作一等公民来设计,而不是在最后一刻打补丁。这正是本文要系统探讨的主题: