Ploy 公司将生产环境 AI 从 Opus 4.8 切换到 GPT-5.6 Sol:质量不下降的同时耗时减少一半以上、成本降低 27%

换模型不是换个 API:评测框架、工具参数、缓存、推理记录,四个看不见的坑逐一拆解修法
作者:Ploy Blog07-13 · 9 分钟⚑ 厂商通稿 · 立场提示
🎧 听播客版0:00 / --:--
0:00 / --:--
深度 · 小互解读
速览
  • Ploy 把旗下建站 AI agent 的默认模型从 Claude Opus 4.8 换成了当天上线的 GPT-5.6 Sol
  • 自评测显示:完成同类建站任务,耗时从 8 分 0 秒降到 3 分 42 秒,成本从 3.06 美元降到 2.22 美元,视觉评分从 0.936 升到 0.970
  • 迁移中发现 GPT-5.6 会在工具调用里对用不上的参数编造默认值(如 offset: 0),一度导致 52% 到 64% 的文件读取悄悄返回空内容
  • OpenAI 的 prompt 缓存机制和 Anthropic 完全不同,改用 workspace 级 cache key 重新设计缓存分层后,首次调用缓存命中率从 0% 提升到 83.7%
  • 团队还发现自家评测框架本身对用惯的旧模型有隐性偏袒,需要先修评测框架才能信评测结果
⚑立场提示:本文是 Ploy 官方工程博客,属厂商自述。文中的耗时、成本、视觉评分、缓存命中率、参数携带率等,全部出自 Ploy 自家评测框架和生产流量口径,跑分标准也由 Ploy 自定。下面只转述它记录下来的事实与做法。
1背景 · 换模型

Ploy 把默认模型换成了 GPT-5.6 Sol

AI 建站产品 Ploy 在 2026 年 7 月 9 日,把旗下 agent 的默认模型从 Claude Opus 4.8 换成了 OpenAI 当天发布的 GPT-5.6 Sol。

换模型这件事,比换一个 API 端点复杂得多。Ploy 的 agent 要规划页面、读代码库、写组件、生成配图、给自己的成果截图,再判断到底做完没有。把这套流程从 Claude 搬到 GPT-5.6,团队是一个评测失败接一个评测失败地发现:那些被当成"模型"的东西,其实是各家服务商各自的行为习惯,整个技术栈早就悄悄围着旧模型长成了特定形状。

📊
同一个生产级 agent、同一套 Vercel AI SDK,只把默认模型换了。Ploy 自评测里完成同类建站任务:耗时 8 分 0 秒降到 3 分 42 秒(快约 2.2 倍),成本 3.06 美元降到 2.22 美元(省 27%),视觉评分 0.936 升到 0.970。过去四个月,Opus 一直守着默认位(先是 4.7,后是 4.8),团队测过的模型没有一个打赢它,GPT-5.6 是头一个赢的。
彩色充气造型由半透明管道相连,隐喻 AI agent 在两套模型系统间迁移
Ploy 官方博客配图:几团彩色充气造型由一根半透明管道相连,隐喻一个生产级 agent 在两套模型系统之间迁移。来源:Ploy Blog

下面是它品牌页重建评测套件里的一组样本,agent 要照着参考设计把品牌主页重做一遍:

每次完成建站,平均Claude Opus 4.8(n=11)GPT-5.6(n=10)
成本$3.06$2.22
耗时8 分 00 秒3 分 42 秒
输入 token2.60M1.70M
输出 token33.0K17.1K
视觉评分0.9360.970

GPT-5.6 写的代码更省。一组配对样本里,Opus 生成了 17,957 字符、174 个 CSS 变量(大段色阶其实没用上)的 globals.css,GPT-5.6 只用 2,508 字符、45 个变量,就渲染出相当(有时更好)的页面。

上面说的那组配对样本,两个模型各自渲染出的页面:左 Opus 4.8,右 GPT-5.6 Sol。GPT-5.6 用约七分之一的 CSS 代码,做出了完成度相当的页面。这里只截了首屏,点击图片看完整长图。来源:Ploy Blog
站内相关解读
OpenAI 正式发布 GPT-5.6:综合智能跑分逼近 Claude Fable 5,成本减半,ChatGPT、Codex 合并
这篇讲的是 GPT-5.6 本身发布了什么;本文是它上线当天,一家生产环境用户的实测迁移记录。
2评测公不公平

先看评测框架公不公平,再看模型强不强

