从0打造编码Agent 实验 实验 ≈ 50 分钟 页内实验 ×4
A9 评测:怎么知道它好不好? 实验课

实验课(终点):自己的 agent 上 TB 2.0,算清 pass@k / pass^k、给每次失败打标签,再回到 A0 复盘

自己的 agent 上真实评测
全课的最后一节实验课。把 T6 摊开:5 个 Terminal-Bench 2.0 任务 × 3 次与贯穿任务 × 3 次,逐任务算 pass@k、pass^k 与区间;在 18 条真实轨迹上自己打一遍失败标签,和规则的结果对照、导出留底;最后回到 A0——A0 的三条判别标准回答「这个任务该不该交给 agent」,评测回答「这个 agent 在这批任务上行不行」。按 A0 的标准,5 个 TB 任务里有 2 个一段 workflow 就够,而 agent 在这 2 个任务上的失败,恰好是 agent 特有的那种:想太久不动手,做完不回头查。
🧪

这一课做什么:把 T6 的全部录制摊开——15 个 Terminal-Bench 2.0 trial 与贯穿任务的 3 次重复。先用自己的数据算 pass@k、pass^k 与区间;再在 18 条真实轨迹上自己打一遍失败标签;最后回到全课的第一个问题。所有数字都来自录制,没有一个是手写的。

从已有出发 · 累计数据流 点已学环节看它回答什么
每一轮循环都经过

数据从哪来

实验台一 · 用自己的数据算 pass@k 与 pass^k

每个任务单独算(第 1 课:不同任务不能共用一个 p)。表里的无偏估计、区间都由生成脚本的 python 与页面组件的 JS 各算一遍,逐项一致:

任务n 次里成功 c 次pass@2(无偏)pass^2(无偏)p 的 95% 区间标签分布
fix-git0 / 30.000.00[0.00, 0.71]停在半路 ×3
regex-log0 / 30.000.00[0.00, 0.71]撞上限 ×3
log-summary-date-ranges0 / 30.000.00[0.00, 0.71]做完不回头查 ×2、自评不一致 ×2、撞上限 ×1
openssl-selfsigned-cert0 / 30.000.00[0.00, 0.71]做完不回头查 ×3、工具幻觉 ×2、自评不一致 ×3
cobol-modernization0 / 30.000.00[0.00, 0.71]做完不回头查 ×2、停在半路 ×3、工具幻觉 ×2
parse_date3 / 31.001.00[0.29, 1.00]—
算法模拟器 · 用你自己的 (n, c) 算区间
只跑了 n 次、成功 c 次:p 能落在多大的范围里?

数据:本课项目 T6(2026-09-26 录制,本机 Qwen3-8B-MLX-4bit)与 A1 同配置运行。两个公式都假设各次试验相互独立、成功率相同;无偏估计的写法与 Harbor 0.23.0 的 pass_at_k.py 相同(本页 JS 与 Harbor 自己的函数在 440 组 (n, c, k) 上逐一比对一致)。

🎯

试三件事:① 在区间视图里把 n 拖到 5、c 保持 0:k 从 3 加到 5,单个 TB 任务的上界能压到多少?(项目的 run_t6.py 已经支持追加 2 次,本课没有跑);② 把 n 拖到 10、c 拖到 10:要让「连续全过」的下界过 0.7 需要多少次?③ 回到表格:5 个 TB 任务的 pass@2 都是 0,这和「这些任务它永远做不了」是两回事——上界还有 0.71。

实验台二 · 自己给每次失败打标签

打开任意一条轨迹,先不要看规则给出的标签,自己读完再勾;写下依据(是哪一步、哪句输出让你这么判)。勾完再和规则的结果对照:哪几条你和规则不一致?是规则写窄了,还是你看到了规则看不到的东西?

