你的Agent回了一句“搞定”。上周有个依赖包静默升级了。现在,你其实没办法证明Agent还在按老样子干活,因为你手里根本没有它之前是怎么干的记录。
三周前我就栽在这上面。合并了一个标记为“安全”的Dependabot补丁更新——SemVer说没问题,CI流水线全绿。三天后,有用户反馈Agent跳过了以前一直会跑的关键步骤。更让人恼火的是,我的测试套件完全没捕获到。因为我所谓的“测试”,就是手动跑一次Agent,翻翻生成的对话文本,看一眼觉得还行就过了。Agent每次都说“已完成”。它不是在故意撒谎。它只是没办法知道自己漏了东西,而我也没办法检查出来。
真正的问题隐藏在那句“怎么证明Agent做了它声称的事”底下:跟什么比?如果你连一个确定正确的运行记录都没有,谈论“验证”就毫无意义。
你的对话文本不是凭据
第一反应通常是去重读Agent生成的对话摘要。但超过三五轮对话,这件事就彻底做不下去了。更要命的是,那段对话本质上是Agent自己的叙述。如果它声称写入了文件但实际没写,那份摘要仍然会白纸黑字地写着“文件已写入”。
你真正需要的是最底层的原始数据:它发起了哪些工具调用,传入了什么参数,拿到了什么样的返回值。不是故事,是收据。
记录一次真正跑通的运行
后来我找到的办法极其朴素,恰恰因为朴素才真的有用。趁Agent还在正常干活的时候,完整记录一次真实运行。把这次抓取当作后续一切的比对基准。
具体就一条命令:用reelier工具记录一次确认无误的Agent运行。它会抓取每一个工具调用、对应参数以及执行结果。这不是模拟数据,也不是手动编写的测试桩。这就是Agent刚才真实完成的工作,一步接一步,原封不动。那张你一直缺的收据,现在有了。
零成本回放与差异检测
真正的价值在于后续操作。每当环境发生变化——不管是哪个依赖升了版本,还是MCP工具服务器打了补丁,又或者你重构了代码——只管回放这份记录,然后把输出结果和最初那条基准做差异对比。
这条回放指令的设计很实用:回放时不调用任何大语言模型。这意味着全程不消耗生成式AI的推理token。在我实际运行中,连续回放1000次,1000次全都字节级一致。正是这种确定性让diff结果变得可信。如果比对发现差异,那一定来自你刚刚做的变更,而不是模型今天“感觉不太一样”。
要是更新没改变任何东西,diff输出就是空的,你可以放心合并。如果某个工具调用变了、某个参数被改了、某个返回值出现了偏移,diff会在被用户察觉之前,精确地告诉你变在哪儿、怎么变的。
在CI流程里,全量diff是给人看的。自动化检查一般只需要关注具体断言:这个工具必须被调用,那个参数必须维持原样。把关键约束写进测试,以后每次变更,先过机器那关。
热门跟贴