ai / 20260727
10. 如何防止有副作用的操作重复执行
重试模型请求主要增加计算,重试发送、支付或创建操作还可能改变外部世界
假设 Agent 调用工具发送一封邮件。服务端已经接受请求,本地进程却在保存结果之前退出。恢复后,日志里只有“调用开始”,没有“调用完成”。
此时直接重试,收件人可能收到两封邮件。
幂等解决的是什么
幂等表示同一个操作执行一次或多次,外部可观察结果相同。读取文件天然接近幂等;发送消息、创建订单和追加记录一般不是。
运行时可以为有副作用的调用生成幂等键。服务端看到相同键时返回第一次结果,而不是再次执行。
| 字段 | 作用 |
|---|---|
operation_id | 运行时内部动作标识 |
idempotency_key | 外部服务去重标识 |
request_fingerprint | 确认参数没有变化 |
external_id | 外部系统返回的资源标识 |
status | 开始、完成或未知 |
幂等键必须与具体参数绑定。若参数变化却复用旧键,运行时可能错误返回旧结果。
三类工具采用不同恢复方式
| 工具类型 | 示例 | 中断后的处理 |
|---|---|---|
| 只读 | 读取文件 | 可以重试 |
| 可查询副作用 | 创建工单 | 先按幂等键或外部标识查询 |
| 不可查询副作用 | 无回执的发送 | 标记未知并请求人工确认 |
不能因为所有工具都使用同一个调用协议,就对它们使用同一种重试策略。
先记录意图,再执行动作
工具执行前,运行时先持久化参数摘要、权限结论和幂等键;外部调用完成后再保存外部标识和结果。这个顺序缩小了“外部已执行、本地没有任何记录”的窗口。
它仍不能消除所有不确定性。网络超时可能发生在服务端完成之后、响应到达之前,所以服务端幂等支持或状态查询仍然重要。
模型不应决定是否安全重试
模型可以根据错误说明提出重试,但最终判断需要工具元数据:
- 操作是否有副作用。
- 服务端是否支持幂等键。
- 当前状态是否可查询。
- 已经重试多少次。
- 用户授权是否仍然有效。
这些是确定性信息,不应只通过自然语言提示交给模型判断。
故障实验怎样做
在工具返回成功后、写入 tool.completed 前强制终止进程。恢复时检查:
- 是否复用相同幂等键。
- 是否先查询外部状态。
- 是否避免再次请求用户批准同一动作。
- 参数变化时是否生成新操作。
- 无法确认时是否进入
unknown,而不是自行重试。
“最多重试三次”只能限制重复次数,不能防止重复副作用。可靠恢复依赖动作语义、持久化顺序和外部接口共同支持。
版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。
(采用 CC BY-NC-SA 4.0 许可协议进行授权)
本文标题:10. 如何防止有副作用的操作重复执行
本文链接:https://www.sshipanoo.com/blog/ai/agent-runtime-lab/10-防止副作用重复执行/