项目实测 · T6 的 18 条轨迹(录制于 2026-09-26)· 你的标注只存在本机浏览器
逐条标注:你的判断 vs 规则的结果 发现阅读写入执行 只有思考(被截断)harness 插话收工
标签规则与重建规则(点开核对;自动 = 浏览器现算,人工 = 本章作者读轨迹标注)
  • one-shot 冒进 · 做完不回头查(自动):没通过、以「不再调工具」收工,且收工前最后一个带调用的步里没有任何检查(发现 / 阅读类调用,或跑 pytest、unittest)。对应 Anthropic《Effective harnesses for long-running agents》里「一次做太多」与「验证不足」。
  • 工具幻觉(自动 + 人工补充):某次调用退出码 127,或输出里出现 command not found / No such file or directory;人工补充「调用对了工具、参数给错」或「把工具结果读错」的步。对应《Writing effective tools for agents》那句「call the wrong tools, call the right tools with the wrong parameters … or process tool responses incorrectly」。
  • 上下文腐化(自动):某步输入超过上下文窗口(Qwen3-8B 为 40,960 token)的一半,且之后出现与之前完全相同的调用。本批最长输入只有几千 token,这条规则一次也没命中——不是没有这类失败,是这批数据里没有样本。
  • 自评与结果不一致(人工):最后一段话明确声称完成,验收没过。判定规则同 A7 第 4 课:断言完成且没说还差什么 = 明确声称;只用 should / would / will = 含糊;没有这类断言、说还差一步、把活交还用户、没写话 = 未声称。依据原句逐字出现在最后一段话里(生成脚本断言)。
  • 停在半路(人工派生):未声称完成,却以「不再调工具」收工,验收没过。不在 Anthropic 的四类里。
  • 撞上 harness 上限(自动):停止原因是 length(连续三次写满单次输出上限)、max_rounds、wall_clock、dropped_tool_call 或 model_error。不在四类里:这是 harness 配置与模型一起造成的。
  • 环境 / 评分器(自动):同一环境里这个任务的参考解(oracle)没通过。本批 5 个任务的 oracle 都通过了,所以一次也没命中。
  • 动作分类:list_dir / grep = 发现,read_file = 阅读,write_file / edit_file = 写入;bash 先把引号里的内容换掉,按 && ; | 拆段,每段看第一个词(ls、find、git status… = 发现;cat、head、diff、cmp… = 阅读;mkdir、cp、rm、带 > 重定向… = 写入;其余 = 执行),一条命令取最强的一类(写入 > 执行 > 阅读 > 发现)。
  • 工作区重建:只认 write_file / edit_file 的结果,和退出码为 0 的 bash 里的重定向、mkdir、touch、cp、mv、rm。程序自己写的文件(openssl -out、python 脚本里 open(…, "w"))看不见——和 ATIF Trajectory Viewer 作者写明的局限一样,重建的工作区不一定忠实。

数据:本课项目 T6(录制于 2026-09-26;Harbor 0.23.0 + Terminal-Bench 2.0;模型 Qwen/Qwen3-8B-MLX-4bit,本机 mlx_lm.server;harness miniagent 0.5.0)。本机有其他任务同时占用,且 amd64 镜像经 qemu 模拟运行,耗时只能粗看;token、轮数、步数可比。

📝

标完点「导出全部标注(JSON)」,把内容贴进 案例库/从0打造编码Agent/05-问答记录/A9.md(目录还没有就新建)。它记下的是你的判断与依据,和规则的结果并排——这正是「提问必记录」:下次改规则时,它就是你的测试集。

实验台三 · 回到 A0:哪些任务值得用 agent

A0 在录制前写下三条判别标准:① 修复需要的信息是否全在「任务说明 + 被测文件」里;② 下一步是否取决于运行时才出现的输出;③ 改动范围能否预先确定。当时对 4 个小任务做了预测,对了 3 / 4。现在把同样三条标准用到 T6 的 5 个 TB 任务上:

任务① 信息在说明里?② 取决于运行时输出?③ 范围能预先确定?按 A0 判给本课 agent(k = 3)它是怎么失败的
fix-git否是否agent0 / 3停在半路 ×3
regex-log是否是workflow0 / 3撞上限 ×3
log-summary-date-ranges否否是workflow(先读一次样例)0 / 3做完不回头查 ×2、自评不一致 ×2、撞上限 ×1
openssl-selfsigned-cert是否是workflow0 / 3做完不回头查 ×3、工具幻觉 ×2、自评不一致 ×3
cobol-modernization否是否agent0 / 3做完不回头查 ×2、停在半路 ×3、工具幻觉 ×2

判定依据(本章作者读任务说明后的事后判定,录制前没有写预测,不能算预测命中):fix-git:改动去了哪里要看仓库当时的状态,说明里没有;regex-log:规格全写在说明里,产物是一个文件 /app/regex.txt;log-summary-date-ranges:要先看一眼日志行长什么样;看过之后一段脚本就能写完,产物是一个 CSV;openssl-selfsigned-cert:六条要求逐条写明,是一串固定的 openssl 命令;cobol-modernization:要读 COBOL 源码和数据文件,再比对两个程序的输出。

读这张表的方法和 A0 实验课一样:错在哪里比对了几个更有用。

