基于LLM的应用开发框架及跨模型扩展初探

文摘   科技   2023-05-15 12:00   北京  


编者荐语:



大语言模型正在引领AI的下一波创新浪潮。如何将其威力释放并应用于实际产品,成为机遇与挑战并存的话题。本文以LangChain为例,分析了目前基于大语言模型应用开发需要的由平台或框架提供的能力,同时分析了时下流行的AGI启蒙框架AutoGPT与HuggingGPT,试图为读者解析由LLM驱动的类PDCA环如何运作,以探究如何将LLM模型集成到现有的产品和能力中。


基于LLM的应用开发框架及跨模型扩展初探

亚信科技(中国)有限公司

摘要:随着ChatGPT的横空出世,基于LLM的应用开发,目前十分活跃。目前主流的框架有哪些,可以如何支持应用的开发,是本文想回答的一个问题,另一方面,基于LLM的应用存在限制有哪些?如何绕过这些限制,将自动化能力提升到下一个阶段,也是本文试图探索的一个方向。最后,本文总结了LLM类应用对底层能力的要求,以期为后续平台能力建设指明新的方向。
关键词:LLM, ChatGPT, AUTO-GP, HUGGINGGPT, 自动化 

随着去年年底(2022.11月份)ChatGPT的发布,基于LLM的AI生成式技术开始流行。目前在问答、文本生成、翻译、内容创作、文本转图片等领域得到的广泛应用。可以预测的是ChatGPT的热潮还会持续一段时间,ChatGPT具备变革我们与计算机交互的方式的潜力,对很多行业都可能会造成比较重大的影响。


2023.3.1日ChatGPT发布了其API,允许开发者通过接口来接入其能力。这极大的降低了开发者在无需训练和维护大语言模型的情况下集成其能力到他们自己的应用和服务的难度。


针对这种场景,我们对基于LLM的应用开发框架及跨模型扩展的场景进行了通用需求分析,以期获得如何通过平台支撑好AI 2.0时代的应用开发的需求输入,同时对相应的平台工具进行相应的能力增强规划。


本文计划从三个项目分析基于LLM的应用开发框架及跨模型扩展的要求:LangChain, Auto-GPT, HuggingGPT。

图1:三个项目

LangChain是一个开发基于LLM应用的框架,提供了将不同组件组合到一起的标准接口,包括语言模型,数据源和Agent。使得开发复杂的如问答、文本生成、翻译等功能的应用变的十分简单。

图2:LangChain能力模型

LangChain定义了如下七种能力:

· LLM:LangChain的核心组件。用来生成文本,翻译,写作,回答问题。

· 提示:用来引导LLM生成特定的输出。例如,提示可以是“写一首关于猫的诗”或”把下面的文字从英文翻译成西班牙文”

· 链:不是单个的LLM调用,而是一系列调用(可以是LLM,也可以是不同的工具)。LangChain提供了关于链的标准接口,提供大量和其他工具的集成, 以及给普通应用使用的端到端的链。

· 数据增强式生成:包含特殊类型的链,先与外部源进行交互获取数据,然后提供生产步骤使用。例如,可以包含很长的文本的总结,然后基于该数据源进行问答。

· Agent: LangChain提供给开发者一组关于Agent的标准接口,允许LLM决策采用哪种动作,基于何种顺序。LangChain提供了一组agent进行选择。Agent使用LLM来决定采用哪种动作,执行动作,进行观测,执行直到完成。

· 记忆:记忆是在调用链/Agent间进行的持久化。LangChain提供了一组关于记忆的标准化接口,一组记忆的实现

· 评估:生成式模型使用传统指标是很难进行评估的。一种新的方法是使用语言模型自身来进行评估。LangChain提供了一些提示符/链来辅助进行评估。


从图2我们可以看出,LangChain将基于LLM的应用场景开发工具化,抽象出了链、记忆、索引、Agent等关键模型,对于LLM的核心应用场景的关键能力都提供底层能力支撑,能够方便应用开发人员快速开发LLM应用。


