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 从演示走进生产的开始。