Toolformer
Toolformer出自2023年2月Meta上传的论文《Toolformer: Language Models Can Teach Themselves to Use Tools》,它提出了一种通过自监督训练的方式来让模型决定调哪个API什么时候调用。
API调用的表示:为了让模型去能够调用API,将API表示成一个文本序列,并用特征token来标识每一个API调用的开始和结束,这样就可以将API调用无缝插入到任意文本中了。将每一个API调用表示成一个元组
c
=
(
a
c
,
i
c
)
c=(a_c, i_c)
c=(ac,ic),其中
a
c
a_c
ac是API的名字,
i
c
i_c
ic是其对应的输入;API调用的结果记为r,则不带结果和带结果的API调用的序列可表示成如下:
e
(
c
)
=
<
API
>
a
c
(
i
c
)
<
/
API
>
e
(
c
,
r
)
=
<
API
>
a
c
(
i
c
)
→
r
<
API
>
e(c) = <\text{API}> a_c(i_c) </\text{API}> \\ e(c,r) = <\text{API}> a_c(i_c) \rightarrow r <\text{API}>
e(c)=<API>ac(ic)</API>e(c,r)=<API>ac(ic)→r<API>
上面的表达式中的"" 和"“以及
→
\rightarrow
→是用来标记API调用的特殊token,注意这里标识只是为了可读性方便理解,实际上实现时为了不修改模型的词表,使用”[“、”]“、”->“来表示”" 和""和
→
\rightarrow
→,上面图片中是几个API表示的例子。
训练数据的构建:对于一个只包括普通文本的数据集 C = { x 1 , … , x ∣ C ∣ } \mathcal{C} = \{x^1, \ldots, x^{|\mathcal{C}|}\} C={x1,…,x∣C∣} ,通过如下三步来将数据集变成一个包含API调用的数据集 C ∗ \mathcal{C}^* C∗(如上图示意)。
- 采样API调用:写prompt P ( x ) P(\mathbf{x}) P(x)让模型 M M M对一个样本 x = x 1 , … , x n \mathbf{x} = x_1, \ldots, x_n x=x1,…,xn来生成API调用数据,比如问答工具的prompt如下图所示。设 P M ( z n + 1 ∣ z 1 , … , z n ) P_M(z_{n+1} | z_1, \ldots, z_n) PM(zn+1∣z1,…,zn)是模型计算的token z n + 1 z_{n+1} zn+1是序列 z 1 , … , z n z_1,\ldots,z_n z1,…,zn的下一个token的概率,对于每一个位置 i ∈ 1 , … , n i \in {1, \ldots, n} i∈1,…,n, 概率 p i = p M ( < API > ∣ P ( x ) , x 1 : i − 1 ) p_i = p_M (<\text{API}> |P(\mathcal{x}), x_{1:i-1}) pi=pM(<API>∣P(x),x1:i−1)是模型 M M M 计算的在位置i处开始调用API的概率,给定一个采样阈值 τ s \tau_s τs,将所有满足 I = { p i > τ s } I=\{p_i > \tau_s \} I={pi>τs}的top k个概率最大的位置保留。再对于每一个 i ∈ I i \in I i∈I的位置,让 M M M在给定序列 [ P ( x , x 1 , … , x i − 1 , < API > ] [P(\mathbf{x}, x_1, \ldots, x_{i-1}, <\text{API} >] [P(x,x1,…,xi−1,<API>] 前缀下生成最多m个以 < / API > </\text{API}> </API>结尾的API调用序列 c 1 i , … , c i m c^i_1,\ldots, c^m_i c1i,…,cim。
- 执行API调用:执行所有 M M M生成的API调用,具体如何执行取决于API的类型。每一个API调用 c i c_i ci对应的输出 r i r_i ri必须是单个文本序列。
- 过滤API调用:给定一个权重序列 ( w i ∣ i ∈ N ) (w_i | i \in \mathbb{N}) (wi∣i∈N), 当模型 M M M被给定前缀 z \mathbf{z} z,设带权交叉熵损失为 L i ( z ) = − ∑ j = i n w j − i ⋅ log p M ( x j ∣ z , x 1 : j − 1 ) L_i(\mathbf{z}) = - \sum_{j=i}^n w_{j-i} \cdot \log p_M (x_j | \mathbf{z}, x_{1:j-1}) Li(z)=−∑j=inwj−i⋅logpM(xj∣z,x1:j−1)。 比较这个损失的两个实例:
L i + = L i ( e ( c i , r i ) ) L i − = m i n ( L i ( ϵ ) , L i ( e ( c i , ϵ ) ) ) L^+_i = L_i (e(c_i, r_i)) \\ L^-_i = min(L_i(\epsilon), L_i(e(c_i, \epsilon))) Li+=Li(e(ci,ri))Li−=min(Li(ϵ),Li(e(ci,ϵ)))
上式中
ϵ
\epsilon
ϵ表示空序列。
L
i
+
L^+_i
Li+是如果将API调用和其输出作为模型
M
M
M的前缀得到的加权损失,而
L
i
−
L^-_i
Li−是不使用API调用或使用API调用但不提供输出这两者中较小的损失。定义过滤阈值
τ
f
\tau_f
τf,如果一个API调用满足
L
i
−
−
L
i
+
≥
τ
f
L^-_i - L^+_i \ge \tau_f
Li−−Li+≥τf 则保留。即希望API调用及其输出是有助于模型生成未来的token。在论文中使用的权重序列计算方式如下:
w
t
=
w
~
t
∑
s
∈
N
w
~
s
with
w
~
t
=
max
(
0
,
1
−
0.2
⋅
t
)
w_t=\frac{\tilde{w}_t}{\sum_{s \in \mathbb{N}} \tilde{w}_s} \text { with } \tilde{w}_t=\max (0,1-0.2 \cdot t)
wt=∑s∈Nw~sw~t with w~t=max(0,1−0.2⋅t)
模型微调:对于一个输入文本 x = x 1 , … , x n \mathbf{x} = x_1, \ldots, x_n x=x1,…,xn及其在位置i的API调用和结果 ( c i , r i ) (c_i, r_i) (ci,ri),构建新的序列 x ∗ = x 1 : i − 1 , e ( c i , r i ) , x i : n \mathbf{x^*} = x_{1:i-1}, e(c_i, r_i), x_{i:n} x∗=x1:i−1,e(ci,ri),xi:n,将数据集 x ∈ C \mathbf{x} \in \mathcal{C} x∈C中所有的数据都构建新序列后生成新的数据集 C ∗ \mathcal{C}^* C∗,注意 C ∗ \mathcal{C}^* C∗中也包括那些与数据集 C \mathcal{C} C一样的文本,作者认为这样有助于模型学习何时及如何调用API。 使用标准的语言模型目标函数在数据集 C ∗ \mathcal{C}^* C∗来微调模型 M M M。
模型推理:使用微调后的模型推理时,在模型输出 → \rightarrow →符号之前都进行常规的解码操作,当模型输出 → \rightarrow →之后,中断解码过程并调用API获取相应的结果,并将结果和 < / API > </\text{API}> </API>添加到之前生成的内容的后面后继续解码。
CoA
CoA(Chain of Abstraction)出自2024年1月底Meta上传的论文《Efficient Tool Use with Chain-of-Abstraction Reasoning》,它提出了一种在多步推理(multi-step reasoning)时更好地利用工具的方法。
CoA方法思路:总览图如上图所示,它先训练LLM生成带占位符(placeholders)的抽象推理链,接着调用工具填充具体的知识使得推理链具体化,最后根据具体化的推理链来生成回答。CoA作者认为让LLM生成抽象推理链可以让LLM聚焦于学习通用和整体的推理推理策略,并且对模型参数也不需要考虑去生成特定的知识。此外,将生成推理链和领域知识解耦可以使得模型解码与API调用并行,即在模型生成下一个抽象推理链时,工具 可以填充当前的推理链,这将加快整个推理的链路。
微调数据构建:从开源QA数据集收集QA样本,让LLaMa-70B对每一个采样问题重写其答案,如下图所示。具体来说,让LLaMa-70B在金标准回答中标注与知识操作(如数学推导、关于Wikipedia参考的描述)有关的片段(span),接着重写这些金标准回答,将知识操作替换为抽象的占位符(placeholders)。对于出现多次的同一个标记,比如例子中第一步计算结果55,prompt时让LLM注意将这些中间结果使用同一个占位符标识。prompt使用了few shot,此外为了确保LLM生成的数据是正确的,设计了工具来验证每一个CoA推理链的正确性,只有验证通过的样本才会被加入到微调训练集。(数学计算借助了SymPy来验证推理链,对于wiki问答使用了BM25检索器和spacy NER)
MM-React
MM-React 出自2023年3月微软提交的论文《MM-REACT: Prompting ChatGPT for Multimodal Reasoning and Action》,它用prompt的方式让LLM利用视觉工具来解决如多图片推理、视频摘要等问题。
MM-REACT 提供一系列视觉处理工具让ChatGPT来选择和使用,帮助其理解图片或者视频,其借助React的思路,将其扩展到视觉领域,可以去体验一下其demo效果。
参考资料
- Toolformer: arxiv
- MM-React: website, github, demo, arxiv
- CoA: arxiv)