【自然语言处理】【大模型】赋予大模型使用工具的能力:Toolformer与ART

news2024/11/18 13:54:49
赋予大模型使用工具的能力:Toolformer与ART

​ 本文介绍两种赋予大模型使用外部工具能力的方法:Toolformer和ART。

Toolformer论文地址:https://arxiv.org/pdf/2302.04761.pdf

ART论文地址:https://arxiv.org/pdf/2303.09014.pdf

相关博客
【自然语言处理】【长文本处理】RMT:能处理长度超过一百万token的Transformer
【自然语言处理】【大模型】MPT模型结构源码解析(单机版)
【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版)
【自然语言处理】【大模型】BLOOM模型结构源码解析(单机版)
【自然语言处理】【大模型】极低资源微调大模型方法LoRA以及BLOOM-LORA实现代码
【深度学习】【分布式训练】Collective通信操作及Pytorch示例
【自然语言处理】【大模型】Chinchilla:训练计算利用率最优的大语言模型
【自然语言处理】【大模型】大语言模型BLOOM推理工具测试
【自然语言处理】【大模型】GLM-130B:一个开源双语预训练语言模型
【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介绍
【自然语言处理】【大模型】BLOOM:一个176B参数且可开放获取的多语言模型
【自然语言处理】【ChatGPT系列】FLAN:微调语言模型是Zero-Shot学习器
【自然语言处理】【ChatGPT系列】ChatGPT的智能来自哪里?

一、Toolformer

在这里插入图片描述

​ 大语言模型(LLM)效果惊人,但是仍然存在规模无法解决的局限性。这些局限性有:无法获得最新的信息以及产生幻觉的倾向、难以理解低资源语言、缺乏精确的数学计算能力、无法意识到时间推移

​ 为了克服这些限制,一种可能的选择是赋予其使用外部工具的能力。但是,现有方法依赖于大量的人工标注数据或者仅限制在特定的任务上。Toolformer提出了一种新的方法,其不需要大量人工标注且不影响LLM的通用性

​ Toolformer的理想结果就如上图1所示,在生成的文本中间产生外部工具调用命令。

Toolformer核心思想其实很简单:通过prompt让模型生成满足指令要求的候选文本,然后利用自动化的方法过滤出高质量的结果,用于微调

1. API调用序列化

​ Toolformer的目标是赋予语言模型 M M M调用不同工具的能力。这需要外部工具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是输入。若 r r r是API调用的结果,那么API调用不包含结果 e ( c ) e(c) e(c)和包含结果 e ( c , r ) e(c,r) e(c,r)定义为:
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>
其中, <API> \text{<API>} <API> </API> \text{</API>} </API> → \rightarrow 是特殊tokens。

2. 自动构建微调数据集

在这里插入图片描述

​ 本小节的目标是:给定一个普通的文本数据集 C = { x 1 , … , x ∣ C ∣ } \mathcal{C}=\{x^1,\dots,x^{|\mathcal{C}|}\} C={x1,,xC},使用API调用形成增强数据集 C ∗ \mathcal{C}^* C,用于后续的模型微调。完整的构造流程如上图2所示,下面详细介绍整个过程。

2.1 采样API调用

在这里插入图片描述

​ 对于每个API(也就是工具),人工撰写prompt P ( x ) P(\textbf{x}) P(x)来鼓励语言模型为样本序列 x = x 1 , … , x n \textbf{x}=x_1,\dots,x_n x=x1,,xn生成API调用。如上图3中,Input上的大段文本指令就是针对问答系统人工撰写的prompt。

​ 令 p M ( z n + 1 ∣ z 1 , … , z n ) p_M(z_{n+1}|z_1,\dots,z_n) pM(zn+1z1,,zn)表示模型 M M M在已知前 n n n个token的序列 z 1 , … , z n z_1,\dots,z_n z1,,zn情况下, z n + 1 z_{n+1} zn+1的条件概率。那么,在位置 i ∈ { 1 , … , n } i\in\{1,\dots,n\} i{1,,n}处开始API调用的概率为
p i = p M ( <API> ∣ P ( x ) , x 1 : i − 1 ) p_i=p_M(\text{<API>}|P(x),x_{1:i-1}) pi=pM(<API>P(x),x1:i1)

直观上来看,序列 x \textbf{x} x并不是所有的位置都适合作为API调用的开始。因此,Toolformer采用了基于概率的过滤规则。给定一个采样阈值 τ s \tau_s τs,那么仅保留概率高于该阈值的位置,即 I = { i ∣ p i > τ s } I=\{i|p_i>\tau_s\} I={ipi>τs}。若这样的位置仍然大于 k k k个,那么就取topk。

