1. spec 拉平了模型差距
有 spec 时,最小和最大的模型相差不超过两次运行。没有 spec 时,结果从 15 次中 7 次到 15 次中 0 次不等。如果一个高风险工单你只能改一件事,改 spec 对结果的影响比换模型更大。
我们在 Sonnet 5.5、Haiku 4.5 和 Fable 5.1 上重跑了三个 agent 运行案例,fixture、prompt 和冻结的隐藏验收测试都与最初的 Opus 5.5 运行相同。有了 spec,这几个模型几乎可以互相替换。没有 spec 时差异很大,而且和基准测试排名并不一致。
每格表示隐藏验收测试满分的运行次数 / 录制的运行次数。"无文档"和"无规则"是在去掉了书面约束的仓库里使用一句话 prompt;"有文档"和"有规则"是在保留这些约束的仓库里使用一句话 prompt。Fable 5.1 每种变体只跑了一次,也没有跑无文档的变体,所以它这一列只能当作抽查。
| 案例与变体 | Opus 5.5 | Sonnet 5.5 | Haiku 4.5 | Fable 5.1 |
|---|---|---|---|---|
| 优惠码,模糊 | 2/3 | 3/3 | 0/3 | 1/1 |
| 优惠码,spec | 3/3 | 3/3 | 3/3 | 1/1 |
| API 错误,无文档 | 0/3 | 0/3 | 0/3 | 未运行 |
| API 错误,有文档 | 0/3 | 0/3 | 0/3 | 0/1 |
| API 错误,spec | 3/3 | 3/3 | 3/3 | 1/1 |
| 迁移,无规则 | 2/3 | 0/3 | 0/3 | 未运行 |
| 迁移,有规则 | 3/3 | 1/3 | 0/3 | 0/1 |
| 迁移,spec | 3/3 | 3/3 | 1/3 | 1/1 |
| 所有 spec 运行 | 9/9 | 9/9 | 7/9 | 3/3 |
| 所有非 spec 运行 | 7/15 | 4/15 | 0/15 | 1/3 |
"满分"的标准很严:API "有文档"的运行大多只差一项检查,即所有端点使用同一种错误结构。每次运行的逐项检查结果都在运行包里。
有 spec 时,最小和最大的模型相差不超过两次运行。没有 spec 时,结果从 15 次中 7 次到 15 次中 0 次不等。如果一个高风险工单你只能改一件事,改 spec 对结果的影响比换模型更大。
Anthropic 公布 Sonnet 5.5 在 Terminal-Bench 4.0 上得分 70.6%,高于 Opus 5.5 的 66.4%。在没有书面规则的迁移任务上,Sonnet 5.5 三次运行全都删掉了 users.name;Opus 5.5 只有一次。基准测试奖励的是完成任务,而这种失败恰恰是任务完成得过头了。
当 README 写明计费同步会读 users.name 时,Opus 5.5 和 Sonnet 5.5 在 6 次运行中 6 次保留了这一列。Haiku 4.5 在 3 次中 3 次删掉了它。在优惠码任务上,它在 3 次运行中 3 次都没通过两项优惠码重复使用检查。仓库里的规则只有在模型主动去读时才起作用;写在 prompt 里的规则,四个模型都接收到了。
Haiku 4.5 带 spec 时平均 15 到 40 轮、129 秒、每次 $0.20,成本和 Opus 5.5 带 spec 差不多($0.22),速度却慢一倍。得到一次通过运行最便宜的是 Sonnet 5.5:带 spec 时平均 $0.11、33 秒。
平均值取自 Claude Code 的报告(按 API 等价成本计)。轮数是各次运行的范围。
| 模型 | 模糊 prompt | Spec | 带 spec 的轮数 |
|---|---|---|---|
| Opus 5.5 | $0.18 · 47 s | $0.22 · 63 s | 3–6 |
| Sonnet 5.5 | $0.09 · 26 s | $0.11 · 33 s | 3–6 |
| Haiku 4.5 | $0.10 · 59 s | $0.20 · 129 s | 15–40 |
| Fable 5.1 | $0.71 · 90 s | $0.83 · 95 s | 4–5 |
spec 规定最后一个词是 last_name,前面的全部是 first_name。实现把 Mary Ann Smith 存成了 Ann Mary / Smith。其他名字都是对的,所以抽查会漏掉它,而"不丢字符"检查抓住了它。
迁移 003 只新增了两列。回填在 open() 内的应用代码里执行。如果部署时单独运行迁移,或者有其他服务使用这个数据库,看到的就是空列。spec 要求由迁移完成回填;实现自己的测试能通过,是因为它们通过 open() 打开数据库。
每种变体只跑一次,所以只算抽查。有 spec 时,Fable 5.1 三个案例全部通过。没有 spec 时,它的表现和 Opus 5.5 一样:优惠码正确,API 上缺一种错误结构;在迁移任务上它保留了 users.name,但把 createUser 和 renameUser 改成接收 { first_name, last_name } 而不是 name,于是所有传 name 的现有调用方现在创建的用户都没有名字。每次运行 $0.71 到 $0.83,它是这里最贵的模型,而且贵出一大截。
一旦规则写进了 prompt,Sonnet 5.5 在这里全部通过,成本和耗时都只有 Opus 的一半。没有规则时,在迁移任务上没有哪个模型是安全的。
README 里的一行说明对 Opus 和 Sonnet 足够,对 Haiku 不够。如果你把日常工单交给小模型,就把"读取方与边界"这一节直接贴进任务本身。
两次失败的 spec 运行都通过了自己的测试。按生产环境的方式运行迁移的检查抓住了它们。参见测试证据门禁。
claude-opus-5-5(运行录制于 2026 年 9 月 28 日)、claude-sonnet-5-5、claude-haiku-4-5-20251001 和 claude-fable-5-1(9 月 29 日)。本页的每个数字都来自运行包中录制的运行。评分前我们没有修改 agent 的任何输出。基准测试数据来自 Anthropic 在其模型页面上公布的数字。