[论文笔记]An LLM Compiler for Parallel Function Calling

引言

今天带来一篇优化函数调用的论文笔记——An LLM Compiler for Parallel Function Calling。

为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。

image-20241114074314129

当前的函数(工具)调用方法通常需要对每个函数进行顺序推理和操作,比如,ReAct模式。这会导致高延迟、高成本有时还会出现不准确的行为。为此,我们引入LLMCompiler,它并行执行函数以有效地协调多个函数调用。

通过三个组件实现并行函数调用:

  1. 函数调用规划器,制定函数调用的执行计划;
  2. 任务获取单元,调度函数调用任务;
  3. 执行器,并行执行这些任务;

代码开源在: https://github.com/SqueezeAILab/LLMCompiler

1. 总体介绍

LLM具有整合各种工具和函数调用能力的潜力,但也带来了一个挑战,如何有效地整合多个函数调用?ReAct通过LLM调用一个函数,并分析其结果,然后推断下一个动作,该动作可能涉及后续的函数调用。

image-20241114075656625

图 1. LLMCompiler 的运行时动态与 ReAct的对比,以 HotpotQA 基准测试中的一个示例问题为例。在 LLMCompiler (右) 中,规划器首先将查询分解为多个具有相互依赖关系的任务。执行器然后并行执行多个任务,尊重它们的依赖关系。最后,LLMCompiler 将来自工具执行的所有观察结果合并起来,以生成最终的响应。相比之下,现有框架如 ReAct (左)的顺序工具执行会导致更长的执行延迟。在这个例子中,LLMCompiler 在 HotpotQA 基准测试上实现了 1.8× 的延迟加速。虽然这里为了简单的视觉说明而展示了一个来自 HotpotQA 的可并行执行的 2 路问题,但 LLMCompiler 能够管理具有更复杂依赖模式的任务。

如图1左所示,当要求LLM判断Scott Derrickson 和 Ed Wood 是否拥有相同的国籍时,ReAct 首先分析查询并决定使用搜索工具来搜索 Scott Derrickson。然后将搜索(即观察)的结果与原始提示串联起来,供 LLM 推理下一个动作,从而调用另一个搜索工具来收集有关 Ed Wood的信息。

但是这种顺序直线函数并推理其观察结果的做法,可能会导致延迟和成本方法的问题,因为每个推理和动作步骤都需要进行顺序函数调用和重复的LLM调用。此外,将中间函数调用的结果连接起来可能会破坏LLM的执行流程,从而降低准确性。常见的失败案例包括重复调用相同的函数

我们从经典的编译器(compiler)中获取灵感。编译器的关键优化技术是识别可以并行执行的指令,并有效地管理它们的依赖关系。为此,我们引入了LLMCompiler,它能够跨越不同小莫和工作负载并行执行多个LLM工具

2. 相关工作

2.1 大语言模型中的延迟优化

各种研究集中于优化模型设计和系统以实现高效的LLM推理,而应用程序级别的优化研究较少。

Skeleton-of-Thought 提出通过应用级并行解码来降低延迟,设计一个两步过程:首先是生成骨架,然后是并行执行骨架项目。它主要针对易并行的负载,不支持具有依赖关系任务的问题。而LLMCompiler通过将输入查询翻译成一系列具有相互依赖关系的任务来解决这个问题。

最近OpenAI在其1106版本中引入了并行函数调用功能,通过同时生成多个函数调用来增强用户查询处理,但它仅适用于OpenAI专有的模型。而LLMCompiler能够为开源模型实现高效地并行函数调用。

2.2 计划与解决策略

一些研究探索了将复杂查询分解成不同细节层次的提示方法,来提高LLM在推理任务中的性能。这种分解式提示通过将复杂任务分解为更简单的子任务来解决问题,使每个子任务都通过具有专用提示的LLM进行优化。