​ 对于每个位置 i ∈ I i\in I iI,模型 M M M都可以采样出 m m m个API调用序列 c i 1 , … , c i m c_i^1,\dots,c_i^m ci1,,cim,其中所有的 c i c_i ci都是以序列 [ P ( x ) , x 1 , … , x i − 1 , <API> ] [P(\textbf{x}),x_1,\dots,x_{i-1},\text{<API>}] [P(x),x1,,xi1,<API>]为前缀,并以 </API> \text{</API>} </API>为结尾的。

2.2 执行API调用

​ 执行生成的API调用序列。具体的执行方式,依赖于API本身,例如:这个API可以是调用令一个神经网络、执行Python脚本或者使用检索系统。API调用 c i c_i ci产生的结果文本序列表示为 r i r_i ri

2.3 过滤API调用

​ 前面的步骤中,采样了 k k k个位置,每个位置 m m m个API调用序列,总结 k × m k\times m k×m个调用序列。显然,这个量并不小,且无法保证参数的API调用序列的质量。那么就需要对这些API调用进行过滤。

​ 在序列 x = x 1 , … , x n \textbf{x}=x_1,\dots,x_n x=x1,,xn的位置 i i i产生的API调用表示为 c i c_i ci,执行调用产生的结果表示为 r i r_i ri。此外,给定一个权重序列 ( w i ∣ i ∈ N ) (w_i|i\in\mathbb{N}) (wiiN)以及前缀序列 z \textbf{z} z时,模型 M M M在token序列 x i , … , x n x_i,\dots,x_n xi,,xn的加权交叉熵损失表示为
L i ( z ) = − ∑ j = i n w j − i ⋅ log ⁡ p M ( x j ∣ z , x 1 : j − 1 ) L_i(\textbf{z})=-\sum_{j=i}^n w_{j-i}\cdot\log p_{M}(x_j|\textbf{z},x_{1:j-1}) Li(z)=j=inwjilogpM(xjz,x1:j1)

注:1. 这里的权重序列是需要人工指定的;2. 这个loss仅是用来比较的,不是用来优化的。

​ 这里在定义两个不同的loss实例:
L i + = L i ( e ( c i , r i ) ) L i − = min ⁡ ( L i ( ε ) , L i ( e ( c i , ε ) ) ) L_i^+=L_i(e(c_i,r_i)) \\ L_i^-=\min(L_i(\varepsilon),L_i(e(c_i,\varepsilon))) Li+=Li(e(ci,ri))Li=min(Li(ε),Li(e(ci,ε)))
其中, ε \varepsilon ε表示空序列, L i ( ε ) L_i(\varepsilon) Li(ε)表示没有进行API调用的loss值, L i ( e ( c i , ε ) ) L_i(e(c_i,\varepsilon)) Li(e(ci,ε))表示进行API调用但没有执行结果的loss值, L i ( e ( c i , r i ) ) L_i(e(c_i,r_i)) Li(e(ci,ri))表示进行API调用且有结果的loss值。直觉上,API调用并返回结果应该是有助于模型 M M M预测下一个token的。因此,设置一个过来阈值 τ f \tau_f τf,然后仅保留满足下面要求的API调用
L i − − L i + ≥ τ f L_i^--L_i^+\geq \tau_f LiLi+τf
也就是说,API调用至少将loss降低了 τ f \tau_f τf

3. 模型微调与推理

微调。在完成API调用采样和过滤后,将API调用和原始输入交叠合并。对于输入文本 x = x 1 , … , x n \textbf{x}=x_1,\dots,x_n x=x1,,xn以及其对应的API调用和结果 ( c i , r i ) (c_i,r_i) (ci,ri),那么构造新序列 x ∗ = x 1 : i − 1 , e ( c i , r i ) , x i : n \textbf{x}^*=x_{1:i-1},e(c_i,r_i),x_{i:n} x=x1:i1,e(ci,ri),xi:n。对于所有的 x ∈ C \textbf{x}\in\mathcal{C} xC应用该操作得到新数据集 C ∗ \mathcal{C}^* C。使用这个数据集微调模型 M M M

推理。模型 M M M经过微调后,在生成时执行正常的解码,直至产生" → \to " token,其表示接下来的预测是API调用。此时,中断解码过程,调用适当的API获得响应结果,并将响应结果和</API>插入序列之后,继续解码。

4. 工具

​ Toolformer通过不同工具来解决语言模型的缺点。这些工具需要满足:(1) 输入和输出都可以表示为序列化的文本;(2) 能够得到一些工具使用的示例。这里探索了5种工具:问答系统、Wikipedia搜索引擎、计算器、日历、机器翻译系统

二、ART

在这里插入图片描述

1. 总览

​ ART的思路不同于Toolformer。ART使用特定的program语法构建一个任务库。当新任务到来时,会从任务库中检索相似的任务,并将这些任务的实体添加至prompt中。

​ 在生成时,LLM生成program。ART解析这些program,当遇到工具调用是会暂停语言模型生成,但调用完成后再恢复生成。

​ 此外,ART也可以引入人工反馈,从而改善在特定任务上的表现。

2. 任务库

​ 将BigBench中的部分任务作为种子,构建program库。BigBench任务包含了传统NLP、数学、常识推理和问答等任务。

2.1 构建任务库

​ 经过分析,BigBench中超过一半的任务会使用算术、代码、搜索、自由形式推理和字符串操作。因此,基于这5种技能对BigBench中的任务进行分组。

​ 在每个分组中挑选2-4任务,为每个任务人工撰写program(任务分解),这些program包含了外部工具的调用以及调用的输出。这些编写的program遵循下面的语法。

2.2 program语法

​ program的格式必须灵活的满足各种任务、输入、工具等,且能够覆盖各种NLP任务。因此,这里定义了一种查询语言,其可以按顺序来表达被分解的推理步骤以及合并调用外部工具的函数。每个program均由一系列的节点组成:一个输入节点、若干个子步骤节点、一个答案节点。输入节点由任务名称、描述任务的指令以及任务输入的实例:
Answer this high-school Physics question Input:Hector yanks... \begin{align} &\text{Answer this high-school Physics question} \\ &\text{Input:Hector yanks...} \end{align} Answer this high-school Physics questionInputHector yanks...
输入节点后跟随一组子任务节点,表示为(query, answer)对
Q1:[search] What is the formula... #1: The horizontal component (Fx) can be calculated... \begin{align} &\text{Q1:[search] What is the formula...} \\ &\text{\#1: The horizontal component (Fx) can be calculated...} \end{align} Q1:[search] What is the formula...#1: The horizontal component (Fx) can be calculated...
Q i Q_i Qi不但有任务名称,也包含输入;答案 # i \#i #i就是该子任务的输出。program以虚拟子程序 ( Q3:[EOQ] ) (\text{Q3:[EOQ]}) (Q3:[EOQ])表示结束,并在末尾添加最终的答案节点 ( Ans: 59N ) (\text{Ans: 59N}) (Ans: 59N)上图2展示了这种格式

2.3 任务检索

​ 对于新的任务,ART从任务库中检索N个任务来构造一个动态多任务prompt。这里探索两种检索相似任务的策略。

​ 若新任务有少量的标注样本( ≈ 50 \approx 50 50),遍历5个任务组,并从每个组中选择少量的任务program来组成prompt。最后,在预留出的样本集上进行预测,选择表现最好的任务组。该策略需要一组“输入-输出”,但不需要额外的监督来生成分解的program。

​ 第二种策略,构建一个few-shot prompt,每个任务包含名称、指令和少量的"输入-输出"样本。每对样本,提供标签"Similar"或"Not similar"。在推理时,将测试任务与任务库中的每个任务构成一个样本对,基于"Similar"和"Not similar"的对数概率来选择排名最高的任务。

3. 工具库

​ 当子任务的查询名称与工具名称匹配(例如: Q i = [search] Q_i=\text{[search]} Qi=[search]),则生成被暂停;工具调用完成并将结果合并至输出后在继续生产。接下来,将描述用于表示这些工具及其输入所使用的符号,以及如何将工具的输出合并至原始的program。

3.1 搜索

​ 搜索使用SerpAPI,其能够提供基于Google的搜索。搜索是输入就是语言模型在 Q i : [search] Q_i:\text{[search]} Qi:[search]后生成的序列。可以合并搜索的top-2结果至原始序列中。如上图2(B)所示,搜索的query就是在原始输入后的
What is the formula for the horizontal component of tension force? \text{What is the formula for the horizontal component of tension force?} What is the formula for the horizontal component of tension force?
输出是
...horizontal component (Fx) can be calculated as Ftens*cosine ( θ ) \text{...horizontal component (Fx) can be calculated as Ftens*cosine}(\theta) ...horizontal component (Fx) can be calculated as Ftens*cosine(θ)

3.2 代码生成

