Agent 评测工程(01):我们要测什么,又希望从结果中知道什么?
从一个编码任务出发,厘清 Agent 评测的对象、测试依据与结论边界,建立从软件测试基础走向故障归因和持续改进的学习路线。
适合阅读:正在学习软件测试与 Agent 评测,希望用评测改进自己系统的开发者。
读完可以带走
- 先明确被测对象、成功标准和评测用途,再选择测试方法与指标。
- 软件测试提供基础方法;Agent 的行为与任务表现还需要在具体场景中验证。
- 从测出失败到解释原因,再到验证改进,需要逐步建立不同的证据。
开发 Pickel-Agent 的过程中,我越来越需要回答一个问题:改完一段提示词、一种上下文策略,或者换一个模型之后,怎么知道 Agent 真的变好了?
最直接的办法是让它做几件事,看看效果。但一次顺利完成,能说明修改有效吗?遇到一次失败,又应该改模型、工具,还是驱动它们工作的代码?如果以后希望系统自己发现问题、提出修改,这些判断还能只靠人的印象吗?
这也是我开始学习 Agent 评测的原因。不过,故障归因与自进化是这个系列希望逐步走到的地方。在此之前,我需要先学会更基础的事情:怎样设计一个测试,怎样判定结果,以及怎样从结果中得出有分寸的结论。
我对软件测试的方法论也还在补课。因此,这个系列会从具体任务出发,结合传统测试方法、公开基准和小型实验,逐步建立理解。第一篇先说明我们要研究什么,以及后续问题之间的关系。
从一个任务开始:什么才算做对了?
假设我们给一个编码 Agent 这样的任务:
修复这个仓库中配置文件缺失时的报错问题。缺失时应使用默认配置,已有配置的读取行为保持不变。
Agent 阅读文件、执行命令、修改代码,最后回复:“已修复,测试通过。”
这时至少有几件事值得检查。目标仓库里是否真的产生了修改?配置缺失时是否使用默认值?已有配置是否仍能正常读取?它执行的是哪些测试,测试结果又是什么?
这些检查有不同的依据。用户要求确定了需要满足的行为;已有功能提供了需要保护的回归条件;实际文件和测试结果提供了判断证据。Agent 的回复可以说明它声称完成了什么,但不能单独证明补丁有效。
不过,我们也不应该要求它必须修改某一行,或者严格按照预想顺序调用工具。只要满足任务要求,不同实现都可能是合理答案。如果测试只接受作者心中的那一种写法,就可能把正确解判错。
这个例子已经包含了测试设计的基本问题:
- 测什么对象? 是文件编辑工具,还是完成修复任务的整个 Agent?
- 依据什么判定? 是明确的功能要求、已有行为,还是需要进一步澄清的预期?
- 怎样获得证据? 检查文件、运行测试,还是审阅产物与执行记录?
- 结果支持什么结论? 是这一次任务成功,还是某项修改确实提高了表现?
这些问题要先于“采用哪个 benchmark”和“计算什么分数”。否则,我们可能有一个精确的数字,却说不清它代表什么。
被测的是哪个系统?
对于本文讨论的工具型 Agent,可以用 Model + Harness 理解它的运行组成。模型根据输入产生回复或动作;Harness 负责组织上下文、提供工具、执行调用,以及管理运行循环等。具体项目怎样划分模块可以不同,评测时需要明确实际纳入了哪些部分。
例如,同样是研究工具调用,我们可能测试两个不同对象:
一种测试直接调用文件编辑函数,检查替换、报错和路径限制是否符合约定。另一种测试给真实模型一个修改任务,让它自行寻找文件、选择参数、调用工具,再检查是否完成目标。
前者通过,说明工具在所测条件下按约定工作;后者才把模型如何使用工具也纳入了测试。反过来,完整任务失败,也不能立即说明文件编辑函数出了问题。
这就是明确边界的意义:测试范围决定了哪些行为进入观察,也限制了我们能够解释什么。
还需要区分两个容易混淆的 Harness。Agent Harness 驱动模型工作;Evaluation Harness 则组织评测,负责准备任务、启动运行、记录过程、调用评分器和汇总结果。Anthropic 的评测指南明确区分了这两个概念。来源:Demystifying evals for AI agents
对于 Pickel-Agent,前者是我们正在开发的系统,后者是未来需要围绕它逐步建立的实验设施。评测设施自身也可能出错,例如没有清理上次运行留下的文件,或者把合法结果判为失败。因此,看到失败时,被检查的对象也应包括测试本身。
软件测试已经提供了什么?
Agent 是软件系统,软件测试自然是理解它的一个起点。有状态、会调用外部服务、有多条执行路径、需要端到端验证,这些现象也存在于其他软件中,不能仅凭这些现象就认定传统方法失效。
我准备先借助软件测试中的几个基本概念,建立分析问题的方式:
| 基本概念 | 在编码 Agent 中怎样理解 |
|---|---|
| 规格与判定依据 | 配置缺失时应使用默认值;怎样检查这项行为? |
| 测试层级 | 分别测试工具、工具与运行系统的连接,以及完整任务 |
| 用例设计 | 除了正常配置,还要考虑缺失、空文件、非法内容等情况,并明确各自要求 |
| 隔离与测试替身 | 固定外部依赖或使用预设模型响应,检查特定机制 |
| 回归测试 | 修复配置缺失问题后,确认已有配置读取行为没有被破坏 |
这里尤其需要理解测试替身的作用。用预设的模型响应驱动循环,可以检查工具调用是否被正确分发,却没有测试真实模型会不会产生合适的调用。固定依赖有助于缩小问题范围,同时也缩小了结论范围。
基础学习可以参考 ISTQB 的软件测试基础大纲,从测试基础、测试层级和用例设计读起。我们的目标是能把这些方法落实到案例中,并解释每项测试的用途。
那么,接入模型之后,还需要关注什么?
在这个修复任务里,工具可以正确执行命令,但选择读什么、如何解释报错、怎样修改代码,包含了模型参与的判断。我们需要用具体任务检验这些行为,也需要观察它们在不同输入和重复运行中的表现。
行为由模型产生,并不意味着只能用另一个模型评分。 修复是否有效,仍然可以通过执行测试来检查。对于报告是否论证充分这样的要求,则可能需要明确的评分规约和人工判断。判断方式取决于要验证的性质,不能仅由组件是否使用 LLM 决定。
同样,“局部测试通过不能保证整体成功”是继续做系统测试的理由,但这也是普通软件测试一直面对的问题。后续文章会具体讨论已有方法怎样应用、哪里需要补充证据,避免先给所有困难贴上“Agent 特有”的标签。
Benchmark 的分数回答了什么?
学习 Agent 评测,很容易先遇到排行榜。但阅读一个分数之前,需要知道它背后的任务、运行条件和判定方式。
例如,τ-bench 构造了包含模拟用户、领域工具和政策的交互任务,并通过对话结束后的数据库状态检查目标是否达成。它已经包含具体业务规则,而非仅仅考察模型知道多少领域知识。来源:τ-bench 论文
GDPval 则研究职业知识工作中的交付物质量,原始研究使用专家盲评比较模型与人类产物。这样的判定方式与执行代码测试不同,因为它要评价的工作成果不同。来源:GDPval 原始说明
因此,公开 benchmark 可以作为评测设计的教材:它怎样选择任务,怎样准备环境,又怎样把“做好了”落实成可执行或可审阅的标准?
但它的任务和标准不一定代表我们的产品。一个模型在某套基准中表现更好,是值得进一步测试的线索;接入 Pickel-Agent 后是否更适合我们的任务,还需要验证。即使固定 Harness 比较模型,结果也仍然带着这套 Harness 和运行条件的限制。
公开或私有说明的是评测材料的可访问性;能力比较、功能验收、故障调查说明的是评测用途。两者不能直接画等号。我们可以借鉴公开基准的方法,再根据自己的任务建立测试,而不必在“打榜”和“产品测试”之间二选一。
从一次成功,到解释一次失败
回到配置修复任务。假设改完提示词后,Agent 成功了。这是一条观察,但它还不足以证明提示词改进有效:旧版本也可能成功,新版本也可能在再次运行时失败。
不同问题需要不同的证据:
| 想回答的问题 | 需要建立的证据 |
|---|---|
| 这次任务做对了吗? | 明确的要求、真实产物和可信的验收结果 |
| 这类任务通常做得怎样? | 有选择依据的任务集,以及必要的重复运行 |
| 新版本是否更好? | 可比较的条件、结果差异及其不确定性 |
| 为什么失败? | 执行记录、可复现案例,以及检验原因假设的实验 |
| 能否接受这次修改? | 针对性验证、其他任务上的回归检查与成本评估 |
例如,Agent 忘记了“已有配置行为保持不变”,可能是相关信息没有进入实际请求,也可能是信息仍在却未被正确使用。仅凭最终失败,无法区分这两种情况。我们需要观察模型实际收到的内容,再设计进一步检查。
记录轨迹有助于提出假设,但看见某一步异常,不等于已经证明它导致最终失败。模型有时能够恢复;多个组件也可能共同影响结果。更有力的判断,需要在可比较条件下改变相关因素,观察结果如何变化,并说明实验的限制。
这解释了为什么本系列会把故障归因放在后面:先能信任测试结果,再学习如何解释结果。将来让系统自动提出修改,也需要沿用这条证据链,检查修改是否有效、是否造成回归,以及收益是否仅限于反复调试的那些案例。
这个系列准备怎样展开?
后续学习会沿着下面的顺序推进,具体篇幅随实验结果调整:
- 构造第一个测试。 学习测试用例、规格、判定依据与测试层级,用同一个任务比较工具测试和完整 Agent 测试。
- 建立可信的验收。 检查结果、必要的过程约束与副作用,并用正确解、错误解和不同的合法解检查评分器。
- 组织评测实验。 准备可重置环境,记录版本、输入、预算和执行过程,区分任务失败与基础设施异常。
- 设计任务集并比较版本。 学习案例覆盖、任务采样、重复试验、统计不确定性,以及成功率与成本的共同解读。
- 调查失败并验证改进。 从实际案例出发,学习复现、组件替换和干预实验,再逐步探索持续改进的自动化。
每篇尽量留下一个可以检查的小产物:一份用例、一个验收器、一组运行记录,或者一次有边界说明的比较。文章中的结论也会区分资料介绍、实验观察和仍待验证的推测。
Pickel-Agent 会是贯穿这些学习的实践对象。它提供了真实的工具、上下文和运行循环问题;具体实验则尽量保持足够小,使失败能够被看懂,判断能够被检查。
下一篇先从最基本的一步开始:选定一个小任务,写清输入、环境和成功条件,分别测试它的工具与完整 Agent。完成以后,我们应该能解释这几个测试各自验证了什么,以及还有什么没有被验证。