实验课(终点):自己的 agent 上 TB 2.0,算清 pass@k / pass^k、给每次失败打标签,再回到 A0 复盘
这一课做什么:把 T6 的全部录制摊开——15 个 Terminal-Bench 2.0 trial 与贯穿任务的 3 次重复。先用自己的数据算 pass@k、pass^k 与区间;再在 18 条真实轨迹上自己打一遍失败标签;最后回到全课的第一个问题。所有数字都来自录制,没有一个是手写的。
数据从哪来
- T6:2026-09-26 在本机录制(脚本
04-实践项目/scripts/run_t6.py、t6_harbor_job.py、record_t6_parse_date.py,导出export_t6.py)。模型 Qwen/Qwen3-8B-MLX-4bit(本机 mlx_lm.server),采样 temperature 0.6、单次输出 4,096 token、开思考;harness miniagent 0.5.0,经 Harbor miniagent.harbor_agent:MiniAgent 适配器接入;TB 2.0 的镜像全部只有 amd64,本机 arm64 经 qemu 模拟。 - 本章派生数据:
src/data/precomputed/a09-eval.json(生成脚本同目录gen_a09_eval.py:18 条轨迹统一成步列表,附人工标注与 python 参考实现的结果)。 - 本机有其他任务同时占用,且 amd64 镜像经 qemu 模拟运行,耗时只能粗看;token、轮数、步数可比。
实验台一 · 用自己的数据算 pass@k 与 pass^k
每个任务单独算(第 1 课:不同任务不能共用一个 p)。表里的无偏估计、区间都由生成脚本的 python 与页面组件的 JS 各算一遍,逐项一致:
| 任务 | n 次里成功 c 次 | pass@2(无偏) | pass^2(无偏) | p 的 95% 区间 | 标签分布 |
|---|---|---|---|---|---|
fix-git | 0 / 3 | 0.00 | 0.00 | [0.00, 0.71] | 停在半路 ×3 |
regex-log | 0 / 3 | 0.00 | 0.00 | [0.00, 0.71] | 撞上限 ×3 |
log-summary-date-ranges | 0 / 3 | 0.00 | 0.00 | [0.00, 0.71] | 做完不回头查 ×2、自评不一致 ×2、撞上限 ×1 |
openssl-selfsigned-cert | 0 / 3 | 0.00 | 0.00 | [0.00, 0.71] | 做完不回头查 ×3、工具幻觉 ×2、自评不一致 ×3 |
cobol-modernization | 0 / 3 | 0.00 | 0.00 | [0.00, 0.71] | 做完不回头查 ×2、停在半路 ×3、工具幻觉 ×2 |
parse_date | 3 / 3 | 1.00 | 1.00 | [0.29, 1.00] | — |
数据:本课项目 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。
实验台二 · 自己给每次失败打标签
打开任意一条轨迹,先不要看规则给出的标签,自己读完再勾;写下依据(是哪一步、哪句输出让你这么判)。勾完再和规则的结果对照:哪几条你和规则不一致?是规则写窄了,还是你看到了规则看不到的东西?
标签规则与重建规则(点开核对;自动 = 浏览器现算,人工 = 本章作者读轨迹标注)
- 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 | 否 | 是 | 否 | agent | 0 / 3 | 停在半路 ×3 |
regex-log | 是 | 否 | 是 | workflow | 0 / 3 | 撞上限 ×3 |
log-summary-date-ranges | 否 | 否 | 是 | workflow(先读一次样例) | 0 / 3 | 做完不回头查 ×2、自评不一致 ×2、撞上限 ×1 |
openssl-selfsigned-cert | 是 | 否 | 是 | workflow | 0 / 3 | 做完不回头查 ×3、工具幻觉 ×2、自评不一致 ×3 |
cobol-modernization | 否 | 是 | 否 | agent | 0 / 3 | 做完不回头查 ×2、停在半路 ×3、工具幻觉 ×2 |
判定依据(本章作者读任务说明后的事后判定,录制前没有写预测,不能算预测命中):fix-git:改动去了哪里要看仓库当时的状态,说明里没有;regex-log:规格全写在说明里,产物是一个文件 /app/regex.txt;log-summary-date-ranges:要先看一眼日志行长什么样;看过之后一段脚本就能写完,产物是一个 CSV;openssl-selfsigned-cert:六条要求逐条写明,是一串固定的 openssl 命令;cobol-modernization:要读 COBOL 源码和数据文件,再比对两个程序的输出。
读这张表的方法和 A0 实验课一样:错在哪里比对了几个更有用。
- 判给 workflow 的 regex-log 与 openssl-selfsigned-cert,agent 的失败方式恰好是 agent 特有的:regex-log 三次都在思考里写满输出上限、一个工具没调——一段「调一次模型、把答案写进文件」的 workflow 至少会产出一个正则;openssl 三次都一步发完所有命令、不回头核对——一段写死的命令序列加一条核对,正是 workflow 擅长的。
- 判给 agent 的 fix-git 与 cobol-modernization,agent 失败在「探索不够」和「做完不查」:需要 agent 的任务,不等于这个 agent 做得了。
- A0 的三条标准回答的是任务该不该交给 agent;本章的评测回答的是这个 agent在这批任务上行不行。两件事都要问,顺序是先 A0、后 A9 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条项目实测 + 本章作者的事后判定:单一 8B 本地模型、5 个任务、k = 3。这里说明的是两类问题要分开问,不是「这 5 个任务该用 workflow」的结论——那需要把 workflow 轨也在 TB 上真跑一遍,本课没有做。 出处待补 。
自己动手
- 在
04-实践项目里把 k 从 3 加到 5:python3 scripts/run_t6.py 2 --suffix=-more --pd-k 5(需要本地模型服务与 colima 实例;脚本会先等本机的模型服务空闲)。 - 导出与脱敏:
.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 仍然一致。 - 刷新本章:区间、标签分布、回到 A0 的表都会换成新数据。
- 选做:把实验台三里判给 workflow 的两个任务写成 workflow(一次模型调用 + 写文件 + 一条核对命令),放进 Harbor 当作另一个「agent」跑,和 miniagent 的结果并排。这才是对 A0 判定的真正检验。
读数时注意:单一 8B 本地模型、每个任务 3 次、5 个 TB 任务、amd64 镜像经 qemu 模拟;耗时只能粗看。本章所有关于「我们的 agent」的结论只在这个规模成立。
演进地图
- 起点 跑一次,看成败最直觉的做法:一个任务、一次运行、一个布尔值解决了最省事:修好了就说「会修」,没修好就说「不会」。卡在同一套配置只换 seed:pd-v2-unlimited 的 s1 / s2 / s3 是 ✗ ✓ ✓;同为 seed 1、只多了一个没碰到的轮数上限的 pd-v2-cap20-s1 又是 ✓。只跑一次,结论取决于你碰上了哪一次。
- 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。
- 第二步 统一 harness,才能比模型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 次失败各是各的样子,一个数看不出为什么。
- 第三步 读轨迹,给失败打带步号的标签Harbor 的 ATIF 轨迹 · Anthropic 工程博客的四类失败 · 本章写明的标签规则解决了15 次失败都落到了带步号的标签上:改完 / 跑完不回头查 7 次,撞上输出上限 4 次,明确声称完成 5 次、5 次没过。卡在标签分不清是 agent 错还是环境错:第一次 oracle 冒烟 0 / 5,原因是容器里的 DNS;arm64 探测里 qemu-startup 连参考解也拿 0 分(verifier 现装 curl 时 404)。
- 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 构建时现算。