6.7B 超过 175B,Toolformer 让语言模型「自监督」学会调工具


一个能解奥数题、能写几千行代码的 LLM,做三位数乘法经常出错,问它今天是星期几也答不准。

这不是个别现象。模型规模再大,也只是部分缓解这种局限——算不准、记不住、不知道最近发生了什么。

2023 年,Meta AI Research 的 Timo Schick 等人给了一条不同的路线。他们让模型自己学会调外部工具——计算器、问答系统、搜索引擎、翻译、日历,不靠人工标注,而是在一个纯文本数据集上自监督训练。这就是 Toolformer。

结果反直觉:基于 6.7B 的 GPT-J 微调出来的 Toolformer,在数学推理任务 ASDiv 上拿到 40.4 分,175B 的 GPT-3 只有 14.0。

这篇论文真正想解决的,不是某一个 benchmark 的分数,而是一个更基本的问题:工具使用这件事,能不能让模型自己学出来。

语言模型的「基本功能」悖论

大语言模型有一个反常的现象:它擅长的事都很复杂——写代码、翻译、推理;它做不好的事都很简单——算术、查事实、知道今天是几号。

Schick 等人在论文开头列了五类这种固有局限:拿不到近期事件信息、事实幻觉、低资源语言理解差、缺精确计算能力、对时间流逝无感知。

这些不是模型不够大造成的。扩大规模只能让模型在已有能力上走得更远,对”根本做不到”的事无能为力。一个再大的语言模型,训练数据里没有 2026 年的新闻,它就不知道;训练数据里没有精确的浮点运算,它就算不准。

而这些事,恰恰是小模型擅长的——计算器算术永远对,日历永远知道今天,搜索引擎能拿到最新信息。

接工具,是自然的解法。

但已有方法各有各的问题。

已有方案的两条路,都走不通

Toolformer 之前的工具使用方法,大致分两类。

第一类靠大量人工标注。Google 的 LaMDA、Internet-augmented dialogue 这些系统,需要人标注大量”什么时候该调搜索、调回来怎么用”的样本。成本高,而且——更重要的是——人类觉得有用的调用,模型未必觉得有用。

第二类靠任务专属提示。PAL、TALM、ReAct 这些方法,给模型看几条 few-shot 示例,示例里写明了”这种问题应该用计算器""那种问题应该用搜索”。问题是,这种方法先验地知道了该用哪个工具,绑死在具体任务上。换个任务就得重新写示例,没有迁移性。

Schick 等人给 Toolformer 立了两条设计目标。

自监督学习。不依赖人工标注,让模型自己判断什么调用有用。这里有一个被多数方案忽略的点:人类的判断标准和模型的判断标准未必一致。人觉得”调一次搜索查作者背景”有用,但模型可能已经知道这个作者,调了反而干扰预测。让模型自己定义”有用”,比人替它定义更准。

不损失通用性。模型自主决定什么时候用、用哪个、怎么用,不绑定具体任务。这一点和 ReAct 这类 prompting 方案形成根本区别——ReAct 是任务来了一律走”推理+动作”的流程,Toolformer 是模型自己看着办。

这两条目标合在一起,指向同一个核心:工具使用要从外部强加的规则,变成模型自己学到的能力。

采样、执行、过滤——让困惑度当老师

Toolformer 的训练流程分三步。

Toolformer 三步流程:在文本中采样候选 API 调用,执行后用困惑度过滤,保留下来的调用和原文本交错成新数据集

第一步是采样。对每一种工具,研究者先写一个 few-shot 提示,告诉模型”这种工具可以这样调”。比如问答工具的提示里写了几条例子:输入”Joe Biden was born in Scranton, Pennsylvania”,输出可以在 Scranton 前面插一句 [QA("Where was Joe Biden born?")]。模型读完提示,在每篇文本的每个位置算一个概率——在这里开始一次 API 调用的概率有多大。保留概率够高的位置,每个位置再采样最多五个具体的调用候选。

第二步是执行。真的去调对应工具拿结果。问答工具调的是 Atlas——一个在 Natural Questions 上微调过的检索增强模型;计算器就是一个只支持四则运算的 Python 脚本;搜索引擎是索引了 Wikipedia 的 BM25 检索器。

这两步都不稀奇。真正关键的是第三步:过滤。

候选调用有成千上万,绝大多数是垃圾。怎么判断哪些有用?Schick 等人用了一个完全自监督的准则——这个调用能不能帮模型更好地预测后续 token。