​ 使用CodeX作为代码生成工具。代码生成工具的输入是,语言模型在子任务查询符号 Q i : [ generate python code ] Q_i:[\text{generate python code}] Qi:[generate python code]后生成的序列,其作为python代码的注释来提示CodeX。如上图2(B)所示,使用下面的序列作为CodeX生成时的提示:
Use the formula Fx=Ftens*consine ( θ )  to solve... \text{Use the formula Fx=Ftens*consine}(\theta)\text{ to solve...} Use the formula Fx=Ftens*consine(θ) to solve...
CodeX生成输出
T = 72.0, theta = 35.0, ..., Fx = T*math.cos(radians) \text{T = 72.0, theta = 35.0, ..., Fx = T*math.cos(radians)} T = 72.0, theta = 35.0, ..., Fx = T*math.cos(radians)

3.3 代码执行

​ 在Python环境中安装算术、符号和科学计算的包,使用该环境执行python代码。代码执行工具的输入参数就是前一个子任务的答案 # ( i − 1 ) : … \#(i-1):\dots #(i1):。上图2(B)中,前一个步骤生成的代码将被送入代码执行工具,并将变量"Fx"的值加入到未完全生成的序列中。

4. 人工反馈

在这里插入图片描述

​ ART是专门为适应人工反馈设计的。用户通过编辑任务库或者工具库,从而将反馈合并至ART中。ART生成的多步推理program是可解释的,因此能够以debug的方式来探索和反馈。通过编辑的方式纠正子步骤的输出、添加/移除子步骤、添加新工具的调用。

​ 上图3(a)用户添加了两个子步骤:(1) 舍入为整数;(2) 包含合适的单位。上图3(b),展示了如何添加新的工具。

5. ART和Toolformer比较

在这里插入图片描述

三、总结

​ 本文介绍了两种赋予到模型使用工具能力的方法:Toolformer和ART。

  • Toolformer的思路:通过prompt令语言模型生成一些能够调用工具的样本,然后利用语言模型对文本的困惑度来过滤这些样本,得到高质量的数据集。最后,利用高质量数据集微调语言模型,赋予其使用工具的能力。
  • ART的思路:人工构建一下常见的工具使用样本,然后利用新任务与已有任务的相似性来辅助语言模型使用工具。(ART文章写的真是一言难尽)

​ 两种方法虽然实现思路不同,但是仍然属于prompt工程范畴。语言模型本身的能力,限制了这些方法的可用性。也就是说,语言模型本身的效果不是特别好的话,这些方法也能够有好的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1226335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《视觉SLAM十四讲》-- 回环检测

文章目录 10 回环检测10.1 概述10.1.1 回环检测的意义10.1.2 回环检测的方法10.1.3 准确率和召回率 10.2 词袋模型10.3 字典10.3.1 字典的结构10.3.2 实践&#xff1a;创建字典 10.4 相似度计算10.4.1 理论部分10.4.2 实践&#xff1a;相似度的计算 10.5 实验分析与评述 10 回环…

Java(二)(String的常见方法,ArrayList的常见方法)

