草庐IT

《2023 HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face》阅读笔记

初篱 2024-05-05 原文

http:// https://github.com/microsoft/JARVIS.

1 Abstract  and Introduction

借助大语言模型(LLMS)在语言理解生成推理等方面表现出的出色能力,考虑将其作为控制器来管理现有的各种AI模型,把语言作为通用接口。基于这一理念,提出了HuggingGPT框架,利用LLMS(ChatGPT)来连接机器学习社区(Hug face)中的各种AI模型,具体来说就是在接收用户请求时使用ChatGPT来进行任务规划,根据Hug face中提供的模型功能描述选择模型,使用所选AI模型执行每一个子任务,并根据执行结果汇总响应。

现有LLM技术的局限:1)局限于文本的输入输出形式。2)现实场景中的复杂任务由多个子任务组合,需要多个模型的调度和配合。3)在零镜头或少镜头下结果表现出色但仍弱于专家模型(如微调模型)。

在本文中,我们提出了一个名为HuggingGPT的系统来连接LLMs(即ChatGPT)和ML社区(即hug Face),它可以处理来自不同模式的输入,并解决众多复杂的AI任务。更具体地说,对于hug Face中的每个AI模型,我们从库中使用其对应的模型描述,并将其融合到提示符中,以建立与ChatGPT的连接。之后,在我们的系统中,llm(即ChatGPT)将充当大脑来确定用户问题的答案。如图1所示,HuggingGPT的整个过程可以分为四个阶段:

1)Task Planning:利用ChatGPT分析用户的请求并通过提示将其分解为可能解决的任务。

2)Model Selection:ChatGPT根据模型描述选择托管在hug face上的专家模型。

3)Task Execution:调用并执行每个选定的模型,并将结果返回给ChatGPT。

4)Response Generation:最后用ChatGPT集成所有预测的模型为用户生成答案。

目前为止,我们的HuggingGPT 已经围绕chatGPT集成了数百个模型,涵盖了文本分类、对象检测、语义分割、图像生成、问答、文本转语音、文本视频等24个任务。

我们的贡献如下:

1)提出了模型间合作协议。大模型作为规划和决策的大脑,小模型作为每个特定任务的执行者。

2)构建了HuggingGPT,通过围绕ChatGPT集成了hug face当中的400多个用于特定任务的模型来处理通用的AI任务。

3)在跨语言、视觉、语音和跨模式的多个具有挑战性的AI任务上进行的大量实验证明了HuggingGPT在理解和解决来自多种模式和领域的复杂任务方面的能力。

2 Related Works

为了将大型语言模型(LLMs)的范围扩展到文本生成之外,当代研究研究了两种主要方法。

1)首先,一些工作设计了统一的多模态语言模型,如BLIP-2[https://arxiv.org/abs/2301.12597],它利用Q-former来协调语言和视觉语义,Kosmos-1[https://arxiv.org/abs/2302.14045]将视觉输入合并到文本序列中,融合语言和视觉输入。

2)其次,其他研究集中在外部工具或模型的集成上。先锋Toolformer[https://arxiv.org/abs/2302.04761]在文本序列中引入了外部API标签,方便llm访问外部工具。

许多工作将LLMs扩展到视觉形态。Visual ChatGPT[20]融合了可视化基础模型,如BLIP[21]和ControlNet[22],与llm。Visual Programming[23]和ViperGPT[20]通过使用编程语言将llm应用于可视对象,将可视查询解析为用Python代码表示的可解释步骤。

3 HuggingGPT

3.1 Task Planing

LLMs从用户获取一个请求并将其分解为一系列结构化任务并确定这些任务的依赖关系和执行顺序,在这里,HuggingGPT在其提示设计中采用了基于规范的指令和基于演示的解析。

1)Specification-based Instruction:提供了统一的模板,并允许大型语言模型通过插槽归档进行任务解析 ,为此设计了任务类型、任务ID、任务依赖项和任务参数四个槽位。

Task ID:为任务规划提供了一个唯一的标识符用于引用依赖任务及其生成的资源。

Task types:包括语言视觉视频音频等不同的任务。

Task dependencies:执行所需的先决条件任务,只有当所有先决条件相关任务都完成时任务才会启动。

Task arguments:包含任务执行所需参数的列表。包含三个子字段根据任务类型填充文本、图像和音频信息;它们是从用户请求或依赖任务生成的资源中解析出来的。

2)Demonstration-based Parsing:通过在提示中注入几个演示,为更有效的任务解析和计划引入了上下文学习。每个演示都是任务计划的一组输入和输出——将解析出用户的请求和预期的任务序列。这些演示是由从用户请求解析的任务之间的依赖关系组成。

3.2 Model Selection

在解析任务列表后,HuggingGPT 接下来要为任务列表中的每个任务选择适当的模型。为此,1)首先从hugging face hub中获取专家模型的描述;2)通过上下文任务模型分配机制动态地为任务选择模型。