具体做法是比较两种损失。把”调用+结果”都喂给模型当前缀,算它在后续 token 上的加权损失,记作 Li+L_i^+;把”完全不调用”和”调用但拿不到结果”两种情况下的损失取较小值,记作 LiL_i^-。只有满足

LiLi+τfL_i^- - L_i^+ \ge \tau_f

的调用才保留下来。翻译成人话:加上这个调用及其结果,让模型预测下文更容易了,比不调用或者拿不到结果都明显更容易,这个调用才算有用。

这个准则为什么聪明。

传统监督学习需要一个外部的”老师”告诉模型对错。但工具使用这件事很难定义对错——调一次问答拿回来的信息,可能在别的上下文里有用,在这个上下文里没用。Toolformer 的做法是把”有用”定义成”降低后续困惑度”,让模型自己未来的预测难度当裁判。不需要人标注任何一条调用是对是错,模型自己跑一遍,有用的留下来,没用的丢掉。

这有点像一个人读书时自己决定要不要查词典:不是老师规定哪个词必须查,而是看这个词查了之后,后面的句子是不是读得更顺了。

权重函数 wtw_t 进一步保证评估聚焦在调用附近的 token 上,离调用越远的位置权重越小,避免把不相关的预测波动算进来。

过滤完,保留下来的调用和原文本交错,构成新的数据集 C\mathcal{C}^*。关键性质是:除了插入的 API 调用,C\mathcal{C}^* 和原始数据集 C\mathcal{C} 文本完全相同。模型在这个新数据集上微调,接触到的内容和在原文上微调等价——所以不损失通用语言建模能力。

推理时的逻辑也直接:模型正常解码,一旦生成 这个 token,表示它接下来想要 API 响应,就中断解码、去调对应 API、把结果和 </API> 插回去,继续生成。为了防止模型陷入无限调 API 的死循环,每个输入至多触发一次调用。

五种工具,一个框架

Toolformer 不是只接一个工具,是五个。

问答工具调的是 Atlas,一个检索增强语言模型(检索增强生成的另一条路线可以看 LightRAG),能回答像”哥伦布骑士团在哪里成立”这种事实问题。计算器是一个 Python 脚本,只支持加减乘除,结果保留两位小数。维基百科搜索用 BM25 检索器,返回短文本片段,要求模型自己从片段里提取相关信息。机器翻译用 600M 参数的 NLLB,支持 200 种语言,源语言由 fastText 自动检测,目标恒为英语。日历不需要输入,调用就返回当前日期。

五种工具,唯一的共同约束是两条:输入和输出都能表示成文本序列,能拿到几条用法的示例。满足这两条,就能接进来。

这个约束看起来宽松,其实是论文的一个重要判断——它把”工具”从一个封闭集合,变成一个开放的接口。只要能文本化,任何系统都能当工具用。这也为后续工作打开了空间。

一个有意思的细节是数据规模。论文 Table 2 列了不同过滤阈值下保留的样本数。阈值 τf\tau_f 从 0.5 调到 2.0,问答工具的样本从近 5.2 万掉到 5 千,维基搜索从 20 万掉到 1.4 万,计算器从 3.7 千掉到 138。数字说明两件事:大部分候选调用其实没用,被过滤掉了;计算器这种工具,有用的样本尤其稀少,处理上百万篇文档才产出几千条。

6.7B 怎么超过 175B

实验结果里,最有冲击力的数字来自 LAMA 和数学任务。

LAMA 是一个知识探针基准,让模型补全缺事实的句子。在 SQuAD 子集上,Toolformer 拿到 33.8 分,GPT-3-175B 是 26.8,比它大 25 倍的 OPT-66B 只有 21.6。98.1% 的例子里,Toolformer 自己决定调问答工具拿信息。

数学任务上的差距更悬殊。ASDiv 上 Toolformer 40.4,GPT-3-175B 只有 14.0;SVAMP 上 29.4 对 10.0;MAWPS 上 44.0 对 19.8。97.9% 的例子里它调了计算器。

用一个不到 GPT-3 二十分之一大小的模型,在数学推理上甩开它近三倍。靠的不是模型本身更强,是模型学会了把算不准的事交给计算器。

但有一个细节更值得注意。把 Toolformer 的 API 调用全部禁用,它在 ASDiv 上仍然有 14.8 分,比在原始 CCNet 上微调的基线(9.6)高出一截。SVAMP 和 MAWPS 上也是类似趋势。

原因不复杂。Toolformer 在微调时见过大量”调用+结果”的数据,比如 [Calculator(735 / 499)] → 1.47 这种格式。这些数据里包含了正确的算术结果,等于让模型在训练中接触到大量带中间过程的数学示例。即便推理时不让它真的调计算器,这些训练信号也提升了它自己的算术能力。