下面以一个案例来讲解LangChain的使用:

图3:Langchain开发举例

该代码的目的是以一个指定链接进行网页下载,内容总结,并翻译成中文。

1.使用CharacterTextSplitter来进行文本分割.

2.使用load_summarize_chain导入总结链。

3.使用PromptTemplate来进行提示符模板的设置

4.使用SimpleSquentialChain将总结链和翻译链进行串联。


从上面的例子我们不难发现由于LangChain提供了大量的工具和范式支持,编写一个基于LLM的应用,需要写的业务代码非常的少。


接下来我们再来看看Auto-GPT的情况。

Auto-GPT是一个开源AI项目,基于ChatGPT的生成式预训练转换器(Generative Pre-trained Transformer)构建. 其最核心的能力,赋予GPT自主运行的能力,不需要人对每个动作进行提示指导。


Auto-GPT的工作步骤大致如下:

1.理解任务:Auto-GPT首先需要对任务进行深入理解。它通过自然语言理解技术,将输入的任务语句转换为可以处理的结构化数据。

2.分解任务:接下来,Auto-GPT将任务分解成多个步骤。这个过程类似于将大型项目分解成更小的任务或子任务,以便更好地管理和控制。每个子任务应该是具有明确目标的小步骤。

3.生成解决方案:对于每个子任务,Auto-GPT将利用其学习到的知识和经验,生成可以解决该任务的解决方案。解决方案可以是一系列指令、操作或决策,以实现该子任务的目标。

4.执行方案:一旦生成了解决方案,Auto-GPT将自动执行指令、操作或决策,以完成指定任务的每个子任务。

5.监控进度:Auto-GPT还将监控任务执行的进度,并在必要时进行调整。如果存在异常情况或错误,它将重新分析任务,并生成新的解决方案,以确保任务完成。


图4:Auto-GPT的执行逻辑

首先AutoGPT会将问题转换为Prompt模板,拼接{ai_name}和{ai_role},填入GOALS:{ai_goals};然后加上一些限制条件CONSTRAINTS,COMMANDS,RESOURCES和PERFORMANCE EVALUATION模板;最后提供一个JSON的返回格式。


图5:Auto-GPT的提示符中返回要求部分

执行第一步以后就能拿到结果,结果会按要求返回对应JSON, 示例如下:

图6:结果返回

根据生成的command创建任务:

图7:执行命令,创建任务

如处理出错,会捕捉错误,重新生成命令。

图8:重新生成命令

对于memory, AutoGPT支持三种向量存储:pinecone,redis,local,默认使用LocalCache。主要是控制token的数量,通过存储对话的上下文,找到全部历史信息中的最近10个关键上下文继续组成下一次上下文,比如LocalCache就是通过ada算法实现topk搜索。剩下的步骤基本就是上述步骤的循环,直到所有任务执行完毕,提示用户进行下一步操作输入


最后我们再来看看HuggingGPT。

HuggingGPT是微软推出的新模型,目标是解决以下问题:


1.大语言模型的输入和输出都是文本。LLM无法处理图片、视频、演讲。

2.在真实场景中,有很多复杂问题需要被分解成多个子任务处理。同时这些子任务,需要在多个模型上进行调度和协作(这已超出LLM的限制)。

3.LLM模型在零样本和少样本模式下,表现出一些有趣的能力,但还是比微调的模型要逊色。


HuggingGPT核心在如何扩展语言模型的能力。

回顾下LLM的发展:

近年来,我们看到新的LLM呈爆炸式增长,这些已经彻底改变了NLP领域。事实上,所有不同的公司都创建或发布了 LLM,著名的例子是GPT-3、PaLM和 LLaMa。尽管方法保持不变,即使用无监督方法对大量文本训练模型,但已经开发了各种技术来改进模型。第一个例子是从人类反馈中强化学习(RLHF),这个例子可以进一步优化 LM(ChatGPT 遵循的一种方法)。此外,诸如思维链(COT) 之类的技术使模型能够针对需要推理的数学或其他问题取得结果。


