精读:Toolformer — 语言模型可以自学使用工具

论文信息
- 标题:Toolformer: Language Models Can Teach Themselves to Use Tools
- 作者:Timo Schick, Jane Dwivedi-Yu, Roberto Dessì, Roberta Raileanu, Maria Lomeli, Luke Zettlemoyer, Nicola Cancedda, Thomas Scialom
- 机构:Meta AI Research
- 发表:arXiv 2302.04761(2023年2月),收录于 NeurIPS 2023
- 原文链接:https://arxiv.org/abs/2302.04761


阅读地图

本文精读按以下顺序展开,建议新手依次阅读:

  1. 摘要:一句话理解论文做了什么
  2. 引言:为什么现有大模型不够用,核心思路是什么
  3. 方法核心(重点):Toolformer 怎样"自己教自己用工具"——三步数据构造流程
  4. 工具细节:五种工具如何表示和调用
  5. 实验结果:6.7B 模型打过 175B GPT-3 的具体数据
  6. 讨论与局限:Toolformer 能做什么,不能做什么
  7. 与 ReAct 对比:两种路线的本质区别

零、术语速查表(首次出现前请先看这里)

在正式开始之前,把本文会反复出现的几个术语讲清楚:

术语 英文 一句话解释
大语言模型 LLM / Language Model 经过海量文本训练、能读懂和生成文字的 AI,如 GPT 系列
API Application Programming Interface 应用程序接口,这里指"可以调用的外部功能",比如调用计算器、调用搜索引擎
工具 / Tool Tool 本文指计算器、搜索引擎、问答系统、翻译器、日历这五类外部功能
自监督 Self-supervised 不需要人工打标签,模型自己产生训练信号。类比:学生自己出题、自己对答案,而不需要老师逐题批改
损失 Loss 模型预测时的"出错程度"。损失越低,预测越准。可理解为"考试扣分"
困惑度 Perplexity 损失的另一种表达,数值越低代表模型越"不困惑"、预测越准
微调 Fine-tune 在已有预训练大模型基础上,用新数据继续训练,让模型学会新技能
上下文学习 In-context learning 不改变模型参数,只在输入里放几个示例,模型就能模仿着做。类比:给你看几道例题,你直接推断解法
Token Token 模型处理文字时的最小单位,大约等于半个到一个英文单词,或一个汉字
Zero-shot Zero-shot 没有看过任何示例直接做任务,考验模型的泛化能力

一、摘要(Abstract)

原文 + 翻译 + 讲解


原文:Language models (LMs) exhibit remarkable abilities to solve new tasks from just a few examples or textual instructions, especially at scale. They also, paradoxically, struggle with basic functionality, such as arithmetic or factual lookup, where much simpler and smaller models excel.

翻译:语言模型(LM)展现出了从极少量示例或文字指令中解决新任务的出色能力,在大规模下尤为突出。然而矛盾的是,它们在算术运算或事实查询等基础功能上却举步维艰——而这些任务,更简单、更小的模型反而表现优异。

讲解:这是论文开头的核心悖论,也是整篇文章的出发点。大语言模型非常聪明,能写文章、做推理、回答复杂问题,但算一道 3 位数乘法却经常算错;知道很多历史知识,却不知道"今天是星期几"。这就好比一个博士学者,做高深研究很厉害,但问他 127 × 38 等于多少,他可能还不如一个口袋计算器准确。


原文:In this paper, we show that LMs can teach themselves to use external tools via simple APIs and achieve the best of both worlds.

翻译:在本文中,我们证明语言模型能够通过简单的 API 接口自学使用外部工具,从而兼得两者之长。

讲解:"兼得两者之长"指的是:既保留大模型强大的语言理解和生成能力,又借助外部工具弥补算术、事实查询等弱点。核心词是"自学"(teach themselves)——这是最大的创新,不需要人工标注"这个地方应该用工具",模型自己能摸索出来。


原文:We introduce Toolformer, a model trained to decide which APIs to call, when to call them, what arguments to pass, and how to best incorporate the results into future token prediction.

翻译:我们提出了 Toolformer,这是一个被训练来决定调用哪个 API、何时调用、传入什么参数,以及如何将结果最好地融入后续 token 预测的模型。