这一点其实指向一个更深的观察:带工具调用轨迹的数据,本身就是一种高质量的训练数据。工具不只是推理时用的拐杖,它的调用记录可以反过来增强模型本身。

不过 Toolformer 不是在所有任务上都赢。在 WebQS、Natural Questions、TriviaQA 这些开放域问答上,它落后于 GPT-3-175B——WebQS 上 26.3 对 29.0,TriviaQA 上 48.8 对 65.9。论文给出的解释很坦白:搜索引擎太简单,经常返回不匹配的结果;而且模型不能和搜索交互,没法重写查询或浏览多条结果。

对核心语言建模能力的影响是另一个关键验证。在 WikiText 和 CCNet 上测困惑度,禁用 API 的 Toolformer 和在原始 CCNet 上微调的基线困惑度完全一致。学会用工具,没有牺牲模型的语言建模能力。

工具利用在 775M 才涌现

Toolformer 的方法能不能用到更小的模型上。

研究者把同样的流程套到 GPT-2 系列上——124M、355M、775M、1.6B 四个规模,只接问答、计算器、搜索三种工具。

GPT-2 系列不同规模上,带 API 和不带 API 的性能对比

结果呈现出一个清晰的阈值:工具利用能力大约在 775M 参数才涌现。124M 和 355M 的模型,用不用工具表现差不多;到 775M 以上,带 API 和不带 API 的差距开始明显拉开,而且规模越大差距越大。

这和思维链(Chain-of-Thought)在 100B 左右才涌现是同一类现象——某些能力不是线性增长,而是到了某个规模才突然出现。工具利用是这种现象的第二个干净实例。

一个例外是维基搜索。它在更小的模型上就开始有帮助,研究者推测是因为这个 API 比较好用——输入一个搜索词,返回相关片段,逻辑比”想一个该问的问题”简单。

涌现意味着工具不是免费午餐。模型不够大,给它工具它也用不好。这也解释了为什么 Toolformer 选 6.7B 的 GPT-J 做主实验——这个规模刚好能稳定地展现出工具使用带来的收益。

不能链式、不能交互——Toolformer 没解的问题

Toolformer 划出了工具使用的边界,论文在最后也坦率说了几个没解决的问题。

最关键的一个是不能链式用工具。把一个工具的输出喂给另一个工具,在 Toolformer 里做不到。原因是每种工具的调用在数据生成阶段是独立采样的,训练集里没有”A 工具的结果传给 B 工具”这种链式示例。模型从来没见过这种模式,自然学不会。

TEMPLAMA 这个数据集最能暴露这个短板。它考的是”某实体在某个时间点的状态”,比如”C 罗现在效力于哪家俱乐部”。正确做法是先调日历拿当前日期,再调问答系统带着日期去查。但 Toolformer 受”每个输入至多一次调用”的约束做不了这种两步链,只能靠单次搜索硬撞——而 TEMPLAMA 里的实体又太稀有,单次搜索命中率很低。结果是 Toolformer 在 TEMPLAMA 上几乎没有用日历,提升主要靠搜索和问答。

第二个是不能交互式用工具。搜索引擎可能返回几百条结果,Toolformer 拿到第一条就用,没法浏览、没法重写查询、没法判断结果有没有用再决定要不要换一个查。这正是 WebGPT 那种”模型和浏览器多轮交互”的路线要解决的问题,也是 Toolformer 在开放域问答上输给 GPT-3 的主要原因。

其他局限还包括:对输入的确切措辞敏感、样本效率低(百万文档才产几千条计算器样本)、决定是否调用时没考虑调用的计算成本。

这些问题不是 Toolformer 的失败,而是它作为奠基文留给后续工作的明确方向。链式工具使用、交互式搜索、更大规模的 API 生态——这些正是 Gorilla、ToolLLM、API-Bank 等后来者推进的方向。Gorilla 微调 LLaMA 专做 API 调用,零样本超过 GPT-4;ToolLLM 用 DFSDT 把线性推理升级成带回溯的树搜索,支持 16000 多个真实 API。

结尾

Toolformer 真正的贡献,不在于那几个超过 GPT-3 的数字。

它证明的是:工具使用可以从一个外部强加的规则,变成模型自己学到的能力。而教模型学会这件事,不需要人标注任何一条”这是对的调用”——只需要让模型自己未来的预测难度当裁判。

让模型自己定义什么是”有用”,比让人替它定义更接近工具使用的本质。