拿两个模型的分数直接比之前,得先问一句:评测框架本身公不公平。Ploy 把同一套评测套件横跨两个模型家族跑了一遍,最意外的发现是,评测框架早就为旧模型调过了,团队自己却没察觉。

头一次跨模型跑,具体偏在这几处:

  • 工具调用预算是按 Opus 的顺序调用风格设的。GPT-5.6 会并行铺开一堆调用,在它其实做对了的题目上把预算撑爆。
  • 评测执行器不支持批量文件读取,这招 Opus 很少用、GPT-5.6 一直在用。
  • 一个数据集漏写了 minScore 阈值,悄悄继承了默认值 1.0。于是 GPT-5.6 一个拿了 0.98 分的 hero 被判"不合格",Opus 一个每项单独检查都通过的题目也算"失败"。两个都是站得住脚的设计方向,卡住它们的是一条看不见的阈值。

把这一轮的原始失败追下去,大约三分之一其实是评测框架的假设在作祟,跟模型行为无关,而且两个模型踩的还不一样多。

Opus 渐变 hero 拿 1.0 通过,GPT-5.6 色块方案拿 0.98 却因默认阈值失败
左:Opus 的渐变 hero 拿到满分 1.0 通过;右:GPT-5.6 的色块方案拿了 0.98,却只因为撞上一个没写明、默认是 1.0 的隐藏阈值被判失败。来源:Ploy Blog

结论很直接:评估一个挑战者模型时,先逐条看轨迹,再信通过率,否则你是在按"它有多像旧模型"给新模型打分。

3设计能力特征

设计风格:干净好看,但容易千篇一律

Ploy 对 GPT-5.6 设计能力的总体判断:它很擅长干净、现代、网格排得很整的版式,但没被好好引导时,会一路往这种样子收敛。在为 Opus 4.8 设计的旧评测框架下,GPT-5.6 倾向于忽略已有的设计系统,产出利落、克制、但一眼就看得出通用化的页面。

Opus 复刻 Clay 品牌系统,GPT-5.6 产出干净但通用的页面
左:Opus 复刻了 Clay 的品牌视觉系统;右:GPT-5.6 在为旧模型设计的评测框架下,产出一个干净但通用化的页面。来源:Ploy Blog

怎么把它引导到世界级的品牌还原度,属于另一篇文章的范围。这里只记一个真实的能力特征,谈不上是坑。

4工具参数被编造

模型会给用不上的参数编一个假值

Ploy 那个 code 工具有 25 个顶层参数,只有 action 是必填,其余都可选。Claude 只发它要用的那两三个,其余省略。GPT-5.6 每次把 25 个全填满,用不上的就编一个看着合理的值:offset 填 0、timeout 填 120000、siteId 填一串全是 0 的 UUID。

悄悄出错

关键在于:编造出来的值和真实值,在接口层面完全看不出区别。offset: 0 看起来就是个正常参数,Ploy 的文件读取实现就当真了,于是 GPT-5.6 有 52% 到 64% 的文件读取悄悄返回空内容。可工具两种情况都回 success: true,模型根本不知道自己读的是空文件,只能默默把活儿越干越差,调用越堆越多。

三天生产流量里,code(read) 调用里携带全部 25 个参数的比例,差异大到不像同一件事:

GPT-5.6100%
Opus 4.80.1%
Sonnet 50%

换算成绝对数:GPT-5.6 的 6,635 次调用,6,635 次全带满;Opus 4.8 的 2,898 次里只有 4 次;Sonnet 5 的 1,933 次一次都没有。

提示词治不了这个。Ploy 把能"劝"的路都试了一遍,全部原样失败:

✗ 工具描述里写"省略用不上的参数"

还是 25 个全填。

✗ 每个属性单独标"OPTIONAL,不用就省略"

还是 25 个全填。

✗ 上 OpenAI 官方的 strict 模式

行为一模一样(Ploy 实测),而且要用它,还得从每个 schema 里删掉 pattern、format 和数组边界校验,代价更大。

这是写进模型生成函数调用方式里的底层行为,靠指令劝不动,只能绕着它设计。

真正管用的修法是在 provider 边界做一次 schema 转换:只对 OpenAI 家族的模型,把每一个可选属性都改写成"必填但可为 null"(用 anyOf: [T, null]),这样模型就有了一个明说"我不用这个"的正规办法。然后在每次工具调用都会经过的那一道关卡,把这些 null 再剥掉,工具那头一行代码都不用改。一来一回:模型看到的是一个能表达诚实的 schema,工具收到的还是它一直以来收到的那些输入。