讲解:注意这里罗列了四个"决定":哪个工具(计算器还是搜索引擎?)、什么时候调用(现在需要查资料了吗?)、传什么参数(搜索词是什么?)、结果怎么用(把结果插回文章里继续生成)。这四件事,以前都需要人工设计规则或标注数据,Toolformer 通过自监督学习全部搞定了。


原文:This is done in a self-supervised way, requiring nothing more than a handful of demonstrations for each API.

翻译:这一切以自监督的方式完成,每个 API 只需要少量示范样例。

讲解"少量示范"是个关键词。传统做法需要数万条"在这段文字的这个位置应该调用计算器,参数是这个"的人工标注数据。Toolformer 每种工具只需要人工写几条示例(论文里大约每种工具 4~5 个例子),其余几十万条训练数据都是模型自动生成和筛选的。这大大降低了标注成本。


原文:We incorporate a range of tools, including a calculator, a Q&A system, a search engine, a translation system, and a calendar. Toolformer achieves substantially improved zero-shot performance across a variety of downstream tasks, often competitive with much larger models, without sacrificing its core language modeling abilities.

翻译:我们融合了一系列工具,包括计算器、问答系统、搜索引擎、翻译系统和日历。Toolformer 在各类下游任务上取得了大幅提升的零样本性能,通常可与规模大得多的模型相媲美,同时不牺牲其核心语言建模能力。

讲解:最令人惊叹的结论在最后一句:Toolformer 基于 6.7 亿参数(6.7B)的 GPT-J 模型,在多个任务上能打过 1750 亿参数(175B)的 GPT-3——参数量是前者的 26 倍。秘密就在于学会了用工具。而且最后强调"不牺牲核心语言建模能力",意味着模型没有因为学工具而变笨,两者可以兼得。


二、引言(Introduction)

2.1 大模型的能力与局限


原文:Large language models (LLMs) have shown an impressive ability to perform new tasks simply from a few examples or brief instructions, including tasks that require logical reasoning, common-sense reasoning, and mathematical problem-solving. However, these models also have several inherent limitations that cannot simply be overcome by scaling them up further.

翻译:大语言模型(LLM)展现出了仅凭几个示例或简短指令就能完成新任务的惊人能力,包括需要逻辑推理、常识推理和数学解题的任务。然而,这些模型同样存在若干本质性的局限,单纯靠扩大规模无法克服。

讲解:这一段说明了一件事:scaling(扩大模型规模)不是万能药。过去几年,大模型一直在变大(从 GPT-2 的 15 亿参数到 GPT-3 的 1750 亿参数),性能确实大幅提升,但有些问题不是"更大"能解决的,比如模型根本不知道"今天是哪一天",无论参数量多大,这个信息也不在训练数据里。


原文:In particular, they are unable to access up-to-date information (as their knowledge is frozen at training time), they struggle to perform precise arithmetic computations, and they can hallucinate facts.

翻译:具体而言,它们无法获取最新信息(因为其知识在训练时就已冻结),难以进行精确的算术运算,并且会产生事实幻觉。

讲解:三个核心问题:
1. 知识截止日期:模型的训练数据有个截止时间,之后发生的事情它一概不知,就像一个人读完书就被锁进考场,考完才能出来看新闻;
2. 算术不可靠:大模型做乘除法经常出错,因为它是在预测"下一个 token 最可能是什么",而不是真的在"计算";
3. 幻觉(Hallucination):模型有时会自信地说出根本不存在的"事实",因为它只是在学习文本模式,而不是在查真实的知识库。


原文:A promising approach to overcome these limitations is to give LLMs access to tools that can solve these tasks more reliably, e.g., a search engine, a calculator, or a calendar.

翻译:一种克服这些局限的有前途的方法,是赋予 LLM 访问能更可靠地解决这些任务的工具的能力,例如搜索引擎、计算器或日历。

讲解:这就是本文的核心思路:不是让模型自己学会算数学,而是给它一个计算器;不是让它记住所有知识,而是给它一个搜索引擎。就像人类文明发展出了计算器、字典、图书馆,聪明人知道"遇到这类问题用这类工具"——Toolformer 要让模型学会这种判断。


2.2 关键挑战:何时调用、如何训练