Decomposed Prompting使LLM能从细节中抽取高级概念,来增强各种任务的推理能力。Plan-and-Solve 提示将多步推理任务细分为子任务,以最大限度地减少错误并提高任务准确性,无需手动提示。

ReWOO使用规划器将推理过程与执行和观察阶段分离,与ReAct相比减少了标记使用量和成本。

2.3 工具增强LLM

LLM增强后的推理能力使其能够调用用户提供的函数并使用其输出有效地完成任务。

3. 方法

image-20241114082439272

图 2. LLMCompiler 框架概述。函数调用规划器生成一个包含任务及其相互依赖关系的 DAG(有向无环图)。然后,任务获取单元根据任务的依赖关系将这些任务并行调度到执行器。在本例中,任务 $1 和 $2 被同时获取,以并行执行两个独立的搜索任务。每个任务执行完成后,结果将被转发回任务获取单元,以在用实际值替换其占位符变量(例如,任务 $3 中的变量 $1$2)后,解除对依赖任务的阻塞。所有任务执行完成后,最终答案将被传递给用户。

为了回答“微软的市值需要增长多少才能超过苹果的市值?”,LLM首先需要对两家公司的市值进行网络搜索,然后进行除法操作。显然它们可以并行执行,关键问题是如何自动确定哪些任务是可并行的,哪些任务是相互依赖的,以便我们能相应地编排不同任务的执行。

LLMCompiler通过三个组件构成的系统来实现这一点:一个函数调用规划器,生成一系列任务及其依赖关系;一个任务获取单元,根据中间结果替换参数并获取任务;以及一个执行器,使用相关工具执行任务。

3.1 函数调用规划器

函数调用规划器(Function Calling Planner)负责生成要执行的任务序列以及它们之间的任何依赖关系。例如,图2中的任务$1$2是两个可以并行执行的独立搜索。而任务S3依赖这两个搜索结果。因此,规划器的作用是利用LLM识别必要的任务、输入参数以及它们之间的相互依赖关系,形成一个任务依赖的有向无环图(directed acyclic graph, DAG)。如果一个任务依赖于前面的任务,它会包含一个占位符变量,如图2中任务3里的$1,该变量稍后将被替换为前面任务的实际输出。

核心是利用LLM的推理能力,将输入的任务分解。规划器LLM结合了一个预定义的提示词,指导它如何创建依赖图并确保语法正确。除此之外,用户还需要为规划器提供工具定义和可选的上下文示例。这些示例提供了针对特定问题的任务分解的详细演示,帮助规划器更好地理解规则。

3.2 任务获取单元

任务获取单元根据贪婪策略,在任务准备好(并行)执行时将任务传递给执行器。另一个关键功能是将变量替换为之前任务的实际输出,这些输出最初由规划器设置为占位符。比如图2中的实例,任务$3中的变量$1$2将被替换为微软和苹果的实际市值。这可以通过简单的获取和排队机制实现,无需专门的LLM。

3.3 执行器

执行器异步执行从任务获取单元获取的任务。任务获取单元保证所有分派到执行器的任务都是独立的,因此它们可以简单地并发执行。执行器配备了用户提供的工具,并将任务委托给相关工具。每个任务都有专门的内存来存储其中间结果。任务完成后,最终结果将作为输入转发给依赖它们的后续任务。

3.4 动态重规划

在各种应用中,执行图可能需要根据先验未知的中间结果进行调整。类似于编程中的分支,对于简单的分支,可以静态编译执行流程,并根据中间结果动态选择正确的流程。然后,对于更复杂的分支,基于中间结果进行重新编译或重新规划可能更好。

重新规划时,中间结果从执行器发送回函数调用规划器,然后函数调用规划器生成一组新的任务及其关联的依赖关系。这些任务随后被发送到任务获取单元,然后发送到执行器。该循环持续进行,直到达到所需的最终结果并可以交付给用户。

4. LLMCompiler细节

