有些事工具天生比模型强:精确算术、最新事实、精确查询、日期计算、生僻翻译。模型遇到这些,常常不调工具、直接凭权重里的模糊记忆硬编(幻觉)。
ReAct 用 prompt 当场教模型走「想-做-看」循环——但那是推理时的编排,没把能力训进模型。 要把工具调用变成模型的原生本事,得训练;可「在每个该调工具的位置都人工标注」贵到不可行。 Toolformer 的赌注:能不能让模型自己判断「哪里调工具有用」,自监督地生成训练数据?
| 步 | 做什么 |
|---|---|
| ① 试插 | 给定一段文本,用几个示例引导模型,在各种位置提出「这里也许该调某 API(带某参数)」的候选 |
| ② 执行 | 把候选 API 调用真的跑一遍,拿到结果(计算器算出值、搜索返回事实…) |
| ③ 筛选(核心) | 判据:把结果插进去,能不能让模型对「后面的词」预测得更准?能(loss 下降)→ 有用,保留;不能 → 丢弃 |
| ④ 微调 | 拿通过筛选的「带 API 调用的文本」去微调模型——它就把「在有用处调工具」学进了权重 |
最妙的一步是 ③。怎么判断一个工具调用「值不值得」?Toolformer 说:看它有没有帮模型把后续文本预测得更准。
比如文本「…通过率是 ___%」,插入 [计算器(400/1400)→28.6] 后,模型对「28.6%」的预测笃定了(loss 暴降)→ 这次调用有用,留下;若插在无关处、对后文预测没帮助 → 丢掉。
它复用了模型自己的训练目标(猜下一个词)当筛子——所以全程自监督、不用人标。
三个洞察,第一个是方法之妙,后两个把整个 agent 阶段串成一句话。
| 洞察 | 说明 |
|---|---|
| ① 「有用」= 「降 loss」,自监督 | 不用人去标「这里该调工具」,而是让模型用自己的预测误差来评判每个候选调用值不值——把「猜下一个词」这个老目标,变成了「工具有没有用」的免费、可规模化的判据。 |
| ② 工具能力烤进权重(vs ReAct 靠 prompt) | ReAct 在推理时用 prompt 编排;Toolformer 在训练时把「何时/如何调工具」学进权重。这就是 function calling 成为模型原生能力的路径。 |
| ③ 模型 = 推理内核,工具 = 它的延伸 | 模型负责推理与编排,把自己不擅长/权重里没有的事(算术、最新事实、动作)外包给工具——用工具把能力扩展到冻结权重之外。 |
看 Toolformer 的「筛选」怎么工作。同一句话,点三种情况,看「降不降 loss」如何决定一个 API 调用的去留。
看出门道了吗:筛选不看「人觉得该不该调」,只看「调了之后模型预测后文准不准」。有用的调用(降 loss)被留下、拿去微调,模型于是学会了「在会算错的地方,自己伸手拿计算器」——而不是硬编一个数。
| 维度 | ReAct(P20) | Toolformer(P21) |
|---|---|---|
| 工具能力怎么来 | prompt 当场编排(想-做-看循环) | 自监督训进权重 |
| 作用时机 | 推理时 | 训练时(之后推理就会用) |
| 要训练吗 | 不要 | 要(但数据自监督生成) |
| 解决的问题 | 用工具的推理循环长啥样 | 模型怎么学会该在哪/怎么调工具 |
| 今天的样子 | 合流:模型被训得会调工具(Toolformer 精神)+ 在 ReAct 式循环里用 | |
| 模型不擅长 / 权重里没有 | 外包给哪个工具 |
|---|---|
| 精确算术 | 计算器 |
| 最新 / 私有事实 | 搜索 / 检索(RAG) |
| 当前日期 / 时间推算 | 日历 |
| 生僻语言翻译 | 翻译 API |
| 改变世界的动作 | 各种 API / 执行器 |
🔮 这正是整个阶段五的母题:模型的权重是冻结且有限的,于是想办法把它「扩展出去」——RAG 用检索扩展知识、ReAct 用循环扩展行动、Toolformer 用自监督训练把调工具变成原生本事。三者合起来,就是一个现代 agent 的完整底座:一个推理内核 + 一圈它会自己调用的工具。
| 你工作里的东西 | 其实就是这篇论文的什么 |
|---|---|
| 你用的模型「会 function calling」 | 就是 Toolformer 精神的产品化:模型被训得能在合适处吐出工具调用——这能力的由来在这篇 |
| 你给 agent 挂哪些工具、在哪挂 | 判据正是 Toolformer 的筛选逻辑:在「模型会瞎猜/会算错/会过时」的地方提供工具;一个不减少不确定性的工具就是噪声 |
| 你的语音客服 / 对话 agent 整体架构 | 推理内核 + 工具延伸:模型管理对话与推理,把查知识库、算价格、查日程等外包给工具——别让它硬编它该去查的东西 |
| 「工具越多越好吗」 | 不是:工具多了模型选择困难、易选错。按 Toolformer 的精神——只挂「确实能降低模型出错」的工具,且描述要让模型分得清何时用哪个 |
| 更通用:模型不会算数 / 不知道今天几号 | 别指望 prompt 教会它算——那是工具的活。判断「这事该靠模型还是靠工具」,是 agent 设计的核心功夫 |
把这一课接到你真实工作上的几个关键问。点开看答。
你不用自己训,但它的判据直接指导你「怎么挂工具」。Toolformer 的核心是「工具在能降低模型不确定性的地方才有价值」——翻译成你的实操:① 在模型会瞎猜的地方挂工具(算术、实时数据、私有事实、动作),它本来就擅长的别硬塞工具;② 工具描述要让模型分得清何时该用(参数、用途写清楚),这相当于帮它复现 Toolformer 学到的「调用时机」判断。
一句话:你不训练模型选工具,但你设计的「工具集 + 描述」就是模型当场判断的依据——挂得准不准,直接决定 function calling 灵不灵。
不是,常常更糟。工具一多:① 模型选择困难、易选错(相似工具尤其);② 每个工具的描述都占上下文,挤压有效空间、增延迟;③ 调试与失败面变大。Toolformer 的精神恰恰是「只留有用的」(降 loss 才保留)。
实操:挂最小够用的工具集;相似功能合并;用清晰、互斥的描述帮模型区分;工具多到一定程度,考虑分层/路由(先让模型选一个工具类别,再在类别内选具体的)。少而准 > 多而杂——和你做 RAG 「精度 ≥ 召回」是同一种克制。
读原典:Schick et al. — Toolformer: Language Models Can Teach Themselves to Use Tools(2023)。
配套回看:ReAct(工具循环) + RAG(检索也是一种工具)——三篇合起来就是你 agent 的完整底座。
你从「一个 token 怎么被吐出来」,一路读到「一个 agent 怎么自己调工具」。回望五个阶段,每一阶段回答了一个根本问题:
| 阶段 | 回答的问题 | 关键论文 |
|---|---|---|
| 一 · 地基 | 模型怎么算(注意力/Transformer 怎么来的) | Attention / NMT / seq2seq / word2vec |
| 二 · 预训练范式 | 能力怎么长出来(预训练→涌现→ICL) | BERT / GPT-1/2/3 / T5 |
| 三 · 规模与效率 | 怎么又强又便宜(量化→修配比→省微调/注意力/激活) | Scaling / Chinchilla / LoRA / FlashAttn / MoE |
| 四 · 对齐与推理 | 怎么让它听话 + 会想 | RLHF / CoT / DPO / Constitutional AI |
| 五 · 检索与 Agent | 怎么把它扩展到权重之外、变成 agent | RAG / ReAct / Toolformer |
Mission 回看:你现在能在白纸上画 self-attention、能说清一篇新模型改了哪、能判断「这做不了/这很贵」的真假、能把 agent 输出不稳定拆到具体机制——「由内而外的物理直觉」,到手了。
下一步建议:① 关掉 AI,默写最该练的两处——self-attention(P01)与 RLHF 三步(P15);② 挑 2-3 篇做真实项目复盘(你的 RAG 知识库、语音 agent、LLM 评分器各对应哪几课);③ 想继续深挖可加读选读地基(AlexNet/ResNet/Adam…)或前沿新作。
参考:
Schick et al., Toolformer: Language Models Can Teach Themselves to Use Tools, 2023.