从0打造编码Agent 岔路 阅读 ≈ 20 分钟 页内实验 ×1
A9 评测:怎么知道它好不好? 岔路课

评测标准为什么是一个极简 agent?

评测的尺子为什么是极简 agent
第 2 课说要统一 harness;统一成哪个?SWE-bench 官方榜用 mini-SWE-agent,Vals 在 TB 4.0 上用 Terminus 2,两个都是极简 agent:只给一个 shell、历史就是线性的消息列表、没有专门的编辑工具。可「随便挑一个统一」也不行:同一个 Gemini 3.8 Flash,在 mini-SWE-agent 上 19.09%,在 Terminus 2 上 13.13%;mini-SWE-agent 自己的 1.x 与 2.x 结果也不能混比。极简 harness 的价值不是「最公平」,而是固定、公开、带版本号、任何模型都跑得起来——一把尺子,只在同一把尺子里比。它也正是本课 A1 那个最小循环的样子。
❓

本课一问:第 2 课说「比模型,先统一 harness」。那统一成哪一个?为什么公认的标准偏偏是一个极简 agent,而不是功能最全的那个?

这一课先不碰:mini-SWE-agent 的源码(它不在本课钉住的源码副本里,这一课只引官方文档与 README);SWE-bench 的任务怎么构造(见原论文)。

从已有出发

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

为什么这一课换例子。要比较「当尺子用的 harness」,需要多个 harness 上的公开成绩,本课项目没有。回扣 A1:本课 miniagent 的起点就是一个最小循环——发请求、模型要调工具就执行、结果塞回历史、没有调用就停。后面八章在它上面一层层加东西。这一课看到的评测尺子,基本就停在那个起点上。

先自己设计:统一 harness,随便挑一个

最省事的做法:选一个 harness,让所有模型都用它跑,就算「统一」了。

  1. ① 朴素方案
  2. ② 它在哪失败
  3. ③ 改进方案
朴素方案随便挑一个 harness,让所有模型都用它
模型(effort)mini-SWE-agent(TB 4.0 官方榜)Terminus 2(Vals)
Gemini 3.8 Flash(high)19.09%13.13%
Gemini 3.7 Flash(high)11.21%6.06%

两把都叫「极简」的尺子,量同一个模型,读数差 6.0 和 5.1 个点。(两边的重复方式与沙箱也不同,见第 2 课。)

改进:极简到什么程度

mini-SWE-agentTerminus 2本课 miniagent(Harbor 适配器版)
谁在用它当尺子SWE-bench 官方 bash-only 榜;Vals 的 SWE-bench(已归档)Vals 的 TB 4.0;Harbor 自带的参考 agent只有本课项目
给模型的工具只有 bash;README:「Does not have any tools other than bash」一个 tmux 会话:每轮发键盘输入、读回屏幕6 个:read_file、write_file、edit_file、bash、list_dir、grep
历史完全线性:每一步只往 messages 里追加,轨迹就是 messages—(Vals 的方法说明没写)线性 messages[];上下文策略在 TB 上设为不压缩
模型怎么发动作v2 默认用原生工具调用;v1 是从回复文字里用正则抽命令回复 JSON,不用结构化输出;JSON 不合法或缺失就带警告重试(Vals 方法说明)原生工具调用(OpenAI 兼容的 tool_calls)
动作怎么执行每个动作一次独立的 subprocess.run,没有常驻的 shell常驻 tmux 会话每次 bash 新开一个 shell,经 Harbor 的 environment.exec 进容器
规模README:agent 类大约 100 行 Python—(本课没有读它的源码)循环 + 工具 + 适配器,见项目 miniagent/

出处:mini-SWE-agent 的 README 与 v2 迁移指南(v2.4.6 是最新 release,2026-07-23);Terminus 2 的描述取自 Vals 方法说明;本课 miniagent 取自项目代码 。

SWE-bench 官方页说明了用它的理由:「To make an apples-to-apples comparison of LMs easier, we evaluate all LMs using mini-SWE-agent in a minimal bash environment.」。统一的极简 harness 把「harness 做了什么」压到最少,剩下的差异更多来自模型——但不是全部:第 2 课里 GPT-5.6 Terra 在 Terminus 2 上反而比在自家 Codex 上高 4.7 个点。

极小真数字:换一把尺子,排名变了多少

第 2 课的 15 组配对,各按两把尺子排一次名,数一数有多少对模型的先后顺序颠倒了:

15 个模型,两把尺子各排一次名
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
两边还混着重复方式与沙箱的差异(官方榜每任务 5 次,Vals 3 轮平均),这个比例只作量级参考。
⚠
常见误解一:「极简 harness 上分数低,说明模型弱。」

它量的是「在同一个极简 harness 里」的相对差。一个模型在产品级 harness 里可能强得多(第 2 课 GLM-5.3 差 16 个点),也可能反过来(GPT-5.6 Terra)。尺子上的读数,只和同一把尺子上的其他读数比。

⚠
常见误解二:「mini-SWE-agent 的分数都可以放在一起比。」

SWE-bench 官方页原话:「Results of release 1.x and 2.x are not necessarily comparable to each other, as 2.x uses tool calling to invoke actions, whereas 1.x parses action from the output strings.」v2 默认改成了原生工具调用,v1 是从文字里用正则抽命令。尺子换了版本,就是换了尺子。

🧭

想自己跑 SWE-bench 的话:官方评测 harness 的资源要求是至少 120GB 空闲存储、建议 16GB 以上内存与 8 核以上 CPU、推荐 x86_64(arm64 支持是实验性的)。官方页称 Lite 旨在降低评测成本(「designed to: Reduce evaluation costs while maintaining benchmark quality」)。本课没有做这一项(大纲里的选做);Harbor 0.23.0 的安装包里已经带了 mini_swe_agent、pi、hermes、claude_code、codex、opencode 等预集成 agent,在 TB 上换 harness 对照只要换 -a。

证据三问

问本课的回答
① 它解决什么问题?给「比模型」一把公共的、可复现的尺子
② 为什么选极简?harness 做的事越少,分数里 harness 的份量越小;极简也最容易让任何模型跑起来、让别人复现
③ 实验上呢?两个极简 harness 之间也有差:Gemini 3.8 Flash 19.09% 对 13.13%;15 个模型换尺子后 12 / 105 对先后颠倒

演进地图:你在这里

评测的演进:每一步都被上一步的真数字逼出来
  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. 第二步 统一 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 次失败各是各的样子,一个数看不出为什么。
  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 构建时现算。

一句话

📌
极简 harness 是一把固定、公开、带版本号的尺子,只在同一把尺子里比。

回主线

分数告诉你成没成,为什么失败要看什么? → 第 3 课:它失败了,失败在哪一步、属于哪一类?

你可能会问