自己动手

  1. 在 04-实践项目 里把 k 从 3 加到 5:python3 scripts/run_t6.py 2 --suffix=-more --pd-k 5(需要本地模型服务与 colima 实例;脚本会先等本机的模型服务空闲)。
  2. 导出与脱敏:.venv/bin/python scripts/export_t6.py;再在 知识平台/src/data/precomputed/ 下运行 python3 gen_a09_eval.py,并跑 node src/data/precomputed/test_a09_pure.mjs(在 知识平台/ 下)确认规则的 JS 与 python 仍然一致。
  3. 刷新本章:区间、标签分布、回到 A0 的表都会换成新数据。
  4. 选做:把实验台三里判给 workflow 的两个任务写成 workflow(一次模型调用 + 写文件 + 一条核对命令),放进 Harbor 当作另一个「agent」跑,和 miniagent 的结果并排。这才是对 A0 判定的真正检验。
⚠

读数时注意:单一 8B 本地模型、每个任务 3 次、5 个 TB 任务、amd64 镜像经 qemu 模拟;耗时只能粗看。本章所有关于「我们的 agent」的结论只在这个规模成立。

演进地图

评测的演进:每一步都被上一步的真数字逼出来
  1. 最直觉的做法:一个任务、一次运行、一个布尔值
    解决了最省事:修好了就说「会修」,没修好就说「不会」。
    卡在同一套配置只换 seed:pd-v2-unlimited 的 s1 / s2 / s3 是 ✗ ✓ ✓;同为 seed 1、只多了一个没碰到的轮数上限的 pd-v2-cap20-s1 又是 ✓。只跑一次,结论取决于你碰上了哪一次。
  2. Anthropic《Demystifying evals for AI agents》· Harbor 的 -k 与 pass_at_k.py
    解决了同配置的 7 次运行过了 6 次:p̂ = 0.857,pass@3 = 99.7%,pass^3 = 63.0%;T6 的 3 次重复全过。
    卡在拿全体平均成功率套公式:TB 4.0 官方榜第一行(Codex + GPT-6 Astra,max)pass@1 为 58.18%,公式给 pass@5 = 98.7%,榜单实测 71.2%:每个任务的成功率不一样。而且重复再多次,也分不出分数里哪部分是 harness。
  3. Vals 统一用 Terminus 2 复测 TB 4.0 · SWE-bench 官方 bash-only 榜统一用 mini-SWE-agent
    解决了同一个模型换 harness 的差距摆上桌:Fable 5.1 在 Claude Code 上 57.88%、在 Terminus 2 上 49.49%;GLM-5.3 41.82% → 25.25%。
    卡在分数只告诉你成没成:本课 agent 在 TB 2.0 上 0 / 15,15 次失败各是各的样子,一个数看不出为什么。
  4. Harbor 的 ATIF 轨迹 · Anthropic 工程博客的四类失败 · 本章写明的标签规则
    解决了15 次失败都落到了带步号的标签上:改完 / 跑完不回头查 7 次,撞上输出上限 4 次,明确声称完成 5 次、5 次没过。
    卡在标签分不清是 agent 错还是环境错:第一次 oracle 冒烟 0 / 5,原因是容器里的 DNS;arm64 探测里 qemu-startup 连参考解也拿 0 分(verifier 现装 curl 时 404)。
  5. Harbor v0.23.0:-a oracle 冒烟 → -a module:Class -k
    解决了参考解 5 / 5 通过、环境就绪之后,再跑自家 agent:5 个任务 × 3 次。
    卡在k = 3、单一 8B 本地模型、5 个任务、amd64 镜像靠 qemu 模拟:结论只在这个规模成立。(→ 课程终点:回到 A0,哪些任务值得用 agent?)

数字口径:本课项目 T6(Harbor 0.23.0 + Terminal-Bench 2.0,本机 Qwen3-8B-MLX-4bit,录制于 2026-09-26)与 A1 的同配置运行;TB 4.0 官方榜(更新于 2026-09-21)与 Vals(更新于 9/22/2026),均于 2026-09-27 抓取;由 a09-eval.json 与 a09-public-2026-09-27.json 构建时现算。

一句话

📌
评测回答的是「这个 agent 在这批任务上行不行」,A0 回答的是「这批任务该不该交给 agent」。
🏁

课程到这里结束。十章回头看是同一件事:agent = 模型 × harness,harness 的每一层——循环、工具、权限、沙箱、上下文、记忆、分工、接入——都是你拍板的决策;判断这些决策对不对,靠可重复的评测和读得懂的轨迹。回到 A0,带着自己的判别标准和评测数据,再选一次轨道。