LLM agentic模式之工具使用: Toolformer、CoA、MM-React思路

news2024/12/29 2:21:34

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,,xC} ,通过如下三步来将数据集变成一个包含API调用的数据集 C ∗ \mathcal{C}^* C(如上图示意)。

  1. 采样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+1z1,,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} i1,,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:i1)是模型 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 iI的位置,让 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,,xi1,<API>] 前缀下生成最多m个以 < / API > </\text{API}> </API>结尾的API调用序列 c 1 i , … , c i m c^i_1,\ldots, c^m_i c1i,,cim

在这里插入图片描述

  1. 执行API调用:执行所有 M M M生成的API调用,具体如何执行取决于API的类型。每一个API调用 c i c_i ci对应的输出 r i r_i ri必须是单个文本序列。
  2. 过滤API调用:给定一个权重序列 ( w i ∣ i ∈ N ) (w_i | i \in \mathbb{N}) (wiiN), 当模型 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=inwjilogpM(xjz,x1:j1)。 比较这个损失的两个实例:

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 LiLi+τ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=sNw~sw~t with w~t=max(0,10.2t)

模型微调:对于一个输入文本 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:i1,e(ci,ri),xi:n,将数据集 x ∈ C \mathbf{x} \in \mathcal{C} xC中所有的数据都构建新序列后生成新的数据集 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效果。

在这里插入图片描述

参考资料

  1. Toolformer: arxiv
  2. MM-React: website, github, demo, arxiv
  3. CoA: arxiv)

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

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

相关文章

实现随机地牢与摄像机追随与拖拽

//author bilibili 民用级脑的研发记录 // 开发环境 小熊猫c 2.25.1 raylib 版本 4.5 // 2024-7-14 // AABB 碰撞检测 在拖拽&#xff0c;绘制&#xff0c;放大缩小中 // 2024-7-20 // 直线改每帧打印一个点&#xff0c;生长的直线&#xff0c;直线炮弹 // 2024-8-4 // 实现敌…

JavaScript高级程序设计 -- -- 观后记录

一、什么是 JavaScript 1、JavaScript 实现 完整的 JavaScript 实现包含以下几个部分&#xff1a; -- --  核心&#xff08;ECMAScript&#xff09;  文档对象模型&#xff08;DOM&#xff09;  浏览器对象模型&#xff08;BOM&#xff09; 2、DOM 文档对象模型&#…

橙色简洁大气体育直播自适应模板赛事直播门户自适应网站源码

源码名称&#xff1a;酷黑简洁大气体育直播自适应模板赛事直播门户网站 源码开发环境&#xff1a;帝国cms 7.5 安装环境&#xff1a;phpmysql 带采集&#xff0c;可以挂着电脑上自动采集发布&#xff0c;无需人工操作&#xff01; 橙色简洁大气体育直播自适应模板赛事直播门户…

广州必看自闭症康复机构十大排名名单出炉

在众多为自闭症儿童提供帮助的机构中&#xff0c;星贝育园以其卓越的服务和显著的成效脱颖而出&#xff0c;成功跻身广州必看自闭症康复机构十大排名。 星贝育园在广州、浙江拥有三个校区&#xff0c;为更多的自闭症儿童和家庭带来了希望。这里的特教老师和生活老师不辞辛劳&a…

一次现网redis CPU使用率异常定位

背景 618大促前&#xff0c;运维对系统做巡检时发现redis cpu利用率白天基本保持在72%左右&#xff0c;夜里也在60%以上。担心618流量比平时大&#xff0c;导致redis超负荷&#xff0c;因此找开发进行优化&#xff0c;降低redis的负载。 定位思路 其实资源使用率过高定位都…

大数据技术—— Clickhouse安装

目录 第一章 ClickHouse入门 1.1 ClickHouse的特点 1.1.1 列式存储 1.1.2 DBMS的功能 1.1.3 多样化引擎 1.1.4 高吞吐写入能力 1.1.5 数据分区与线程级并行 1.1.6 性能对比 第二章 ClickHouse的安装 2.1 准备工作 2.1.1 确定防火墙处于关闭状态 2.1.2 CentOS取消…

Vue UI - 可视化的Vue项目管理器

概述 Vue CLI 3.0 更新后&#xff0c;提供了一套全新的可视化Vue项目管理器 —— Vue UI。所以要想使用它&#xff0c;你的 Vue CL I版本必须要在v3.0以上。 一、启动Vue UI 1.1 环境准备 1.1.1 安装node.js 访问官网&#xff08;外网下载速度较慢&#xff09;或 http://nod…

