解决具有不同领域和模态的复杂人工智能任务是通往人工通用智能的关键骤。尽管存在丰富的适用于不同领域和模态的人工智能模型,但它们无法处理复杂的人工智能任务。考虑到大型语言模型(LLMs)在语言理解、生成、交互和推理方面表现出色,我们主张LLMs可以作为一个控制器来管理现有的人工智能模型,以解决复杂的人工智能任务,并认为语言可以成为一种通用接口来增强这一过程。基于这一理念,我们提出了HuggingGPT框架,利用LLMs(例如ChatGPT)连接机器学习社区(例如Hugging Face)中的各种人工智能模型来解决人工智能任务。具体而言,当接收到用户请求时,我们使用ChatGPT进行任务规划,根据Hugging Face中可用的功能描述选择模型,使用所选的人工智能模型执行每个子任务,并根据执行结果进行响应汇总。通过利用ChatGPT的强大语言能力和Hugging Face中丰富的人工智能模型,HuggingGPT能够覆盖各种模态和领域中的众多复杂人工智能任务,并在语言、视觉、语音和其他具有挑战性的任务中取得令人印象深刻的结果,为实现人工通用智能铺平了一条新的道路。
大型语言模型(LLMs),如ChatGPT,由于在各种自然语言处理(NLP)任务上的出色性能,引起了学术界和工业界的巨大关注。基于大规模文本语料库的预训练和人类反馈的强化学习(RLHF),LLMs在语言理解、生成、交互和推理方面具有优越的能力。LLMs的强大能力还推动了许多新兴的研究课题(例如上下文学习,指令学习和思维链提示),进一步探索LLMs的巨大潜力,并为我们构建先进的人工智能系统带来了无限可能性。
尽管取得了这些伟大的成功,当前的LLM技术仍然存在不完善之处,并面临着构建先进AI系统的一些紧迫挑战。我们从以下几个方面进行讨论:
在本文中,我们指出为了处理复杂的人工智能任务,LLMs应该能够与外部模型协调合作以发挥它们的能力。因此,关键问题是如何选择适当的中间件来连接LLMs和人工智能模型之间的联系。为了解决这个问题,我们注意到每个人工智能模型都可以通过总结其功能来用语言形式描述。因此,我们引入了一个概念:“语言是LLMs连接人工智能模型的通用接口”。换句话说,通过将这些模型描述融入提示中,LLMs可以被视为管理人工智能模型的大脑,例如进行规划、调度和协作。因此,这种策略使得LLMs能够调用外部模型来解决人工智能任务。然而,当涉及将多个人工智能模型整合到LLMs中时,另一个挑战出现了:解决众多人工智能任务需要收集大量高质量的模型描述,这反过来需要进行大量的提示工程。巧合的是,我们注意到一些公开的机器学习社区通常提供各种适用的模型,并为解决特定的人工智能任务(如语言、视觉、语音等)提供明确定义的模型描述。这些观察给我们带来了一些灵感:我们能否通过基于语言的接口将LLMs(例如ChatGPT)与公共机器学习社区(例如GitHub、Hugging Face等)连接起来,以解决复杂的人工智能任务?
因此,在本文中,我们提出了一个名为HuggingGPT的系统,用于连接LLMs(即ChatGPT)和机器学习社区(即Hugging Face),该系统可以处理来自不同模态的输入并自主解决众多复杂的人工智能任务。具体而言,对于Hugging Face中的每个人工智能模型,我们使用其在库中的相应模型描述,并将其融入到提示中以建立与ChatGPT的连接。随后,在我们的系统中,LLMs(即ChatGPT)将充当大脑,确定用户问题的答案。正如图1所示,HuggingGPT的整个过程可以分为四个阶段:
• 任务规划:使用ChatGPT分析用户的请求,理解其意图,并通过提示将其拆分为可能可解决的任务。
• 模型选择:为了解决规划的任务,ChatGPT根据模型描述从Hugging Face上选择托管的专家模型。
• 任务执行:调用和执行每个选定的模型,并将结果返回给ChatGPT。
• 响应生成:最后,利用ChatGPT集成所有模型的预测结果,并为用户生成响应。
得益于这样的设计,HuggingGPT能够根据用户请求自动生成计划,并使用外部模型,从而集成多模态感知能力并处理多个复杂的人工智能任务。更值得注意的是,这个流程还允许HuggingGPT不断吸收来自任务专家的能力,实现可增长和可扩展的人工智能能力。此外,我们还指出,在HuggingGPT中,任务规划起着非常重要的作用,直接决定了后续工作流程的成功与否。因此,如何进行规划也是反映LLMs能力的一个好的视角,也为LLMs的评估开辟了新的途径。总体而言,我们的贡献可以总结如下:
近年来,自然语言处理(NLP)领域在大型语言模型(LLMs)的出现下发生了革命性变化,例如GPT-3 、GPT-4、PaLM 和LLaMa等模型。由于其庞大的语料库和密集的训练计算,LLMs在零样本和少样本任务以及数学问题和常识推理等更复杂的任务中表现出令人印象深刻的能力。为了将大型语言模型(LLMs)的范围扩展到文本生成之外,当代研究可以分为两个分支:1)一些工作已经设计了统一的多模态语言模型来解决各种人工智能任务[21, 22, 23]。例如,Flamingo结合了预训练的视觉和语言模型进行感知和推理。BLIP-2 利用Q-former来协调语言和视觉语义,而Kosmos-1 则将视觉输入融入到文本序列中,以融合语言和视觉输入。2)最近,一些研究人员开始探索在LLMs中使用工具或模型的整合[24, 25, 26, 27, 28]。Toolformer是首个将外部API标签引入文本序列的先驱性工作,促进了LLMs访问外部工具的能力。因此,许多工作已经扩展了LLMs以涵盖视觉模态。Visual ChatGPT将BLIP和ControlNet等视觉基础模型与LLMs融合在一起。Visual Programming和ViperGPT通过使用编程语言,将LLMs应用于可视化对象,并将视觉查询解析为表示为Python代码的可解释步骤。我们还在附录B中对相关工作进行了更多讨论。
与这些方法不同,我们提出的HuggingGPT在以下几个方面推进了更通用的人工智能能力:1)HuggingGPT使用LLM作为接口将用户请求路由到专家模型,有效地将LLM的语言理解能力与其他专家模型的专业知识相结合;2)HuggingGPT不仅限于视觉感知任务,通过LLM组织模型之间的合作,可以处理任何模态或领域的任务。得益于HuggingGPT中任务规划的设计,我们的系统可以自动、高效地生成任务流程并解决更复杂的问题;3)HuggingGPT提供了一种更开放的模型选择方法,基于模型描述分配和组织任务。通过仅提供模型描述,HuggingGPT可以持续且方便地集成来自AI社区的各种专家模型,而无需改变任何结构或提示设置。这种开放和持续的方式使我们离实现人工通用智能更近了一步。
HuggingGPT是一个用于解决人工智能任务的协作系统,它由一个大型语言模型(LLM)和来自机器学习社区的许多专家模型组成。它的工作流程包括四个阶段:任务规划、模型选择、任务执行和响应生成,如图2所示。给定用户的请求,我们的HuggingGPT采用LLM作为控制器,将自动部署整个工作流程,从而协调和执行专家模型以实现目标。表1展示了我们HuggingGPT中详细的提示设计。我们将在以下各小节中介绍每个阶段的设计。
通常,在现实世界的场景中,许多用户请求会包含一些复杂的意图,因此需要协调多个子任务来实现目标。因此,我们将任务规划作为HuggingGPT的第一个阶段,旨在使用LLM分析用户请求,然后将其分解为一系列结构化任务。此外,我们还要求LLM确定这些分解任务的依赖关系和执行顺序,以建立它们之间的连接。为了更好地提示LLM进行有效的任务规划,HuggingGPT采用了一种提示设计,包括基于规范的指令和基于演示的解析。我们将在下面的段落中介绍这些细节。
基于规范的指令 为了更好地表示用户请求的预期任务并在后续阶段使用它们,我们期望LLM能够按照一些规范(例如JSON格式)解析任务。因此,我们为任务提供了一个统一的模板,并指示LLM通过槽位填充进行任务解析。如表1所示,任务解析的模板包括四个槽位(“task”、“id”、“dep"和"args”),用于表示任务的信息、唯一标识符、依赖关系和参数。有关每个槽位的详细信息可以在模板描述中找到(请参阅附录A.1.1)。通过遵循这些任务规范,HuggingGPT可以自动地利用LLM分析用户请求并相应地解析任务。
基于演示的解析 为了更好地理解任务规划的意图和标准,HuggingGPT在提示中加入了多个演示。每个演示包括一个用户请求及其相应的输出,代表了解析任务的预期顺序。通过考虑任务之间的依赖关系,这些演示帮助HuggingGPT理解任务之间的逻辑连接,从而准确确定执行顺序和识别资源依赖关系。我们的演示设计如表1所示。此外,为了支持更全面的用户请求(例如,多轮对话),我们通过添加以下指示将聊天记录并入提示中:为了辅助任务规划,聊天记录可作为{{ Chat Logs }}使用,您可以追踪用户提到的资源并将其纳入任务规划中。其中,{{ Chat Logs }}代表之前的聊天记录。这样的设计使得HuggingGPT能够更好地管理上下文,并在多轮对话中回答用户请求。
在任务规划之后,HuggingGPT接下来需要将任务和模型进行匹配,即为解析的任务列表中的每个任务选择最合适的模型。为此,我们使用模型描述作为语言接口来连接每个模型。具体而言,我们首先从机器学习社区(例如Hugging Face)获取专家模型的描述,然后通过一种上下文任务-模型分配机制动态地为任务选择模型。这种策略实现了增量式的模型访问(仅需提供专家模型的描述),能够更加开放和灵活地使用机器学习社区。更多细节将在下一段介绍。
上下文任务-模型分配 我们将任务-模型分配问题形式化为单选问题,在给定上下文中将潜在模型作为选项呈现。通常情况下,根据提示中提供的用户查询和任务信息,HuggingGPT能够为每个解析的任务选择最合适的模型。然而,由于最大上下文长度的限制,一个提示不可能包含所有相关模型信息。为了解决这个问题,我们首先根据任务类型筛选模型,只保留与当前任务类型匹配的模型。对于这些选定的模型,我们将根据它们在Hugging Face上的下载数量对它们进行排名(我们认为下载数量在一定程度上能够反映模型的质量),然后选择排名前K的模型作为HuggingGPT的候选模型。这种策略可以大大减少提示中的标记使用量,并有效地为每个任务选择适当的模型。
一旦为解析的任务分配了特定的模型,下一步就是执行任务,即进行模型推理。因此,在这个阶段,HuggingGPT将自动将这些任务参数输入到模型中,执行这些模型以获得推理结果,然后将结果发送回LLM。在这个阶段,资源依赖性的问题需要强调。由于先决任务的输出是动态生成的,HuggingGPT在启动任务之前还需要动态指定任务的依赖资源。因此,在这个阶段建立具有资源依赖性的任务之间的连接是具有挑战性的。
资源依赖性 为了解决这个问题,我们使用一个独特的符号“”来维护资源依赖关系。具体而言,HuggingGPT将先决任务生成的资源标识为-task_id,其中task_id是先决任务的任务ID。在任务规划阶段,如果有任务依赖于由task_id任务生成的资源,HuggingGPT将此符号设置为任务参数中相应资源子字段的值。然后在任务执行阶段,HuggingGPT会动态地用先决任务生成的资源替换这个符号。因此,这个简单的策略使得HuggingGPT能够在任务执行过程中高效处理资源依赖关系。
此外,在获取了没有任何资源依赖关系的任务后,我们将并行执行这些任务,以进一步提高推理效率。这意味着可以同时启动满足先决依赖关系的多个任务。此外,为了加速和计算稳定性,我们还提供了一个混合推理端点来部署这些模型。
在完成所有任务执行之后,HuggingGPT需要生成最终的响应。就像表1中所示,HuggingGPT将前三个阶段(任务规划、模型选择和任务执行)的所有信息整合到这个阶段的简洁摘要中,包括计划任务的列表、任务的选定模型以及模型的推理结果。
其中最重要的是推理结果,这是HuggingGPT做出最终决策的关键点。这些推理结果以结构化的格式呈现,例如目标检测模型中带有检测概率的边界框,问答模型中的答案分布等。HuggingGPT允许LLM接收这些结构化的推理结果作为输入,并以友好的人类语言形式生成响应。此外,LLM不仅仅是简单地汇总结果,还生成主动响应用户请求的响应,提供具有置信水平的可靠决策。
HuggingGPT提出了设计AI解决方案的新范式,但我们要强调它仍然存在一些限制或改进空间:1)HuggingGPT在规划方面严重依赖LLM的能力。因此,我们无法保证生成的计划始终是可行和最优的。因此,探索优化LLM以增强其规划能力至关重要;2)效率是我们框架中的一个常见挑战。为了构建这样一个协作系统(即HuggingGPT)并实现任务自动化,它严重依赖于一个强大的控制器(例如ChatGPT)。然而,HuggingGPT需要在整个工作流程中与LLM进行多次交互,这导致生成响应的时间成本增加;3)在使用LLM时,令牌长度是另一个常见问题,因为最大令牌长度总是有限的。尽管一些工作已将最大长度扩展到32K,但如果我们想连接大量模型,这仍然是不足够的。因此,如何简要有效地总结模型描述也值得探索;4)不稳定性主要是由于LLM通常是不可控的。尽管LLM在生成方面很擅长,但在预测过程中仍可能无法遵循指令或给出错误答案,导致程序工作流程中出现异常。在设计系统时应考虑如何减少这些不确定性。
在本文中,我们提出了一个名为HuggingGPT的系统,用于解决AI任务,以语言作为将LLMs与AI模型连接起来的接口。我们系统的原则是,LLM可以被视为一个控制器,用于管理AI模型,并可以利用来自Hugging Face等ML社区的模型自动解决用户的不同请求。通过利用LLMs在理解和推理方面的优势,HuggingGPT可以分析用户的意图,并将其分解为多个子任务。然后,根据专家模型描述,HuggingGPT能够为每个任务分配最合适的模型,并整合来自不同模型的结果生成最终的响应。通过利用机器学习社区中众多AI模型的能力,HuggingGPT展示了在解决具有挑战性的AI任务方面的巨大潜力,从而为实现人工通用智能铺平了一条新的道路。
HuggingGPT报道:https://mp.weixin.qq.com/s/x9nihEI6uhbouFTR-0hqQg
HuggingGPT论文:https://arxiv.org/pdf/2303.17580.pdf
HuggingGPT代码:https://github.com/microsoft/JARVIS