将生产级 AI Agent 迁移至 GPT-5.6 Sol

将生产级 AI Agent 迁移至 GPT-5.6 Sol

Ploy 已将其生产级 AI agent(负责规划、构建和编辑营销网站)从 Claude Opus 4.8 迁移到了 GPT-5.6 Sol。此次迁移使构建的实际耗时减少了 2.2 倍,运营成本降低了 27%,同时保持或提高了视觉质量评分。

为实现模型对等而优化评估框架

评估框架(Evaluation harnesses)通常会针对现有模型进行隐性调优,导致在测试挑战者模型时出现不准确的性能数据。Ploy 发现,GPT-5.6 最初约三分之一的失败案例并非源于模型缺陷,而是由评估框架的假设引起的。

关键的框架失败原因

  • 工具调用预算 (Tool-Call Budgets): 现有的框架是针对 Claude Opus 的顺序工具调用风格设计的。GPT-5.6 使用并行工具调用,这导致即使模型正确解决了案例,也会耗尽这些预算。
  • 执行器支持 (Executor Support): 评估执行器不支持批量文件读取,而这是 GPT-5.6 频繁使用但 Opus 很少使用的功能。
  • 隐式阈值 (Implicit Thresholds): 一些数据集缺乏显式的 minScore 阈值,默认值为 1.0。这导致 GPT-5.6 的高质量输出(例如评分 0.98)被判定为“失败”,而如果使用更灵活的阈值,这些输出本可以顺利通过。

性能对比:Claude Opus 4.8 vs. GPT-5.6

每个完成构建的平均值 Claude Opus 4.8 (n=11) GPT-5.6 (n=10)
成本 $3.06 $2.22
实际耗时 8m 00s 3m 42s
输入 token 2.60M 1.70M
输出 token 33.0K 17.1K
视觉评分 0.936 0.970

通过模式转换解决工具调用损坏问题

GPT-5.6 表现出一种特定行为:它会在工具调用中用虚构的值(例如 offset: 0)填充所有可选参数,而不是省略它们。这使得虚构的值与预期的参数无法区分,从而导致工具执行出现重大失败。

“虚构值”问题

在 Ploy 的 code 工具中(该工具拥有 25 个参数),GPT-5.6 在 100% 的调用中都发送了所有 25 个键,而 Claude Opus 4.8 在 99.9% 的情况下都会省略未使用的参数。这导致 52% 到 64% 的文件读取返回为空,因为模型无意中将 offset: 0 作为真实参数发送了。

解决方案:必填但可为空的模式 (Required-but-Nullable Schemas)

提示词工程和 OpenAI 的 strict 模式并未解决此行为。Ploy 在提供商边界实现了模式转换:

  1. 将可选转为可为空: 每个可选属性都被重写为必填但可为空,使用 anyOf: [T, null]。这迫使模型在不使用参数时显式地声明 null
  2. 剥离 Null 值: 在工具调用衔接处,null 值在验证之前会被剥离,从而确保工具实现接收到的输入与以往一致。

这一改动将空文件读取的比例降低至 0%,并将每个任务所需的工具调用总数减少了约 30%。

为 GPT-5.6 重新配置提示词缓存 (Prompt Caching)

GPT-5.6 的提示词缓存机制与 Anthropic 的组织范围缓存有着本质区别。如果未能正确配置 prompt_cache_key,可能会导致 0% 的缓存命中率并显著增加成本。

架构差异

  • Anthropic (Claude): 缓存是组织范围的。一个静态前缀(例如 29K tokens 的工具模式)会被缓存一次并在所有对话和工作区中共享。
  • OpenAI (GPT-5.6): 缓存需要显式的 prompt_cache_breakpoint 标记和 prompt_cache_key。每个键映射到一个缓存节点,每个节点每分钟支持约 15 次请求 (RPM)。如果流量超过此限制,请求会溢出到冷节点,导致缓存未命中。

实现策略:工作区范围的键 (Workspace-Scoped Keys)

为了平衡命中率和吞吐量,Ploy 实现了一套工作区范围的键 (ws:{workspaceId}):

  • 入口 A (静态前缀): 在工作区内的所有会话中共享,使得新会话的第一次调用变得廉价。
  • 入口 B (工作区上下文): 在所有属于同一工作区的对话中共享;当工作区内存发生变化时进行更新。
  • 入口 C (Session Chain): 针对仅追加式对话轮次的隐式全提示词链。

经过此次重新配置后,首个调用缓存命中率从 0% 提高到了 83.7%,未缓存的输入 token 总数下降了 28%。

解决推理重放失败问题

GPT-5.6 的 Responses API 默认将前一轮的推理过程作为服务器端项引用。这导致在对话中途出现间歇性的 Item 'rs_...' not found 错误。Ploy 通过设置 store: false 解决了这一问题,这会强制 SDK 请求加密的推理内容,并将其作为自包含的二进制块 (blobs) 重放,而不是作为指向服务器状态的指针。

社区洞察与不同观点

业界从业者指出,模型在生产环境中很少是可互换的。正如一位开发者所言:

将整个评估框架、提示词和模型视为一个整体系统,而不是可以随意更换模块化部件的系统,如果你追求的是最优性能。

其他批评意见集中在 GPT-5.6 的具体设计质量上,一些用户更倾向于 Claude Opus 的品牌一致性,而另一些人则认为 GPT-5.6 本质上是之前模型的重新包装版本,相比 Opus 4.6 等旧版本并没有明显的质量提升。

Sources