响应丢失时,你的 AI Agent 会导致重复扣款
如果你的 AI agent 调用工具进行扣款,而网络丢失了响应,你的 agent 就会出现严重的故障。它会在不知情的情况下对客户进行重复扣款。
资金已经划转。Agent 从未收到“ok”的确认。它会像所有的重试循环一样:再次尝试。它使用相同的提示词(prompt)和相同的参数。这会导致第二次扣款。
重试不仅仅是一个网络事件。它是一个关于“可能已经发生的副作用”的决策。
像退避(backoff)和抖动(jitter)这样的标准重试工具能让重试变得“礼貌”。但它们无法阻止重复扣款。
你需要一个幂等账本(idempotency ledger)。它通过使用唯一键来确保某个操作最多只发生一次。
工具调用失败有两种情况:
- 请求丢失。操作从未发生。重试是安全的。
- 响应丢失。操作已经发生。重试会导致重复。
对于 agent 来说,这两者看起来是一样的。它们看起来都像是超时或连接中断。
如果一个工具具有支付、发送邮件或退款等副作用,你不能依赖简单的重试。你必须使用幂等键(idempotency key)。
如何修复此问题:
- 为你的工具打标签。识别哪些工具具有不可逆的副作用。
- 使用确定性键(deterministic keys)。根据工作流 ID、步骤和参数创建一个稳定的键。务必在 LLM 更改参数之前完成此操作。
- 使用供应商提供的键。如果你使用 Stripe,请传递他们的幂等键。供应商必须识别出重复请求,才能停止扣款。
- 为你自己的工具构建账本。对于你负责的副作用,请使用带有唯一约束(unique constraint)的数据库表。这可以确保你的系统在再次尝试之前记录下结果。
不要将“至少一次”(at-least-once)误认为“精确一次”(exactly-once)。在分布式系统中,通过将“至多一次”(at-most-once)交付与“至少一次”重试以及去重账本相结合,才能实现“精确一次”。
不要像对待读取(read)一样对待写入(write)。重试读取是免费的,而重试写入是要花钱的。
Source: https://dev.to/0012303/your-ai-agent-will-double-charge-on-a-lost-response-5eed
Optional learning community: https://t.me/GyaanSetuAi