选型讨论里最常见的一句话是"感觉 Opus 更聪明一点"。这篇把"感觉"换成 20 个真实重构用例下的数字。
可复现前提: 用例来自我们自己仓库的历史重构 PR,已脱敏后整理成 bench/refactor-20。评测脚本、原始输出与判定标准全部在仓库里,跑一遍约 40 分钟。
一、用例怎么选
我没有用公开 benchmark,原因很简单:公开题目和我们的代码风格差太远,结论迁移不过来。20 个用例全部来自过去半年真实合并的重构 PR,每个用例包含:
- 重构前的文件快照
- 一句话的重构意图(取自 PR 描述)
- 重构后的人工版本作为参考
- 该模块原有的单元测试
判定标准只有一条硬指标:改完之后原有测试全绿,加一条软指标:改动是否引入了明显多余的抽象。
二、结果
通过率 平均耗时 平均成本
Opus 4.8 18/20 52s ¥0.83
Sonnet 5 16/20 19s ¥0.14两个失败用例两边重合:都是需要跨 4 个文件同步改签名的场景,两个模型都漏了最后一个调用点。这说明问题不在模型强弱,而在我给的上下文范围不够。
细分来看:
| 任务类型 | 用例数 | Opus | Sonnet |
|---|---|---|---|
| 单文件提取函数 | 8 | 8 | 8 |
| 跨文件重命名 | 5 | 5 | 4 |
| 消除重复逻辑 | 4 | 4 | 3 |
| 调整模块边界 | 3 | 1 | 1 |
三、结论与用法建议
- 单文件范围内的重构,用 Sonnet。质量没差别,快 2.7 倍,便宜 6 倍。
- 跨模块的结构性重构,用 Opus,并且要把相关文件全部显式加进上下文。
- "调整模块边界"这类任务两个都不靠谱,目前还是人来定边界、模型来执行更划算。
第 3 条是这次评测最有价值的发现:我们原本打算把架构调整也交出去,数据劝退了这个想法。
四、你怎么复现
git clone git@internal:praxis/bench-refactor-20.git
cd bench-refactor-20
cp .env.example .env # 填入你自己的 API key
./run.sh --model claude-opus-5 --model claude-sonnet-5
# 输出:results/<date>/summary.md 与逐用例 diff跑完欢迎把你的 summary.md 贴评论区,我想收集不同代码库上的差异。
评论与复现反馈 3
我们组按这个结论切了一周,成本确实降下来了,质量没感觉出差别。补一个数据点:我们的用例里跨文件占比只有 15%,所以整体省得更多。
「调整模块边界」那一行数据很有说服力。想问下这 3 个用例的失败模式是一样的吗?是边界划错了还是改漏了?
不一样。2 个是边界划得过细(把一个内聚模块拆成了三个),1 个是改漏了循环依赖。原始 diff 都在仓库的
results/里,可以直接看。