程序式工具调用反超 JSON:GPT-5.6 涨 10.6%,弱模型却掉 26.9%

The Bitter Lesson of Tool Calling

Ishan Patel, Sahil Sen, Elias Lumer, Vamse Kumar Subbiah

cs.CL

2026-08-07

在 BFCL v4 上对比 14 个模型,让模型写 Python 调工具(PTC)在 11 个模型上追平或超过 JSON,GPT-5.6 涨 10.6%;但三个较老的模型反掉 19.7% 到 26.9%。

这篇在解决什么

工具调用(function calling)是大模型变成 agent 的关键一环:模型决定调哪个外部工具、填什么参数,运行时执行后把结果喂回来。目前业界主流是原生 JSON 方案,模型吐出一个结构化 JSON 对象(函数名加参数),运行时解析执行。另一条路是程序式工具调用(programmatic tool calling,PTC):把工具暴露成带类型的 Python 桩函数,模型直接写一段 Python 脚本去 import 并调用它们,在子进程里一次跑完。

PTC 的理论好处早有论证:一段代码能自然地串起多步调用,也能并行发出多个调用,而 JSON 方案每发一次调用往往要单独占一轮推理。但理论优势不等于实测优势。在统一基准上、跨多个模型世代、再叠上真实任务里的压力条件(长链路、大并行、上下文被污染),PTC 到底能不能追上甚至超过 JSON,一直没人系统验过。这篇就是来填这个空缺的。

方法

PTC 的链路:工具被编译成带类型的 Python 桩函数;模型写一段 import 这些桩的脚本;agent 循环在 shell 子进程里执行;结果从 stdout 一次性收回,不额外占用推理轮次。为了公平,两种方案在每个测试条目上消耗的 LLM 调用次数被对齐成一样。

评测用 BFCL v4(伯克利函数调用基准第四版),取一个覆盖 8 类任务的 309 条子集。14 个模型来自两家,时间跨度从 2024 年 11 月到 2026 年 7 月:Anthropic 一侧有 Claude Haiku 4.5、Sonnet 4.5、Sonnet 4.6、Opus 4.8、Sonnet 5;OpenAI 一侧有 GPT-4o、GPT-4.1、GPT-5-nano、GPT-5、GPT-5.4-mini、GPT-5.4,以及 GPT-5.6 的 Luna、Sol、Terra 三个变体。

除了主评测,还设了三个压力消融:链式调用(链长 2 到 20,后一个工具依赖前一个的输出)、并行扇出(一次发 7 到 48 个互相独立的调用)、上下文腐烂(把无关的干扰 schema 灌进上下文,模拟真实 agent 里信息被淹没的情形)。

结果

主评测:14 个模型里 11 个在 PTC 下追平或超过各自的 JSON 基线。GPT-5.6-Sol 和 GPT-5.6-Terra 各比自己的 JSON 基线高 10.6%。但有三个较老的 OpenAI 模型不升反降:GPT-4o、GPT-4.1、GPT-5.4-mini 掉了 19.7% 到 26.9%。掉的原因很具体,它们在多行脚本里吐出字面的反斜杠 n 转义序列,而不是真正的换行,子进程直接语法错误。这个 bug 在 GPT-5.4-mini 到 GPT-5-nano 之间的训练数据里被修掉了。

设置结果
主评测 GPT-5.6-Sol/Terra(PTC vs JSON)+10.6%
主评测 GPT-4o/4.1/5.4-mini(PTC vs JSON)-19.7% -26.9%
链式,链长 ≥12,Claude Sonnet 580.8% → 96.2%
并行扇出,GPT-571.9% → 96.9%
上下文腐烂,平均JSON -2.3%,PTC +5.5%

链式调用的优势随链长放大:链长到 12 跳以上时,PTC 比 JSON 高出 18.8 个百分点。并行扇出更明显,14 个模型里 13 个追平或超过。JSON 方案在这里还有一个硬天花板:Claude Sonnet 5 在并行数到 70 到 72 时开始整批漏调,而 PTC 在并行数 100 时仍保持 100% 的枚举准确率,该调的工具一个不落。上下文腐烂这一项最反直觉:JSON 平均掉 2.3%,PTC 不降反升 5.5%(部分模型因为更丰富的上下文反而表现更好),而一种基于文件系统发现工具的对照方案则平均崩掉 32.0%。

为什么重要

标题里的 bitter lesson 借的是 Sutton 那条 bitter lesson:通用机制(写代码)会随模型能力一起涨,最终压过专门设计的协议(JSON schema)。这篇的实测正好画出了这条曲线,模型越会写代码,PTC 越划算。GPT-5.6 这种强编码模型能吃下 10.6% 的红利,而老模型因为吐不出合法的多行脚本反而吃亏。同时 JSON 方案在大并行下有结构性的硬上限(整批漏调),PTC 没有。

对做 agent 的人:如果你的模型编码能力强,PTC 能把多轮工具编排压成一轮、绕开 JSON 的扇出天花板、还能在上下文被污染时更稳。但它不是免费升级,依赖模型稳定吐出可执行代码,链式场景下还要多花约 1.5 倍的输入 token(固定的系统提示开销)。模型偏弱就老老实实用 JSON。

局限与存疑

术语

原文与代码

社区讨论

相关论文

全部论文解读