把可选工具参数改成"必填但可为空"的 schema 转换
// Before: 25 keys, every one carrying an invented value
{ "action": "read", "file_paths": [...], "offset": 0, "timeout": 120000, ... }

// After: 25 keys, 4 real values, 21 explicit nulls (stripped before the tool runs)
{ "action": "read", "file_paths": [...], "offset": null, "timeout": null, ... }
模型看到一个可填 null 的 schema
→
模型用 null 明说"我不用这个"
→
落到工具前,在唯一关卡把 null 剥掉
→
工具收到和过去一样的输入
改造前
52% 到 64% 的文件读取返回空内容。模型不知情,只能多读几遍,调用越堆越多。
改造后
空文件读取降到 0%。同样的活儿少用约 30% 的工具调用,因为不再反复重读空文件。
5缓存两套设计

两家的 prompt 缓存根本是两套设计

表面上两家都叫 prompt 缓存,"缓存"这两个字底下藏着两套完全不同的架构。迁移里最该小心搬的就是这一件:搬对之前,GPT-5.6 看起来比 Opus 贵约 50%,贵出来的这部分来自 Ploy 自己的缓存配置,跟模型定价没关系。

Ploy 的 prompt 开头有一段约 29K token 的静态前缀(工具 schema 加核心系统提示词),每一次对话都一模一样。两家怎么缓存这段前缀,差得很远:

Anthropic(Claude)
用 cache_control 标断点,那段 29K 的静态前缀在整个机构范围内共享,任何对话、任何工作区共用一份,也不用操心每分钟能扛多少请求。命中率稳在 92% 到 96%,缓存基本无感。
OpenAI(GPT-5.6)
把隐式缓存从"部分前缀匹配"改成只按最新一条消息建"整段前缀"条目。一个新会话就算带着同样的 29K 前缀,也 0% 命中,而且每个没命中的 prompt 还要多付 1.25 倍的缓存写入附加费。

OpenAI 给的正规机制是显式的:用 prompt_cache_breakpoint 标记,再配一个必填的 prompt_cache_key。而 key 正是设计真正分岔的地方,因为它是缓存身份的一部分。prompt 一模一样、key 不同,命中率就是 0。每个 key 对应一个缓存节点,这个节点大约每分钟只扛得住 15 次请求,超了 OpenAI 就把流量甩到别的冷缓存节点。

打个比方

prompt_cache_key 像图书馆的预留座位牌:拿同一个牌子的人会被安排坐进同一片区域,下次来直接续着看。key 相同才共享同一批缓存条目;key 一变,等于换了片区,之前存的缓存一条都用不上。

于是"要不要开缓存"变成了一个实打实的设计决定:这把 key,你绑到哪个层级?三种绑法各有各的下场:

① 按会话(per-conversation)分配 key

新会话永远碰不到共享前缀,首次调用命中率 0%(Ploy 实测踩过这个坑,代价很贵)。

② 全局统一(one global key)

所有请求都哈希到同一个缓存节点,生产流量直接撑爆每分钟 15 次的预算,请求被甩到没缓存的冷节点,又变回没命中。

③ 按 workspace 分配 key(甜蜜点)

同一个客户工作区里的所有对话共享缓存条目,单个 key 的流量压力保持在低位。

Ploy 最后上线的是 workspace 级的 key,请求经 hash 分到吞吐有限的缓存节点,等于给每个客户工作区分一条专属车道:

工作区 Aws:A key 工作区 Bws:B key 工作区 Cws:C key hash前缀 + key 缓存节点≤ 15 次 / 分 缓存节点≤ 15 次 / 分 缓存节点≤ 15 次 / 分
每个客户工作区分到自己的 key,等于分到一条专属车道,请求各走各的缓存节点。换成全局一个 key,三条车道会挤成一条,节点一超过每分钟 15 次,请求就被甩到没缓存的冷节点。

光有 key 还不够,Ploy 还把系统提示词拆成三层断点,让每一层各管一件事,和它给 Anthropic 用的结构对齐:

A
[ 工具 schema + 静态前缀 ]每个会话都命中它,让一次会话的首次调用便宜下来。
B
[ 工具 schema + 静态前缀 + 工作区上下文 ]工作区记忆一变,B 未命中,但 A 还命中,只补写一个上下文大小的 B,不用把 29K 整段重新计费。
C
[ … + 第 1 轮 + … + 最新一条 ]本次会话链;因为 Ploy 的 prompt 只往后追加、从不改前面,OpenAI 的隐式整段前缀链在会话内一直有效。
0% → 83.7%
缓存重建后,新会话首次调用的命中率
−28%
未命中的输入 token 总量降幅
92%~96%
对照:Claude 侧同一份 29K 前缀的机构级命中率
1.25×
GPT-5.6 没命中缓存时,每个 prompt 要多付的缓存写入附加费

改完之后,GPT-5.6 的每套评测成本落到了 Opus 之下。之前团队盯着的那道价差,每一块钱都是缓存配置错了,跟模型定价没关系。

还有一个没法绕开的结构性限制:在 OpenAI 上,跨工作区共享那段静态前缀,结构上就做不到。Anthropic 能共享,是因为它的缓存按机构划分、不按 key 分区。在 GPT-5.6 上,每个工作区的缓存一旦闲置过期,下次调用就要重付一次 29K 的冷写入,约 0.18 美元。这是实打实的成本,但有上限、可预期。

6推理记录

上一轮的推理记录会突然取不回来,加个开关就好

最后一个坑最短,但会真的搞坏对话。GPT-5.6 的 Responses API 默认把上一轮的推理过程存成"服务端 item 引用":服务器记一个编号,下一轮直接问那个编号。Ploy 的对话开始间歇性地在中途报错:Item 'rs_...' not found。

打个比方

服务端指针就像给你一张取件凭证,而不是直接把东西给你。凭证一过期,你就取不到货了。store: false 相当于直接把货交到你手上,再也不用担心凭证失效。

默认:服务端指针
上一轮的推理过程存成一个服务器编号(rs_...),下一轮直接问那个编号。编号一旦失效,就报 Item 'rs_...' not found。
store: false:自包含
SDK 改成请求"加密推理内容",把推理重放做成一块自带全部信息的数据,不再依赖服务器上那份状态。
推理重放跨轮次报错的修复配置
store: false — 让 SDK 改为请求「加密推理内容」,把推理重放做成自包含的数据块,
而不是指向服务器状态的指针引用;否则中途可能报错 Item 'rs_...' not found

还有一点让 Ploy 多调了一下午:一旦回路里带着服务端推理状态,哪怕你自己发出去的字节严格只往后追加、一个都没动过,上游的有效 prompt 还是可能变。

7成绩单与清单

迁移做完,最终成绩单和给同类团队的清单

四个坑一个个填完,开头那些承诺数字兑现了:耗时快约 2.2 倍、成本降 27%、视觉评分持平略升,缓存重配后首次命中率从 0% 拉到 83.7%、未命中输入 token 降 28%,per-suite 成本落到 Opus 之下;schema 改造后空文件读取归零、工具调用少约 30%。

这四步有先后顺序,先修框架,才能信后面的每一个数:

修评测框架
工具调用预算是按旧模型的顺序调用习惯设的,还藏着像 minScore 默认 1.0 这种看不见的阈值。头一轮约三分之一的失败其实是框架的锅,不是模型。
修工具 schema
GPT-5.6 把可选参数全填满、编造默认值,让文件读取悄悄返空。在 provider 边界把可选参数改成 anyOf: [T, null],执行前再把 null 剥掉。
重建缓存
OpenAI 要显式 prompt_cache_breakpoint 加 prompt_cache_key,key 按 workspace 绑,system prompt 拆成 A / B / C 三层。首次命中率 0% → 83.7%。
让推理重放自包含
加 store: false,把服务端指针换成加密的自包含数据块,治好 Item 'rs_...' not found 报错。
✅ 从 Claude 迁到 GPT-5.6,四步都要过一遍
如果你在比两个模型的成本,其中一个的缓存还是冷的,那你比的是自己的配置,跟模型无关。Ploy 官方工程博客
一份从 Claude 迁到 GPT-5.6 的四步检查清单,加上 schema 转换代码、cache key 决策清单和 store:false 修法,照着抄就能上手。
来源:Ploy 官方工程博客《Migrating a production AI agent to GPT-5.6》(ploy.ai/blog,2026 年 7 月 9 日)。本文为小互解读站的中文可视化解读,文中迁移收益、命中率、参数携带率等数据均为 Ploy 自评测口径,图表由本站据原文重绘。
来源
Ploy BlogPloy Blog·查看主材料
↑ 正文结束
✓ 本篇全文免费开放

会员可复制、下载全文 Markdown,还能让你的 AI 订阅和提问。

阅读原文 ↗
📮 新解读第一时间进邮箱

读完觉得有用?留个邮箱,每篇新解读发布就送达,随时退订。