String 创建string对象 package Helloworld;public class dome1 {public static void main(String[] args) {// 1.直接双引号得到字符串对象,封装字符串对象String name "lihao";System.out.println(name);// 2. new String 创建字符串对象,并调用构造器初始化字符…

html综合笔记:设计实验室主页

&#xff11; 主页来源及效果 Overview - Lab Website Template docs (gitbook.io) greenelab/lab-website-template: An easy-to-use, flexible website template for labs (github.com) 2 创建网页 3 主要的一些file 3.1 index.md 主页面 3.1.1 intro 3.1.2 highlight …

庖丁解牛:NIO核心概念与机制详解 02 _ 缓冲区的细节实现

文章目录 PreOverview状态变量概述Position 访问方法 Pre 庖丁解牛&#xff1a;NIO核心概念与机制详解 01 接下来我们来看下缓冲区内部细节 Overview 接下来将介绍 NIO 中两个重要的缓冲区组件&#xff1a;状态变量和访问方法 (accessor) 状态变量是"内部统计机制&quo…

【汇编】处理字符问题

文章目录 前言一、处理字符问题1.1 汇编语言如何处理字符1.2 asciiascii码是什么&#xff1f;ascii码表是什么&#xff1f; 1.3 汇编语言字符示例代码 二、大小写转换2.1 问题&#xff1a;对datasg中的字符串2.2 逻辑与和逻辑或2.3 程序&#xff1a;解决大小写转换的问题一个新…

我终于体会到了:代码竟然不可以运行,为什么呢?代码竟然可以运行,为什么呢?

废话不多说&#xff0c;直接上图 初看只当是段子&#xff0c;再看已是段中人 事情经过&#xff1a; 我在写动态顺序表的尾插函数时&#xff0c;写出了如下代码&#xff0c;可以跑&#xff0c;但是这段代码有一个bug暂时先不提 //动态顺序表的尾插 void SLPushBack(SL* psl, …

python中列表的基础解释

列表&#xff1a; 一种可以存放多种类型数据的数据结构 列表的创建&#xff1a; 1.用【】创建列表 #创建一个空列表 list1[] #创建一个非空列表 list2 [zhang,li,ying,1,2,3] #输出内容及类型 print(list1,type(list1)) print(list2,type(list2))结果&#xff1a; 2.使用list…

详细步骤记录:持续集成Jenkins自动化部署一个Maven项目

Jenkins自动化部署 提示&#xff1a;本教程基于CentOS Linux 7系统下进行 Jenkins的安装 1. 下载安装jdk11 官网下载地址&#xff1a;https://www.oracle.com/cn/java/technologies/javase/jdk11-archive-downloads.html 本文档教程选择的是jdk-11.0.20_linux-x64_bin.tar.g…

Linux中系统时间同步

在Windwos中&#xff0c;系统时间的设置很简单&#xff0c;界面操作&#xff0c;通俗易懂&#xff0c;而且设置后&#xff0c;重启&#xff0c;关机都没关系。系统时间会自动保存在BIOS时钟里面&#xff0c;启动计算机的时候&#xff0c;系统会自动在BIOS里面取硬件时间&#x…

开发知识点-uniapp微信小程序-开发指南

uniapp uni.chooseLocationgetCurrentPages美团外卖微信小程序开发uniapp-美团外卖微信小程序开发P1 成果展示P2外卖小程序后端&#xff0c;学习给小程序写http接口P3 主界面配置P4 首页组件拆分P13 外卖列表布局筛选组件商家 布局测试数据创建样式 请求商家外卖数据封装请求并…

汇编-指针

一个变量如果包含的是另一个变量的地址&#xff0c; 则该变量就称为指针(pointer) 。指针是操作数组和数据结构的极好工具&#xff0c;因为它包含的地址在运行时是可以修改的。 .data arrayB byte 10h, 20h, 30h, 40h ptrB dword arrayB ptrB1 dword OFFSET arrayBarray…

4.6每日一题(多元函数的隐函数求导)

三元方程确定的二元函数类型的隐函数 方法一&#xff1a;两边对x求偏导&#xff0c;把y看成常数 注&#xff1a;z可以把x和y同时代入求出答案 方法二&#xff1a;带公式

数据结构【DS】栈

共享栈 共享栈的目的是什么&#xff1f; 目的:有效利用存储空间。 共享栈的存取数据时间复杂度为&#xff1f; 存取数据时间复杂度为O(1) 共享栈如何判空&#xff1f;如何判满&#xff1f; 两个栈的栈顶指针都指向栈顶元素&#xff0c;&#x1d461;&#x1d45c;&#x1d45d;…

【0基础学Java第十课】-- 认识String类

10. 认识String类 10.1 String类的重要性10.2 常用方法10.2.1 字符串构造10.2.2 String对象的比较10.2.3 字符串查找10.2.4 转化10.2.5 字符串替换10.2.6 字符串拆分10.2.7 字符串截取10.2.8 字符串的不可变性10.2.9 字符串修改 10.3 StringBuilder和StringBuffer10.3.1 String…

Java 11及更高版本的Oracle JDK版本

2021 年 9 月 14 日&#xff0c;Oracle 发布了可以长期支持的 JDK17 版本&#xff0c;那么从 JDK11 到 JDK17&#xff0c;到底带来了哪些特性呢&#xff1f;亚毫秒级的 ZGC 效果到底怎么样呢&#xff1f;值得我们升级吗&#xff1f;而且升级过程会遇到哪些问题呢&#xff1f;带…

PHP字符串函数的解析

在PHP中&#xff0c;字符串是一种常见的数据类型&#xff0c;用于存储和操作文本数据。PHP提供了丰富的字符串函数&#xff0c;用于执行各种字符串操作&#xff0c;包括截取、连接、替换、搜索等。在这篇文章中&#xff0c;我们将深入解析一些常用的PHP字符串函数&#xff0c;以…

小程序开通电子发票

总目录 文章目录 总目录前言结语 前言 随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介绍了机器学习的基础内容。 首先登录商户号&#xff1a;https://pay.weixin.qq.com/index.php/core/home/lo…

数据结构及八种常用数据结构简介

data-structure 数据结构是一种存在某种关系的元素的集合。“数据” 是指元素&#xff1b;“结构” 是指元素之间存在的关系&#xff0c;分为 “逻辑结构” 和 “物理结构&#xff08;又称存储结构&#xff09;”。 常用的数据结构有 数组&#xff08;array&#xff09;、栈&…