GPT-5.5 Codex 推理强度实测:low、medium、high、xhigh 到底差在哪?

你用 GPT-5.5 Codex 写代码的时候,有没有纠结过该选哪个推理强度?low、medium、high、xhigh,这四个选项摆在面前,到底哪个最适合日常使用?网上众说纷纭,有人说 low 就够了,有人说必须拉满 xhigh,还有人担心高推理强度会「过度思考」反而写出烂代码。
stet.sh 的作者做了一个实验:在同一个开源仓库 GraphQL-go-tools 上,用 GPT-5.5 Codex 的四个推理强度分别跑了 26 个真实合并过的 PR,然后从多个维度对比了结果。这篇文章就是他的实验报告。
先交代背景:GraphQL-go-tools 是一个 Go 语言实现的 GraphQL 工具库,涉及 schema 解析、联邦查询、gRPC 数据源、订阅处理等复杂场景。26 个 PR 涵盖了并发安全修复、输入校验重构、别名语义处理、AST 合并优化等不同类型的任务,比跑几个算法题要有说服力得多。
实验不是简单地看测试过没过。作者设定了五个评价维度:
- 测试通过率:最基本的指标,patch 能不能让现有测试通过。
- 语义等价性:AI 提交的 patch 是否实现了和人类提交者相同的意图。这个比测试通过率更严格,因为测试可能覆盖不全。
- 代码审查通过率:用 GPT-5.4 作为评审模型,判断人类审查者会不会接受这个 patch。
- 代码质量评分:从清晰性、简洁性、一致性、意图明确性、健壮性、指令遵守度、范围约束、diff 精简度八个子维度打分。
- 足迹风险:AI 相比人类提交者多触碰了多少代码。触碰越多,审查负担越重,引入 bug 的风险也越大。
Low 和 Medium:测试平手,质量悬殊#
最让人意外的一个发现是:low 和 medium 在测试通过率上打成平手,都是 21/26(80.8%),但语义等价性差了整整 15 个百分点(15% vs 42%)。
这意味着如果你只看「测试过没过」这个指标,你会得出「low 和 medium 一样好」的结论,然后心安理得地省钱用 low。但如果你坐下来认真读那些 patch,你会发现 medium 写的代码质量明显更高。
举个例子,PR #1297 要求 Agent 在 GraphQL Federation 中验证可以为 null 的外部依赖。如果一个可空字段返回 null 且带有 error,依赖它的下游查询不应该收到被污染的数据。low 的方案虽然通过了测试,但它用的是启发式的字段匹配,看到 required 字段加 error 就拦截,完全没有理解 Federation 的 nullable metadata 结构。medium 则明确追踪了被污染的对象,在下游输入中正确过滤。
用作者的话说:low 在猜,medium 在建模。
High:性价比甜点#
从中等强度提到 high 档,变化是全方位的:
| 指标 | Medium | High | 提升 |
|---|---|---|---|
| 测试通过率 | 21/26 (80.8%) | 25/26 (96.2%) | +15.4pp |
| 语义等价 | 11/26 (42.3%) | 18/26 (69.2%) | +26.9pp |
| 代码审查通过 | 5/26 (19.2%) | 10/26 (38.5%) | +19.2pp |
| 平均成本/任务 | $3.13 | $4.49 | +43% |
| 平均耗时 | 411s | 579s | +168s |
成本涨了 43%,但语义等价性涨了 64%,代码审查通过率直接翻倍。High 是那种「多花的钱真的值」的档位。
PR #1209 的任务是在 gRPC 数据源中支持 GraphQL 别名:把用户写的别名一路传导到 JSON 输出,并且验证 protobuf 消息类型。low 和 medium 都通过了测试,但都没有真正完成这个任务。low 压根没处理别名语义,medium 处理了别名序列化但漏掉了 mutation 映射。只有 high 第一次做到了等价且可审查,它引入了显式的 response-key/alias 处理逻辑,在整个链路中正确传递了别名。
PR #1155 更有戏剧性。这个 PR 要求加固 gRPC 数据源的多个生产边界:支持重复的标量字段、防止空指针 panic、传递 gRPC 状态码、支持动态客户端。low 和 medium 测试全绿,但不等价。high 做到了等价且通过审查。xhigh 反而翻车了:测试通过了,但等价性和审查都没过,因为它在 disabled datasource 和 invalid-list 的处理上出了错。
这个反转很值得注意:更高的推理强度不等于更好的结果。
Xhigh:质量模式,不是默认选择#
xhigh 是实验中最贵的档位,平均每个任务花费 $9.77,是 high 的 2.18 倍。它值得吗?分场景。
| 指标 | High | Xhigh | 变化 |
|---|---|---|---|
| 测试通过率 | 25/26 (96.2%) | 24/26 (92.3%) | -3.8pp |
| 语义等价 | 18/26 (69.2%) | 23/26 (88.5%) | +19.2pp |
| 代码审查通过 | 10/26 (38.5%) | 18/26 (69.2%) | +30.8pp |
| 平均成本 | $4.49 | $9.77 | +118% |
xhigh 在语义等价和代码审查上明显更强,但测试通过率反而下降,成本翻倍还不止。这不是一个「无脑拉满」的选项。
什么场景适合 xhigh?作者提到了 PR #1076,这是一个并发安全修复:重构订阅处理逻辑,用 per-subscription 序列化写入替代共享锁,加上心跳控制、竞态检测和正确的 WebSocket 关闭语义。只有 xhigh 严格通过了所有指标,high 做到了等价但不通过审查,因为 worker 队列可能阻塞全局事件循环。
另一个例子是 PR #1308,要求实现 GraphQL 输入对象:添加内置指令、通过 introspection 暴露、验证操作字面量和运行时变量。medium 和 high 测试都过了但不等价,xhigh 是唯一严格通过所有维度的档位。
总结一下 xhigh 的特征:它更适合那些歧义性高、跨模块、并发复杂、审查要求严的任务。日常 CRUD 用它就是浪费钱。
代码质量不只是「功能正确」#
最让我欣赏这个实验的地方是它引入了「代码质量」的多维度评分。传统 benchmark 只关注任务完成与否,但日常开发中,我们不仅关心代码能不能跑,更关心它好不好维护。
八个维度的评分如下(满分 4 分):
| 维度 | Low | Medium | High | Xhigh |
|---|---|---|---|---|
| 清晰性 | 2.65 | 2.70 | 2.79 | 2.92 |
| 简洁性 | 2.73 | 2.80 | 2.84 | 3.16 |
| 一致性 | 1.94 | 2.44 | 2.62 | 3.05 |
| 意图明确性 | 3.02 | 3.16 | 3.17 | 3.23 |
| 健壮性 | 1.62 | 2.07 | 2.49 | 3.07 |
| 指令遵守度 | 1.70 | 2.23 | 2.75 | 3.13 |
| 范围约束 | 2.39 | 2.75 | 2.69 | 3.07 |
| diff 精简度 | 2.43 | 2.68 | 2.53 | 2.93 |
数据很清楚:从 low 到 xhigh,几乎所有维度都在提升。最显著的改进在健壮性(1.62 → 3.07,接近翻倍)和指令遵守度(1.70 → 3.13)。这说明推理强度越高,AI 越不容易漏掉细节、边界条件和隐性需求。
不过 xhigh 在「范围约束」和「diff 精简度」上的提升幅度较小。xhigh 倾向于触碰更多代码,平均足迹风险 0.365,比 high 的 0.314 高出不少。但这不是坏习惯,数据表明多出来的代码主要是测试、fixture 和预期输出文件,而不是乱改生产逻辑。你可以理解为:xhigh 在补测试。
对我的启示#
这篇文章不仅是数据报告,它还揭示了一个被 benchmark 忽略的核心问题:测试覆盖率不等于代码质量。
SWE-bench 这类主流 benchmark 只看测试是否通过,一个二元的过/不过信号。但真实世界中,一个能过测试的 patch 可能充斥着 hack、绕过设计、硬编码假设。你当然不会把它合进主干。
那怎么办?作者的答案是:让 Agent 自己测试和优化自己的配置。这恰恰是他做的产品 Stet 在做的事:在团队自己的代码库上,用历史的真实 PR 来评估 Agent 在不同设置下的表现,然后让 Agent 自动调整配置。
我自己的实践经验也验证了这个结论。日常开发中,high 是最实用的默认档位。遇到需要跨模块理解、涉及并发安全、或者审查要求高的任务,再临时切到 xhigh。至于 low 和 medium,除非你在做一个明确简单的小改动且极度在意成本,否则不推荐。
最后说一句:这篇文章的数据量不大(26 个任务、单次运行),不能当作统计显著的结论。但它提供了一种审阅代码的思路,而不仅仅是看测试灯的颜色。这才是这篇文章最大的价值。
参考来源:GPT-5.5 low vs medium vs high vs xhigh: the reasoning curve on 26 real tasks — stet.sh, May 2026