Claude新模型工具调用变差,工程师深挖根因
Claude Opus 4.8 & Sonnet 5 这批更好的模型,工具调用却更差了,真的吗?有点意外!
做 Agent 或工具调用的同学必看,这篇深度分析了新模型在非主流 schema 上倒退的根因,并给出了 strict 模式等实用建议,值得仔细阅读原文。
Claude Opus 4.8 & Sonnet 5 这批更好的模型,工具调用却更差了,真的吗?有点意外!
来自 Flask/Sentry 资深工程师 @mitsuhiko,他从一次 Pi 的诡异 bug 切入,揭示了一个反直觉趋势:更强的模型,在非主流工具 schema 上反而更不可靠。 https://lucumr.pocoo.org/2026/7/4/better-models-worse-tools/
现象:SOTA 模型在"工具调用"上倒退 Pi 的 edit 工具支持一次提交多个精确替换,参数结构是嵌套的 edits[] 数组: { "path": "...", "edits": [{ "oldText": "...", "newText": "..." }] }
Opus 4.8 与 Sonnet 5 在调用此工具时,会在 edit 对象末尾凭空发明字段:requireUnique、type、id、oldText2、in_file、children、cost……花样繁多且每次不同。诡异的是,oldText/newText 本身往往字节级正确——模型理解了任务,只是在收尾时多吐了"垃圾键",导致 schema 校验失败被拒。
几个关键特征: · 以前的 Anthropic 模型不出现此问题,Opus 4.8 / Sonnet 5 才出现——新模型反而更差。 · 单轮 fresh prompt 无法复现,长 agentic 历史(读文件、诊断、再编辑)下复现率约 20%。 · 去掉历史中的 thinking 块,失败率减半;开启 strict 模式,问题消失。
机制:工具调用本质是"带标记的文本" Anthropic 模型并非真正"调用函数",而是在生成文本中插入类似 XML 的 antml:function_calls 标记,由客户端解析。顶层字符串参数走内联,嵌套对象/数组则要模型手写 JSON 字符串——而这段 JSON 内还要嵌入几百 token 的转义多行文件内容。
失败点恰好位于熵最高的位置:一段长 newText 闭合后,模型要在 } 与 ,"..." 之间二选一。新模型在此处倾向于多采样一个"看起来合理"的字段名。
可选的两条出路: · 事后校验:让模型自由生成,失败再重试(当前默认)。 · 约束解码(grammar-aware / constrained decoding):采样器在生成时直接屏蔽违反 schema 的 token。Anthropic 的 strict 模式大概率就是服务端在做这件事——这也解释了为何 strict 模式对 schema 复杂度有上限。
根因假设:RL 后训练对"特定 forgiving harness"过拟合 Armin 最强的解释是训练产物,而非随机退化: · 现代 Anthropic 模型的后训练(RL)很可能在 Claude Code 或其近似 harness 中进行。 · Claude Code 自带的 edit 工具是扁平结构:file_path / old_string / new_string / replace_all,与 Pi 的嵌套 edits[] 形状不同。 · 更致命的是,Claude Code 的客户端(作者反编译了 minified 代码)极度宽容:接受 old_str / old_string / new_str 等参数别名、修复坏掉的 \uXXXX、过滤未知键、对畸形调用自动重试、并且不开 strict 模式(因为 strict 会撞 complexity limit)。
后果:在这样的 forgiving harness 里做 RL,畸形工具调用仍能完成任务并拿到 reward,几乎不存在"乱加字段"的负梯度。模型于是学到了一个强先验——"edit 操作可以多带一个可选字段",但在 Pi 的 schema 下它没有学过该字段叫什么,于是每次现编一个名字。这正是为何失败键百花齐放而非稳定一个。
Claude Code 的训练生态是闭源、未文档化的。官方文档里的 text editor 工具格式,连 Claude Code 自己都不遵守。
与 OpenAI harmony 路线的对比 OpenAI 的 gpt-oss / harmony 把"这是 JSON 内容"显式写进 prompt 格式(<|constrain|>json),让推理栈能在该边界切换到 JSON 约束采样,还支持自定义 LARK 文法。Codex 系列在作者测试中未出现此回归。Anthropic 这边则较隐晦,只有 strict 模式可用,且对 schema 复杂度设卡。
对 harness 开发者的含义(核心结论) 1. 工具 schema 不是中性契约。模型不再是"通用推理器按 schema 输出",某些 schema 形状靠近后训练分布、某些远离;远离的会吃亏,哪怕模型"理解"它。 2. 越强的模型可能越难对抗——它的先验更深,会"更用力地"按 Claude Code 的形状来打你的工具。 3. 唯一主导 harness 的 RL 训练,会让所有其他 harness 被迫继承它的怪癖,而这些怪癖闭源、不文档化、随时可能变。 4. Armin 原本对 grammar-constrained decoding 持保留态度(担心质量折损),但这次事件显著改变了他的先验:当模型在"能力变强"的同时"schema 保真度变差",harness 必须从某处获得更强保证。最直接的就是开启 strict 模式。
更进一步:量化金融体系
看懂新闻只是起点——沿量化金融路径,把它变成能交付的工程能力