4.1 用户提供的信息

LLMCompiler需要用户提供两个输入:

  1. 工具定义 用户需要指定LLM可以使用的工具;
  2. 规划器上下文示例 用户可以选择用LLMCompiler提供规划器应如何运行的示例。这些示例可以帮助规划器LLM理解如何使用各种工具并为传入的输入生成正确格式的依赖关系图。

4.2 流式规划器

规划器在处理涉及大量任务的用户查询时可能会产生不小的开销,因为它会阻塞任务获取单元和执行器,而它们必须等待规划器输出才能启动其进程。

类似与计算机系统中的指令流水线,可以通过允许规划器异步地流式传输依赖关系图来缓解这个问题,从而允许每个任务在所有依赖关系都解析后立即由执行器处理。

5. 结果

image-20241115215146701

图 3. 不同函数调用模式的示例问题及其依赖图。HotpotQA 和电影推荐数据集表现出模式 (a),而 ParallelQA 数据集表现出模式 (b) 和 ©,以及其他模式。在 (a) 中,我们需要分析每家公司的最新 10-K 报告。在 (b) 中,我们需要对每所学校进行三次搜索,然后进行一次加法运算和一次比较运算。在 © 中,我们需要搜索每个州在每个领域的年度医疗保健支出,将每个州的支出相加,然后进行比较。

在并行函数调用场景。最简单的场景涉及一个 LLM 重复使用工具来完成独立的任务,例如进行平行搜索或分析以收集不同主题的信息,如 图3 (a) 中所示的模式。虽然这些任务彼此独立,可以并行执行,但 ReAct 以及其他 LLM 解决方案,在当前状态下,需要按顺序运行。这会导致由于每次工具使用都需要频繁调用 LLM 而导致延迟和Token消耗增加。

image-20241115215347052

表 1. LLMCompiler 与基线在不同基准测试上的准确性和延迟比较,包括 HotpotQA、电影推荐、名为 ParallelQA 的自定义数据集以及 24 点游戏。对于 HotpotQA 和电影推荐,我们经常观察到循环和提前停止。为了尽可能减少这些行为,我们加入了 ReAct 特定的提示,我们将其表示为 ReAct†。ReAct(不带 †) 表示没有此提示的原始结果。

从表1可以看到,ReAct的准确性始终低于OpenAI并行函数调用和LLMCompiler。ReAct有两种主要失败模式: (1)重复生成先前函数调用的趋势;(2)基于不完整的中间结果过早停止。

image-20241115215945238

表 2. HotpotQA、电影推荐和名为ParallelQA 的自定义数据集的输入和输出标记消耗以及估计成本。成本是根据用于每个基准的 GPT 模型的定价表计算的。

LLMCompiler在成本方面比ReAct更具成本效益,因为它涉及更少的LLM调用。LLMCompiler 在成本效率方面也优于最近的 OpenAI 并行函数调用。因为 LLMCompiler 的规划阶段比 OpenAI 并行函数调用的规划阶段更有效率,因为我们的规划器的上下文示例比较短,只包含计划,不包含观察结果。

6. 结论

作者引入了LLMCompiler,这是一个受编译器启发的框架,它能够在各种LLM之间高效地并行调用函数。通过将用户输入分解为具有定义的相互依赖关系的任务,并通过其规划器、任务获取单元和执行器组件并发执行这些任务。

G. 用户提供的LLMCompiler配置示例

LLMCompiler提供了一个简单的接口,允许通过提供工具定义以及可选的上下文示例来为规划器定制框架,以应用不同的用例。

下面提供用于在电影推荐和24点游戏中设置框架的规划器示例提示。

