上周接了个私活,要做带复杂业务逻辑的后台管理系统。本来想全程用 Claude Opus 4.6 搞定,结果甲方突然说"听说 GPT-5.4 出了,你试试那个,据说写代码更强了"。行吧,那我就两个都跑一遍,顺便做个对比——正好最近 Claude Code 的 Skills 生态炸了(7.7 万+ Skills),GLM-4.7 也刚开放初测,模型圈是真的卷。
直接说结论:GPT-5.4 在长上下文理解和多步推理上有明显提升,适合架构设计和复杂逻辑生成;Claude Opus 4.6 在代码质量、指令遵循精度和工程落地上依然是标杆。两个我现在都在用,根据任务切换。
先说结论
| 维度 | GPT-5.4 | Claude Opus 4.6 | 我的选择 |
|---|---|---|---|
| 代码生成质量 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Opus 4.6 |
| 长上下文理解 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | GPT-5.4 |
| 指令遵循精度 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Opus 4.6 |
| 多步推理 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | GPT-5.4 |
| 响应速度(Streaming) | 快 | 中等 | GPT-5.4 |
| API 价格 | 较贵 | 贵 | 看下面详细算 |
| 工程化落地体验 | 好 | 非常好 | Opus 4.6 |
环境准备
测试环境:
- Python 3.12
- openai SDK 1.52.0(两个模型都用 OpenAI 兼容协议调)
- 测试任务:从真实项目里抽了 5 个典型场景
为了省事,我用了聚合 API 来调这两个模型,不用分别管两家的鉴权。ofox.ai 是一个 AI 模型聚合平台,一个 API Key 可以调用 GPT-5.4、Claude Opus 4.6、Gemini 3 等 50+ 模型,兼容 OpenAI 协议,改个 base_url 就行,不用装额外 SDK。
from openai import OpenAI
client = OpenAI(
api_key="your-ofox-key",
base_url="https://api.ofox.ai/v1"
)
# 调 GPT-5.4
gpt_resp = client.chat.completions.create(
model="gpt-5.4",
messages=[{"role": "user", "content": "你好"}],
stream=True
)
# 调 Claude Opus 4.6,同一个 client,换个 model 名就行
claude_resp = client.chat.completions.create(
model="claude-opus-4.6",
messages=[{"role": "user", "content": "你好"}],
stream=True
)
同一套代码,只改 model 参数,做对比测试特别方便。
调用链路
graph LR
A[Python 测试脚本] --> B[ofox.ai 聚合网关]
B --> C[GPT-5.4]
B --> D[Claude Opus 4.6]
B --> E[其他模型: Gemini 3 / DeepSeek V3]
C --> F[响应结果]
D --> F
E --> F
F --> G[本地对比分析]
方案一:代码生成质量对比
选了一个真实场景——写一个带权限控制的 RESTful API,要求用 NestJS + TypeORM,包含 RBAC 权限模型。
GPT-5.4 的输出
response = client.chat.completions.create(
model="gpt-5.4",
messages=[
{
"role": "system",
"content": "你是一个资深后端工程师,使用 NestJS + TypeORM 技术栈。"
},
{
"role": "user",
"content": """
请实现一个完整的 RBAC 权限系统,包含:
1. User、Role、Permission 三个实体
2. 角色-权限多对多关系
3. 一个权限守卫(Guard)装饰器
4. 用户登录接口(JWT)
要求代码可以直接跑,不要省略 import。
"""
}
],
temperature=0.3
)
print(response.choices[0].message.content)
GPT-5.4 给了大概 180 行代码,结构很清晰,实体、Service、Controller、Guard 都分开了。但有个问题:它生成的 RolesGuard 里用了 Reflector 的旧 API 写法,跑起来直接报了个类型错误,得手动改一行。
Claude Opus 4.6 的输出
同样的 prompt,换成 model="claude-opus-4.6"。
Opus 4.6 给了大约 210 行代码,比 GPT-5.4 多了大概 30 行——多出来的部分是错误处理和边界情况:
- 登录接口加了请求频率限制的注释提示
- Guard 里处理了 token 缺失、过期、角色不匹配三种情况,每种给了不同的 HTTP 状态码
- 实体定义里加了
@Index()装饰器
拿过来几乎不用改就能跑。这个差距单看一个文件不明显,但你改 10 个文件,每个文件省 5 分钟调试,就是将近一小时。
实测结论:代码生成质量 Opus 4.6 > GPT-5.4,主要体现在边界处理和工程规范上。
方案二:复杂推理 + 长上下文理解对比
这是 GPT-5.4 扳回一城的地方。
我把一个 3000 行的 Python 项目(FastAPI + SQLAlchemy,一个订单管理系统)整个丢进去,然后问:
"这个项目的订单状态机有 bug,当用户在支付超时后又收到支付回调时会出现状态不一致。请定位问题并给出修复方案。"
GPT-5.4 的表现
GPT-5.4 花了大概 15 秒(Streaming 首 token 约 1.2s),给出了:
- 准确定位到
order_service.py第 187 行的竞态条件 - 分析了超时定时器和回调处理器的执行时序
- 给了两种修复方案:乐观锁 vs 状态机重构
- 每种方案都附了完整的 diff 代码
它把整个调用链都理清楚了,包括跨文件的依赖关系,属实没想到。
Claude Opus 4.6 的表现
Opus 4.6 也找到了问题,但分析路径不一样——它先把状态机画了一个文字版的状态转移图,然后指出"从 PENDING_PAYMENT 到 TIMEOUT 的转换没有加锁"。修复方案只给了一种(乐观锁),但代码更完整,包含了数据库迁移脚本。
问题出在追问阶段。当我问"如果用状态机重构呢",Opus 4.6 的第二轮回答明显没有 GPT-5.4 连贯——它似乎"忘了"前面几个文件的部分细节。
实测结论:长上下文 + 多步推理 GPT-5.4 > Opus 4.6,尤其是跨文件分析和多轮对话的上下文保持。
方案三:Function Calling 实测
这个差距比较小,但还是值得说。
tools = [
{
"type": "function",
"function": {
"name": "query_order",
"description": "根据订单号查询订单详情",
"parameters": {
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "订单编号,格式为 ORD-开头"
},
"include_items": {
"type": "boolean",
"description": "是否包含订单明细"
}
},
"required": ["order_id"]
}
}
}
]
# GPT-5.4
gpt_fc = client.chat.completions.create(
model="gpt-5.4",
messages=[{"role": "user", "content": "帮我查一下 ORD-20260615-001 的订单,要包含明细"}],
tools=tools,
tool_choice="auto"
)
print(gpt_fc.choices[0].message.tool_calls)
# Claude Opus 4.6
claude_fc = client.chat.completions.create(
model="claude-opus-4.6",
messages=[{"role": "user", "content": "帮我查一下 ORD-20260615-001 的订单,要包含明细"}],
tools=tools,
tool_choice="auto"
)
print(claude_fc.choices[0].message.tool_calls)
两个模型都正确地提取了参数,没啥差别。但当我故意把 prompt 写得模糊——"查下那个 6 月 15 号的大单子,我要看详情"——GPT-5.4 还是能正确触发 function call(虽然 order_id 是编的),Opus 4.6 则会先回复一段文字问我"请提供具体的订单编号"。
很难说谁对谁错,看场景。做 Agent 的话 GPT-5.4 的"先做再说"更顺手;做面向用户的 chatbot,Opus 4.6 的谨慎反而是优点。
踩坑记录
坑 1:Streaming 模式下 Claude 的 chunk 格式
用 OpenAI 兼容协议调 Opus 4.6,有时候 delta.content 会返回 None 而不是空字符串,前端拼接逻辑直接炸。加个判空就行,但第一次遇到确实懵了几分钟:
for chunk in response:
content = chunk.choices[0].delta.content
if content is not None: # 注意这里,不能用 if content
print(content, end="", flush=True)
坑 2:GPT-5.4 的 temperature 敏感度
GPT-5.4 对 temperature 参数特别敏感。我一开始用 0.7(之前 GPT-5 的习惯),代码生成里经常出现"创意发挥"——比如自作主张加了个 Redis 缓存层,我压根没要求。写代码建议 temperature 设到 0.2-0.3。
坑 3:Opus 4.6 的 max_tokens 默认值
Opus 4.6 如果不显式设 max_tokens,默认输出长度比 GPT-5.4 短不少。生成长代码的时候经常被截断,我以为是 bug,后来发现加个 max_tokens=4096 就好了:
response = client.chat.completions.create(
model="claude-opus-4.6",
messages=messages,
max_tokens=4096, # 别忘了加这个
temperature=0.3
)
小结
跑完这一轮,我的分工策略很简单:
- 写业务代码、CRUD、API 开发 → Claude Opus 4.6,代码质量更高,省调试时间
- 排查复杂 bug、读大型代码库、做架构分析 → GPT-5.4,长上下文理解确实强
- 日常杂活(写文档、改配置、问问题)→ 哪个便宜用哪个,或者直接 DeepSeek V3
说实话,2026 年了还在争"哪个模型最强"没太大意义——真正重要的是能快速切换。这个项目里光是 GPT-5.4 和 Opus 4.6 就来回切了几十次,如果每次都要换 SDK、换 Key、换鉴权方式,效率直接砍半。用聚合接口换个 model 参数就完事,这个工作流是真的舒服。
Claude Code 的 Skills 生态爆了 7.7 万+,GLM-4.7 也在初测,模型层面的竞争只会越来越激烈。与其押注一个模型,不如把切换成本降到最低——工具是拿来用的。