民航管理局无人机运营合格证技术详解

1. 证书定义与意义 民航管理局无人机运营合格证&#xff08;以下简称“合格证”&#xff09;是对符合民航法规、规章及标准要求的无人机运营单位或个人进行资质认证的重要证明。该证书旨在确保无人机运营活动的安全、有序进行&#xff0c;保护国家空域安全&#xff0c;维护公众…

电子电气架构 --- 软件定义汽车需要怎么样的EE架构

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

反射型XSS的几种payload

目录 第一种&#xff1a;采用的是urlcode编码 第二种&#xff1a;前面用html实体编码&#xff0c;后面用urlcode编码 第三种&#xff1a;只对&#xff1a;使用urlcode编码 第四种&#xff1a;对<>进行html实体编码 第五种&#xff1a;textarea 第六种&#xff1a;和…

【JavaEE】锁策略和CAS

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 &#x1f4b0;一.常见的的锁策略 锁策略&#xff08;Locking Strategy&#xff09;是指在多线程环境中&#xff0c;为了控制对共享资源的访问&#xff0c;确保…

「OC」探索CALayer:基础知识与实用技巧简要介绍

「OC」探索CALayer&#xff1a;基础知识与实用技巧简要介绍 文章目录 「OC」探索CALayer&#xff1a;基础知识与实用技巧简要介绍前言认识CALayerCALayer的相关属性 UIView和CALayer区别联系创建UIView和CALayer的原因 开始创建CALayer视图层级CALayers 和 Sublayersposition与…

javaweb-flex布局

1. flex布局原理 flex是flexible Box的缩写&#xff0c;意味着"弹性布局"&#xff0c;用来为盒子模型提供最大的灵活性&#xff0c;任何一个容器都可以指定为flex布局。 当我们为父盒子设为flex布局以后&#xff0c;子元素的float、clear和vertical-align属性都将失…

【质因数分解】将正整数分解质因数

将一个正整数分解成质因数&#xff0c;例如&#xff1a;输入90&#xff0c;打印输出 902*3*3*5 使用C语言实现&#xff1a; #include<stdio.h>int main(){int n,i;printf("请输入需要分解的正整数&#xff1a; ");scanf("%d",&n);for(i2;i<…

六. 部署分类器-deploy-classification-basic

目录 前言0. 简述1. 案例运行2. 代码分析2.1 main.cpp2.2 model.cpp 3. 补充说明结语下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第六章—部署分类器&#xff…

Flutter-自适用高度PageView

需求 在 Flutter 中&#xff0c;PageView 是一个非常常用的组件&#xff0c;能够实现多个页面的滑动切换。然而&#xff0c;默认的 PageView 高度是固定的&#xff0c;这在展示不同高度的页面时&#xff0c;可能会导致不必要的空白或内容裁剪问题。为了使 PageView 能够根据每…

Educational Codeforces Round 169 (Rated for Div. 2)(ABCDE)

A. Closest Point 签到 #define _rep(i,a,b) for(int i(a);i<(b);i) int n,m; int q[N]; void solve() {cin>>n;_rep(i,1,n)cin>>q[i];if(n!2)cout<<"NO\n";else if(abs(q[1]-q[2])!1)cout<<"YES\n";else cout<<"…

堆排序-优先级队列

我们用堆排来实现优先级队列&#xff0c;那么优先级队列是什么&#xff0c;就是 我们给每一个任务都添加一个优先级&#xff0c;优先级越高执行的越早我们用&#xff0c;但是我们怎么能按照顺序优先拿到优先级高的任务呢&#xff0c;我们可以用排序 来进行&#xff0c;也可以用…

Mybatis-Plus分页插件注意事项

使用Mybatis-Plus的分页插件进行分页查询时&#xff0c;如果结果需要使用<collection>进行映射&#xff0c;只能使用嵌套查询&#xff0c;而不能使用嵌套结果映射 嵌套查询和嵌套结果映射是Collection映射的两种方式&#xff0c;下面通过一个案例进行介绍 例如有room_i…

MyBatis源码系列3(解析配置文件,创建SqlSessionFactory对象)

创建SqlSessionFactory&#xff1b; 首先读取配置文件&#xff0c;使用构造者模式创建SqlSessionFactory对象。 InputStream inputStream Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder…