Agent 系统到底怎么测,别再只盯着最终答案了

让一个 Agent 查客户最近三个月的投诉,再写一段摘要,看起来是个很普通的任务。

它最后交出了一份像样的文字。

可如果它中途把客户标签改了,读了不该读的内部备注,或者遇到超时后重试十几次,把一笔本来几分钱的任务跑成了几十块,这个 Agent 算成功吗?

我觉得不算。

这就是很多团队刚开始做 Agent 时最容易掉进去的坑。大家把注意力都放在最终答案上,测它答得对不对、文案顺不顺、任务有没有完成。可 Agent 和一个只负责生成文字的模型不一样,它会计划、会选工具、会读写外部系统,还会在多轮交互里改变自己的下一步。

它不是一个会说话的函数。

它是一个会在真实世界留下痕迹的执行者。

所以 Agent 测试也不能只是一场答题考试。它得是一条证据链,目标有没有完成、过程有没有跑偏、工具有没有越界、环境最后变成了什么样、线上失败能不能回到回归集里。

这篇文章想讲清楚一件事。测 Agent,要从答案正确性,走到行为正确性。

一个看似很小的变化

传统软件测试建立在一个舒服的前提上。输入、代码和状态都固定时,输出应该可重复。

给函数传入两个数,结果对不对。给接口一个非法参数,它会不会拒绝。给用户一个错误密码,登录页有没有拦住。这些问题很适合单元测试、集成测试、CI 回归。它们依然重要,Agent 也逃不掉。

工具 wrapper 要校验参数,文件操作要限制路径,数据库写入要有事务和权限,模型吐出非法 JSON 时 parser 不能直接崩,状态机也不能带着任务原地绕圈。

这部分必须硬。

但 Agent 最难的地方,往往发生在所有零件都没有坏的时候。

它调用了一个合法工具,参数格式也对,返回值也没报错。只是用户让它总结投诉,它却决定顺手修改客户标签。用户让它找文件,它为了少走两步,把临时目录删了。用户让它修一个 bug,它交出一个能过当前测试、却悄悄破坏边界条件的补丁。

这类失败,不是单元测试失灵。

是测试对象变了。

Agent 的输入不再只是一段文本。它还背着 prompt、模型、工具、记忆、权限、外部状态、网络延迟和多轮上下文。它每走一步,都可能把此前一个小小的误解放大一点。

这也是为什么,公共基准的早期结果看起来会让人有点清醒。WebArena 让 Agent 在可复现的网站里完成真实网页任务,论文中的最佳 GPT-4 系统端到端成功率是 14.41%,人类是 78.24%。OSWorld 把任务搬进真实桌面、网页、文件 I/O 和跨应用场景,369 个任务中,人类完成率超过 72.36%,当时最佳模型是 12.24%。

不是模型不知道答案。

很多时候,它只是不会把事情做完。

最终答案为什么不够了

聊天机器人交付的是文本,最终答案当然很重要。

Agent 交付的却是行动后的结果。一个订单 Agent 说退款已处理,这句话没什么价值,真正的价值在退款金额、订单状态、政策判断、用户确认和审计记录里。一个代码 Agent 说 bug 已修复,也只是一张收据,真正值得看的是 patch、测试结果和影响范围。

τ-bench 把这件事做得很直白。它不只看对话写得好不好,而是比较一段多轮交互结束后的数据库状态,是否真的等于目标状态。它还提出了 pass^k 这个可靠性指标,因为跑一次成功不叫稳定。论文中,最强的函数调用 Agent 在零售场景里连续跑八次,pass^8 低于 25%。

一次 demo 成功,真的只能说明一次 demo 成功。

所以,一个能上线的 Agent,至少要同时回答四个问题。

一,结果有没有完成用户目标。

二,它走的路合不合理。

三,它有没有碰不该碰的东西。

四,同样的任务多跑几次,还能不能稳住。

这四个问题里,只有第一个能单靠最终答案回答。

先写一份测试宪法

很多团队上来就收集 benchmark,或者急着选一个评估平台。我更建议先停一下,写几条所有人都同意的硬规则。

一个退款 Agent 的成功不是退款成功,而是正确解释政策,并在符合条件时创建退款草稿。它绝对不能未经确认直接退款,不能泄露内部风控标签。超过一定金额、身份无法确认、政策冲突的情况,必须交给人工。

这不是文档工作。

这是系统的宪法。

没有它,后面的测试指标会不停摇摆。今天大家觉得成功率重要,明天发现越权了才想起来补一条权限规则,后天又因为成本太高开始加限制。Agent 最容易在这种补丁式治理里长成一个谁都说不清边界的黑盒。

把下面这四件事写清楚,测试就已经赢了一半。

需要写清楚的事 例子
任务成功 正确解释政策,只创建退款草稿
绝对禁止 未确认退款,读取内部风控标签
必须确认 大额退款,身份不明,跨账户操作
可接受代价 单次工具调用数、时延、模型成本的上限

模型可以负责概率判断。

权限、金额、审批和事务边界,还是交给确定性的代码。

一套够用的测试矩阵

不用一上来就做一个巨大的评测平台。对大多数团队,一条从本地到线上的测试路径已经能挡住大量事故。

阶段 要问的问题 最可靠的证据
本地开发 工具和边界有没有低级错 单元测试、schema 校验、mock
CI 这次改动有没有让核心任务退化 小而稳定的 golden tasks 和程序断言
预发 在接近真实的环境里会不会出错 sandbox、历史 trace 回放、故障注入
线上 真实用户和真实工具发生了什么 trace、环境 diff、成本与延迟告警

本地阶段追求快。模型调用可以 mock,工具结果可以固定,几秒或几分钟内告诉开发者,参数校验、权限检查、parser、终止条件有没有被改坏。

CI 阶段追求硬。每条核心 workflow 准备十几个高质量样本,比一千条来源不明的题目更有用。查询任务不该调用写工具,简单查询不该超过五次调用,敏感字段必须来自授权范围,这些都应该是程序断言,不该交给一个 judge 凭感觉打分。

预发阶段追求真。Mock 只能告诉你接口长什么样,sandbox 才能告诉你状态变化后会发生什么。网页任务看页面状态,代码任务跑测试,文件任务看 diff,数据库任务看字段。让 Agent 自己说我完成了,没有用。

线上阶段追求变化。模型会变,工具会变,用户也会变。把差评、重试、人工接管、异常步数、权限拦截和高成本任务留下来。它们不是脏数据,反而是下一版系统最值钱的测试集。

测试集不是一次性写完的。

它会从生产里长出来。

Agent 最该留下的东西,是 trace

一个成熟的 Agent 系统,应该能把一次任务还原出来。

它看到了什么上下文,做了什么计划,调用了哪个工具,参数是什么,工具返回了什么,guardrail 有没有拦截,环境状态前后变了什么,最后花了多少 token、多少钱、多少时间。

这条记录就是 trace。

有了 trace,失败才不是一句用户说它不好用。你可以分清,是检索拿错了文档,还是 planner 走偏了,是工具超时后重试失控,还是权限层本来就留了洞。

没有 trace,Agent 事故像雾里看花。

有了 trace,它才像一个能复盘的生产系统。

OpenAI 的 Agent eval 指南把工作流评估拆到任务、轨迹和评分器上,这个方向很重要。语义是否清楚、解释是否贴切,可以交给 LLM judge 辅助判断。可权限、金额、数据库状态、文件差异、调用顺序,都应该让程序断言来做最后裁决。

Judge 很有用。

但它不是裁判之神。

它会偏爱更长的答案,也可能被漂亮文案骗过去。高风险任务里,一个好用的做法是自动筛查、人工抽审,再把分歧样本和事故样本永久放进回归集。

Benchmark 是体检,不是驾照

AgentBench、WebArena、OSWorld、SWE-bench、τ-bench 这些工作很有价值。它们让我们知道不同模型和 scaffold 的能力边界,也让行业早一点看到,会聊天和会干活是两回事。

但别把分数直接搬进上线结论。

一个 SWE-bench 分数很高的代码 Agent,不等于它可以安全修改你的仓库。一个网页 benchmark 表现不错的 Agent,也不等于它能处理你的审批流、内部权限和真实数据。公共基准测试的是公共任务,你要上线的却是你的业务风险。

把 benchmark 当成能力雷达,很合适。

把它当成生产验收,太危险。

真正的上线门禁,还是要回到自己的 workflow。自己的客户数据,自己的工具 schema,自己的审批规则,自己的高风险动作,自己的失败历史。

安全测试不能只测它会不会拒绝

Agent 的安全问题,比普通聊天机器人更硬一点。

聊天机器人被 prompt injection,可能说了不该说的话。Agent 被 prompt injection,可能读文件、发邮件、写数据库、删记录。风险从语言层走进了行动层。

所以安全测试不能只问,它会不会拒绝一段恶意提示。还要问恶意网页、邮件、文档和工具返回里的指令,能不能钻进工具参数。要问用户有没有授权这笔写入,要问跨租户检索会不会混入别人的数据,要问遇到权限拒绝和 API 超时时,它会不会死循环。

每发现一个攻击样本,都把它留下来。

每补一个 guardrail,都让它以后一直跑。

安全演练如果不能进入 CI 和预发,很容易变成一次热闹的表演。

最后,给智能修路

我一直觉得,Agent 测试不是在限制智能。

它是在给智能修路、装护栏、放路标,也给它装一个能回看的黑匣子。

模型适合处理开放问题、模糊语言和不完整信息。确定性的工程系统则负责权限、状态、审计、回滚和边界。两者不是谁替代谁,而是该各自站在自己擅长的位置。

别再只问这个 Agent 最后答对了吗。

多问一句,它为什么这么做,它碰了什么,它留下了什么,下一次还会不会这样做。

这才是一个 Agent 从演示走进生产的开始。

参考资料