原文:The key challenge in achieving this is teaching models to use tools in a helpful way, i.e., to use them only when necessary and to generate meaningful inputs for them. State-of-the-art approaches for teaching LLMs to use tools require either large amounts of human annotations or restrict themselves to specific tools and tasks.

翻译:实现这一目标的核心挑战在于训练模型以有益的方式使用工具,即仅在必要时使用,并为工具生成有意义的输入。现有最先进的方法要么需要大量人工标注,要么将自身限制在特定工具和任务上。

讲解:挑战有两层:
- 何时用:不能每个句子都去调用计算器,那样太慢且毫无意义;也不能从不调用,那就失去了工具的意义。模型需要学会"这个地方我需要帮助"。
- 如何训练:以前让模型学会用工具,要么需要人工标注大量"在这个位置调用这个工具"的数据(贵且慢),要么只能针对特定任务设计。这些做法可扩展性差。


原文:In this paper, we overcome these limitations with a bootstrapping approach. We first use a LLM's in-context learning abilities to create an annotated dataset for API usage, and then fine-tune the LLM on this dataset.

翻译:在本文中,我们通过一种自举(bootstrapping)方法克服了这些局限。我们首先利用 LLM 的上下文学习能力,创建一个用于 API 使用的标注数据集,然后在该数据集上对 LLM 进行微调。

讲解"自举"(bootstrapping)是本文最核心的概念,用一个比喻解释:

想象你在教一个聪明的学生学会"什么时候用计算器"。你不需要盯着他做 10000 道题然后标注哪道该用计算器——你只需要给他看 5 道示例,然后说:"你自己去做 10000 道练习题,用不用计算器你自己判断,做完后对答案,发现用了计算器做得更准的,那些情况就是'应该用计算器'的情况,把它们记下来。"

Toolformer 的方法就是这样:让模型自己在文本里尝试插入 API 调用,执行后看哪些调用真的让预测更准(损失下降),就把这些"有用的调用"保留下来作为训练数据,再微调自己。


2.3 核心贡献总结

Toolformer 的三大核心贡献:

  1. 首个完全自监督学习工具使用的方法:每种工具只需极少量示例,其余数据由模型自动生成和筛选,无需大规模人工标注。

  2. 通用性强:同时支持计算器、搜索引擎、问答、翻译、日历五种工具,不依赖特定任务设计。

  3. 效果惊人:6.7B 参数的 Toolformer 在多个基准上超越 175B 参数的 GPT-3,同时保留了通用语言建模能力。


三、方法核心(Toolformer 方法详解)

这是本文最重要的部分,请仔细阅读。

3.1 整体框架:让模型自己教自己用工具

核心类比:自学使用计算器的学生

想象一个高中生在做数学应用题:
- 第一步(采样):他在做每道题时,随时可以尝试拿出计算器算一下。他不确定是否需要,但他会在觉得"这里可能需要计算"的地方试一试。
- 第二步(执行):他真的按下计算器,得到一个数字结果。
- 第三步(筛选):他对比两种情况:用了计算器的答案,和不用计算器(靠心算或跳过)的答案。如果用了计算器,整道题做得更对,他就把"这种情况用计算器"记在笔记本上。
- 第四步(微调):他把笔记本里的经验整理成习惯,以后遇到类似情况就自然知道该用计算器了。

Toolformer 做的事情完全一样,只是把"学生"换成"语言模型","题目"换成"文本预测任务","做得更对"换成"损失(Loss)下降"。


3.2 工具调用的文本表示格式


原文:API calls are represented as special sequences of tokens that can be interleaved with regular text. We define an API call as a tuple c = (api_name, i) consisting of an API name and a list of input parameters i = [i₁, ..., iₙ], where each iₙ is a sequence of tokens. The corresponding API result is a sequence of tokens r. Given this, a call c and its result r are represented as a single token sequence: "e(c,r) = [api_name(i₁, ..., iₙ) → r]"

翻译:API 调用被表示为可以与普通文本交错的特殊 token 序列。我们将一次 API 调用定义为一个二元组 c = (api_name, i),由 API 名称和输入参数列表 i = [i₁, ..., iₙ] 组成,每个 iₙ 都是一段 token 序列。相应的 API 结果是 token 序列 r。在此基础上,调用 c 及其结果 r 被表示为单一 token 序列:[api_name(i₁, ..., iₙ) → r]

