前几天,我读了 The Agent Evals Handbook,分享了一些笔记。随后又做了 mini-agent,把 Agent 的循环变得具体:询问模型,执行工具,把结果交回去,再重复。
接下来,自然而然地想再做一个小型 Coding Agent 评测。
当 Agent 已经能读取文件、修改代码和运行测试,我们该怎样判断它是否真的做得好?修改了它的指令之后,又怎样知道它有没有变好?
我想做一个足够小、能够从头读懂的系统。下面跟着一个修复程序错误的任务,介绍这个想法。
1. 先决定怎样才算“完成”
把一段有错误的程序交给 Agent,请它修复。它读了代码,改了文件,跑了一项测试,然后回复:
修好了,测试通过。
它成功了吗?
文件可能改了,错误却还在;一个例子可能通过,其他行为却被破坏;它也可能没有执行自己声称执行过的检查。
所以,在尝试开始之前,就需要定义验收标准。
在这个项目里,主要成功标准是:最终程序通过对目标行为和回归问题的独立检查,并且 Agent 正常结束。通过这些检查,是它在检查覆盖范围内成功的依据,不代表程序对所有可能输入都正确。

2. 让它执行,同时保留依据
Agent 有三个工具:读取、写入和测试。它可以运行公开样例,也可以补充一些自己的小测试。
这些反馈帮助它决定下一步。为了评测,我还会保留执行轨迹、最终代码、测试结果和终止状态。
有了这些记录,失败就更容易解释。一次尝试可能因为修复错误而失败,也可能因为回复被截断、请求抛出异常,或轮次预算耗尽而失败。它们都影响交付,但需要采取的改进并不相同。
最终产物告诉我们交付了什么,执行记录帮助解释它是怎样得到的。
3. 独立检查结果
Agent 自己编写的测试有用,但它也可能把预期答案写错。同一种误解,可能同时出现在代码和测试里。
因此,我把执行过程中的反馈和最终验收分开:Agent 用测试推进修复,评测器则用独立准备的用例检查最终程序。
以允许选择多个物品的背包问题为例。一个错误的修复,如果只选择价值最高的单个物品,仍然可能通过部分样例。验收需要包含必须组合多个物品才能得到正确结果的情况。
我还会用带错误的初始程序、参考修复和一个故意写错的修复来检查评分器:它能不能区分这些情况?
信任分数之前,先检查评分方法能不能抓住你在意的错误。
4. 代码正确,与验证声明准确,是两件事
一次运行记录很好地说明了这一点。
Agent 在编辑前运行了公开测试。编辑之后,它运行了自己编写的六项测试。最终回复却声称,公开测试和补充测试都已通过。
最终程序通过了独立验收。但旧代码上的公开测试结果,并不能证明新代码也通过了同样的测试。

一次成功的修复,也可能附带没有依据的验证声明。
我用一个辅助 LLM 评审来检查这类声明,同时保留它的判断理由和错误。它有时无法返回有效结论,也尚未用独立的人类标注进行校准。因此,我把它的评估当作诊断依据,而不是可靠的最终裁决。
5. 用评测检验一次改动
有了这些部分,就能问一个具体问题:如果要求 Agent 先复现错误、修改后测试、检查回归,并如实报告验证情况,修复效果会不会更好?
A 版使用基本的修复指令,B 版加入上述步骤。两版使用相同的模型、工具和预算,每次尝试都从全新的起始文件开始。A/B 运行按任务和重复轮次配对,执行顺序随机化,并交错进行。
最终比较用了五个小型算法修复任务,每个任务的每个版本尝试三次,共三十次。
A 成功 15/15 次,B 成功 13/15 次。
在这次实验中,额外指令没有带来可观察到的修复收益。
一次未成功的 B 运行,在写出修复之前碰到了响应长度上限;另一次则在首次请求时遇到 HTTP 异常。这些记录不能证明 B 的算法解题能力更差,也不能证明详细指令普遍有害。
它们描述的是这些任务和条件下的交付表现。五个任务仍然是小样本;重复同一个任务,并没有增加任务种类。这些问题来自公开算法基准,是否出现在模型训练数据中并不清楚。
6. 继续做下去
这次实验没有得到“更好的提示词获胜”的结果,却让我看到了更具体的下一步。
一个想法是,把验证结果和代码版本绑定起来。代码修改后,旧结果仍然保留在记录中,但不再意味着当前代码已经验证。Agent 可以看到这样的状态:“当前版本的自编测试已通过,公开测试尚未运行。”
对于响应截断,可以固定提示词,比较不同的响应预算。对于缺失的评审结论,可以检查评审预算,并用人类样例校准判断。这些都是有待检验的假设,不是已经证明有效的改进。

做 mini-agent,让执行循环变得具体;做一个小型评测,也让成功、依据和可靠性变得具体。
对我来说,有用的问题是:下一步应该改什么,又用什么依据证明这个改动有效?
代码、中英文指南和实验记录都在这里。欢迎看看实现,试试自己的实验,再告诉我你的发现:
https://github.com/caulif/mini--coding-agent-eval
英文原文最初发布于 X。