AI 智能体调用工具,失败是常态:接口超时、返回格式变了、服务临时不可用。失败的应对方式决定系统的成色——盲目立刻重试会把故障放大,坐等不管则让任务卡死。成熟的做法是一套章法:先判断该不该重试,再按退避节奏等,最后换路走。
先判断该不该重试
失败分两类。临时性失败:网络抖动、服务过载、超时,过一会儿自己就好,重试有价值。确定性失败:参数非法、权限不足、资源不存在,重试一百次结果也一样,重试纯属浪费。
判断依据主要看返回的错误码和错误信息:超时类、限流类可重试;校验类、权限类不可重试。拿不准的,重试一次试探,第二次仍然同样错误就转入确定性处理。这个判断要在框架层自动完成,不能指望模型每次都记得。
退避:越失败,等得越久
确定要重试,也不能立刻连发。指数退避是标准做法:第一次失败等一秒,第二次等两秒,第三次等四秒,逐次翻倍,封顶一个上限。这样做的理由是给故障方喘息时间——对方正在过载,你越急它越喘不过气,双方一起陷进去。
退避常配一点随机抖动:等待时间上下浮动一点,避免多个智能体在完全相同的时刻同时重发,形成新的冲击波。设重试上限同样必要,比如最多五次,到了就认输换路。
换路:备用工具与降级方案
重试用尽仍失败,就该换路。换路有三档。换备用源:同一个能力的另一家服务,主搜索挂了切备用搜索。换方式:网页抓取失败就改用接口,接口失败就改读缓存。降级:拿不到实时数据就明确标注「基于 X 日的缓存数据」继续,任务主体不中断。
三档换路换的东西不同,产物里怎么交代也不同。
| 换路档位 | 怎么换 | 原文里的例子 | 产物里怎么交代 |
|---|---|---|---|
| 换备用源 | 同一能力的另一家服务顶上 | 主搜索挂了切备用搜索 | 说明用了备用的来源 |
| 换方式 | 一条取数路径走不通,换另一条路径 | 网页抓取失败改用接口,接口失败改读缓存 | 说明换了取数方式,别当成第一手数据 |
| 降级 | 拿不到实时数据,标注后继续,任务主体不中断 | 标注「基于 X 日的缓存数据」 | 把标注写进产物,让下游看得见 |
换路的关键是如实标注:用了备用的、用了缓存的,都要在产物里说明,别让下游把降级结果当成第一手数据。海螺AI这类深度调研产品在信息源不稳定时的多源备选、纳米AI的多引擎聚合,都是换路思路的产品化。
重试的上限与刹车点
退避加换路都有尽头。全部走完仍失败,任务进入失败处理:向主管如实报告失败在哪一环、试过哪些路,附上错误记录,由主管决定补偿、改派还是终止。错误信息要原样留存——失败现场是排查的第一手材料,抹掉错误详情只写「调用失败」,等于烧掉证据。
还有一条容易被忽略:重试前先确认重复执行是安全的。加了幂等保护的操作可以放心重试,没有保护的写操作重试一次就可能多一份副本。
重试章法四步
- 分类:临时性可重试,确定性不重试
- 退避:指数加随机抖动,封顶设上限
- 换路:备用源、换方式、降级,如实标注
- 收尾:走完仍败则报告,错误原样留档
检查你的智能体配置:重试几次、间隔多少、备用路径是哪条,三个数都说得出,容错就算及格。
相关词条:重试安全的前提,见什么是幂等设计?重复执行不出乱;派给别人的任务失败怎么改派,参考多 Agent 是怎么分派任务的?与两个 Agent 冲突了怎么处理?;受控环境里的失败怎么看,见沙箱是怎么隔离的?文件与网络,每一步都讲透;网页类调用失败的常见原因,看网页改版了 Agent 怎么办?元素漂移。
工具重试快问快答三则
- 重试次数越多越稳妥吗?:不是。超过合理次数的重试大多在骚扰已故障的服务,还烧自己的预算,五次封顶加换路远比无限重试有效。
- 重试要通知模型吗?:框架层的静默重试不必打扰模型;换路或最终失败时必须如实告知,模型据此调整后续计划。
- 退避时间怎么定起点?:从半秒到一秒起步都行,关键是倍率翻涨加上限,再留随机抖动,不必追求精确数值。


