LLM 超时重试:用幂等键防止重复执行
LLM 调用超时后可能已完成推理,盲目重试会重复消耗令牌并触发业务副作用。文章建议每次用户操作生成固定幂等键,重试时复用,并在业务侧保存键与结果,结合退避机制处理失败。
原文暂未完整获取,基于公开信息的快读
LLM 调用超时,不代表模型没有完成推理。客户端没收到响应就重发,可能再次消耗令牌,还让消息落库、通知发送或用户扣点执行两遍。dev.to 上一篇由 AI API gateway OROO Blue 团队撰写的文章,提出用固定幂等键串起一次用户操作的所有重试,并在业务侧保存处理结果。
目前能确认什么
核心做法是「一次操作,一个键」:用户点击发送或提交表单时生成幂等键(idempotency key),后续重试复用它,每次 HTTP 请求都重新生成会失去去重作用。
业务侧也要保存键与结果,在写入回复、发送通知或扣点前检查是否处理过。幂等性的目标,是让同一操作重复提交后仍保持相同的业务结果。数据库唯一约束能防止并发请求写入重复记录;通知等外部操作,还需要配套的执行状态管理。
重试也要区分错误。节选建议对超时、连接重置、限流和临时服务端错误重试,遵守 Retry-After 提示;参数、认证和校验错误则直接失败。指数退避加随机抖动用于错开重试时间,同时限制次数和总等待时间。
业务侧去重,不能直接保证模型侧只推理、计费一次。
我的判断
对程序员而言,最先该改的是操作标识的生命周期。前端自动重试若每次都生成新键,后端便无法识别它们属于同一次提交;按钮禁用只能减少重复点击,无法覆盖网络重试。
还要区分业务扣点与服务商计费:前者可以在自己的系统中控制,后者取决于服务商或网关的幂等支持。节选没有交代键的有效期、处理中请求如何响应,以及结果保存与副作用执行之间如何保证一致性,不能把传入一个参数当作完整方案。
流式响应中途断开尤其需要确认。复用键后返回完整结果、剩余内容还是错误,节选没有答案;在这些语义明确前,直接自动重发可能造成重复输出,甚至再次触发工具调用。