精读: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
阅读地图
本文精读按以下顺序展开,建议新手依次阅读:
- 摘要:一句话理解论文做了什么
- 引言:为什么现有大模型不够用,核心思路是什么
- 方法核心(重点):Toolformer 怎样"自己教自己用工具"——三步数据构造流程
- 工具细节:五种工具如何表示和调用
- 实验结果:6.7B 模型打过 175B GPT-3 的具体数据
- 讨论与局限:Toolformer 能做什么,不能做什么
- 与 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 的三大核心贡献:
-
首个完全自监督学习工具使用的方法:每种工具只需极少量示例,其余数据由模型自动生成和筛选,无需大规模人工标注。
-
通用性强:同时支持计算器、搜索引擎、问答、翻译、日历五种工具,不依赖特定任务设计。
-
效果惊人: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 > τₛ(采样阈值)的位置。
讲解:这一步回答了"在哪里插入工具调用"的问题。做法如下:
- 给模型看一段文字,然后在每个词的位置问模型:"你这里想用工具吗?想用工具的概率有多大?"
- 如果概率超过阈值 τₛ(论文取 0.05),就认为"这个位置有可能需要工具",保留下来。
- 每段文字最多保留 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)
- 实现:Python 脚本,计算算术表达式
- 调用格式:
[Calculator(expression) → result] - 示例:
[Calculator(127 × 38) → 4826] - 结果格式:数值,取两位小数(如
4826.00) - 用途:解决大模型不擅长的精确数值计算
4.2 维基百科搜索(Wikipedia Search)
- 实现:BM25 检索器,在 KILT 维基百科数据集上检索
- 调用格式:
[WikiSearch(query) → relevant text snippet] - 示例:
[WikiSearch("法国大革命时间") → 法国大革命发生于 1789 年...] - 用途:补充事实性知识,弥补模型知识截止问题
4.3 问答系统(Question Answering)
- 实现:在 Natural Questions 数据集上微调的 Atlas 模型
- 调用格式:
[QA(question) → answer] - 示例:
[QA("谁发明了电话?") → 亚历山大·贝尔] - 用途:直接回答事实性问题
4.4 机器翻译(Machine Translation)
- 实现:600M 参数的 NLLB 翻译模型 + fastText 语言检测
- 调用格式:
[MT(text) → English translation] - 示例:
[MT("Bonjour le monde") → Hello the world] - 用途:处理多语言文本,统一翻译成英语再处理
4.5 日历(Calendar)
- 实现:从文档 URL 元数据中提取日期
- 调用格式:
[Calendar() → Today is Weekday, Month Day, Year] - 示例:
[Calendar() → Today is Tuesday, October 18, 2022] - 用途:回答需要知道"今天是哪天"的时态相关问题
五、实验结果(核心数据)
5.1 实验设置
- 基础模型:GPT-J(6.7B 参数,EleutherAI 开源模型)
- 对比模型:
- GPT-J 基线(无工具)
- GPT-3(175B 参数,OpenAI)——参数量是 Toolformer 的 26 倍
- OPT(66B 参数,Meta AI)
- GPT-J + CCNet 微调(排除"微调本身有帮助"的干扰)
- 评估方式:零样本(Zero-shot)——不给任何示例,直接测试
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 方法中获益:
- 124M 参数:无法有效使用工具
- 355M、775M 参数:边际收益
- 1.6B 参数:开始出现明显效果
- 6.7B 参数(GPT-J):效果显著
这表明工具使用能力是在足够大的模型上才会涌现的能力(emergent ability),不是所有规模的模型都适合用这个方法。
六、讨论与局限性
6.1 Toolformer 能做到的
- 自主决定用哪个工具、什么时候用:不需要人告诉它"这道题用计算器",它自己判断
- 保留通用语言能力:学了工具后不变笨,语言生成质量不下降
- 跨任务泛化:一个模型同时掌握五种工具,可以应对不同类型的问题
- 极低标注成本:每种工具只需 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 是重要工作?
-
自监督数据构造范式:证明了"模型可以自己生成训练数据来学习工具使用"这条路是可行的。损失下降作为筛选标准,是一个无需人工标注的通用信号。
-
参数效率的突破:6.7B 的 Toolformer 在多项任务上超越 175B 的 GPT-3,表明能力增强(augmentation)可以部分替代规模扩大(scaling)。这对降低 AI 研究成本有重要意义。
-
通用能力与专业能力的兼顾:明确证明了微调学工具不牺牲通用语言能力,解决了业界对"专门化导致通用性下降"的担忧。
-
方法论贡献:损失过滤机制(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 设计、与后续工作的对比),可以继续追问。