讲解:这一段解决了一个工程问题:如何在纯文本的语言模型里"嵌入"工具调用?答案非常优雅——就用特殊的文本格式!

举个具体例子,原本一段文字是:
苹果公司市值约为 2.7 万亿美元
加入计算器调用后变成:
苹果公司市值约为 [Calculator(2700 * 10^9) → 2700000000000] 2.7 万亿美元
方括号 [...] 内是完整的"调用+结果"序列。这样,API 调用不是什么特殊的代码,而是语言模型可以直接生成和读取的普通文本。这个设计思想非常重要:工具调用被"语言化"了,语言模型能做什么(生成文本),用工具就能做什么,不需要任何额外的架构修改。


3.3 第一步:采样候选 API 调用位置和参数


原文:Sampling API Calls. Given a dataset C of plain texts, for each text x ∈ C, we first identify positions i that are likely to benefit from an API call. Specifically, we compute the probability p_i = P_M([API] | prompt(x), x₁:ᵢ₋₁) of the model placing an API call token at each position i and only keep those where p_i > τₛ (the sampling threshold).

翻译采样 API 调用。给定一个由纯文本组成的数据集 C,对于其中每段文本 x,我们首先识别出可能从 API 调用中获益的位置 i。具体来说,我们计算模型在每个位置 i 放置 API 调用 token 的概率 p_i = P_M([API] | prompt(x), x₁:ᵢ₋₁),只保留那些 p_i > τₛ(采样阈值)的位置。

讲解:这一步回答了"在哪里插入工具调用"的问题。做法如下:

  1. 给模型看一段文字,然后在每个词的位置问模型:"你这里想用工具吗?想用工具的概率有多大?"
  2. 如果概率超过阈值 τₛ(论文取 0.05),就认为"这个位置有可能需要工具",保留下来。
  3. 每段文字最多保留 k=5 个候选位置(避免过多尝试)。

这一步的关键是:模型是用上下文学习(in-context learning)来提出候选调用的——在输入里附上几个示例,告诉模型"这种情况下应该调用什么工具、参数是什么",模型就能模仿着提出新的候选。人工只需要写这几条示例,不需要标注整个数据集。


原文:We then use M to generate up to k API calls for each such position i by sampling from the model with the prompt format. For the i-th position in text x = x₁, ..., xₙ, the prompt contains: (i) a task description and a few examples illustrating the use of the API, (ii) the original text x₁:ᵢ₋₁, followed by [API].

翻译:接着,我们通过从模型中采样,为每个这样的位置 i 生成最多 k 次 API 调用,采样使用特定的提示格式。对于文本 x = x₁, ..., xₙ 中的第 i 个位置,提示包含:(i)任务描述和若干说明 API 使用方式的示例;(ii)原始文本 x₁:ᵢ₋₁,后跟 [API] 标记。

讲解:为每个候选位置生成 m=5 个不同的候选调用。为什么要多生成几个?因为一个位置可能适合不同的查询方式,多生成几个候选再筛选,能提高最终保留到有用调用的概率。

提示(Prompt)的格式:以计算器为例,提示大概长这样:
```
你的任务是在文本中合适的地方添加计算器调用。
示例1:苹果有12个,橙子有[Calculator(8*5)→40]40个...
示例2:...

现在请处理这段文字:
小明的月薪是 5000 元,一年工资是[API
`` 模型看到[API之后,就会续写出Calculator(5000*12) → 60000]` 这样的内容。


3.4 第二步:执行 API 调用


原文:Executing API Calls. After sampling candidate API calls, we execute them by calling the corresponding tools with the generated input parameters. Different tools have different implementations, but all return either a text string or an empty result if the tool fails or is unable to answer.

翻译执行 API 调用。采样候选 API 调用之后,我们通过使用生成的输入参数调用相应工具来执行它们。不同工具有不同的实现方式,但所有工具都返回文本字符串,或者在工具失败或无法回答时返回空结果。

讲解:这一步很直接:拿着第一步生成的调用参数,真的去执行外部工具,得到结果。

