LLM Agent 指令微调与搜索代理方案
上一章我们介绍了基于 Prompt 范式的工具调用方案,这一章介绍基于模型微调,支持任意多工具组合调用、复杂调用的方案。多工具调用核心需要解决 3 个问题:在哪个位置进行工具调用 (Where),从众多工具中选择哪一个 (Which),工具的输入是什么 (What)。Where + Which + What,我称之为 3W 原则。
大模型 Agent 的工具调用方案主要分为基于 Prompt 和基于指令微调两类。对比了 Toolformer 和 Gorilla 两种微调方案,分析了其在样本构造、API 泛化及推理效果上的差异。此外,针对复杂搜索场景,介绍了包含搜索、检索、综合与行动四个模块的 Search Agent 架构,阐述了如何通过多轮交互与优化排序解决长文本开放问答问题,强调了系统整体设计在落地应用中的重要性。

上一章我们介绍了基于 Prompt 范式的工具调用方案,这一章介绍基于模型微调,支持任意多工具组合调用、复杂调用的方案。多工具调用核心需要解决 3 个问题:在哪个位置进行工具调用 (Where),从众多工具中选择哪一个 (Which),工具的输入是什么 (What)。Where + Which + What,我称之为 3W 原则。
其实如何教大模型使用工具,和教人类使用工具没啥区别。就像学习使用电钻的途径无非有三种:
下面我们看下通过微调为模型注入工具使用经验的两个方案:Toolformer 和 Gorilla。
Toolformer: Language Models Can Teach Themselves to Use Tools。这是工具调用领域的前辈,使用 LM 监督微调得到可以进行 Inline 工具调用的模型。解码时,模型会在恰当的位置生成 API 调用的请求,并中止解码,去调用 API 得到返回值,把返回值拼接到 "->" 字符之后,再继续模型解码。
Toolformer 的创新主要在 API 调用的样本构造,主要包含以下 3 个步骤:
以 QA API 为例,作者会先编写几个样本作为 In-Context,得到以下的 FewShot 指令样本。然后针对新的长度为 N 的输入文本,计算每个位置得到 <API> 前缀的条件解码概率,并保留超过阈值的 TopK 个最优可能出现 <API> 的位置。每个位置基于上文,让模型随机解码 m 次生成 m 个候选的 API 调用请求。这样我们就得到了候选样本集,每一段文本最多有 K 个可能进行工具调用的位置,且每个位置有至多 m 个候选请求 {c1,...,cm}。
执行以上得到的候选请求,每个请求得到一个对应的返回值 {r1,...,rm}。可以是计算器的结果,维基百科的搜索返回等等。
最后是过滤筛选,原理是好的工具调用样本,应该会让工具调用位置后面的文本解码概率提高,Perplexity 降低。因此作者计算了在工具调用位置之后,所有 token 的加权条件解码概率。离工具调用位置越远权重越小。
条件解码概率的条件 Z,分别是 [工具调用 + 返回值],[工具调用 + 无返回值],[无工具调用],这三者中 Loss 较小的一个。过滤方案是 [工具调用 + 工具返回值] 的 Loss 降幅超过阈值,则保留该样本。
整体量级上,1 个 API 生成了 25K 左右的样本用于微调,样本长度 1024。
使用以上样本生成方案得到多 API 调用的样本集混合后得到增强训练样本。样本的构建方式是在原始文本中直接插入 API 调用的语句。例如:
The Nile has an approximate length of QA(What is the approximate length of the Nile?)->6,853 km 6,853 kilometers, the White Nile being its main source
这样通过微调,模型会学习到在什么位置使用什么样的工具,以及工具的请求输入。同时和解码的格式保持一致,后文会依赖 API 调用结果进行解码。微调使用了 GPT-J 模型,Batch=128,lr=1e-5,warmup=10%,训练了 2K step,常规的 LM Loss。
Toolformer 的创新主要在使用模型的 Few-shot 理解能力,使用少量的人工标注样本制造大量的自监督样本。这样 Toolformer 理论上可以支持任意的 API 工具。但 Toolformer 有一些局限性:
Gorilla 在 HuggingGPT、TaskMatrix.AI 这两个 API 调用的前辈的基础上,加入了指令微调来提升 API 调用效果。Gorilla 支持 TorchHub、TensorflowHub、Huggingface 总共 1645 个 API,且可以泛化到新的 API 上。
Gorilla 使用 Self-Instruct 来构建指令样本,用的是 GPT4 模型。构建方案是以上 3 个 API Hub,每个 Hub 各人工编写 6 个指令样本。每一轮随机从 6 个样本中采样 3 个作为 Few-Shot,并通过指令让 GPT4 随机生成 10 个真实世界的使用 case,总共生成 16450 个指令样本。
同时 Gorilla 加入了 Retriever-Aware,也就是在以上的指令样本中,指令后面会拼接上 API 的使用说明:Use this API documentation for reference: <retrieved_API_doc_JSON>。这样在推理阶段,会先根据用户的指令召回最相关、最新的 API 使用说明。降低模型幻觉的同时,使得模型有更好的泛化性,可以适应全新的 API 接口,或者已有 API 接口的参数变化。
微调的部分比较常规就是在 Llama-7B 模型上,使用特定参数在 8*A100(40G) 进行指令微调。在推理阶段会同样加入 API Retriever 根据用户的指令召回最相关的 API 使用说明,和用户输入拼接,喂进模型推理。召回方案作者尝试了 BM25 和 GPT 的 Embedding,不过不同召回方案的效果和 API 本身相关,没有谁一定更好这一说。
效果上微调后 7B 的 Llama 模型使用 GPT Embedding 召回工具说明,在工具调用上的准确率可以显著超越 GPT3.5 使用 Prompt 方案的调用效果。
对比上一章基于 Prompt 的方案 Self Ask、ReAct 和这一章基于微调的方案 Toolformer、Gorilla,指令微调的方案有以下优势:
缺点自然是没有开箱即用的 Prompt 方案灵活,所以不妨用 prompt 方案来进行前期测试,后期用微调来提升效果。
但其实不论是 Prompt 方案还是微调方案,其实都是 LLM Agent 应用中的工具调用规划这一个子模块。要真正搭建可以落地的大模型应用,需要更系统的整体设计。
为啥需要整体方案,直接调用搜索接口取 Top1 返回不成嘛?要是果真如此 Simple&Naive,New Bing 岂不是很容易复刻。
我们先来看个例子,如果想回答 LK99 哪些板块会涨,你会得到以下搜索答案。从以上的搜索结果不难发现,Top1 答案并不能回答问题。在和搜索引擎交互中几个可能的问题有:
为了解决上述提到的 3 个主要问题,我们会基于 WebGPT、WebGLM、WebCPM 的 3 篇论文,详述如何更有效的和搜索引擎进行交互,来解决长文本开放问答 LFQA 问题。和搜索引擎的交互主要分成以下 4 个模块:
生成搜索请求 query,或基于结果进行 query 改写,请求搜索 API。类似 self-Ask 里面的 Thought,只不过 self-ask 强调问题拆解,而这里的 search 还有 query 改写、追问等功能。这要求模型具备理解用户意图并将其转化为搜索引擎可识别关键词的能力。
从搜索返回的大段内容中,定位可以回答 query 的支撑性事实,进行抽取式摘要、生成式摘要。类似 React 里面的 LookUp 行为,只不过更加复杂不是简单的定位文字。这一步通常需要结合 RAG(检索增强生成)技术,利用向量数据库或关键词匹配来提取高相关性片段。
对多个内容进行组装,输入模型进行推理得到答案。当检索到的信息分散在不同来源时,模型需要整合这些信息,消除矛盾,形成连贯的回答。这涉及到上下文窗口管理和信息融合策略。
针对需要和搜索引擎进行自动化多轮交互的场景,需要预测下一步的行为,是继续搜索,抽取摘要,还是停止搜索,组装内容进行推理等等,对应 LLM Agent 中的规划模块。其实就是丰富了 React/SelfAsk 里面的 Action,加入了更多和搜索引擎交互的行为,例如继续浏览、翻页、点击链接等。
虽然论文的发布顺序是 webcpm > WebGLM > WebGPT,但考虑 webcpm 开源了很全面的中文数据,我会以 webcpm 作为基准详细介绍,再分别介绍 WebGLM 和 WebGPT 的异同点。这些工作共同推动了 Agent 从单一工具调用向复杂任务规划的演进。
前两章,我们分别介绍了基于微调和 Prompt 的工具调用方案,核心都是如何让大模型和工具进行交互,包括生成工具调用语句和处理工具调用请求。不过在实际应用中,想要设计一个可以落地的 LLM Agent,需要更全面整体的系统设计。本章我们以搜索工具为例,介绍如何更好和搜索引擎进行交互的 LLM Agent。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online