Model Description:在hug Face Hub上托管的专家模型伴随着全面的模型描述,通常由开发人员提供。这些描述包含模型的功能、体系结构、支持的语言和域、许可等信息。这些信息有效地支持HuggingGPT根据用户请求和模型描述的相关性为任务选择正确的模型。

In-Context Task-Model Assignment :通过在提示中包含用户查询和已解析地任务,HuggingGPT 可以为手头的任务选择最合适的模型,然而由于最大上下文长度的限制,在提示符中不可能包含所有相关的模型信息,因此我们根据它们的任务模型进行筛选,只保留那些与当前任务类型匹配的模型。剩下的模型根据下载量进行排名,并根据这个排名选择前k个的模型作为候选。

3.3 Task Execution

一旦将任务分配给特定的模型,下一步就是执行该任务,即执行模型推断。为了加速和计算稳定性,HuggingGPT 在混合推断端点上运行这些模型。通过将任务参数作为输入,模型计算推理结果,然后将它们发送回LLM。为了进一步提高推理效率,可以对没有资源依赖的模型进行并行化。

1)Hybrid Endpoint:为了保持系统的稳定和高效,HuggingGPT在本地提取并运行一些常见或耗时的模型,并且局部端点的优先级高于hug face的推理端点。只有匹配的模型不在本地部署时,huggingGPT才会在hug face端点上运行模型。

2)Resource Dependency:在任务执行阶段有效地管理任务之间的资源依赖关系是难题。在这里,我们使用一个唯一的符号“<resource>”来管理资源依赖关系。具体来说,HuggingGPT将前置任务生成的资源标识为-task_id,其中task_id是前置任务的任务id。在任务规划阶段,如果存在依赖于task_id任务生成的资源的任务,HuggingGPT将此符号设置为任务参数中对应的资源子字段。

3.4 Response Generation

所有任务执行完成后,HuggingGPT进入响应生成阶段。在这一阶段,HuggingGPT将前三个阶段(任务计划、模型选择和任务执行)的所有信息集成到一个简明的摘要中,包括计划的任务列表、为任务选择的模型以及模型的推断结果。

其中最重要的是推理结果,是HuggingGPT做出最终决策的依据。这些推理结果以结构化的形式出现,如对象检测模型中带有检测概率的边界框,问答模型中的答案分布等。HuggingGPT允许LLM接收这些结构化的推理结果作为输入,并以友好的人类语言形式生成响应。

有关《2023 HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face》阅读笔记的更多相关文章

  1. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  2. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  3. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  4. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  5. ruby-on-rails - 在 irb 中阅读文档 - 2

    我怀念ipython的一件事是它有一个?为特定功能挖掘文档的运算符。我知道ruby​​有一个类似的命令行工具,但是我在irb中调用它非常不方便。ruby/irb有类似的东西吗? 最佳答案 Pry是IPython的Ruby版本,它支持?命令来查找有关方法的文档,但语法略有不同:pry(main)>?File.dirnameFrom:file.cinRubyCore(CMethod):Numberoflines:6visibility:publicsignature:dirname()Returnsallcomponentsofthef

  6. 华为OD机试真题 C++ 实现【带传送阵的矩阵游离】【2023 Q2 | 200分】 - 2

            所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。

  7. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  8. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  9. ruby - 如何将 Vim 中的 "expand"文本转换成一种易于阅读的方式? - 2

    我经常使用嵌套数据结构,很多时候我必须从控制台手动分析它们。问题是它们全部打印在一行中。是否有一种简单的方法可以根据{,[,],}和逗号重新构造数据结构的显示,使其看起来像Ruby的pretty_print输出? 最佳答案 :%s/\([{,]\)/\1\r/gggVG=:setft=ruby呜呜呜 关于ruby-如何将Vim中的"expand"文本转换成一种易于阅读的方式?,我们在StackOverflow上找到一个类似的问题: https://stacko

  10. IDEA 2023.1 正式发布,新特性简介 - 2

     昨晚看到IDEA官推宣布IntelliJIDEA2023.1正式发布了。简单看了一下,发现这次的新版本包含了许多改进,进一步优化了用户体验,提高了便捷性。至于是否升级最新版本完全是个人意愿,如果觉得新版本没有让自己感兴趣的改进,完全就不用升级,影响不大。软件的版本迭代非常正常,正确看待即可,不持续改进就会慢慢被淘汰!根据官方介绍:IntelliJIDEA2023.1针对新的用户界面进行了大量重构,这些改进都是基于收到的宝贵反馈而实现的。官方还实施了性能增强措施,使得Maven导入更快,并且在打开项目时IDE功能更早地可用。由于后台提交检查,新版本提供了简化的提交流程。IntelliJIDEA

随机推荐