其次,LLM 的新领域是多模态,因此 LLM 可以超越文本生成。已经测试了两种主要方法:统一的多模态语言模型(例如 BLIP-2)。或者,集成外部工具或模型(例如Toolformer,它在文本序列中引入了外部 API 标签,这有助于模型访问外部工具)。


BLIP-2的一个核心认知是:为了处理复杂的 AI 任务,LLM 应该能够与外部模型协调以利用它们的能力。因此,关键是如何选择合适的中间件来桥接 LLM 和 AI 模型之间的连接。


换句话说,这个想法是 LLM 可以与其他模型对话,从而利用它们的能力。即任何 AI 模型都可以“通过总结其模型功能”以文本形式定义。因此,我们的想法是使用语言作为 LLM 与另一个模型之间的接口。


更清楚地说,与 LLM 的交互是通过使用提示进行的,那么为什么不以提示形式提供有关 AI 模型的信息呢?然后 LLM 可以利用这些信息来处理这些模型的管理(计划、调度和合作)。显然,要做到这一点,我们需要大量高质量的模型描述。幸运的是,ML 社区为特定任务和用于解决这些任务的模型(语言、视觉、语音等)提供了质量描述。所以我们需要的是将 LLM 与社区(GitHub、HuggingFace 等)联系起来。


HuggingGPT 是一个旨在做到这一点的系统,微软提出了一个名为 HuggingGPT 的系统来连接 LLM(即 ChatGPT)和 ML 社区(即 Hugging Face),它可以处理来自不同模态的输入并解决众多复杂的 AI 任务。


图9:HuggingGPT使用LLM充当控制器

换句话说,使用了 HuggingFace 中每个模型的描述(由用户编写并描述模型的功能)。这些描述合并到提示中以允许与 ChatGPT 通信。LLM 然后与用户交互。该过程可以定义为四个步骤:


· 任务规划:ChatGPT 分析用户的请求(理解意图)并将问题转化为可能解决的任务。

· 模型选择:ChatGPT 选择 HuggingFace 中存在的适当模型(专家模型)(根据提供的描述选择模型)

· 任务执行:模型被调用并执行,然后将结果返回给ChatGPT

· 响应生成:ChatGPT 整合模型的结果并生成答案


这种方法比以前的方法有优势。HuggingGPT 不仅限于视觉组件,还可以集成任何任务和模型,因为它可以与其他模型协作。此外,它可以解决更复杂的任务,因为它可以与多个模型合作并组织任务执行。此外,通过提供新模型的描述,HuggingGPT 可以集成和解决其他模型并解决新任务。


图10. HuggingGPT工作原理图释

任务规划

第一步是了解回答用户问题所涉及的任务。该模型收到用户请求,必须解释其意图,并将此请求转换为多个任务。之后,它必须根据自己的知识来规划顺序和依赖关系。HuggingGPT 在第一步中使用基于规范的指令。也就是说,HuggingGPT 抽取了四个槽位用于任务解析:


· Task ID。模型为每个任务提供了唯一的标识符。此 ID 用于标识任务和依赖的任务以及生成的所有资源。

· 任务类型。每个任务可以是多种类型(语言、视觉、视频、音频等)。

· 任务依赖性。定义每个任务的先决条件(模型仅在其所有先决条件都已完成时才启动任务)。

· 任务参数。此槽包含执行任务所需的所有参数(从文本到图像或其他资源)。这些内容可以来自于用户的查询,也可以来自于其他任务的结果。


指令调整和来自人类反馈的强化学习允许模型遵循指令。HuggingGPT 实际上允许为模型提供执行这些任务所需的任务规范。换句话说,对于每个任务,各种槽代表 LLM 可以用来分析用户请求并相应地解析任务的指令。该模型还利用了另一种称为基于演示的解析的方法:


该模型接收一组输入(任务和其他参数)作为输入,并将任务规划作为输出。现在,这些任务可能也有依赖关系,所以为了让模型更容易理解要做什么,我们为它提供了一个逻辑顺序。此外,为了使模型更有效,我们为其提供了聊天上下文,将这一段添加到包含聊天上下文的说明中。


