你理所当然地认为一个更新、更强的模型应该在所有方面都比旧模型更好。
毕竟 SOTA 模型在 Frontier-Bench 上刷了新高,在 CursorBench 上逼近 Fable 5,你花更贵的 API 费用,理所应当得到更好的 tool calling 能力。
然后你发现 Opus 4.8 调用你的编辑工具时,凭空发明了 schema 里不存在的字段。
不是 Haiku,不是 Sonnet 3.5,是最新最强的 Opus 4.8 和 Sonnet 5。旧模型反而没问题。
这就是 Armin Ronacher 在开发 Pi 编辑器时撞上的反直觉 bug——一个足以让所有第三方 Coding Harness 重新审视自己工具设计的工程陷阱。
〇、元问题:模型的目标函数不是你的目标函数
Armin 的发现过程极其简单。Pi 有一个 edit 工具,schema 定义得清清楚楚。旧模型——Claude 3.5 Sonnet、更早的 Opus——调用这个工具时规规矩矩,字段名、类型、结构都按 schema 来。
到了 Opus 4.8 和 Sonnet 5,开始出问题。
模型在
edits[]数组里凭空加入 schema 中不存在的字段。编辑本身是对的,但参数不匹配 schema,Pi 只能拒绝请求,让模型重试。
Armin 的原话是:
“What surprised me is that this is getting worse with newer Anthropic models.”
翻译过来就是:让我震惊的不是模型会生成格式错误的 tool call,而是这件事在新模型上变得比旧模型更差。
这是一个非常不正常的退化方向。
一、退化链条:RL 训练如何产生"工具偏好"
Armin 给出了一个假设,这个假设目前没有被 Anthropic 官方证实,但从工程逻辑上完全说得通。
新模型经过了针对 Claude Code 内置工具的强化学习训练。
Claude Code 的 edit 工具使用的是 search_and_replace 模式:找到旧文本,替换为新文本。这是 Claude Code 内部的一种特定工具协议。
而 Pi 使用的是自己的 edit 工具,虽然功能类似,但 schema 结构不同。新模型在 RL 训练中被反复奖励"正确使用 Claude Code 的 edit 工具"的行为,导致它在面对其他编辑工具时,也倾向于往 Claude Code 那套 schema 上靠。
经验一:RL 训练越聚焦于某个特定工具集,模型在第三方工具上的泛化能力就越差。这不是 bug,是 feature——只是这个 feature 对 Anthropic 有利,对你没利。
Simon Willison 在转发 Armin 的博客时补充了一个尖锐的观察:
“Does this mean third-party coding harnesses like Pi should implement multiple edit tools just so they can use the one with the best performance for the underlying model the user has selected?”
翻译:第三方工具是不是要同时实现多套编辑工具,只为适配不同模型对不同工具 schema 的偏好?
这听起来荒谬,但它正在变成工程现实。
二、同样的故事,不同的玩家
这不是 Anthropic 独有的问题。OpenAI 的 Codex 使用 apply_patch 机制来做编辑,而 OpenAI 同样在训练中优化模型对这个工具的使用。
所以同样的退化链条也在发生:GPT-5 在 Codex 的 apply_patch 上表现完美,但如果你给它一个自定义的 edit 工具,它可能会在边缘情况下产生不符合 schema 的输出。
每一个模型厂商都在为自己的旗舰产品优化 tool calling,而优化方向天然地和第三方工具的兼容性冲突。
经验二:Tool Calling 不是标准件。它正在变成一个厂商锁定手段——你用我的工具协议,就有最好的体验;你自己设计协议,就要忍受退化。
更扎心的是,这个问题不会因为模型"变聪明"而自动解决。恰恰相反——模型越强,RL 训练越聚焦,对特定工具协议的偏好越深。
三、如果你也在开发自己的 Coding Harness
Armin 和 Simon 的讨论揭示了几个应对策略。
策略一:检测模型版本,动态切换工具 schema。
如果你的 harness 支持多个模型,为不同的模型家族准备不同的工具定义。给 Claude 系列的工具定义尽量接近 Claude Code 的内置工具 schema;给 OpenAI 系列的尽量接近 Codex 的工具 schema。
这本质上是把兼容性成本从模型侧转移到了 harness 侧。 短期可行,长期维护负担不小。
策略二:在 tool call 校验层加入模糊匹配。
当模型返回的 tool call 包含未知字段时,不是直接拒绝,而是尝试判断"模型是不是在套用其他工具的 schema"。如果是,忽略多余字段,只取匹配的部分。
这个策略的 tradeoff 很明显:你在用容忍度换取成功率,但容忍度本身就是精度损失。
策略三:接受重试成本。
让模型第一次调用失败后被拒绝,然后在错误消息中明确告知 schema 的正确格式。这个策略看起来笨拙,但反而是目前最稳定的方案。
Claude 和 GPT 在收到明确的 schema 错误后,通常能在 1-2 次重试内修正。代价是多一次 API 调用,但至少不会引入额外的复杂度。
经验三:在 Agent 工程中,「重试」不是一个 workaround,而是一个被低估的架构模式。模型不是确定性系统,给它一次修正的机会往往比事前预防更经济。
四、这个问题的深层含义
回到元问题:
模型的目标函数不是你的目标函数。
Anthropic 优化 Claude 的目标是让它在 Claude Code 里表现好。OpenAI 优化 GPT 的目标是让它在 Codex 里表现好。
你的 Coding Harness 是第三方的。从厂商的角度看,你的工具 schema 对齐问题不是他们的优先级——除非你有足够的用户量,让这个问题变成他们的商业顾虑。
Simon 问的那个问题——“第三方 harness 是不是应该实现多套编辑工具”——其实已经暗示了一个更大的趋势:
Tool Calling 协议正在从开放标准退化为平台专属协议。
就像 iOS 的 UIKit 和 Android 的 Material Design——不是你不能跨平台,但"最优体验"永远是绑定在特定平台上的。
同理,Claude Code 的 edit 工具 = Anthropic 的 UIKit。你不会指望一个 iOS app 在 Android 上跑得一样好。
总结
| 决策 | 回答的根本问题 |
|---|---|
| 动态切换工具 schema | 兼容性成本谁来承担? |
| 模糊匹配校验 | 容忍度和成功率怎么平衡? |
| 接受重试成本 | 哪种架构复杂度更值得? |
| 接受平台分化 | 这是一个能解决的问题还是该适应的事实? |
Armin 的这个发现值得每一个做 Agent 工具链的人停下来想一想:你花在调 tool schema 上的时间,到底是在解决一个技术问题,还是在对抗一个商业决策?
如果你是一个人或者一个小团队在做 Coding Harness,最务实的答案是:别对抗。让自己兼容,接受重试,把精力花在工具本身的价值上。
🎯 正在用 Claude / GPT 搭建自己的 Agent 系统?
- 📬 关注「全栈之巅 - 梦兽编程」,获取 Agent 工程实践第一手经验
- 🔧 访问 Rex 工具集 发现更多 AI 开发工具
参考来源:
- Armin Ronacher, Better Models: Worse Tools , Jul 4 2026
- Simon Willison, Better Models: Worse Tools , Jul 4 2026

