假设 Agent 调用工具发送一封邮件。服务端已经接受请求,本地进程却在保存结果之前退出。恢复后,日志里只有“调用开始”,没有“调用完成”。

此时直接重试,收件人可能收到两封邮件。

幂等解决的是什么

幂等表示同一个操作执行一次或多次,外部可观察结果相同。读取文件天然接近幂等;发送消息、创建订单和追加记录一般不是。

运行时可以为有副作用的调用生成幂等键。服务端看到相同键时返回第一次结果,而不是再次执行。

字段作用
operation_id运行时内部动作标识
idempotency_key外部服务去重标识
request_fingerprint确认参数没有变化
external_id外部系统返回的资源标识
status开始、完成或未知

幂等键必须与具体参数绑定。若参数变化却复用旧键,运行时可能错误返回旧结果。

三类工具采用不同恢复方式

工具类型示例中断后的处理
只读读取文件可以重试
可查询副作用创建工单先按幂等键或外部标识查询
不可查询副作用无回执的发送标记未知并请求人工确认

不能因为所有工具都使用同一个调用协议,就对它们使用同一种重试策略。

先记录意图,再执行动作

工具执行前,运行时先持久化参数摘要、权限结论和幂等键;外部调用完成后再保存外部标识和结果。这个顺序缩小了“外部已执行、本地没有任何记录”的窗口。

它仍不能消除所有不确定性。网络超时可能发生在服务端完成之后、响应到达之前,所以服务端幂等支持或状态查询仍然重要。

模型不应决定是否安全重试

模型可以根据错误说明提出重试,但最终判断需要工具元数据:

  • 操作是否有副作用。
  • 服务端是否支持幂等键。
  • 当前状态是否可查询。
  • 已经重试多少次。
  • 用户授权是否仍然有效。

这些是确定性信息,不应只通过自然语言提示交给模型判断。

故障实验怎样做

在工具返回成功后、写入 tool.completed 前强制终止进程。恢复时检查:

  1. 是否复用相同幂等键。
  2. 是否先查询外部状态。
  3. 是否避免再次请求用户批准同一动作。
  4. 参数变化时是否生成新操作。
  5. 无法确认时是否进入 unknown,而不是自行重试。

“最多重试三次”只能限制重复次数,不能防止重复副作用。可靠恢复依赖动作语义、持久化顺序和外部接口共同支持。

版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:10. 如何防止有副作用的操作重复执行

本文链接:https://www.sshipanoo.com/blog/ai/agent-runtime-lab/10-防止副作用重复执行/