五种工具的实现细节:
- 计算器:用 Python 脚本计算算术表达式,结果取两位小数
- 问答系统:用在 Natural Questions 数据集上微调的 Atlas 模型回答问题
- 维基百科搜索:用 BM25 检索器在 KILT 维基百科数据集上检索,返回最相关段落
- 机器翻译:用 600M 参数的 NLLB 模型将文本翻译成英语
- 日历:根据文档的 URL 元数据返回当前日期(格式如"Today is Tuesday, October 18, 2022")

执行后,把结果填回原来的位置,变成完整的 [tool(input) → result] 序列。这样我们就有了"带有工具调用和结果"的文本版本,下一步就是判断这些调用到底有没有用。


3.5 第三步:用损失筛选有用的 API 调用(最关键的步骤)

这是整篇论文最核心的创新,请重点理解。


原文:Filtering API Calls. We keep only those API calls c with corresponding result r where the model loss on the subsequent tokens is sufficiently reduced. More precisely, we compute:

L⁺ᵢ = L_i(e(c_i, r_i)) — the loss with the API call and its result

L⁻ᵢ = min(L_i(ε), L_i(e(c_i, ε))) — the minimum of the loss without any API call, and the loss with the API call but without the result

and only keep the API call if L⁻ᵢ − L⁺ᵢ ≥ τ_f, where τ_f is a filtering threshold.

翻译筛选 API 调用。我们只保留那些使模型在后续 token 上的损失足够降低的 API 调用 c(及其结果 r)。更精确地说,我们计算:

L⁺ᵢ:包含 API 调用及其结果时,模型对后续 token 的损失

L⁻ᵢ:以下两种情况损失的最小值——(1)完全不调用 API、(2)有 API 调用但没有结果

只有当 L⁻ᵢ − L⁺ᵢ ≥ τ_f 时,才保留这次 API 调用,其中 τ_f 是筛选阈值(论文默认取 1.0)。

讲解:这是本文最精妙的设计,需要仔细理解每个变量的含义:

L⁺(有调用且有结果的损失):模型看到"[Calculator(127×38) → 4826]"后,对后面文字的预测准确度。损失越低,说明有了这个结果后,后续内容更容易预测(更有帮助)。

L⁻(没有帮助时的损失):取两种"没有帮助"情况的最小值:
- 情况1:根本没有 API 调用,纯靠模型自己预测
- 情况2:有 API 调用的壳子([Calculator(127×38) → ])但结果是空的——这是为了排除"光看到调用格式就对预测有帮助"的干扰情况

筛选条件 L⁻ − L⁺ ≥ τ_f:这表示"有结果"比"没有结果"的损失低了至少 τ_f = 1.0。差值越大,说明工具结果越有帮助。

完整类比
想象学生用计算器做数学题:
- L⁺ = 用了计算器并且看到答案之后,后续题目做对了多少(错误率)
- L⁻ = min(完全不用计算器的错误率,用了计算器但遮住屏幕不看结果的错误率)
- 筛选条件 = "用了计算器且看到答案"比"没有看到答案"好很多

这样就过滤掉了两种无用的情况:
1. 工具结果完全没用(L⁺ ≈ L⁻,差值接近0)
2. 工具生成的调用格式本身就已经混淆了模型(用空结果反而比不调用更差)


原文:The loss Lᵢ(z) is computed over a weighted average of the next tokens, with weight w_t = max(0, 1 − 0.2·t) for the t-th token after the API call position i, ensuring that more weight is given to tokens immediately following the API call.

翻译:损失 Lᵢ(z) 是对后续 token 的加权平均,第 t 个 token 的权重为 w_t = max(0, 1 − 0.2·t),确保更靠近 API 调用位置的 token 获得更大权重。

讲解:这个权重设计很合理。假设在文章中间用了搜索引擎,那么紧接在搜索结果后面的几个词,是最直接受益于搜索结果的。越往后,文字可能已经说到其他话题了,跟这次调用的关联就越弱。所以用递减权重(t=0权重最高,t=5之后权重为0),让筛选更聚焦于"调用之后立即有用"的调用。


3.6 第四步:微调模型


原文:Finetuning. We merge all API calls that pass the filtering step back into the original texts and finetune M on the resulting augmented dataset C. Crucially, C contains the same texts as C, but with API calls interleaved at appropriate positions.

翻译微调。我们将所有通过筛选的 API 调用合并回原始文本,并在得到的增强数据集 C 上对模型 M 进行微调。关键在于,C 包含与 C 相同的文本,只是在适当位置穿插了 API 调用。