Question: Find a movie similar to Mission Impossible, The Silence of the
Lambs, American Beauty, Star Wars Episode IV - A New Hope
Options:
Austin Powers International Man of Mystery
Alesha Popvich and Tugarin the Dragon
In Cold Blood
Rosetta
1. search("Mission Impossible")
2. search("The Silence of the Lambs")
3. search("American Beauty")
4. search("Star Wars Episode IV - A New Hope")
5. search("Austin Powers International Man of Mystery")
6. search("Alesha Popvich and Tugarin the Dragon")
7. search("In Cold Blood")
8. search("Rosetta")
Thought: I can answer the question now.
9. finish()
###
问题:找到一部类似于《碟中谍》,《沉默的羔羊》,《美国美人》,《星球大战第四集:新希望》的电影  
选项:  
《奥斯汀·鲍尔斯:国际间谍》  
《阿列沙·波普维奇与龙图加林》  
《冷血》  
《罗塞塔》  
1. search("碟中谍")
2. search("沉默的羔羊")
3. search("美国美人")
4. search("星球大战第四集:新希望")
5. search("奥斯汀·鲍尔斯:国际间谍")
6. search("阿列沙·波普维奇与龙图加林") 
7. search("冷血")
8. search("罗塞塔")
Thought:我现在可以回答这个问题。  
9. finish()

Question: "1 2 3 4", state list: [""]
$1 = thought proposer("1 2 3 4", "")
$2 = state evaluator("1 2 3 4", "$1")
$3 = top k select("1 2 3 4", ["$1"], ["$2"])
$4 = finish()
###
Question: "1 2 3 4", state list: ["1+2=3(left:3 3 4)","2-1=1(left:1 3
4)","3-1=2(left:2 2 4)","4-1=3(left:2 3 3)","2*1=2(left:2 3 4)"]
$1 = thought proposer("1 2 3 4", "1+2=3(left:3 3 4)")
$2 = thought proposer("1 2 3 4", "2-1=1(left:1 3 4)")
$3 = thought proposer("1 2 3 4", "3-1=2(left:2 2 4)")
$4 = thought proposer("1 2 3 4", "4-1=3(left:2 3 3)")
$5 = thought proposer("1 2 3 4", "2*1=2(left:2 3 4)")
$6 = state evaluator("1 2 3 4", "$1")
$7 = state evaluator("1 2 3 4", "$2")
$8 = state evaluator("1 2 3 4", "$3")
$9 = state evaluator("1 2 3 4", "$4")
$10 = state evaluator("1 2 3 4", "$5")
$11 = top k select("1 2 3 4", ["$1", "$2", "$3", "$4", "$5"], ["$6", "$7",
"$8", "$9", "$10"])
$12 = finish()
###

H. 预定义的LLMCompiler规划器提示

预定义的LLMCompiler规划器提示为其提供了关于如何分解任务和生成依赖图的具体说明,同时确保相关语法格式正确。此提示包含特定规则,例如将每个任务分配到新行,每个任务以数字标识符开头,并使用$符号来表示中间变量。

