Skip to content

约 4 分钟阅读

让 Agent 拿出证据:验证的五级台阶 ​

实战手记第 04 篇

第一篇提到过 Agent 的“假完成”:它把手头最接近的信号当成结论,报告“已合并”“已通过验收”,而事实并非如此。上一篇的规则能挡住危险操作,挡不住这种问题,因为它没有做任何违规的事,只是说多了。

这一篇讲我怎样要求 Agent 交出证据,以及怎样读这些证据。核心只有一点:每一份证据都要说清它证明到哪一级。读完你应该能看着一份 Agent 的完成报告,判断它到底证明了什么、还缺什么。

证据的五级台阶 ​

验证证据的五级台阶

从左到右,证据离用户真实看到的结果越来越近。

能编译只说明语法和依赖没问题,能打出包。

单元测试验证函数和状态在给定输入下的行为,包括边界和失败用例。

模拟集成用夹具、Mock 或本地浏览器把几个部件串起来跑,比如在本地 Chrome 里模拟语音厂商的协议往返。它能发现接口对接的问题,但对面不是真的服务。

真实调用连接真实服务、真实设备、真实音频,样本通常有限,环境要写明。

线上回读是在发布以后,用真实的业务路径把结果读回来,和发布前对比,并记下时间,保留回滚入口。

台阶越高,证明的事情越多,成本和风险也越高。不是每个任务都要走到最高一级,但每份证据都要标明自己在哪一级。“测试通过”这四个字本身没有信息量,“本地 Chrome 加厂商协议 Mock,48 项网页测试通过”才有。

项目里的证据长什么样 ​

语音交互平台的每次改动跑 418 到 426 项 Rust 回归和 16 项公网门禁。浏览器测试用真实的 Chrome 和 WebAudio,但厂商协议是本地 Mock,验收文档里明确标注这部分是模拟。

全双工语音服务有 663 项客户端测试、几十项网关测试和 48 项网页测试,这些都在前四级以内。真正回答“能不能上线”的,是一次 8 路真实并发的稳定性测试:0 错误,输入延迟 p99 为 89 毫秒,环境是一台指定型号的 GPU 服务器。

私有化识别交付有 105 项测试和 3024 处数值比对,加上 14 次真实 WebSocket 会话。交付包里的授权文件,每一份副本发出前都要核对 SHA-256,和目标机器的授权一致才能发送。

博客和作品集也一样。作品集仓库的检查脚本有 171 项页面检查,覆盖每个案例页的章节、图片加载、桌面和手机宽度下的横向溢出。截图压缩用无损编码,并逐像素比对压缩前后完全一致。

三个容易误读的地方 ​

模拟冒充真实。 会议纪要应用要验证“录制浏览器标签页的声音”。自动化验证时踩到两个坑:Playwright 默认会给浏览器静音,标签页采集到的其实是一段静音;用来跳过权限弹窗的通用参数返回的是系统默认音源,并没有走标签页采集。后来改用真实 Chrome 播放一段 440 Hz 的正弦波,再检查采集到的音频和原始波形是否相关,这才算标签页采集通过。

跳过算作通过。 测试框架报告“50 项通过,3 项跳过”时,Agent 很容易写成“全部通过”。官网项目的规则专门写了一条:跳过的检查不算通过,要单独列出原因。

局部成功外推成整体结论。 云平台国内区域的一次发布,几个服务的部署流水线都是绿的,发布期间 Agent 持续探测接口约 1800 秒,记录到 11 次 502、503 或 504。结论因此写成“发布期间有少量失败请求”,没有写“零中断”。同一天的生产整体回归也没有通过,因为其中一项能力没有可用的后端。单个部署成功和整体可用,是两个需要分别回答的问题。GitLab 那次版本升级也一样,维护窗口约 2 分 46 秒不可用,记录里就照实写。

让 Agent 主动写清范围 ​

我读完成报告时看三部分:改了什么;实际运行了哪些检查,各自在哪一级、什么环境;哪些没有验证,原因是什么。电商项目的规则把其中一条写死了:最后的回复必须列出实际运行过的测试命令。

第三部分最重要,也最容易被省略。一份写着“真机长时间通话、回声消除、外部告警尚未验收”的报告,比一份只写“全部完成”的报告有用得多:前者告诉我接下来要安排什么,后者让我在上线以后才发现问题。

还有一个细节:当 Agent 没能复现某个失败时,要区分“方法不行”和“当时的条件不对”。一个回归脚本因为启动时序失败,不能记成算法失败;22 组扩展回归里有 6 组没过,Agent 独立复现以后确认是模型能力问题,不是界面问题,才把结论写进报告。

总结 ​

证据要标明它站在哪一级:能编译、单元测试、模拟集成、真实调用、线上回读。模拟环境要标注,跳过的检查要单独列出,局部成功不能外推成整体结论。完成报告里,“还没验证什么”和“验证了什么”同样重要。

即便有了规则和证据,Agent 仍然会出错,有时还会把小错放大成线上事故。下一篇复盘四次真实的出错经历。

别急,先让缓存热一下。