讲解:微调阶段的细节:

  • 训练目标:标准语言建模目标,即预测下一个 token(包括预测 API 调用本身)
  • 批大小:128
  • 学习率:1×10⁻⁵,前 10% 步骤线性预热
  • 基础模型:GPT-J(6.7B 参数的开源模型)

最关键的设计选择:微调数据集 C 用的是与预训练相同的文本(CCNet 网络爬取语料),只是插入了 API 调用。这意味着模型学到的不只是"要用工具",同时还在继续学习通用语言知识。这就是为什么 Toolformer 最后能在保留通用语言能力*的同时学会使用工具。

比喻:就像你在复习课本时,老师在课本的关键数字旁边写上"这里可以用计算器"——你既复习了知识,又学会了什么时候该用工具,两不耽误。


3.7 完整流程图示

【输入】大规模纯文本数据集 C(CCNet)
         ↓
【第一步:采样候选位置和参数】
  - 对每段文字,找出"可能需要工具"的位置(概率 > 0.05)
  - 用上下文学习,为每个候选位置生成 m=5 个可能的 API 调用
  - 输出:候选 API 调用列表(每个调用有名称和参数)
         ↓
【第二步:执行 API 调用】
  - 真正运行每个候选调用(调用计算器、搜索引擎等)
  - 得到结果 r(或空结果)
  - 输出:带有"调用+结果"的候选文本片段
         ↓
【第三步:损失筛选(核心!)】
  - 计算 L⁺(有调用有结果的损失)
  - 计算 L⁻(无调用或无结果的损失的较小值)
  - 只保留 L⁻ − L⁺ ≥ 1.0 的调用(真正有用的)
  - 输出:经过筛选的有用 API 调用
         ↓
【第四步:构建增强数据集 C*】
  - 将有用的 API 调用插回原始文本
  - C* = 原始文本 + 恰当位置的 API 调用
         ↓
【第五步:微调模型】
  - 在 C* 上用标准语言建模目标微调 GPT-J
  - 输出:Toolformer(会自主判断是否调用工具的模型)

3.8 为什么"损失是否下降"是判断工具有没有用的好标准?

这是一个值得深入思考的问题。

直观解释:损失衡量的是"模型对接下来要说什么有多不确定"。如果告诉模型"127×38 = 4826"之后,它对紧接着的文字预测得更准,说明这个计算结果确实是后续文字需要的信息。反之,如果给了结果之后模型依然困惑,说明这次调用没有提供有用信息。

与其他标准的对比
- 人工标注:需要人判断"这里该用工具",成本高,难以规模化
- 任务准确率:只能在有标准答案的任务上衡量,无法用于无监督的通用文本
- 损失下降(本文方法):可以在任何文本上计算,不需要人工答案,且直接衡量"工具结果对后续预测有没有帮助"

关键性质:损失是与任务无关的通用指标。不管是在讨论历史的文章里还是在解数学题的文章里,"调用工具后损失下降"都意味着工具确实帮了忙。这使得整个方法可以应用于任何领域的文本,实现真正的通用性。


四、五种工具的具体实现

4.1 计算器(Calculator)

4.3 问答系统(Question Answering)

4.4 机器翻译(Machine Translation)

4.5 日历(Calendar)


五、实验结果(核心数据)

5.1 实验设置

5.2 事实记忆任务(LAMA 基准)

LAMA 测试模型对知识性填空的能力,例如"法国的首都是______"。

模型 SQuAD Google-RE T-REx
GPT-J 基线(无工具) 17.8 4.9 31.9
GPT-J + CCNet 微调 17.6 5.6 32.5
Toolformer 33.8 11.5 53.5
GPT-3(175B) 26.8 7.0 39.8
OPT(66B) 20.6 5.1 36.4

解读:在 T-REx 数据集上,Toolformer(6.7B)得分 53.5,GPT-3(175B)只有 39.8。6.7B 打败了 175B,且领先 13.7 个百分点。主要原因:Toolformer 学会了用 QA 工具和维基百科搜索来查证事实,而不是靠记忆。

5.3 数学计算任务

模型 ASDiv SVAMP MAWPS
GPT-J 基线 7.5 5.2 9.9
Toolformer 40.4 29.4 44.0
GPT-3(175B) 14.0 10.0 19.8

