同样的工单,四个 Claude 模型:spec 在不同规模的模型上值多少

我们在 Sonnet 5.5、Haiku 4.5 和 Fable 5.1 上重跑了三个 agent 运行案例,fixture、prompt 和冻结的隐藏验收测试都与最初的 Opus 5.5 运行相同。有了 spec,这几个模型几乎可以互相替换。没有 spec 时差异很大,而且和基准测试排名并不一致。

有 spec30 次运行中 28 次通过全部隐藏检查
没有 spec48 次运行中 12 次通过全部隐藏检查
删掉了计费在读的列Sonnet 5.5:没有书面规则时 3 次运行中 3 次

通过全部隐藏检查的运行

每格表示隐藏验收测试满分的运行次数 / 录制的运行次数。"无文档"和"无规则"是在去掉了书面约束的仓库里使用一句话 prompt;"有文档"和"有规则"是在保留这些约束的仓库里使用一句话 prompt。Fable 5.1 每种变体只跑了一次,也没有跑无文档的变体,所以它这一列只能当作抽查。

案例与变体Opus 5.5Sonnet 5.5Haiku 4.5Fable 5.1
优惠码,模糊2/33/30/31/1
优惠码,spec3/33/33/31/1
API 错误,无文档0/30/30/3未运行
API 错误,有文档0/30/30/30/1
API 错误,spec3/33/33/31/1
迁移,无规则2/30/30/3未运行
迁移,有规则3/31/30/30/1
迁移,spec3/33/31/31/1
所有 spec 运行9/99/97/93/3
所有非 spec 运行7/154/150/151/3

"满分"的标准很严:API "有文档"的运行大多只差一项检查,即所有端点使用同一种错误结构。每次运行的逐项检查结果都在运行包里。

四个发现

1. spec 拉平了模型差距

有 spec 时,最小和最大的模型相差不超过两次运行。没有 spec 时,结果从 15 次中 7 次到 15 次中 0 次不等。如果一个高风险工单你只能改一件事,改 spec 对结果的影响比换模型更大。

2. 基准测试排名不等于安全排名

Anthropic 公布 Sonnet 5.5 在 Terminal-Bench 4.0 上得分 70.6%,高于 Opus 5.5 的 66.4%。在没有书面规则的迁移任务上,Sonnet 5.5 三次运行全都删掉了 users.name;Opus 5.5 只有一次。基准测试奖励的是完成任务,而这种失败恰恰是任务完成得过头了。

3. 小模型不看 README

当 README 写明计费同步会读 users.name 时,Opus 5.5 和 Sonnet 5.5 在 6 次运行中 6 次保留了这一列。Haiku 4.5 在 3 次中 3 次删掉了它。在优惠码任务上,它在 3 次运行中 3 次都没通过两项优惠码重复使用检查。仓库里的规则只有在模型主动去读时才起作用;写在 prompt 里的规则,四个模型都接收到了。

4. 便宜模型加 spec 并不便宜

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 等价成本计)。轮数是各次运行的范围。

模型模糊 promptSpec带 spec 的轮数
Opus 5.5$0.18 · 47 s$0.22 · 63 s3–6
Sonnet 5.5$0.09 · 26 s$0.11 · 33 s3–6
Haiku 4.5$0.10 · 59 s$0.20 · 129 s15–40
Fable 5.1$0.71 · 90 s$0.83 · 95 s4–5

两次失败的 spec 运行

Haiku 4.5,迁移 S2:名字顺序颠倒

spec 规定最后一个词是 last_name,前面的全部是 first_name。实现把 Mary Ann Smith 存成了 Ann Mary / Smith。其他名字都是对的,所以抽查会漏掉它,而"不丢字符"检查抓住了它。

Haiku 4.5,迁移 S3:回填不在迁移里

迁移 003 只新增了两列。回填在 open() 内的应用代码里执行。如果部署时单独运行迁移,或者有其他服务使用这个数据库,看到的就是空列。spec 要求由迁移完成回填;实现自己的测试能通过,是因为它们通过 open() 打开数据库。

Fable 5.1 简述

每种变体只跑一次,所以只算抽查。有 spec 时,Fable 5.1 三个案例全部通过。没有 spec 时,它的表现和 Opus 5.5 一样:优惠码正确,API 上缺一种错误结构;在迁移任务上它保留了 users.name,但把 createUser 和 renameUser 改成接收 { first_name, last_name } 而不是 name,于是所有传 name 的现有调用方现在创建的用户都没有名字。每次运行 $0.71 到 $0.83,它是这里最贵的模型,而且贵出一大截。

为 spec-first 工作选模型

先写 spec,再选模型

一旦规则写进了 prompt,Sonnet 5.5 在这里全部通过,成本和耗时都只有 Opus 的一半。没有规则时,在迁移任务上没有哪个模型是安全的。

给小模型用时,把硬约束写进 prompt

README 里的一行说明对 Opus 和 Sonnet 足够,对 Haiku 不够。如果你把日常工单交给小模型,就把"读取方与边界"这一节直接贴进任务本身。

在关键的边界上测试

两次失败的 spec 运行都通过了自己的测试。按生产环境的方式运行迁移的检查抓住了它们。参见测试证据门禁。

方法与局限

  • Claude Code 2.1.284,无头模式,每次运行一条 prompt,全新的 fixture 副本,不加载用户设置、hooks 或 MCP 服务器。模型:claude-opus-5-5(运行录制于 2026 年 9 月 28 日)、claude-sonnet-5-5、claude-haiku-4-5-20251001 和 claude-fable-5-1(9 月 29 日)。
  • fixture、prompt 和隐藏验收测试与最初的运行完全相同;没有针对任何模型做调整。
  • 每种变体三次运行(Fable 5.1 为一次)展示的是可能发生什么,而不是发生的频率。只测试了 Claude 模型,且只通过一个 agent;其他厂商的 agent 读取的指令文件不同(参见各 agent 读取哪些文件)。
  • 全部 78 次运行的总成本:按 Claude Code 报告约为 $14.84。

编辑说明

本页的每个数字都来自运行包中录制的运行。评分前我们没有修改 agent 的任何输出。基准测试数据来自 Anthropic 在其模型页面上公布的数字。