作者:王磊,菊厂 · MindSpore资深架构师、AI工程技术专家
整理:青稞AI
>快来!NLP论文投稿、LLM交流、论文直播群
近年,大语言模型以其强大的自然语言处理能力,成为AI领域的一大热点。它们不仅能生成和理解文本,还能进行复杂的分析和推理。与此同时,大语言模型还带火了智能体(即AI Agent)。智能体是一种能够感知环境、进行决策和执行动作的智能实体。不同于传统的人工智能,智能体具备通过独立思考、调用工具去逐步完成给定目标的能力。在有大语言模型作为其大脑之后,智能体更是具备了对通用问题的自动化处理能力。
MetaGPT是一种多智能体框架,其利用SOP(Standard Operating Procedures,标准作业程序)来协调基于大语言模型的多智能体系统,从而实现元编程技术。该框架使用智能体模拟了一个虚拟软件团队,包含产品经理、架构师、项目经理、工程师、质量工程师等角色,并引入SOP成为框架的虚拟软件团队的开发流程。其专注于软件开发,覆盖了从需求分析到代码实现的全生命周期覆盖。
在MetaGPT中,多智能体被视为一个智能体社会,其中多智能体=智能体+环境+标准流程(SOP)+通信+经济,这些组件各自发挥着重要的作用:
• 智能体:在单个智能体的基础上,扩展了多智能体定义。在多智能体系统中,可以由多个单智能体协同工作,每个智能体都具备独特有的LLM、观察、思考、行动和记忆。
• 环境:环境是智能体生存和互动的公共场所。智能体从环境中观察到重要信息,并发布行动的输出结果以供其他智能体使用。
• 标准流程(SOP):这些是管理智能体行动和交互的既定程序,确保系统内部的有序和高效运作。
• 通信:通信是智能体之间信息交流的过程。它对于系统内的协作、谈判和竞争至关重要。
• 经济:这指的是多智能体环境中的价值交换系统,决定资源分配和任务优先级。
SOP定义了社会中的工作角色和工作流程。在软件工程中,瀑布模型(Waterfall Model)概述了从分析到交付的步骤,促进了跨角色的团队合作。MetaGPT的方法展示了其将高级任务分解为由不同角色(产品经理、架构师、项目经理、工程师、质量工程师)处理的、详细可行性组件的能力,从而促进了角色特定的专业知识和协调。该图说明了MetaGPT如何设计来处理复杂任务并促进清晰的角色划分,使其成为复杂软件开发场景中的有价值的工具。
MetaGPT的设计分为两个层次:基础组件层和协作层。
基础组件层以AI Agent为核心,提供了观察、思考等能力。其建立了个体智能体操作和在系统范围内进行信息交换所需的核心模块,包括环境、记忆、角色、行动和工具,如图2所示。
• 环境:为智能体提供协作工作空间和交流平台。
• 记忆:存储和检索历史消息。
• 角色:根据领域封装专业技能和工作流程。
• 行动:执行模块化的子任务。
• 工具:提供常见的服务和工具。
这一层为智能体在分配的角色中运行提供了基础设施,使它们可以相互交互并与系统交互。
其建立在基础组件层的基础上,协调各个智能体共同解决复杂问题。其提供了两种基本机制:知识共享和封装工作流程。
• 知识共享:该机制允许智能体有效地交换信息,为共享的知识库做出贡献。智能体可以以不同粒度存储、检索和共享数据。它不仅可以加强协调能力,还减少了冗余的通信,提高了整体的运行效率。
• 封装工作流程:该机制利用SOP将复杂任务分解为较小、可管理的子任务。它将这些子任务分配给适合的智能体,并通过标准化的输出对其进行监控,确保它们的行动与总体目标一致。
在这个框架中,MetaGPT中的智能体能力得到了显著增强。智能体的实例化,由专门的角色提示引导,被称为"锚定智能体",为角色提供了观察、思考、反思和知识积累的能力。这些角色通过已建立的订阅和发布方法与环境进行交互。
基础和协作层的分离有利于实现模块化,同时确保智能体的个人和集体能力。基础组件提供了可重用的构建模块和工具,而协作模块则实现了有目的的协调。
基础和协作层的划分促进了模块化,同时确保了个体和集体代理的能力。组件提供了可重用的构建块和实用程序,而协作模块整合了有目的的协调。
角色定义
MetaGPT框架支持创建各种专业类的角色,如产品经理、架构师等。基础角色类由一组关键属性定义:名称、简介、目标、约束和描述。目标表示角色寻求完成的主要责任或目标。约束表示角色在执行行动时必须遵循的限制或原则。约束可以规定如下:“你编写的代码应符合PEP8等代码规范,具有模块化、易于阅读和维护的特点”。描述提供了额外的具体信息,以帮助建立更全面的角色定义。
MetaGPT框架提供的全面角色定义使得其可以创建高度专业化的基于LLM的智能体,每个智能体都针对特定的领域和目标进行了定制。角色定义不仅引入了基于预期功能的行为指导,而且有助于创建多样化和专业化的智能体,每个智能体都是其领域的专家。
• 思考与反思(Think & Reflect):角色可以检索角色描述来构建思考,然后通过_think()函数来反思需要做什么并决定下一步的行动。
• 观察(Observe):角色可以观察环境,并根据观察结果使用_observe()函数进行思考和行动。它们会关注重要信息,并将其纳入记忆中,以丰富其上下文理解并为未来的决策提供信息。
• 广播消息(Broadcast messages):角色可以使用_publish_message()函数将消息广播到环境中。这些消息包含有关当前执行结果和相关行动记录的详细信息,用于发布和共享信息。
• 知识沉淀与行动(Knowledge precipitation & Act):角色不仅是广播者,也是环境信息的接收者。角色可以评估传入的消息的相关性和及时性,从共享环境中提取相关知识,并维护一个内部的知识库以支持决策。它们通过咨询LLM,并利用其具有丰富上下文信息和自我知识的来执行行动。执行结果被封装为消息,而规范性组件则由环境共享。
• 状态管理(State management):角色可以通过更新工作状态和监控待办事项列表来跟踪它们的行动。这使得角色能够按顺序处理多个行动而不中断。在执行每个行动时,角色首先锁定其状态。完成行动后,将状态标记为解锁。这样可以防止其他行动中断工作流程。
MetaGPT使用提示(Prompt)将现实世界的标准作业程序(SOP)转化为明确定义的智能体工作流。该过程涉及使用提示来实例化SOP,并基于已建立的实践提供逐步指导,确保复杂序列任务的一致和结构化执行。
首先,我们详细介绍Action类,然后展示了如何设计标准化行动级别细粒度提示。在MetaGPT框架中,Action作为智能体执行特定任务的原子单位,通过自然语言进行指定。关键属性包括:
• 前缀(Prefix):将角色特定的前缀注入到提示中,以建立角色上下文。使用set_prefix()方法配置角色特定提示的标识符。
• LLM代理(LLM proxy):每个Action包含一个LLM代理,可以通过aask()方法调用该代理,使用以自然语言提示表达的上下文输入来丰富行动细节。此外,可以在Action类中实现各种角色特定上下文解析函数。这些函数旨在从输入中提取并提供足够的上下文信息给LLM。
• 标准化的输出模式(Standardized outputs schema):使用结构化表示来定义预期的输出模式,用于提取结构化数据。标准化输出模式。一个定义预期输出模式的结构表示,用于提取结构化数据。
• 重试机制(Retry mechanism):通过定义尝试次数和等待时间来实现对行动进行重试,以提高稳健性。
MetaGPT实例化工作流的有效性在很大程度上依赖于每个行动的标准化输出。这些输出利用专家领域知识和行业最佳实践,将工作流程调整到特定的角色和上下文中。结构化输出设计具有以下目的:
标准化的输出保障了一致的LLM结果,这些结果是可预测、可重复的,并符合智能体的责任范围。它们通过设定输出期望来引导高质量、结构化和基于任务的特定LLM生成。
此外,标准化的模式充当了蓝图,将LLM行为限制在适合角色的边界内。同时,这有助于保持对目标任务的关注,防止偏离目标。由于行动是综合角色基准指南的一部分,这种角色意识的引导确保输出与真实世界的质量标准相一致。
总之,在MetaGPT中标准化输出设计和实现为处理复杂任务提供了强大的工具。将自然语言中定义的复杂任务转化为标准化输出促进了协作的一致性,从而减少了可能导致不连贯的多轮对话交互。此外,它可以清晰、一致地表示结构信息,这在仅通过自然语言传达时可能存在困难,特别是对于基于LLM的智能体。此外,通过提供结构化和标准化的输出,不同的智能体可以清晰地对其任务和责任达成一致的理解。
在MetaGPT中,每个智能体通过从共享环境日志中检索相关历史信息,来主动策划个性化知识。智能体不是被动地依赖对话,而是利用基于角色的兴趣来提取相关信息。
如前所述,MetaGPT中的每个智能体都维护了一个内存缓存,并对其角色相关的订阅消息进行索引,实现个性化的知识策划。具体来说,消息的集中复制创建了一个统一的数据源。智能体可以注册订阅,自动从该数据源接收与其角色相关的消息。在内部,智能体通过内容、来源和属性将内存缓存索引,以便在相关上下文中实现快速检索。
• 消息共享:当一个智能体生成一条消息时,它会被复制到共享的环境日志中,创建一个真实的单一数据源。从而确保所有智能体都可以获取相同的信息。
• 基于角色的订阅:智能体可以根据其角色对其有意义的消息类型进行注册订阅。其根据与智能体的责任和任务相一致的预定义标准进行的。
• 消息分发:当有新的消息符合订阅条件时,它会自动分发通知给相关的智能体。这种主动传播信息的方式可以防止智能体错过重要的更新。
• 内存缓存和索引:智能体会维护一个内部的记忆缓存,其中订阅的消息会被存储并按内容、发送者和接收者建立索引。从而保障高效的信息存储和检索。
• 上下文检索:环境会维护一个支持缓存和索引的共享内存池。与此同时,智能体可以根据需要查询其内部内存,以获取与其当前任务相关的上下文细节。这有助于改进其理解并做出更好的决策。
• 更新同步:对消息进行的任何更新或更改都会在所有链接的智能体内存中同步,以保持信息的一致视图。这确保所有智能体都可以访问最新的数据。
通过在智能体角色周围对信息流进行组织,确保多智能体之间的协作。通过结合中心化的知识共享与基于角色的个性化内存缓存相结合,实现定制化的知识管理。这减少了无关数据的存在,并提供了共同的上下文,从而在团队协作和个人效率之间达成平衡。
• 多Agent组成协作处理更复杂的任务。
• 通过将SOP融入到多智能体协作中,解决了现有方法在处理复杂任务时存在的幻觉问题。
• 通过结构化协调和模块化输出,能够有效地解决复杂的多智能体协作问题。
• 智能体可以主动从环境中获取相关知识,而不是简单地通过对话获取信息。这种设计更符合人类组织的运作模式。
• 偶尔会引用不存在的资源文件,如图像和音频。
• 在执行复杂任务时,它容易调用未定义或未导入的类或变量。
• 角色和流程还比较固定,无法实现动态扩展,如扩展UI设计角色。
可访问OpenAI的服务器或者本地电脑。
由于需要调用OpenAI API,因此需要提前准备好OPENAI_API_KEY。
• 1、确保系统已经安装了Python 3.9及其以上版本,如未安装,请自行安装。
python --version
• 2、克隆仓库到本地机器,并进行安装。
git clone https://github.com/geekan/MetaGPT.git
cd MetaGPT
pip3 install -e. # 或者 pip3 install metagpt # 安装稳定版本
• 3、在config/key.yaml
文件中配置OPENAI_API_KEY
。
# 拷贝配置文件config.yaml为key.yaml并进行如下修改
cp config/config.yaml config/key.yaml
变量名 | config/key.yaml |
OPENAI_API_KEY # 用您自己的密钥替换 | OPENAI_API_KEY: "sk-..." |
OPENAI_API_BASE # 可选 | OPENAI_API_BASE: "https:///v1" |
• 4、(可选)如果想在执行过程中保存像象限图、系统设计、序列流程等图表这些产物,可以先安装mermaid-js
。
# 如果执行,确保您的系统上安装了 NPM。并使用npm安装mermaid-js。
npm --version
sudo npm install -g @mermaid-js/mermaid-cli
• 5、开始使用。
python startup.py "写一个命令行贪吃蛇"
# 开启code review模式会花费更多的金钱, 但是会提升代码质量和成功率
python startup.py "写一个命令行贪吃蛇" --code_review True`
运行脚本后,您可以在 workspace/ 目录中找到您的新项目。
[1]Sirui Hong, Xiawu Zheng, Jonathan Chen, Yuheng Cheng, Ceyao Zhang, Zili Wang, Steven Ka Shing Yau, Zijuan Lin, Liyang Zhou, Chenyu Ran, et al. MetaGPT: Meta programming for multi-agent collaborative framework. arXiv preprint arXiv:2308.00352, 2023.
[2]https://github.com/geekan/MetaGPT
[3]https://docs.deepwisdom.ai/zhcn/guide/get_started/introduction.html
公众号后台回复aaai、acl、naacl直接进投稿群~
回复LLM进入技术交流群~
回复 nice 进入每周论文直播分享群~