解读:数学任务上提升最为惊人。GPT-J 基线在 ASDiv 只有 7.5 分,Toolformer 达到 40.4,提升了 5 倍以上,并且大幅超越参数量 26 倍的 GPT-3(14.0 分)。Toolformer 在 97.9% 的数学样例中都调用了计算器——它学会了"数学题就用计算器"这条规律。

5.4 开放域问答任务

模型 WebQuestions NaturalQuestions TriviaQA
GPT-J 基线 18.5 12.8 43.9
Toolformer 26.3 17.7 48.8
GPT-3(175B) 29.0 22.6 65.9

解读:问答任务上,Toolformer 超越了 GPT-J 基线,但在 TriviaQA 上仍不如 GPT-3(48.8 vs 65.9)。原因之一:GPT-3 的训练数据更多,记住了更多事实。Toolformer 在 99.3% 的问答样本中都调用了维基百科搜索,但搜索的单次查询限制了它处理复杂问题的能力(无法多次查询、无法综合多个搜索结果)。

5.5 多语言问答(MLQA — 6 种语言)

语言 GPT-J 基线 Toolformer 提升
西班牙语 15.2 20.6 +5.4
德语 13.5 19.0 +5.5
印地语 1.3 1.4 +0.1

解读:翻译工具在资源丰富的语言(西班牙语、德语)上帮助显著,但在资源较少的语言(印地语)上提升有限。这揭示了翻译工具本身的局限——如果翻译质量不高,反而可能引入噪声。

5.6 时态推理任务

模型 TempLAMA Dateset
GPT-J 基线 13.7 3.9
Toolformer 16.3 27.3
GPT-3(175B) 32.9 11.5

解读:Dateset 任务需要知道"今天是哪一天",Toolformer 学会了用日历工具(54.8% 的样本调用了日历),得分从 3.9 跳升到 27.3,甚至超过了 GPT-3(11.5)。这是工具调用最直接有效的案例。

5.7 核心语言能力是否保留(困惑度测试)

这个测试回答"学了工具用之后,模型的通用语言能力有没有下降"。

模型 WikiText 困惑度 CCNet 困惑度
GPT-J 原始模型 9.9 10.6
GPT-J + CCNet 微调 10.3 10.5
Toolformer(禁用工具) 10.3 10.5

解读:将 Toolformer 的 API 调用功能禁用(相当于测纯语言能力),困惑度与 GPT-J 基线相当,没有显著下降。这证明了论文的重要承诺:学会用工具不会让模型变笨,通用语言能力得到了完整保留。

5.8 工具能力的涌现规模

论文还测试了不同大小的模型是否都能从 Toolformer 方法中获益:

这表明工具使用能力是在足够大的模型上才会涌现的能力(emergent ability),不是所有规模的模型都适合用这个方法。


六、讨论与局限性

6.1 Toolformer 能做到的

  1. 自主决定用哪个工具、什么时候用:不需要人告诉它"这道题用计算器",它自己判断
  2. 保留通用语言能力:学了工具后不变笨,语言生成质量不下降
  3. 跨任务泛化:一个模型同时掌握五种工具,可以应对不同类型的问题
  4. 极低标注成本:每种工具只需 4~5 个人工示例,其余全自动

6.2 Toolformer 的局限性


原文:A key limitation of Toolformer is that it cannot be used for tasks that require tools to be used in an interactive fashion, e.g. tools that maintain a state across multiple calls or require sequential tool use.

翻译:Toolformer 的一个关键局限在于,它无法用于需要以交互方式使用工具的任务,例如需要跨多次调用维护状态或需要顺序使用工具的情况。

讲解:这是最重要的局限。Toolformer 只能在文本的某个位置插入一次工具调用,得到结果后继续。但很多复杂任务需要:
- 链式调用:用搜索结果再算一下,再搜索,再判断
- 多步推理:先查事实,再基于事实推理,再验证

这正是后来 ReAct(Reasoning + Acting)论文所解决的问题——让模型可以循环地"想→做→看→再想→再做"。


原文:Furthermore, Toolformer requires generating a large number of API calls per document during the annotation phase, which is computationally expensive.

翻译:此外,Toolformer 在标注阶段需要对每个文档生成大量 API 调用,计算开销较大。

