加载中...
加载中...
Agent 的一次工具调用在工程上会经过模型生成参数、执行前持久化、执行器发出请求三个阶段,每个阶段都可能因为超时、崩溃或重试而重放一次——三次重放造成的业务后果完全不同。上线前把这三次断点分别打穿,验证重放后副作用只生效一次,这是工具调用层最容易漏、也最容易造成重复扣款与重复发报的一关。
Agent 的一次工具调用在工程上会经过三个阶段:模型生成参数、执行前持久化、执行器发出请求。每个阶段都可能因为超时、进程崩溃或重试而重放一次,而三次重放造成的业务后果完全不同——第一次是同一业务意图被执行两次,第二次是请求可能从未发出却显示成功,第三次是请求已生效但 Agent 以为失败。上线前把这三次断点分别打穿,验证重放后副作用只生效一次,这是工具调用层最容易漏、也最容易造成重复扣款与重复发报的一关。
以下 5 项测试按三个断点顺序打穿,外加不确定态与端到端压力两项,帮你把「重试安全」从「应该没问题」验到「账能对平」。
测试一:断点一重放测试(模型重规划)
测试二:断点二重放测试(状态落库后进程崩溃)
测试三:断点三重放测试(请求已发出但响应丢失)
测试四:不确定态重试安全性测试
测试五:端到端重试压力与幂等性测试
补充参考实现:Temporal(https://temporal.io)的 Activity 重试与幂等设计、AWS Step Functions(https://aws.amazon.com/step-functions/)的 Task 级重试语义,可以拿来对照自己的实现是否漏了防重表与状态查询。
最常见的漏法:状态机、幂等键都做了,但 Agent 在同一个业务意图上因为结果不满意而重新规划,两次生成了相同的工具调用参数。执行器因为调用来源不同、请求 ID 不同而去重失败,业务被执行两次。正确做法是对工具调用本身做签名(工具名加规范化参数),在生成层就拦掉重复意图,执行器幂等只是第二道防线。
连接中断和网关超时是「不确定态」——请求可能已经到了外部系统并且已经生效,只是响应丢了。此时重试等于再执行一次;而按参数错误处理直接放弃,又会丢单。唯一安全的路径是先按客户端请求 ID 查询外部系统当前状态:查到了就采用查询结果,查不到才允许带原幂等键重试。把这两种错误混在一个重试策略里,是生产事故的高发区。
无间隔立即重试会把下游的瞬时过载放大成雪崩:下游已经返回 503,上游还在每秒重试十次。同时必须做错误分类——参数错误重试永远不会成功,只是浪费时间和配额;服务不可用与超时才允许指数退避重试;不确定态转查询。缺少分类的重试策略,在演练中表现为「故障恢复时间比不重试还长」。
「分享到微信」:手机浏览器打开时一键调起系统分享面板,选择微信即可分享到朋友圈或聊天。电脑上回退为复制文案。
暂无留言,来说两句吧