Toolformer: Language Models Can Teach Themselves to Use Tools

model 2302.04761
tool-useself-supervisedapi-augmentationzero-shotgpt-j

Toolformer: Language Models Can Teach Themselves to Use Tools — L2 #

1. TL;DR #

一个 6.7B 的 GPT-J 用自监督方式给普通文本自动插入 API 调用,只保留"能降低后续 token 预测损失"的调用,再在增广数据上微调。学会自己决定何时/调用哪个工具后,零样本超越 25× 更大的 GPT-3,且不损失语言建模能力。

2. Q1 / Q2 / Q3 #

Q1 — 痛点 #

大语言模型强于少样本泛化,却在最基础的能力上失败:算术、事实查询、低资源语言、时间感知、以及对最新事件的访问。仅靠扩大规模无法根治。已有的"给模型加工具"方案有两条死路:(i) 依赖大量人工标注(如对话检索、WebGPT),成本高且"人认为有用"未必等于"模型认为有用";(ii) 把工具用限制在任务特定的少样本提示里,事先规定必须用哪个工具,无法通用化。缺口是一个既自监督(无需人工标注)又任务无关(模型自己决定何时/如何/用哪个工具)的工具学习方法。

Q2 — 方法 #

把每个 API 调用线性化为可插入任意文本的特殊 token 序列 $\text{e}(c,r)=\texttt{}\,a_c(i_c)\rightarrow r\,\texttt{}$,然后三步把纯文本数据集 $\mathcal{C}$ 转成增广数据集 $\mathcal{C}^*$:

  1. 采样:用工具特定 prompt $P(\mathbf{x})$ 让模型在每个位置给出发起调用的概率 $p_i$,保留 top-$k$ 且超过阈值 $\tau_s$ 的位置,再对每个位置采 $m$ 个候选调用。
  2. 执行:真正调用工具(另一个 LM、Python 脚本、BM25 检索等),得到文本结果 $r_i$。
  3. 过滤:只保留"有用"的调用——即提供调用+结果能让后续 token 的加权交叉熵损失下降至少 $\tau_f$ 的调用($L_i^- - L_i^+ \geq \tau_f$)。
  4. 最后把保留的调用原位插回文本,用标准 LM 目标微调模型自己。推理时正常解码,遇到 就中断、真实调用 API、把结果插回继续解码。

    核心技术壁垒:自监督"有用性"过滤准则 $L_i^- - L_i^+ \geq \tau_f$。它把"工具是否有用"这一主观判断,转化为一个纯粹由模型自身未来 token 预测损失度量的客观信号——不需要任何下游任务标签、不需要人类判断、不需要任务特定 prompt。$L_i^-$ 取"不调用"与"调用但不给结果"两者损失的最小值,保证 baseline 是最强的"无信息"对照,从而只有结果本身携带的信息才算数。这个信号+基座模型 in-context 生成候选调用的能力,是全方法唯一无法轻易替代的支点(详见 §7)。

    Q3 — 结果 #

    • LAMA(T-REx)53.5 vs GPT-3-175B 39.8;数学 SVAMP 29.4 vs GPT-3 10.0;开启 API 后数学各基准翻倍以上。
    • 工具调用率极高且自主:QA 场景 98.1% 调 QA 工具,数学 97.9% 调计算器,QA 检索场景 99.3% 调 WikiSearch。
    • 语言建模困惑度不因增广数据升高(关调用时 WikiText 10.3 / CCNet 10.5,与仅在 $\mathcal{C}$ 微调持平)。
    • 局限暴露:开放域 QA 仍输 GPT-3(搜索引擎太弱、无交互);MLQA 因 CCNet 微调分布漂移未能稳定超越原始 GPT-J。

    3. 架构 / 方法图 #

    Toolformer 不是一个新的网络结构,而是一个数据构造 + 微调 pipeline,作用在标准 decoder-only Transformer(GPT-J 6.7B)之上。核心方法图是论文 Figure 2 的三步流水线。

    Figure 2: sample → execute → filter pipeline for augmenting text with API calls

    Paper's Figure 2, verbatim (caption: "Key steps in our approach, illustrated for a question answering tool: Given an input text x, we first sample a position i and corresponding API call candidates ... We then execute these API calls and filter out all calls which do not reduce the loss $L_i$ over the next tokens. All remaining API calls are interleaved with the original text, resulting in a new text $x^$.").*

    这张图是整篇方法的骨架:注意"filter"步骤是唯一决定哪些调用进入训练集的闸门,它只看未来 token 损失是否下降,不看任何下游标签。QA 例子里"New Haven, Connecticut"的调用被保留,是因为它让后面的地名 token 更好预测。

    Figure 1 展示了训练完成后的推理行为:模型在四种语境下自主选择了不同工具。

    Figure 1: Toolformer autonomously calling QA / calculator / MT / Wikipedia APIs

    Paper's Figure 1, verbatim (caption: "Exemplary predictions of Toolformer. The model autonomously decides to call different APIs (from top to bottom: a question answering system, a calculator, a machine translation system, and a Wikipedia search engine) to obtain information that is useful for completing a piece of text.").

    从上到下依次是 QA → 计算器 → 机器翻译 → 维基搜索,说明同一个模型在没有任务提示的情况下能按语境切换工具——这正是 §2 desiderata 中"任务无关"的直接体现。

    采样步骤依赖工具特定 prompt,Figure 3 给出 QA 工具的 prompt 模板。

    Figure 3: exemplary QA prompt used to sample API call candidates

    Paper's Figure 3, verbatim (caption: "An exemplary prompt $P(x)$ used to generate API calls for the question answering tool.").

    prompt 用几个人写的示范展示"在哪里插入 [QA(...)] 最自然",模型据此在新文本上泛化出候选调用位置与参数——每个工具只需一把(handful)这样的示范。

    数据流(method pipeline) #

    flowchart LR C["原始文本 x ∈ 𝒞"] --> S["采样: 计算 p_i = p_M(<API> | P(x), x_1:i-1)
    保留 p_i > τ_s 的 top-k 位置
    每位置采 m 个候选调用"] S --> E["执行: 真实调用工具
    QA/Calc/WikiSearch/MT/Calendar → r_i"] E --> F["过滤: 保留 L_i⁻ − L_i⁺ ≥ τ_f 的调用"] F --> M["插回原位: x* = x_1:i-1, e(c_i,r_i), x_i:n"] M --> T["标准 LM 目标微调 M → Toolformer"] T --> INF["推理: 解码遇到 → 就中断、调用 API、插回结果、续解码"]

    Attention / FFN / 位置编码 #

    Toolformer 复用 GPT-J 6.7B 原始结构,方法本身不改架构:GPT-J 使用 MHA + RoPE(旋转位置编码,作用于每个 head 的 q/k)、标准(非 MoE)FFN、pre-norm 布局;词表也不改——// 用现有 token 序列 [ / ] / -> 表示(§2 脚注),使方法无需扩词表即可插入结构化调用。config.json 级维度未在论文正文披露([论文未披露],见 §Appendix 说明)。

    4. 作者证明 #

    本文无形式化定理证明,方法的正当性由一组定义式 + 实证验证支撑。下面给出记号表、方程物理意义与最小检查。

    记号表 #

    符号含义
    $M$待增强的语言模型(GPT-J 6.7B)
    $c=(a_c, i_c)$一次 API 调用:名称 $a_c$ + 输入 $i_c$
    $r$ / $r_i$API 返回结果(单一文本序列)
    $\text{e}(c)$, $\text{e}(c,r)$调用的线性化(无/含结果)
    $P(\mathbf{x})$工具特定采样 prompt
    $p_i$在位置 $i$ 发起调用的概率
    $\tau_s$, $\tau_f$采样阈值 / 过滤阈值
    $k$, $m$保留位置数上限 / 每位置候选调用数
    $L_i(\mathbf{z})$以 $\mathbf{z}$ 为前缀时对 $x_i,\ldots,x_n$ 的加权交叉熵损失
    $w_t$相对偏移 $t$ 处的归一化权重
    $\varepsilon$空序列

    关键方程与物理意义 #

    • 线性化:$\text{e}(c,r) = \texttt{}\,a_c(i_c)\rightarrow r\,\texttt{}$ —— 把结构化工具调用编码成可内联插入的纯文本,是"工具即文本"的表征基石。
    • 位置信号:$p_i = p_M(\texttt{}\mid P(\mathbf{x}), x_{1:i-1})$ —— 用模型自己发出 起始 token 的概率作为"此处值得调用"的先验。
    • 加权损失:$L_i(\mathbf{z}) = -\sum_{j=i}^{n} w_{j-i}\cdot \log p_M(x_j\mid \mathbf{z}, x_{1:j-1})$ —— 度量给定前缀 $\mathbf{z}$ 后模型对续写的预测能力,权重让"靠近调用位置的 token"权重更高。
    • 对照与准则:$L_i^{+}=L_i(\text{e}(c_i,r_i))$,$L_i^{-}=\min(L_i(\varepsilon), L_i(\text{e}(c_i,\varepsilon)))$,保留条件 $L_i^{-}-L_i^{+}\geq \tau_f$ —— 只有当"调用+结果"相比"最强无信息对照"降损至少 $\tau_f$ 时才算有用。
    • 权重函数:$w_t = \tilde{w}_t / \sum_{s} \tilde{w}_s$,$\tilde{w}_t = \max(0, 1-0.2\cdot t)$ —— 线性衰减,$t=5$ 时归零,保证调用发生在信息真正有用的位置附近。

    6 minimum checks #

    1. 量纲/单位一致性:$L_i^+$、$L_i^-$ 同为对相同 token 段 $x_i,\ldots,x_n$ 的加权 CE 损失(nats),相减为纯损失差,与 $\tau_f$ 同量纲 —— 一致。
    2. 边界情形:$r=\varepsilon$ 时 $L_i(\text{e}(c_i,\varepsilon))$ 落入 $L_i^-$ 的候选,此时准则 $\geq \tau_f$ 难满足(无新信息),符合"空结果不该被保留"的直觉。
    3. 权重归一化:$\sum_t w_t = 1$(定义即归一化);$\tilde{w}_t$ 在 $t\geq 5$ 为 0,故有效支撑为 $t\in\{0,1,2,3,4\}$,$\sum \tilde{w}_t = 1+0.8+0.6+0.4+0.2 = 3.0$,归一化后 $w_0=1/3$ —— 自洽。
    4. 单调性:$\tau_f$ 增大 → 保留调用数单调下降。Table 2 验证:QA 从 51,987($\tau_f{=}0.5$) → 18,526(1.0) → 5,135(2.0),各工具均单调递减 —— 一致。
    5. 对照最强性:$L_i^-$ 取 min 确保 baseline 不被高估,否则 $L_i^--L_i^+$ 会虚高、放入无用调用 —— 逻辑自洽(Table 10 中 -1.23 等负分被正确判为无用)。
    6. 参数量核对(capacity budget):GPT-J 6.7B 为唯一被反复 finetune 的主体;方法不新增可训练参数(工具是外部 API + 现有 token 表征),故"总参数量 = 基座 6.7B",与论文自报一致。
    7. 参数逐模块拆解表、Chinchilla/DeepSeek 式 scaling-law 拟合:本文非模型架构发布,[论文未披露]

      5. 实验与数据 #

      下游任务(QA 工具)— LAMA #

      Table 3: LAMA results, Toolformer vs baselines and GPT-3

      Paper's Table 3 (caption: "Results on subsets of LAMA. Toolformer uses the question answering tool for most examples, clearly outperforming all baselines of the same size and achieving results competitive with GPT-3 (175B).").

      Toolformer 在 SQuAD/Google-RE/T-REx 上分别比最好的同尺寸 baseline 高 +11.7/+5.2/+18.6,并同时超过 OPT-66B 与 GPT-3-175B——关键在于 98.1% 的样本模型自主选择了 QA 工具。这是"小模型 + 工具 > 大模型"的最强证据行。

      下游任务(计算器)— 数学基准 #

      Table 4: math reasoning results, enabling API more than doubles performance

      Paper's Table 4 (caption: "Results for various benchmarks requiring mathematical reasoning. Toolformer makes use of the calculator tool for most examples, clearly outperforming even OPT (66B) and GPT-3 (175B).").

      开启 API 后 ASDiv/SVAMP/MAWPS 全部翻倍以上(如 SVAMP 6.3→29.4),远超 GPT-3。值得注意的是即便"关调用"版本也强于纯 GPT-J,作者推测微调于大量调用+结果示例本身提升了模型自身的数学能力。

      局限暴露行 — 开放域 QA #

      Table 5: QA results, Toolformer beats same-size but loses to GPT-3

      Paper's Table 5 (caption: "Results for various question answering dataset. Using the Wikipedia search tool for most examples, Toolformer clearly outperforms baselines of the same size, but falls short of GPT-3 (175B).").

      99.3% 用 WikiSearch,超越所有同尺寸 baseline,但仍输 GPT-3-175B。作者归因于搜索引擎太简单且无交互能力(不能改写 query、不能翻多条结果)——这是核心壁垒之外方法当前形态的主要短板,直接引向 §7 局限。

      时间工具的意外 — 温度/日历 #

      Table 7: temporal datasets, calendar tool barely used on TempLAMA

      Paper's Table 7 (caption: "Results for the temporal datasets. Toolformer outperforms all baselines, but does not make use of the calendar tool for TempLAMA.").

      TempLAMA 上 Toolformer 提升了,但日历工具仅用 0.2%——增益其实来自 WikiSearch/QA。理想做法是"先查日历拿当前日期,再带日期查 QA"这种链式调用,但被"每样本至多一次调用"的限制禁止,也因训练数据里调用独立采样而难以学到。Dateset 上日历工具用到 54.8%,增益可完全归因于它。

      解码敏感性 — $k$ 的消融 #

      Table 9: decoding k ablation on T-REx and WebQS

      Paper's Table 9 (caption: "Toolformer results on the T-REx subset of LAMA and on WebQS for different values of k used during decoding ... percentage of examples for which the model decides to call an API (%).").

      增大 $k$ 使调用率从 40.3%/8.5%($k{=}1$)升至 98.1%/100%($k{=}10$)。有趣的是 $k=1$ 时模型有一定校准性——它恰好在自己会做不好的样本上选择调用(NC 子集 44.3/19.9 高于全体不调用时的 34.9/18.9),但这一性质在高 $k$ 时消失。(源表 WebQS % 列在 L1 中标注了排版歧义,此处采用正文数字。)

      6. 论证链 #

      步骤论断论文内依据
      1LM 的算术/事实/时间/多语弱点无法仅靠扩规模解决,需外部工具,但现有工具方案要么依赖人工标注要么任务特定§1 局限枚举 + 两条 desiderata
      2只要工具的输入输出可文本化,就能把调用线性化成特殊 token 内联插入任意文本,无需改词表§2 线性化式 + 脚注(用 [/]/->
      3用模型自身 概率 $p_i$ 定位候选、in-context 采样候选调用,可无标注地生成海量候选§2 采样式 $p_i$;Table 2 统计量
      4用 $L_i^- - L_i^+ \geq \tau_f$ 过滤,只保留真正降低未来 token 损失的调用——自监督"有用性"信号§2 过滤准则;§5 Table 10 高分↔有用的定性对应
      5把保留调用插回原位、标准 LM 目标微调,因文本内容与原始 $\mathcal{C}$ 相同,泛化能力不受损§2 微调段;§4.3 Table 8 困惑度持平
      6结果:模型自主决定何时/用哪个工具,零样本超越 25× 更大的 GPT-3(LAMA/数学),且工具能力在 ~775M 处涌现§4.2 Tables 3/4;§4.4 Fig 4 涌现阈值

      7. 实现 cross-reference #

      论文未随附官方推理/训练代码库到本 L1 抓取范围;正文与附录给出了可复现的超参与流程级细节,但无 file:line 级公开实现。故标记 [实现未公开](就代码而言),并整理关键实现细节如下(均可从论文 §Appendix 定位):

      • 默认阈值/采样预算(Appendix A 引言):$\tau_s=0.05$、$\tau_f=1.0$、$k=5$、$m=5$;计算器与 MT 因子集小改为 $\tau_s=0.0, k=20, m=10, \tau_f=0.5$。
      • 训练配置(Appendix B):每 API 至多 25k 样本、最大序列长 1024、有效 batch 128、DeepSpeed ZeRO-3、8× A100 40GB BF16、至多 2k step、每 500 step 在 1000 条 CCNet dev 集上评 PPL 选最优 checkpoint。

      核心技术壁垒(§6 补充) #

      最难复制的洞见是 §2 的自监督有用性过滤准则 $L_i^- - L_i^+ \geq \tau_f$,尤其是 $L_i^-$ 取 min 的设计。它把"工具是否有用"从需要人工/任务标签的判断,压缩成一个只依赖模型自身困惑度的标量信号;配合"任务无关、数据集即预训练语料"的选择,才使得微调不损失泛化能力(Table 8)。任何试图复现的人若把 baseline 取错(例如只用 $L_i(\varepsilon)$ 不取 min),就会放入大量"看似降损实则无信息"的噪声调用,破坏整个 pipeline 的信噪比。

      关键实现细节(易漏 tricks) #

      1. 不改词表// 全部用现有 token 序列 [/]/-> 表示(§2 脚注),使方法即插即用、无需扩表重训 embedding。
      2. 前缀而非原位做过滤:过滤时把 $\text{e}(c_i,r_i)$ 作为前缀而非插在位置 $i$(§2 脚注),因为微调前的 $M$ 没见过内联调用,中途插入会打断分布、虚高困惑度;只有微调后(数据已增广)推理才原位插入。
      3. 8. Serving / 部署考量 #

        • 训练即用 8× A100 40GB(BF16, ZeRO-3),基座仅 6.7B,推理硬件门槛低于同等能力的 175B 大模型——这正是本文"小模型+工具"路线的部署价值。
        • 推理有一次同步阻塞:解码到 必须中断、外呼真实 API、拿到结果再续解码——延迟受最慢工具(QA 用 Atlas-xxl、检索、MT-600M)主导,连续批处理需处理这类可变长中断。
        • KV cache / 精度维度:本文未做量化,全程 BF16,无 FP8/FP4 讨论([论文未披露])。

        9. Open questions(LLM 特有角度) #

        • 规模饱和/反转:工具能力在 ~775M 涌现,且到 6.7B 时带/不带调用的差距仍很大(Fig 4);在何种更大规模下这一差距会收窄乃至反转(模型内化知识后不再需要工具)?
        • 链式与交互:独立采样导致无法学到链式调用(TempLAMA 反例);把过滤准则扩展到多步/交互(可改写 query、翻多条结果)是最直接的下一步。
        • 样本效率:>100 万文档只产出几千条有用计算器调用(§7);能否用迭代 bootstrapping(用当前 Toolformer 再标注)放大有用调用密度?
        • 模态迁移:该"自监督工具过滤"recipe 是否能迁到视觉/音频模态的外部工具(OCR、ASR)?论文只在文本工具上验证。
        • 成本感知:当前决策不考虑工具的计算成本;引入 cost-aware 过滤是开放问题。

        Appendix: 模型架构图(代码驱动) #

        N/A — Toolformer 是作用于既有 decoder-only Transformer(GPT-J 6.7B)之上的数据构造+微调方法,非模型架构发布;论文未随附会改变网络结构的官方实现,基座维度(d_model、head 数、层数等 config.json 级参数)未在正文披露。因此本节不绘制代码驱动的架构细节图(A1–A6 均不适用),方法级数据流已在 §3 的 Mermaid 中给出。若需 GPT-J 逐块结构,应参照 GPT-J-6B 官方权重与 HF transformers 的 GPT-J 实现,但这超出本论文自身贡献范围。