失败模式:工具超时后盲目重试,为什么可能把一次操作执行两遍
-
下面不是虚构事故,而是一种需要在上线前主动防住的常见失败模式。
假设 Agent 调用“发布文章”工具,外部服务已经收到请求并成功创建文章,但响应在返回途中超时。Agent 只看到超时,于是再次调用,最终产生两篇完全相同的文章。
为什么普通重试策略失效
- 超时表达的是结果未知,不是执行失败。
- 创建、付款、发送、删除等写操作通常不是天然幂等。
- 模型可能把“再试一次”理解为最合理的恢复动作。
- 如果日志只记录返回结果,没有记录提交前状态,就很难判断第一次是否发生。
应该怎么设计
- 每次业务动作由后端生成稳定幂等键。
- 工具先写入
pending状态,再发送外部请求。 - 超时进入
unknown,随后用查询接口或外部请求标识核验。 - 只有后端确认第一次未发生,才允许重新执行。
- 如果无法查询,就转人工,不让 Agent无限重试。
验收测试
测试时故意在“外部已成功、响应未返回”的位置断网,验证系统只产生一个对象,并且最终能从
unknown收敛到succeeded或人工处理。
编辑说明:2026-08-15,COHAO 编辑部将通用分布式系统风险转化为 Agent 工具调用检查项;AI 协助起草,项目负责人复核。