- Each action described above contains input/output types and descriptions.
- You must strictly adhere to the input and output types for each action.
- The action descriptions contain the guidelines. You MUST strictly follow
those guidelines when you use the actions.
- Each action in the plan should strictly be one of the above types. Follow
the Python conventions for each action.
- Each action MUST have a unique ID, which is strictly increasing.
- Inputs for actions can either be constants or outputs from preceding
actions. In the latter case, use the format $id to denote the ID of the
previous action whose output will be the input.
- Ensure the plan maximizes parallelizability.
- Only use the provided action types. If a query cannot be addressed using
these, invoke the finish action for the next steps.
- Never explain the plan with comments (e.g. #).
- Never introduce new actions other than the ones provided.
- 上面描述的每个动作都包含输入/输出类型和描述。
- 你必须严格遵守每个动作的输入和输出类型。
- 动作描述包含指导方针。你在使用动作时必须严格遵守这些指导方针。在你使用这些操作时,请遵循这些指南。
- 每个动作必须具有唯一的 ID,该 ID 严格递增。
- 动作的输入可以是常量或来自先前动作的输出。在后一种情况下,使用格式 $id 来表示先前动作的 ID,其输出将作为输入。
- 确保计划最大程度地并行化。
- 仅使用提供的动作类型。如果查询无法使用这些动作类型解决,则调用 finish 动作以进行下一步。
- 永远不要用注释(例如 #)来解释计划。
- 除提供的动作外,不要引入新的动作。

除了用户提供的函数外,规划器还包含一个特殊的硬编码完成函数(finish())。规划器在计划足以解决用户查询或无法在执行当前计划之前继续规划时(即,当它认为需要重新规划时)使用此函数。当规划器输出完成函数时,其计划生成停止。完成函数的定义如下,并作为提示与其他用户提供的函数定义一起提供给规划器。

finish():
- Collects and combines results from prior actions.
- A LLM agent is called upon invoking join to either finalize the user
query or wait until the plans are executed.
- join should always be the last action in the plan, and will be called in
two scenarios:
(a) if the answer can be determined by gathering the outputs from tasks to
generate the final response.
(b) if the answer cannot be determined in the planning phase before you
execute the plans.
finish():
- 收集并整合先前行动的结果。
- 调用 join 时,LLM agent要么完成用户查询,要么等待计划执行。
- join 应该始终是计划中的最后一个操作,并且将在两种情况下被调用:
(a) 如果答案可以通过收集任务的输出以生成最终响应来确定。
(b) 如果在执行计划之前,无法在计划阶段确定答案。

总结

⭐ 这是一篇很厉害的工作,作者受计算机中编译器的启发,设计了LLMCompiler这一框架。首先利用函数调用规划器指定函数调用的执行计划;然后通过任务获取单元来调度函数调用任务,找出其中的依赖和独立任务;最后通过执行器(并行)执行这些任务。

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

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

相关文章

基于JAVA的资源检索系统(源码+定制+开发)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

展望:多模态融合与marker推断

技术进步使得利用高维、高通量、多尺度的生物医学数据从多个角度研究患者和疾病成为可能。在肿瘤学中,正在生成大量数据,从分子、组织病理学到临床记录。深度学习的引入极大地促进了生物医学数据的分析。然而,大多数方法都侧重于单一模态&…

AI在电商平台中的创新应用:提升销售效率与用户体验的数字化转型

1. 引言 AI技术在电商平台的应用已不仅仅停留在基础的数据分析和自动化推荐上。随着人工智能的迅速发展,越来越多的电商平台开始将AI技术深度融合到用户体验、定价策略、供应链优化、客户服务等核心业务中,从而显著提升运营效率和用户满意度。在这篇文章…

基于Java Springboot餐厅点餐系统(加入商家版)

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA 数据库:MySQL5.7…

NeRF在农业领域的应用-------------(1)

一、Exploring Accurate 3D Phenotyping in Greenhouse through Neural Radiance Fields(通过神经辐射场探索温室中精确的三维表型分析) 1.摘要 在精准农业中,准确收集植物表型对于优化可持续农业实践至关重要。 在受控实验室环境中进行的传…

pico-sdk(零)

pico-sdk(零) 项目概述license相关文档 依赖三方库链接 项目概述 Raspberry Pi Pico SDK(以下简称 SDK)提供了为 RP 系列微控制器设备(如 Raspberry Pi Pico 或 Raspberry Pi Pico 2)编写 C、C 或汇编语言…

基于java+SpringBoot+Vue的视频网站系统设计与实现

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

vue注册全局组件,其他地方可以直接方便的调用

文章目录 问题注册全局组件完结 问题 本来我们想使用某个组件,需要在各个地方引入对应的参数,并配置好components内容,才可以使用 但是随着用的越来越多,这种方法变得重复且易出错 注册全局组件 修改main.js文件,放…

javaScript交互补充(元素的三大系列)

1、元素的三大系列 1.1、offset系列 1.1.1、offset初相识 使用offset系列相关属性可以动态的得到该元素的位置(偏移)、大小等 获得元素距离带有定位祖先元素的位置获得元素自身的大小(宽度高度)注意:返回的数值都不…

基于SSM的特色美食推荐平台+LW示例参考

1.项目介绍 系统角色:管理员、普通用户功能模块:管理员(用户管理、店铺管理、美食类型、美食收录管理、论坛交流管理等)、普通用户(登录注册、论坛交流、信息查看、美食收藏、美食资讯等)技术栈&#xff1…

【javascript从零单排】变量let、var、const

🌈"It always seems impossible until it’s done." — Nelson Mandela 种一棵树最好是机会是十年前,其次是现在。 📗概念 在 JavaScript 中,变量是用于存储数据值的容器。可以使用变量来保存不同类型的数据&#xff0…

Marp for VScode插件 PPT无法预览的问题

优质好文:https://blog.csdn.net/lyuhaochina/article/details/141527208 这是因为很多人在VScode中安装markdown插件时都会安装插件Markdown Preview Enhanced,这个插件会和Marp插件的预览功能产生冲突,导致用Marp插件做的PPT无法预览 找到设置选项Markdown-previe…

响应时间指标的探索

响应时间指标的探索 最近又看到响应时间的一些讨论,就顺着这个响应时间的一些资料整理了如下内容 1968年 目前能够追溯的最早定义响应时间的文章应该是Rober B.Miller于1968年在AFIPS 68 (Fall, part I): Proceedings of the December 9-11, 1968, fall joint comp…

VRT: 关于视频修复的模型

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月15日14点34分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅…

从基础到进阶,Dockerfile 如何使用环境变量

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 什么是 Dockerfile 环境变量?🔖1. `ENV` 指令🔖2. `ARG` 指令🔖语法:🔖使用 `ARG` 的例子:📝 如何使用环境变量提高 Dockerfile 的灵活性🔖1. 动态配置环境🔖2. 配置不同的运行环境🔖3. 多…

使用AI制作视频的一些感受

浦饭幽助真人灵丸 大家好,我是阿赵。 最近我开始用各种AI软件来制作一些视频,比如上次介绍的3D打印的黑龙波飞影的视频,就用了AI生成语音,还有一些换脸的视频。然后再比如上面这个浦饭幽助从漫画变成真人,然后再做出发…

从0开始创建Django项目-基础篇

文章目录 1、安装Django2、创建项目3、默认项目的介绍4、APP5、快速上手5.1 写一个页面5.2 templates模板5.3 静态文件5.3.1 static目录5.3.2 引用静态文件 6、模板语法7、请求和响应8、数据库操作8.1 安装第三方模块8.2 ORM8.3 案例:用户管理 1、安装Django pip install djan…

网络设备 - 这个有点难!

Linux 内核中的网络设备是整个网络通信的核心,它将硬件接口与内核的网络栈连接起来。对于许多初、中级学者而言,理解 Linux 网络设备的概念和工作机制可能显得复杂,但一旦掌握了这些内容,就能更深入地理解内核中的网络操作原理。本…

电商行业财一体化实施案例:如何通过对接实现多组织结算

电商行业财一体化实施案例:如何通过对接实现多组织结算 项目概述: 一家电子商务有限公司,专注于整合线上线下销售渠道,主营业务涵盖化妆品、日用品、乳制品、保健食品等产品的批发与零售。 公司背景与特色 主营业务&#xff1a…

动手学深度学习73 课程总结和进阶学习

1. 课程总结和进阶学习 https://c.d2l.ai/stanford-cs329p/ https://paperswithcode.com https://www.bilibili.com/video/BV1nA41157y4/?vd_sourceeb04c9a33e87ceba9c9a2e5f09752ef8 怎么建立知识库 2. QA 20 算法提取的特征和人的不一样,互补 21 很难预测未…