图11:提示符上下文

选型

一旦 HuggingGPT 解析了任务列表,您需要为每个任务选择合适的模型(匹配任务和模型)。这是可能的,因为我们有模型的描述。事实上,在 HuggingFace 上,通常是开发人员自己在功能、架构、支持的语言和领域、许可等方面描述模型。显然,主要的限制是模型卡可能很长并且无法嵌入整个描述(可以提供给 HuggingGPT 的文本有最大长度限制)因此可能不会包含一些相关信息。因此,作者决定“根据任务类型过滤模型,只保留与当前任务类型匹配的模型。”由于同一个任务有不同的模型,作者依靠社区,模型实际上是根据下载量进行排名的(这个数字应该部分反映模型的质量)。之后,选择了一些模型(top-k candidates),HuggingGPT 从中选择


任务执行

一旦将任务分配给模型,我们就需要模型来执行它(模型仅用于推理)。为了加快执行速度,HuggingGPT 使用混合推理端点。所选模型将任务参数作为输入,然后将结果发送回语言模型 (ChatGPT)。此外,如果模型没有资源依赖性,则可以并行化其推理。换句话说,相互不依赖的任务可以同时执行。为此,HuggingGPT 在本地运行一些使用频率最高或最耗时的模型。这些在本地运行的模型数量很少,速度更快,优先级也更高。换句话说,HuggingGPT 将模型与任务匹配,如果它不在本地存在的模型列表中,HuggingGPT 将在 Hugging Face 端点上运行模型。


响应生成

最后一步是生成响应。当所有任务都已完成时会发生这种情况。在这一步中,HuggingGPT 将从前面的步骤中获得的所有信息整合成一种简洁的摘要(任务、使用的模型和模型的结果)。获得的结果可以是多种类型,并且通常采用结构化形式(从边界框到问题的答案),然后 HuggingGPT 会重新处理这些结果:


HuggingGPT 允许 LLM 接收这些结构化推理结果作为输入,并以友好的人类语言形式生成响应。此外,LLM 不是简单地汇总结果,而是生成主动响应用户请求的响应,从而提供具有置信度的可靠决策。


从上面的三款产品的分析我们不难发现,目前基于ChatGPT或LLM的应用大致分为三类:

1.使用单个LLM API接口解决简单问题的应用。--- 基于OpenAI接口

2.通过LLM的能力作为PDCA的能力主控,通过外部工具完成复杂功能的应用。--- 基于LangChain,参考Auto-GPT实现

3.通过LLM的能力作为PDCA的能力主控,结合其他模型完成更为复杂的功能的应用。--- 参考HuggingGPT实现


配合ChatGPT完成应用开发支撑,至少需要完成以下能力的补齐:

1.数据获取能力。如各种Search接口,各种爬虫能力。可参考SerpApi等。

2.向量存储/查询能力。用于Embeding的存储和使用。可参考Pinecore等。

3.记忆模型。至少提供会话实体窗口模型,会话实体记忆模型。


可考虑提供如下现成的模型调用:

1.总结链

2.基于文档的对话链

3.基于源的问答链


针对流程编排产品能力,可考虑参考Auto-GPT, 完善如下能力:

1.根据用户目标,解析成对应的计划和命令的能力,然后通过命令返回。

2.提供多种外部接入能力,完善命令子流程完成处理的能力

3.提供注智节点(ChatGPT Based节点),提供高阶的基于LLM的处理能力。

参考文献

[1]https://github.com/Significant-Gravitas/Auto-GPT
[2]https://python.langchain.com/en/latest/index.html
[3]https://juejin.cn/post/7221461913003442236
[4]https://levelup.gitconnected.com/hugginggpt-give-your-chatbot-an-ai-army-cfadf5647f98


亚信科技新技术探索
亚信科技的ICT前沿技术观点与行业洞见。展现亚信新技术与产品行业实践成果。
 最新文章