讲解:数据构造阶段的效率问题。论文处理了超过 100 万个文档,每个文档要在多个位置尝试多次 API 调用——最终保留下来的数据其实很少(计算器有用的调用只有几千条),"性价比"较低。这是自监督方法的通病:需要大量尝试才能筛出有用信号。


原文:Finally, Toolformer is unable to use tools in a context-dependent way, e.g., it cannot chain tool outputs as inputs to other tools.

翻译:最后,Toolformer 无法以上下文相关的方式使用工具,例如无法将一个工具的输出作为另一个工具的输入。

讲解:无法"工具链"(tool chaining)。比如:先用搜索引擎找到某公司的年收入,然后把这个数字直接输入计算器做运算。Toolformer 的工具调用都是独立的一次性操作,不能联动。这在实际复杂任务中是个明显限制。


七、与 ReAct 的对比

Toolformer 和 ReAct(Yao et al., 2022)是两篇同期的代表性工作,方向相同但路线不同,理解它们的区别有助于把握整个"工具使用"领域的发展脉络。

维度 Toolformer ReAct
核心思路 训练阶段内化工具使用能力 推理阶段动态交错思考与行动
是否需要微调 需要(在 CCNet 上微调 GPT-J) 不需要(纯 prompting,不改模型参数)
工具使用方式 文本中嵌入单次 API 调用 Reason-Act 循环:想 → 做 → 观察 → 再想
能否多步推理 不能(每次只插入一个调用) 可以(循环执行,直到得出答案)
标注需求 每种工具 4~5 个 few-shot 示例 少量 Thought-Act-Observation 示例
通用能力保留 明确验证(困惑度不下降) 未专门验证
适合场景 流式文本生成中嵌入工具辅助 需要多步推理的复杂问答任务
局限 无法链式调用,无法迭代 需要精心设计 prompt,性能依赖模型大小

总结:Toolformer 更像是"把工具使用内化为本能"——通过训练,让模型形成"遇到这类问题就用这类工具"的直觉,推理时不需要额外思考;ReAct 更像是"边思考边行动"——在推理时显式地规划步骤、调用工具、观察结果、继续推理。

两者代表了不同的设计哲学:
- Toolformer:工具使用 = 训练数据的一部分,inference 阶段透明
- ReAct:工具使用 = prompt 设计的一部分,inference 阶段可观察可控


八、核心贡献总结

为什么 Toolformer 是重要工作?

  1. 自监督数据构造范式:证明了"模型可以自己生成训练数据来学习工具使用"这条路是可行的。损失下降作为筛选标准,是一个无需人工标注的通用信号。

  2. 参数效率的突破:6.7B 的 Toolformer 在多项任务上超越 175B 的 GPT-3,表明能力增强(augmentation)可以部分替代规模扩大(scaling)。这对降低 AI 研究成本有重要意义。

  3. 通用能力与专业能力的兼顾:明确证明了微调学工具不牺牲通用语言能力,解决了业界对"专门化导致通用性下降"的担忧。

  4. 方法论贡献:损失过滤机制(loss-based filtering)作为一种通用的自监督数据筛选方法,启发了后续许多工作。

从 Toolformer 到现代 Agent 的演进路径

Toolformer (2023年2月)
↓ 解决"无法多步工具调用"的问题
ReAct (2022年10月)
↓ 更系统的多步工具使用
ToolLLM / Gorilla (2023年)
↓ 更大规模的工具库
现代 AI Agent(工具调用 + 规划 + 记忆)

Toolformer 是这条路线上奠基性的一步:它证明了语言模型可以学会自主判断何时使用工具,并以极低的标注成本实现这一能力。


九、引用信息

@article{schick2023toolformer,
  title={Toolformer: Language Models Can Teach Themselves to Use Tools},
  author={Schick, Timo and Dwivedi-Yu, Jane and Dess{\`i}, Roberto and 
          Raileanu, Roberta and Lomeli, Maria and Zettlemoyer, Luke and 
          Cancedda, Nicola and Scialom, Thomas},
  journal={arXiv preprint arXiv:2302.04761},
  year={2023}
}

精读完成。如需深入某一部分(如损失筛选的数学细节、具体工具的 Prompt 设计、与后续工作的对比),可以继续追问。