随着大语言模型的横空出世,生成式AI应用也在不断发展,图1列出了生成式AI应用的分级,共分为5级:
- L1 Tool,人类完成所有工作,基本没有任何显性的AI辅助,只是比较简单的工具,会被逐渐升级淘汰;
- L2 Chatbot,人类直接完成绝大部分工作,人类向AI询问意见,了解信息,AI提供信息和建议但不直接处理工作;
- L3 Copilot,人类和AI进行协作,工作量相当,AI根据人类要求完成工作初稿,人类进行目标设定,修改调整,最后确认;
- L4 Agent,AI完成绝大部分工作,人类负责设定目标、提供资源和监督结果,AI完成任务拆分,工具选择,进度控制,实现目标后自主结束工作;
- L5 Intelligence,完全无需人类监督,AI自主拆解目标,寻找资源,选择并使用工具,完成全部工作,人类只需给出初始目标。
当发展到L4级别时,Agent(即智能体)的能力已经越来越接近通用人工智能,可以借助AI完成绝大部分的工作。相对来看,L3和L4级别的AI应用价值更大,但需要大语言模型的能力来进一步支持升级。
图1 生成式AI应用的分级
在《大语言模型Agent综述与实践》中,笔者已对基于大语言模型的智能体进行介绍。基于大语言模型的智能体的演进方向之一是多智能体间的协同。和人类在现实生活中将不同专长的专家组成团队、发挥集体智慧、共同完成复杂任务的协作方式类似,目前众多理论研究者和应用开发者也在探索多个不同角色的智能体相互协作、共同完成复杂任务的方案。
《Large Language Model based Multi-Agents: A Survey of Progress and Challenges》对基于大语言模型的多智能体的相关研究进行了综述,本文前半部分是对这篇论文的阅读笔记,并对综述中提及的部分工作进行展开,后半部分是对基于大语言模型的多智能体的实践。如有不足之处,请指正。
如无特殊说明,下面所讲的智能体、多智能体均指基于大语言模型的智能体、多智能体,而非传统的智能体、多智能体。
综述
大语言模型显现出与人类相当的推理和规划潜力,这与人类对能够感知环境、做出决策和响应的智能体的期望相一致,因此,基于大语言模型的智能体被提出。进一步,和人类在现实生活中将不同专长的专家组成团队、发挥集体智慧、共同完成复杂任务的协作方式类似,基于大语言模型的多智能体被提出。多个智能体相互协作、共同完成复杂任务。与单智能体相比,多智能体能够定义不同角色的智能体,使得每个智能体专精特定领域的知识和能力,并通过智能体间的交互有效模拟复杂的现实世界环境,提供更高级的能力。
《Large Language Model based Multi-Agents: A Survey of Progress and Challenges》对基于大语言模型的多智能体的相关研究进行了综述,内容包括以下几个部分:
- 背景知识,包括单智能体的介绍、多智能体和单智能体的对比;
- 多智能体的架构,包括智能体和环境的交互、智能体画像构建、智能体间的通信和智能体能力获取;
- 多智能体的应用,包括在问题求解和世界模拟这两大类中的应用,而每个大类中又具体拆分若干子类,论文对多智能体在每个子类中的应用进展均进行了介绍;
- 多智能体的工具和资源,包括框架、数据集和基准;
- 多智能体后续的挑战和机遇。
图2是论文列出的基于大语言模型的多智能体的研究进展,包括相关的框架、应用、数据集和基准,也包括多智能体如何通过记忆和自我进化进行迭代、获取能力。基于大语言模型的多智能体的框架包括Camel、MetaGPT、AutoGen、Agents,后面会再详细介绍。多智能体通过自我进化进行迭代、获取能力的方案包括Self-Adaptive、ProAgent、LTC等,后面会再详细介绍。多智能体的应用分问题求解和世界模拟两大类,而每个大类又分若干子类,问题求解的子类包括软件开发(Software Development)、具身智能(Embodied Agents)、科学实验(Science Experiments)、科学辩论(Science Debate),世界模拟的子类包括社会模拟(Societal Simulation)、游戏(Gaming)、心理学(Psychology)、经济学(Economy)、推荐系统(Recommender Systems)、政策制定(Policy Making)、疾病传播模拟(Disease Propagation Simulation),图2列出了各子类在每个时间周期(3个月为一个时间周期)内的论文数,后面会对多智能体在软件开发中的应用进行详细介绍。
图2 基于大语言模型的多智能体的研究进展
背景
基于大语言模型的智能体
在《大语言模型Agent综述与实践》中,笔者已对基于大语言模型的智能体进行介绍,这里直接引用其中的内容。基于大语言模型的智能体其核心是大语言模型,大语言模型承担着大脑的角色,用于思考和规划,而围绕着大语言模型,Agent还包含记忆和工具,记忆用于存储短期上下文信息和长期知识信息,工具则承担着感官和四肢的角色,在大语言模型的思考和规划下,Agent一方面可以通过工具获取外部的各种信息用于进一步的思考和规划,另一方可以通过工具执行动作对外部环境施加影响。
图3 基于大语言模型的Agent的整体架构
《LLM Powered Autonomous Agents》中使用图3描述了基于大语言模型的Agent的整体架构,其中包含以下核心组件:
- 规划(Planning),大语言模型作为Agent的大脑负责思考和规划,而思考和规划的方式又可以分为两部分:
- 分而治之(Task Decomposition):对于复杂的任务,大语言模型会将其分解为多个相对简单的子任务,每个子任务包含独立的子目标,从而分而治之、逐步求解;
- 自我反思(Self-Reflection):大语言模型会对过去的规划和执行进行自我反思,分析其中的错误,并对后续的思考和规划进行改进,完善最后输出的结果。
- 记忆(Memory),记忆是对大语言模型本身由模型结构和参数所蕴含知识的补充,记忆又可以分为短期记忆和长期记忆:
- 短期记忆,即大语言模型的上下文学习,包括提示、指示、前序步骤的大语言模型推理结果和工具执行结果等;
- 长期记忆,即外部可快速检索的向量索引,这也就是目前比较流行的一种大语言模型应用的解决方案——RAG(Retrieval-Augmented Generation,检索增强生成)。RAG的流程可以简单概括为,将包含知识的文档切分为块,并对块向量化,构建块向量索引,然后将问题也向量化,然后从块向量索引中检索和问题相关的块,最后将块和问题合并作为大语言模型的输入进行推理。RAG可以有效缓解大语言模型无法扩展知识、由知识局限产生的“幻觉”的问题。
- 工具(Tool),工具作为Agent的感官和四肢,Agent一方面可以通过工具获取外部的各种信息用于进一步的思考和规划,例如通过搜索引擎搜索某个关键词的最新信息,另一方可以通过工具执行动作对外部环境施加影响,例如调用外部系统的接口执行指令并获取执行结果。
另外,在《A Survey on Large Language Model based Autonomous Agents》这篇综述论文中,作者提出了和图3类似的基于大语言模型的智能体的整体架构,如图4所示,其中除了和图3相同的Memory、Planning、Action组件外,作者还增加了画像(Profile)组件。画像(Profile)组件即提示中关于智能体角色的定义。我们平时通过大语言模型解决某类问题时,一般会先定义其角色,例如期望通过大语言模型根据关键词创作一段广告创意描述,则会给出类似“你是一位广告创意优化师,你需要根据关键词创作一段广告创意描述”这样的角色定义,并还会在提示中进一步给出思考步骤、约束限制、样本示例等。而画像,既可以由人工根据一定的方法论进行撰写,也可以由大语言模型根据提示进行生成。
图4 基于大语言模型的智能体的整体架构
多智能体和单智能体的对比
随着应用场景越来越复杂,基于大语言模型的大模型智能体也在向多智能体的协同进行演进,由各个智能体各司其职、分工协作来共同完成任务。
与单智能体相比,多智能体强调多样化的智能体配置、智能体间的交互和集体决策过程,这使得多个自主智能体能够通过合作解决更动态和复杂的任务。
架构
图5 基于大语言模型的多智能体的整体架构
图5是论文列出的基于大语言模型的多智能体的整体架构,其中涉及多个智能体间的协作,类似于人类在问题解决场景中的协作。论文分四个方面对多智能体的架构进行解析:
- 智能体和环境的交互(Agent-Environment Interface);
- 智能体画像构建(Agents Profiling);
- 智能体间的通信(Agents Communication);
- 智能体能力获取(Agents Capabilities Acquisition)。
智能体和环境的交互
智能体通过和环境的交互,获取信息,思考规划,执行动作对环境施加影响,进行再获取信息,用于后续的思考和规划,如此循环迭代多轮。智能体交互的环境可分为以下几类:
- 沙箱环境(Sandbox),即模拟或虚拟环境,沙箱环境主要用于软件开发和游戏,软件开发中将可编写和执行各类代码的代码解释器(Code Interpreter)作为模拟环境,游戏中将游戏规则作为模拟环境;
- 物理环境(Physical),即真实物理环境,智能体和物理实体交互,且交互遵循物理定律,智能体的行动是真实的物理动作,比如打扫房间等;
- 无环境(None),例如多智能体对一个问题进行辩论以达成共识,无环境下的应用主要关注智能体间的交互,而非智能体和外部环境的交互。
智能体画像构建
多智能体中各智能体承担不同的角色,每个角色均有相应的描述,包括特征、能力、行为、约束和目标等,这些描述构成智能体的画像(Profile)。例如,在游戏中,各智能体作为游戏玩家,有不同的角色和技能,对游戏的目标有不同的作用;在软件开发中,各智能体承担的角色包括产品经理、架构师、开发工程师、测试工程师等,每个智能体分别负责软件开发流程的某一环节;在辩论中,各智能体承担的角色包括正方、反方和裁判等,每个智能体有特定的职责和策略。
智能体画像构建的方法也可分为以下几类:
- 预先定义(Pre-Defined),即由多智能体设计者人工显式地定义;
- 模型生成(Model-Generated),即通过指示由大语言模型自动生成;
- 数据衍生(Data-Derived),即根据已有数据集衍生。
智能体间的通信
多智能体中各智能体的相互协作依赖智能体间的通信,论文从通信范式、通信结构和通信内容三个方面对智能体间的通信进行解析:
- 通信范式(Communication Paradigms):智能体间通信的方式、方法;
- 通信结构(Communication Structure):智能体间通信的组织、结构;
- 通信内容(Communication Content):智能体间通信的内容。
通信范式可分为三类:
- 合作(Cooperative),各智能体有共同的目标,相互交换信息以达成统一的解决方案;
- 辩论(Debate),各智能体各自表达和维护自己的观点和方案,点评其他智能体的观点和方案,最终达成共识;
- 竞争(Competitive),各智能体有各自的目标,且各自的目标可能相互冲突。
通信结构可分为四类:
- 分层(Layered)结构,如图6左上角所示,多智能体按层组织,每层包含多个不同角色的智能体,智能体只与同层或相邻层的其他智能体通信,《A Dynamic LLM-Powered Agent Network for Task-Oriented Agent Collaboration》这篇论文中提出的动态智能体网络(Dynamic LLM-Powered Agent Network,DyLAN)即属于分层结构,类似多层前馈神经网络,只是将其中的神经元替换为智能体,其针对给定问题,在推理时根据智能体优选算法选择各层中最优的智能体,然后使用选出的智能体逐层向前传递求解给定问题;
- 去中心化(Decentralized)结构,如图6右上角所示,各智能体间直接点对点地相互通信,这种结构主要用于世界模拟(World Simulation)应用中;
- 中心化(Centralized)结构,如图6左下角所示,由一个或一组智能体构成中心节点,其他智能体只与中心节点通信;
- 共享消息池(Shared Message Pool)结构,如图6右下角所示,由MetaGPT提出,所有智能体发送消息至共享消息池,并订阅和自己相关的消息。
图6 多智能体的通信结构
通信内容格式主要是文本,但特定应用也有特殊的内容格式,例如,在软件开发中,智能体通信的内容可能还包括代码片段。
智能体能力获取
能力获取是多智能体中的关键过程,其使得智能体能够动态学习和演变。能力获取包括智能体从哪些类型的反馈中学习以增强其能力,以及智能体为有效解决复杂问题而调整自己的策略。
根据反馈的来源,可将反馈分为以下几类:
- 来自真实或模拟环境的反馈(Feedback from Environment),这种反馈在问题求解应用中比较普遍,包括软件研发中智能体从代码解释器(Code Interpreter)获取的代码执行结果,机器人这类具身智能体从真实或模拟环境获取的反馈等;
- 来自智能体间交互的反馈(Feedback from Agents Interactions),这种反馈在问题求解应用也比较常见,包括来自其他智能体的判断,或来自智能体间的通信等,例如在科学辩论中,智能体通过智能体间的通信评估和完善结论,在博弈游戏中,智能体通过之前几轮和其他智能体的交互完善自己的策略;
- 来自人类反馈(Human Feedback),人类反馈对智能体对齐人类偏好很重要,这种反馈主要在人机回环(Human-in-the-loop)应用中,《Putting Humans in the Natural Language Processing Loop: A Survey》这篇综述论文系统总结了在自然语言处理流程的各个环节中,可加入的人类反馈,这些环节包括数据生产、数据打标、模型选择、模型训练、评估部署等,如图7所示;
图7 在自然语言处理流程的各个环节中可加入人类反馈
- 无反馈(None),无反馈主要出现世界模拟这类应用中,因为这列应用主要侧重结果分析,例如传播模拟的结果分析,而非智能体能力获取,所以无需引入反馈对智能体的策略进行调整。
而智能体调整策略、增强能力的方式又可以分为三类:记忆(Memory),自我进化(Self-Evolution)和动态生成(Dynamic Generation)。
记忆(Memory)。智能体通过记忆模块保存过去交互和反馈的信息,在后续的执行中,可以从记忆中检索和当前任务相关的信息,特别是和本次任务目标类似的成功执行的信息,将这些信息作为上下文,辅助智能体思考规划。
自我进化(Self-Evolution)。除了基于记忆过去的信息来调整后续的执行外,智能体还可以动态地自我进化,调整目标和策略。论文在这里列举了自我进化相关的研究。
Self-Adaptive
《Self-Adaptive Large Language Model (LLM)-Based Multiagent Systems》这篇论文将MAPE-K控制循环和大语言模型相结合,实现多智能体的自我进化。MAPE-K控制循环是一个著名的框架,用于促进智能体的自主性和自我意识,如图8所示,其包含监控(Monitoring)、分析(Analyzing)、规划(Planing)、执行(Executing)、知识(Knowledge)这几个阶段或组件,而其名称就是由上述阶段或组件的英文单词的首字母组成。在监控阶段,智能体使用专门的传感器从环境中收集数据。在分析阶段,智能体评估数据以确定基于感知到的环境变化所需的响应。在规划阶段,智能体基于分析结果进一步收敛动作集合,通过执行动作能够达到预期的状态。在执行阶段,智能体通过执行器执行选定的动作。
图8 MAPE-K控制循环
MAPE-K控制循环和大语言模型相结合,实现多智能体的自我进化的方案如图9所示,其中包含多个智能体,而每个智能体采用如图8所示的MAPE-K控制循环实现自我进化,每个智能体的控制循环使用大语言模型实现知识存储、分析和规划。
图9 MAPE-K控制循环和大语言模型相结合,实现多智能体的自我进化的方案
每个智能体的控制循环使用大语言模型实现知识存储、分析和规划的细节如图10所示,其中智能体的处理流程主要包含以下三个任务:
- 监控,即MAPE-K控制循环中的监控阶段,智能体收集感知器的数据,计算智能体的状态,联同来自其他智能体的消息,一并作为输入大语言模型的提示的一部分;
- GPT,合并MAPE-K控制循环中的分析、规划阶段以及知识存储,智能体依赖大模型模型,由其根据监控输入进行推理,输出动作;
- 执行,即MAPE-K控制循环中的执行阶段,智能体将大语言模型输出的动作转化为可执行的指令,并执行。
图10 每个智能体的控制循环使用大语言模型实现知识存储、分析和规划的细节
图11 智能体4在第一轮交互中输入大语言模型的提示以及大语言模型返回的动作
论文设计以下应用场景评估MAPE-K控制循环和大语言模型相结合的效果:该应用场景共有5个智能体,其中智能体1、2、3为书籍卖家,智能体4、5为书籍卖家,买卖双方通过多轮交互、互相发送消息进行议价,卖家的成功条件是以尽可能高的价格成功卖出书籍,买家的成功条件是以尽可能低的价格成功买到书籍。智能体4在第一轮交互中输入大语言模型的提示以及大语言模型返回的动作如图11所示,未被蓝色标记的部分是输入大语言模型的提示,其中包括智能体4的角色描述、成功条件以及智能体1、3发给智能体4的消息,被蓝色标记的部分是大语言模型返回的动作,因为智能体1给出的价格相比智能体3给出的价格更低,为20,所以智能体4后续的动作是给智能体1回复消息,期望价格进一步降低至15。
ProAgent
《ProAgent: Building Proactive Cooperative Agents with Large Language Models》这篇论文提出ProAgent框架,其中,多智能体在协作时,每个智能体能够分析当前状态,推断其他智能体的意图,动态调整本身的策略和行动,对齐其他智能体,从而增强多智能体的协作能力。
论文使用Overcooked-AI这一开源项目作为评估ProAgent的应用场景,该项目基于热门视频游戏Overcooked,其中,多智能体相互协作,协作目标是尽可能快地烹饪并递送汤,协作过程中智能体的动作包括选择食材、烹饪汤、递送汤等。
图12 ProAgent框架的整体架构和流程
ProAgent框架的整体架构和流程如图12所示,该框架包含4个模块和1个机制,4个模块分别是规划器(Planner)、校验器(Verificator)、控制器(Controller)和记忆(Memory),1个机制是认知修正(Belief Correction)。
ProAgent框架中智能体基于上述模块和机制感知环境、思考规划、执行动作的流程如图12左侧所示。首先,将智能体在环境中的状态由符号形式转化为自然语言形式,然后将自然语言形式的状态和记忆中的历史信息拼接在一起,由大语言模型作为规划器进行思考规划,识别其他智能体的意图,预估其他智能体的动作,并规划当前智能体本身后续的动作。接着,一方面通过认知修正机制,对比其他智能体的动作预估值和实际值,若有差异,则进行修正,另一方面通过校验器,校验当前智能体本身后续的规划动作是否可成功执行,若不可成功执行,则由规划器重新思考规划,如此循环,直至规划器给出可成功执行的动作,最后由控制器执行相应的动作。
流程细节和示例如图12右侧所示,当前智能体——Alice和另一个智能体——Bob合作制作并递送汤,Alice通过大语言模型进行思考规划时,其提示包括知识(即游戏目标、可选择的动作等)和状态(即Alice、Bob和环境当前的状态)等,大语言模型按照思维链(Chain of Thought,COT)的方式进行思考规划,先输出思考过程,再输出Alice的规划和Bob的意图,Bob的意图通过认知修正机制被修正,Alice的规划通过校验器被校验,校验通过的动作被控制器执行。
LTC
《Adapting LLM Agents Through Communication》这篇论文提出了通信学习(Learning through Communication,LTC)这一新的学习方式,将智能体的消息历史作为训练数据集对大语言模型进行微调。LTC既可用于单智能体,也可用于多智能体,单智能体通过思维链产生多个消息,多智能体通过相互之间的交互产生多个消息,这些消息构成类似强化学习中的轨迹,产生相应的结果,这些结果构成对各智能体的奖励,如图13所示。
图13 单智能体和多智能体的多个消息构成轨迹、产生奖励
图13左侧单智能体的多个消息构成的轨迹的数据示例如图14所示:
图14 单智能体的多个消息构成的轨迹的数据示例
其中,轨迹由词元序列构成,且每个词元通过Mask标记其由哪方产出,轨迹通过Reward标记其获得的奖励。
LTC的整体架构如图15所示,其参考强化学习,包括两个阶段:
- 探索(Exploration)阶段,智能体通过和大语言模型、环境及其它智能体等各方的交互,产出多个消息,构成如图14所示的轨迹,这些轨迹会存入重放池(Replay Buffers);
- 更新(Updating)阶段,从重放池中采样轨迹,使用这些轨迹作为训练数据集微调大语言模型,微调的目标函数包含两部分,一部分是大语言模型本身的损失函数,即期望大语言模型能够通过前序词元序列准确预测下一个词元,另一部分是强化学习中PPO优化算法的损失函数,即期望大语言模型能够最大化奖励,通过将这两部分加权求和,使得微调后的大语言模型在保持语言模型能力的同时,能够最大化奖励,提升解决问题的能力。
图15 LTC的整体架构
动态生成(Dynamic Generation)。系统运行过程中根据需要动态生成新的智能体。论文在这里列举了动态生成相关的研究。
AutoAgents
《AutoAgents: A Framework for Automatic Agent Generation》这篇论文提出AutoAgents框架,如图16所示,其针对某个任务(例如,写一篇关于人工智能觉醒的小说)可动态生成相应的智能体进行处理,处理过程包括两个阶段:
- 草稿阶段(Draft Stage):通过三个预先定义的智能体——规划者(Planner)、智能体观察者(Agent Observer)、规划观察者(Plan Observer)的合作,生成完成任务所需的智能体和执行计划;
- 执行阶段(Execution Stage):使用生成的智能体逐步执行计划,并通过一个预先定义的智能体——动作观察者(Action Observer)监控执行过程。
图16 AutoAgents框架
展开AutoAgents框架的部分细节。
在草稿阶段,规划者 负责根据任务内容生成和完善智能体和执行计划,智能体观察者 负责对生成的智能体的合理性以及和任务的匹配度进行分析,并向规划者提出建议,规划观察者 负责对生成的执行计划的合理性以及和任务的匹配度进行分析,向规划者提出建议。规划者和智能体观察者、规划观察者进行多轮交互,直至观察者不再有反馈或交互达到最大轮数,从而得到最终的智能体和执行计划,执行计划包含多个步骤,每步由一个或多个智能体完成,每个智能体包含以下信息:提示(Prompt,即智能体的画像、目标和约束)、描述(Description)、工具集和建议。
在执行阶段,执行计划被分步执行,每步由单个或多个智能体完成,每步的完成过程也会进行多轮迭代,直至当前步骤完成或迭代达到最大次数。若某步的完成过程由单个智能体进行多轮迭代,则智能体采用思维链的方式逐步思考,论文称之为“Self-refinement Agent”,若某步的完成过程由多个智能体进行多轮迭代,则智能体采用交互的方式逐步思考,论文称之为“Collaborative Refinement Action”。同时,论文引入长短期记忆,计划的执行过程采用长期记忆,每步的迭代过程采用短期记忆,论文称之为“Knowledge Sharing Mechanism”。每步完成后,动作观察者分析截至当前步的计划执行情况,对计划进行调整。
AutoAgents框架的处理过程的伪代码如图17所示。
图17 AutoAgents框架的处理过程的伪代码
AgentVerse
《AgentVerse: Facilitating Multi-Agent Collaboration and Exploring Emergent Behaviors》这篇论文提出了AgentVerse框架,如图18所示,和AutoAgents类似,AgentVerse针对某个任务也可以动态生成相应的智能体进行处理,AgentVerse模拟人类组织解决问题的流程,针对给定问题,进行多轮迭代,每轮迭代又分为4个阶段:
- 专家招聘(Expert Recruitment),定义和调整各智能体的角色;
- 协作决策(Collaborative Decision-Making),由上述智能体联合讨论决定解决问题的策略;
- 动作执行(Action Execution),各智能体和环境交互,执行动作;
- 评估(Evaluation),评估本轮迭代结果是否符合预期。
协作决策中,论文尝试了两种多智能体间的协作方式,一种是水平结构(Horizontal Structure),即各智能体分别提出决策,再进行决策的整合,另一种是垂直结构(Vertical Structure),即由一个智能体提出决策,其他智能体提出反馈,迭代多次,直至达成一致。
图18 AgentVerse框架
应用
论文在前一部分分智能体和环境的交互、智能体画像构建、智能体间的通信、智能体能力获取四个方面对多智能体的架构进行解析。
论文在这一部分则对多智能体的应用进行分类介绍。论文将这些应用总结为两大类:问题解决(Problem Solving)和世界模拟(World Simulation)。两大类又分别包含了若干子类,问题求解的子类包括软件开发(Software Development)、具身智能(Embodied Agents)、科学实验(Science Experiments)、科学辩论(Science Debate),世界模拟的子类包括社会模拟(Societal Simulation)、游戏(Gaming)、心理学(Psychology)、经济学(Economy)、推荐系统(Recommender Systems)、政策制定(Policy Making)、疾病传播模拟(Disease Propagation Simulation)。论文分别对各子类的相关研究工作进行了梳理和介绍,并使用下表对各项工作按智能体和环境的交互、智能体画像构建、智能体间的通信、智能体能力获取这四个方面进行总结。
表1 对各项工作按智能体和环境的交互、智能体画像构建、智能体间的通信、智能体能力获取这四个方面进行总结
笔者下面主要对问题解决大类中软件开发的相关研究工作进行展开介绍,其他类别的相关研究工作读者可阅读论文原文,或进一步阅读论文所介绍工作的论文原文。
问题解决
使用多智能体解决问题的主要动机是利用具有专业知识的智能体的集体能力。这些智能体作为个体行动,合作解决复杂问题,如软件开发、具身智能体、科学实验和科学辩论。
下面主要对软件开发的相关研究工作进行展开介绍。软件开发流程一般是标准SOP工作流,由产品经理产出需求、架构师设计方案、研发工程师编写代码、测试工程师测试功能,因此,软件开发中各智能体的角色包括产品经理、架构师、研发工程师和测试工程师等,各智能体间的通信结构一般采用分层结构,按照标准SOP工作流,由各智能体逐步完成软件开发任务。
CAMEL
《CAMEL: Communicative Agents for "Mind" Exploration of Large Language Model Society》这篇论文提出了“Role-Playing”框架,如图19所示,针对某个任务,由AI用户(AI user)和AI助手(AI assistant)这两个智能体分别承担某个角色,进行多轮交互,每轮交互中,由AI用户根据任务目标和当前进展给出指示,由AI助手跟随指示、给出相应解决方案,直至最终完成任务。
以“开发股票交易机器人”为例,首先由人提出这一想法,并由人指定AI用户的角色是交易员、AI助手的角色是Python程序员,然后由Task Specifier这一智能体对想法进行细化,产出详细的任务描述,指出开发的功能需要包括对社交媒体平台上关于某只股票的正负向评价进行分析、并根据分析结果执行相应的交易操作。根据任务描述,AI用户和AI助手进行多轮交互,例如,AI用户先给出安装Python依赖的指示,AI助手给出应安装依赖列表和相应安装命令,AI用户再给出代码中引入库的指示,AI助手给出引入库的代码,如此交互,逐步给出交易机器人的实现方案。
图19 CAMEL Role-Playing框架
“Role-Playing”框架涉及Task Specifier、AI用户、AI助手这三个智能体,如何让这三个智能体遵循要求,即由Task Specifier细化想法,由AI用户给出指示,由AI助手给出解决方案,论文针对不同类型的应用场景,为这三个智能体设计了相应的提示,论文称这部分工作为“Inception Prompting”,图20为软件开发场景下Task Specifier、AI用户、AI助手这三个智能体的指示。
图20 软件开发场景下Task Specifier、AI用户、AI助手这三个智能体的指示
Self-collaboration
《Self-collaboration Code Generation via ChatGPT》这篇论文提出了“self-collaboration”框架,如图21所示,包含Division of Labor和Collaboration两阶段。在Division of Labor阶段,论文引入标准的软件开发方法,将软件开发过程划分为若干步骤,每个步骤由相应角色的智能体负责完成。论文引入三种角色:Analyst,Coder和Tester,由Analyst负责拆解需求、设计方案,由Coder负责基于Analyst给出的方案和Tester给出的反馈编写代码,由Tester负责测试代码。在Collaboration阶段,则按照Division of Labor阶段已划分的软件开发若干步骤,分步执行,每步由相应角色的智能体负责完成。
图21 “self-collaboration”框架
论文在提示中使用了“Role Instruction”来引导大语言模型按照所指定的角色进行思考。每个角色有各自的指示,图22是Coder的指示示例。指示包含三部分,分别是任务描述、用户需求和角色描述。
图22 Coder的指示示例
ChatDev
《ChatDev: Communicative Agents for Software Development》这篇论文提出了ChatDev框架,以对话的方式实现软件开发,如图23所示。论文将软件开发过程划分为串行的三个阶段,分别是Design、Coding和Testing,每个阶段又可以进一步划分为一或多个子任务,Design阶段的子任务即Design,Coding的子任务包括Coding和Code Complete,Testing的子任务包括Code Review和Testing。每个子任务的完成采用CAMEL中提出的“Role-Playing”框架,引入Instructor和Assistant这两个智能体,由Instructor负责给出指示,由Assistant负责跟随指示、给出解决方案,这两个智能体会以对话的形式进行多轮交互,直至最终达成一致,输出当前任务的结果(文本或代码)。Instructor和Assistant这两个智能体在不同的子任务中有不同的角色,例如Code Review中,Instructor的角色是Reviewer,负责给出代码修改建议,Assistant的角色是Programer,负责根据建议修改代码。为了让大语言模型按照不同的角色进行思考,论文也采用了CAMEL提出的“Inception Prompting”方案,为不同的角色设计了不同的提示。
图23 ChatDev框架
通常,Instructor和Assistant这两个智能体以一问一答的形式进行多轮交互,交互方式可表示为: 在这种交互方式下,如果Instructor给出的指示不明确,Assistant可能给出错误的解决方案,即导致幻觉的发生。为了解决这个问题,论文对交互方式进行升级,提出了“Communicative Dehallucination”机制,即在每轮交互中,若Assistant认为Instructor给出的指示并不明确,则先不给出解决方案,而是进行角色反转,由Assistant发起问题,向Instructor询问指示的细节,并由Instructor给出回复,由Assistant问、Instructor答的交互也会迭代多轮,直至Assistant认为指示已明确,才由其给出本轮交互的解决方案,新的交互方式可表示为:

MetaGPT
《MetaGPT: Meta Programming for A Multi-Agent Collaborative Framework》这篇论文指出软件开发有如图24所示的标准SOP流程,包括需求分析、架构设计、系统设计、开发、测试等各步,每步由相应角色的人员完成,包括产品经理、架构师、项目经理、开发工程师、测试工程师。
图24 软件开发的标准SOP流程
论文提出的MetaGPT框架即遵循上述SOP流程分步进行软件开发,并设计相应角色的智能体,包括产品经理、架构师、项目经理、开发工程师、测试工程师。论文为每个智能体指定角色、目标、约束和工具,图25右侧是开发工程师智能体的示例,其负责根据产品经理产出的需求文档和项目经理产出的系统设计、遵循一定的编码规范编写代码,并可运行和调试代码,将运行和调试结果作为反馈对代码进行修改和完善。论文要求每个智能体均输出结构化的消息,从而避免幻觉问题,例如,产品经理输出结构化的需求文档,架构师输出数据结构、接口定义等,开发工程师输出代码。各智能体输出的结构化消息统一存入如图25左侧所示的共享消息池,而各智能体从共享消息池中订阅自己所关注的消息,例如架构师关注产品经理输出的需求文档。
图25 共享消息池和开发工程师智能体
AgentCoder
《AgentCoder: Multi-Agent-based Code Generation with Iterative Testing and Optimisation》这篇论文提出AgentCoder框架,其相对上述研究工作,只设计了3个智能体,分别是Programmer、Test Designer和Test Executor,因此占用较少的计算资源,另外,其更关注通过测试收集到的反馈,通过反馈对代码进行完善。
AgentCoder框架如图26所示,Programmer、Test Designer这两个智能体相互解耦,分别独立负责代码编写和测试用例生成,Programmer按照思维链的方式进行思考,思考过程分为问题理解、算法选择、伪代码生成、代码生成这四步,Test Designer生成覆盖度高的测试用例,包括基础测试用例、边界测试用例,大值测试用例这三类。而Test Executor则负责收集Programmer生成的代码和Test Designer生成的测试用例,执行测试用例,并将执行结果反馈给Programmer,用于代码的完善。
图26 AgentCoder框架
世界模拟
多智能体的另一个主流应用场景是世界模拟,涵盖社会科学、游戏、心理学、经济学、政策制定等领域。多智能体在世界模拟中的使用关键在于其出色的角色扮演能力,这对于真实地描绘模拟世界中的各种角色和观点至关重要。例如,《Generative Agents: Interactive Simulacra of Human Behavior》这篇论文,在一个类似“模拟人生”的沙箱环境中引入25个智能体构成社区,每个智能体有不同的画像,相互之间可以通信,产生丰富的对话和行为数据,用于深度的社会科学分析,而用户可以通过自然语言和这些智能体进行交互。
图27 多智能体构成的社区
关于多智能体应用于世界模拟的相关研究工作,读者可阅读论文原文,或进一步阅读论文所介绍工作的论文原文。
工具和资源
框架
论文在这里介绍了三个开源的多智能体框架:MetaGPT、CAMEL和AutoGen,这些框架均利用多智能体的协作进行复杂任务的求解,但在方法细节上有所不同。
MetaGPT和CAMEL在上一部分已有介绍,这里不再赘述,这里再介绍一下AutoGen。
AutoGen
《AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation》这篇论文提出了AutoGen框架,如图28所示,该框架支持开发可定制的、对话形式的智能体,这些智能体可接收和发送消息,而思考产出消息的能力可以基于大语言模型、人类或工具,另外,该框架支持灵活定制多智能体间的交互方式。
图28 AutoGen框架
图29是使用AutoGen框架开发并使用多智能体的示例。
图29中最上面一层列出了AutoGen框架用于定义对话形式的智能体的接口——ConversableAgent,其有三个核心方法:send方法用于发送消息,receive方法用于接收消息,generate_replay方法用于基于大语言模型、人类或工具等产出消息。AutoGen框架默认提供了ConversableAgent接口的两个实现——AssistantAgent和UserProxyAgent,AssistantAgent基于大语言模型产出消息,UserProxyAgent基于人类或工具产出消息,开发者也可以自行实现ConversableAgent接口,定制智能体。
图29中中间一层是基于AutoGen框架开发多智能体的示例,其中定义了两个智能体,分别是基于UserProxyAgent实例化得到的User Proxy A,和基于AssistantAgent实例化得到的Assistant B。然后,通过register_replay方法为User Proxy A注册定制的产出待发送消息的方法,该方法首先从人类获取待发送消息,若人类无输入且之前接收的消息中包含“code”,则调用工具执行接收的消息,工具执行结果作为待发送消息,论文称这一定制过程为“Conversation-Driven Control Flow”。最后,通过initiate_chat方法初始化对话,由User Proxy A向Assistant B发送消息,要求绘制META和TESLA年初至今的股票价格走势图。
图29中最下面一层则是上述所开发多智能体以对话形式相互交互的示意。
图29 使用AutoGen框架开发并使用多智能体的示例
论文还提到一些框架支持系统运行过程中根据需要动态生成新的智能体,包括前面在智能体能力获取部分已介绍的AgentVerse、AutoAgents等,这里不再赘述。论文也还提到一些研究工作通过平台化的方式快速支持智能体的构建和使用,例如,《OpenAgents: An Open Platform for Language Agents in the Wild》这篇论文提出了OpenAgents这一开源平台,如图30所示,其包含三类智能体:数据分析智能体、插件调用智能体和WEB搜索智能体,既支持WEB形式的直接访问,也支持本地化部署。
图30 OpenAgents平台
数据集和基准
论文总结了多智能体研究中常用的数据集或基准,如表2所示。不同的研究使用不同的数据集和基准。在问题解决场景中,大多数数据集和基准用于评估多个智能体合作或辩论的规划和推理能力。在世界模拟场景中,数据集和基准用于评估模拟世界和真实世界的对齐,或分析不同智能体的行为。
表2 多智能体研究中常用的数据集或基准
挑战和机遇
多智能体框架和应用的研究正在迅速进展,带来了许多挑战和机遇。论文这里列举了一些关键挑战和未来研究的潜在领域:
- 支持多模态环境。大多数先前关于多智能体的工作都集中在基于文本的环境中,擅长处理和生成文本,而在多模态环境中,智能体将与多种感官输入进行交互,并生成多种输出,如图像、音频、视频和物理动作,目前这方面工作仍然较少。
- 解决幻觉问题。幻觉问题在大语言模型和单智能体中是一个重大挑战,而在多智能体中,这个问题变得更加复杂,在多智能体中,一个智能体的幻觉可能会产生级联效应,错误信息会从一个智能体传播到另一个智能体,因此,在多智能体中,既要修正单个智能体的幻觉,也要完善智能体间的信息流,避免错误信息的扩散。
- 获取集体智能。传统未基于大语言模型的多智能体中,智能体通常使用强化学习从离线训练数据集中学习,而基于大语言模型的多智能体主要从即时反馈中学习,如与环境或人类的交互,通过记忆和自我进化,基于反馈进行调整。
- 支持扩展。多智能体由多个智能体组成,每个智能体通常依赖某个大语言模型,需要大量的计算资源和存储空阿金,扩展多智能体中的智能体数量,会导致计算资源需求的增长,如何更好地设计多智能体的工作流和任务分配机制,使得扩展多智能体,提升效果的同时减少计算资源的使用。
实践
LangGraph
图31 LangChain整体框架
LangChain是一个面向大语言模型的应用开发框架,它可以将外部数据源、工具和大语言模型结合在一起。目前LangChain整体框架如图31所示,由以下部分组成:
- LangChain库:
- langchain-core:核心组件的抽象定义和LangChain表达式语言;
- langchain-community:各种第三方实现的集成;
- langchain:各类Chain和Agent的实现;
- LangGraph:用于以图的方式将多个基于大语言模型的智能应用组合在一起;
- LangServe:用于将LangChain应用部署为REST API的服务;
- LangSmith:开发者平台,用于调试、评估和监控基于大语言模型构建的应用。
LangChain包含以下核心组件:
- Model,表示大语言模型;
- Prompt,表示提示;
- Tool,表示工具;
- Chain,表示将Model、Tool等组件串联在一起,甚至可以递归地将其他Chain串联在一起;
- Agent,相对于Chain已固定执行链路,Agent能够基于大语言模型进行思考和规划,根据不同的问题实现动态的执行链路;
关于Chain的实践可以阅读笔者之前撰写的《Mac本地部署大模型体验AIGC能力》,关于Tool和Agent的实践可以阅读笔者之前撰写的《大语言模型Agent综述与实践》,以下是对LangGraph的介绍和使用,基于LangGraph构建多智能体。本文所用的LangGraph的版本是“0.2.39”。
LangGraph的核心是将多智能体间的通信建模为图,其使用三个关键组件定义图中的相关信息:
- 状态:一个共享数据结构,表示多智能体的当前状态,其可以是任何Python类型,但通常是TypedDict或Pydantic BaseModel,其存储的信息可以是多智能体间通信的历史消息及其他定制化的信息;
- 节点:Python 函数,用于编码某个智能体的计算逻辑,其以当前状态作为输入,执行计算逻辑,并返回更新后的状态;
- 边:Python函数,根据当前状态确定要执行的下一个节点。
LangGraph提供多种方法来控制智能体间的通信顺序(即边的定义):
- 显式控制流(图边):通过定义图边显式指定智能体间的通信顺序;
- 动态控制流(条件边):通过定义条件边由大型语言模型或路由函数决定接下来调用的智能体。
以下是一个显式控制流的例子,首先定义两个智能体——研究助手和摘要专家,研究助手负责根据给定主题(例如“强化学习”)提供信息,摘要专家负责根据给定信息生成摘要,显式控制流即先由研究助手提供信息,再由摘要专家生成摘要,代码如下所示:- import os
- DASHSCOPE_API_KEY = 'xxx'
- os.environ["DASHSCOPE_API_KEY"] = DASHSCOPE_API_KEY
- LANGCHAIN_API_KEY = 'xxx'
- os.environ["LANGCHAIN_TRACING_V2"] = "true"
- os.environ["LANGCHAIN_API_KEY"] = LANGCHAIN_API_KEY
- TAVILY_API_KEY = 'xxx'
- os.environ["TAVILY_API_KEY"] = TAVILY_API_KEY
- from langchain_community.chat_models import ChatTongyi
- from langchain_core.messages import HumanMessage, SystemMessage
- from langgraph.graph import StateGraph, MessagesState, START, END
- model = ChatTongyi(model_name="qwen-max", temperature=0.1)
- # 定义两个智能体——研究助手和摘要专家
- def research_agent(state: MessagesState):
- """Call research agent"""
- messages = [SystemMessage(content="You are a research assistant. Given a topic, provide key facts and information.")] + state["messages"]
- response = model.invoke(messages)
- return {"messages": [response]}
- def summarize_agent(state: MessagesState):
- """Call summarization agent"""
- messages = [SystemMessage(content="You are a summarization expert. Condense the given information into a brief summary.")] + state["messages"]
- response = model.invoke(messages)
- return {"messages": [response]}
- workflow = StateGraph(MessagesState)
- workflow.add_node("research", research_agent)
- workflow.add_node("summarize", summarize_agent)
- # 指定显式控制流,先由研究助手提供信息,再由摘要专家生成摘要
- workflow.add_edge(START, "research")
- workflow.add_edge("research", "summarize")
- workflow.add_edge("summarize", END)
- graph = workflow.compile()
- for s in graph.stream(
- {"messages": [HumanMessage(content="强化学习")]},
- {"recursion_limit": 100},
- ):
- if "__end__" not in s:
- print(s)
- print("----")
复制代码 执行上述代码,LangSmith中记录的执行过程和结果如图32所示,从中可以看出,执行过程先由研究助手调用大语言模型给出“强化学习”的相关信息,再由摘要专家调用大语言模型根据上述信息,给出摘要: 强化学习(Reinforcement Learning, RL)是一种通过智能体与环境交互来学习最优行动策略的机器学习方法,旨在最大化累积奖励。其核心概念包括智能体、环境、状态、动作、奖励和策略。RL的目标是找到一个长期总奖励最大的策略,主要分为基于价值、基于策略和基于模型的方法。应用领域涵盖游戏(如AlphaGo)、机器人学、自动驾驶及推荐系统等。尽管面临样本效率低、探索与利用难题以及泛化能力差等挑战,随着计算资源和算法的进步,RL正逐渐成为解决复杂问题的有效工具,并展现出广泛的应用前景。
图32 显式控制流的执行过程和结果
也可以将上述显式控制流修改为动态控制流,将研究助手和摘要专家这两个智能体作为工具,以ReAct的方式由大语言模型决定接下来调用的智能体,代码如下:- import os
- DASHSCOPE_API_KEY = 'xxx'
- os.environ["DASHSCOPE_API_KEY"] = DASHSCOPE_API_KEY
- LANGCHAIN_API_KEY = 'xxx'
- os.environ["LANGCHAIN_TRACING_V2"] = "true"
- os.environ["LANGCHAIN_API_KEY"] = LANGCHAIN_API_KEY
- TAVILY_API_KEY = 'xxx'
- os.environ["TAVILY_API_KEY"] = TAVILY_API_KEY
- from langchain_community.chat_models import ChatTongyi
- from typing import Annotated
- from langchain_core.messages import SystemMessage, ToolMessage
- from langgraph.prebuilt import ToolNode, InjectedState, create_react_agent
- model = ChatTongyi(model_name="qwen-max", temperature=0.1)
- # 定义两个智能体——研究助手和摘要专家
- def research_agent(state: Annotated[dict, InjectedState]):
- """Call research agent"""
- messages = [SystemMessage(content="You are a research assistant. Given a topic, provide key facts and information.")] + state["messages"][:-1]
- response = model.invoke(messages)
- tool_call = state["messages"][-1].tool_calls[0]
- return {"messages": [ToolMessage(response.content, tool_call_id=tool_call["id"])]}
- def summarize_agent(state: Annotated[dict, InjectedState]):
- """Call summarization agent"""
- messages = [SystemMessage(content="You are a summarization expert. Condense the given information into a brief summary.")] + state["messages"][:-1]
- response = model.invoke(messages)
- tool_call = state["messages"][-1].tool_calls[0]
- return {"messages": [ToolMessage(response.content, tool_call_id=tool_call["id"])]}
- # 将研究助手和摘要专家作为工具
- tool_node = ToolNode([research_agent, summarize_agent])
- # 定义一个负责总体协调的智能体,其将研究助手和摘要专家作为工具,以ReAct的方式进行思考,分步调用工具
- graph = create_react_agent(model, [research_agent, summarize_agent], state_modifier="First, research information on a given topic, Second, summarize based on information above.")
- inputs = {"messages": [("user", "强化学习")]}
- for s in graph.stream(inputs, stream_mode="values"):
- message = s["messages"][-1]
- if isinstance(message, tuple):
- print(message)
- else:
- message.pretty_print()
复制代码 执行上述代码,LangSmith中记录的执行过程和结果如图33所示,从中可以看出,负责总体协调的智能体,其将研究助手和摘要专家作为工具,以ReAct的方式进行思考,分步调用工具,先由研究助手调用大语言模型给出“强化学习”的相关信息,再由摘要专家调用大语言模型根据上述信息,给出摘要: 强化学习(Reinforcement Learning, RL)是一种机器学习方法,通过智能体与环境的互动来学习最优行为策略。智能体根据其行为获得奖励或惩罚,并据此调整策略以最大化长期累积奖励。关键概念包括智能体、环境、状态、动作、奖励和策略。RL的目标是找到最优策略以获取最大累计奖励。主要算法类型有基于价值的方法(如Q-learning)、策略梯度方法(如REINFORCE)和模仿学习。RL广泛应用于游戏、机器人学、自动驾驶、推荐系统和资源管理等领域。面临的主要挑战包括样本效率低、探索与利用之间的权衡以及奖励稀疏性。未来,随着计算能力和算法的进步,预计RL将在更多实际应用中发挥作用,并提高其泛化和适应未知环境的能力。
图33 动态控制流的执行过程和结果
参考文献
- 《真格基金戴雨森谈生成式AI:这是比移动互联网更大的创业机会,开始行动是关键》
- 《Large Language Model based Multi-Agents: A Survey of Progress and Challenges》
- 《A Survey on Large Language Model based Autonomous Agents》
- 《A Dynamic LLM-Powered Agent Network for Task-Oriented Agent Collaboration》
- 《Putting Humans in the Natural Language Processing Loop: A Survey》
- 《Self-Adaptive Large Language Model (LLM)-Based Multiagent Systems》
- 《ProAgent: Building Proactive Cooperative Agents with Large Language Models》
- 《Adapting LLM Agents Through Communication》
- 《AutoAgents: A Framework for Automatic Agent Generation》
- 《AgentVerse: Facilitating Multi-Agent Collaboration and Exploring Emergent Behaviors》
- 《CAMEL: Communicative Agents for "Mind" Exploration of Large Language Model Society》
- 《Self-collaboration Code Generation via ChatGPT》
- 《ChatDev: Communicative Agents for Software Development》
- 《MetaGPT: Meta Programming for A Multi-Agent Collaborative Framework》
- 《AgentCoder: Multi-Agent-based Code Generation with Iterative Testing and Optimisation》
- 《Generative Agents: Interactive Simulacra of Human Behavior》
- 《AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation》
- 《OpenAgents: An Open Platform for Language Agents in the Wild》
- 《LangGraph》
- 《LangGraph中的多智能体系统》
|
|