Zhangzhe's Blog

The projection of my life.

0%

Toolformer: Language Models Can Teach Themselves to Use Tools

URL

TL;DR

  • 大模型并不是全能的,大模型 + 工具可以更好地解决问题,本文提出一种新的训练方法,让大模型可以自我学习使用如何工具。
  • 本文的主要贡献是提出了一种新的训练方法,包括通过大模型构造工具调用数据集、清洗数据集、使用工具调用数据集微调大模型。

Algorithm

ToolFormer 的意义

  1. 众所周知,大模型在很多任务上表现出色,但它们并不是全能的,比如去数 “strawberry” 这个单词中有多少个 “r”。
  2. 工具可以帮助大模型更好地解决问题,比如计算器、日历、知识库等。
  3. 一种常见的大模型和工具结合的方式是:通过 Agent 多角色(user / llm / function)多轮对话 形式调用,简单来说就是:
    1. 大模型在需要调用工具的时候,输出一段特定格式的文本
    2. 外部程序解析这段文本,调用相应的工具,调用得到结果
    3. 新的结果作为 Function 角色的输入,继续和大模型对话
  4. ToolFormer 采用的方式和 Agent 有相似之处,也有不同的地方:
    • 相似点:
      1. 都需要大模型输出一段特定格式的文本来调用工具
      2. 都需要一段 endless loop 程序来解析大模型的输出,调用工具
    • 不同点:
      1. ToolFormer 不是通过 多角色多轮对话 的方式调用工具,而是通过 单角色单轮对话 的方式调用工具
      2. ToolFormer 需要对大模型进行 微调,而 Agent 不需要
  5. ToolFormer 可以将存在确定答案的 专用 任务转化为工具调用任务(例如:计算、翻译、问答等),让大模型可以更专注在 通用 任务上(例如:上下文理解、常识知识运用等)。

ToolFormer 的工作方式

  1. ToolFormer 是经过工具调用微调的大模型,知道有哪些工具可以调用,也知道如何调用这些工具。
  2. 假设模型输入的问题是:
    1
    Pittsburgh is also known as
  3. 这个时候,模型会意识到这个问题可以通过调用 Question Answering 工具来解决,于是模型会续写:
    1
    Pittsburgh is also known as <API>QA(Pittsburgh is also known as)</API>
  4. 输出 </API> 之后,推理进程会暂停推理模型,等待外部监听程序的调用结束。
  5. 外部监听程序会解析模型输出文本中的工具调用指令(通过 <API> </API> 格式),然后调用 Question Answering 工具,得到结果:
    1
    the Steel City
  6. 推理程序将工具调用结果和模型的历史输出(去掉调用相关信息)拼接起来,继续推理模型:
    1
    Pittsburgh is also known as the Steel City.

应该怎么得到 ToolFormer

  1. 假设上面提到的 ToolFormer 工作方式是一个愿景,那么接下来就是考虑应该如何得到一个这样的模型。
  2. 显然,直接拿一个预训练或经过微调的大模型来使用是行不通的,因为它并不知道哪些工具可以用,以及如何调用。
  3. 那么需要做的事就是:通过微调,让大模型自己学习如何使用工具
  4. 最困难的部分就是:如何构造工具调用数据集,因为不存在现成的工具调用数据集,需要自己构造。
  5. 这篇论文花了很大的篇幅就在讲一件事:如何用大模型来构造工具调用数据集

如何构造工具调用数据集

toolformer_1.png

上面这张图展示了如何用大模型来构造工具调用数据集的流程。

  1. 首先,还是用预训练数据做为基础,假设一条预训练数据是:
    1
    Pittsburgh is also known as the Steel City.
  2. 然后,使用大模型(例如:GPT-3)来在数据中找到可以调用工具的位置和工具类型,并给出调用工具的参数,例如:
    1
    Pittsburgh is also known as <API>QA(What other name is Pittsburgh known by?) -> Steel City</API> the Steel City.
    1
    Pittsburgh is also known as <API>QA(Which country is Pittsburgh in?) -> United States</API> the Steel City.
  3. 计算调用工具带来的损失收益,剔除负收益的数据,保留正收益的数据。
    • 损失的计算方式(离调用工具位置越远,损失权重 wjiw_{j-i} 越小):

    Li(z)=j=inwjilogpM(xjz,xi;j1)L_i(z) = -\sum_{j=i}^n w_{j-i}\cdot \log p_M(x_j|z,x_{i;j-1})

    • 调用工具的损失:

    Li+=Li(e(ci,ri))L_i^+=L_i(e(c_i,r_i))

    • 不调用工具 / 调用工具没有返回的损失:

    Li=min(Li(ϵ),Li(e(ci,ϵ)))L_i^- = \min(L_i(\epsilon),L_i(e(c_i,\epsilon)))

    • 只保留调用工具损失收益大于阈值的样本:

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

  4. 用筛选后的数据来微调大模型,得到 ToolFormer

toolformer_2.png

  • 上图展示了 ToolFormer 支持的五种工具类型:
    1. Question Answering:问答工具
    2. Wikipedia Search:维基百科搜索工具
    3. Calculator:计算器工具
    4. Calendar:日历工具
    5. Machine Translation:机器翻译工具

Thoughts

  • ToolFormer 这种通过大模型自我学习使用工具的方式感觉挺好的,但似乎在实际使用中没有得到大范围推广,目前主流外挂工具的方式基本还是 Agent 的多角色多轮对话方式。
  • 可能是因为 ToolFormer 的方式需要对大模型进行微调,而 Agent 的方式不需要微调,直接使用预训练模型就可以。