AI 智能体的 PRG 模式

AI 智能体正在遇到一个老问题。这和 90 年代导致 Web 表单崩溃的 Bug 是同一个。

在早期的 Web 时代,用户会提交一个表单。如果他们点击刷新,浏览器会重新提交数据。这意味着会出现两次订单、两次扣费或两封邮件。

解决方法是 Post/Redirect/Get (PRG) 模式。

逻辑很简单:

  • 用户发送一个 POST 请求。
  • 服务器处理任务。
  • 服务器向新 URL 发送 302 重定向。
  • 浏览器通过 GET 请求跟随重定向。

现在,刷新只会重新加载结果页面,而不会重复执行操作。

AI 智能体将这个 Bug 带到了一个新的层面。

当智能体调用工具进行扣费或创建记录时,问题就出现了。网络掉线、容器重启、触发速率限制。智能体不知道上一次调用是否成功,因此它会进行重试。

如果没有修复措施,智能体会创建重复订单并导致客户愤怒。

你必须通过使用幂等键(idempotency keys)将 PRG 模式应用于你的智能体流水线。

幂等键就是你的“重定向”。它将操作与结果分离开来。

如何实现:

  • 每个具有变更性质的工具都必须接受一个幂等键。
  • 在第一次尝试之前生成该键。
  • 从用户意图中派生键,而不是从时间戳。
  • 服务器必须检查之前是否见过该键。
  • 如果键已存在,则返回存储的结果,而不是再次运行任务。

对于长任务,你需要的不仅仅是一个键,还需要检查点机制(checkpointing)。

检查点机制会在每一步保存状态。如果智能体在执行一个 20 分钟的任务中途崩溃,它会从上次中断的地方继续,而不是重新开始。

如果你只能做一件事,那就确保每一次工具调用在运行两次时都是安全的。

使用以下五项检查来构建你的智能体:

  • 每个工具都接受幂等键吗?
  • 键是基于意图而非时间的吗?
  • 每次重试时是否复用了同一个键?
  • 对于重复的键,服务器是否返回存储的结果?
  • 对于长任务,中间步骤是否已保存?

模式是一样的,改变的只是层面。

Source: https://dev.to/ravikiran438/the-prg-pattern-for-ai-agents-a-25-year-old-fix-coming-of-age-in-a-new-era-23fh