发布时间:2023 年 11 月 06 日
Agent应用
MetaGPT: Meta Programming for A Multi-Agent Collaborative Framework
基于大型语言模型的代理社会在自动问题解决领域取得了显著进步,但面对复杂任务时,由于幻觉连锁导致的逻辑不一致,解决方案变得复杂。为此,我们推出了 MetaGPT,一种创新的元编程框架,它将人类工作流程的高效性融入到多代理协作中。MetaGPT 通过将标准化操作程序编码为提示序列,优化了工作流程,使得具备人类领域专业知识的代理能够验证中间结果,减少错误。采用装配线模式,MetaGPT 为不同代理分配特定角色,将复杂任务分解为多个子任务,促进多代理协同工作。在协作软件工程的测试中,MetaGPT 展现出了比以往基于聊天的多代理系统更为连贯的解决方案。欲了解更多信息,请访问我们的 GitHub 项目页面:https://github.com/geekan/MetaGPT。
为什么要开发MetaGPT?
使用大型语言模型(LLM)的自主智能体为提升和模拟人类工作流程带来了巨大的潜力。然而,在现实世界的应用实践中,现有的系统往往会忽略复杂性,难以实现高效、一致且准确的解决问题的流程,尤其是在需要有意义的协作互动时。
人类通过广泛的合作实践,在多个领域内发展出了被广泛认可的标准操作程序(SOPs)。这些 SOPs 对于支持任务分解和有效协调至关重要。它们不仅明确了每个团队成员的职责,还为中间产出设定了标准。良好的 SOPs 能够提升任务执行的一致性和准确性,确保与既定角色和质量标准相符。例如,在软件开发公司中,产品经理会分析市场竞争和用户需求,利用标准化框架撰写产品需求文档(PRDs)、设计工件、流程图和接口规范等中间结构化输出显著提升了目标代码生成的成功率。举例来说,在 MetaGPT 所模拟的公司中,所有员工遵循严格且高效的工作流程,且他们的工作交接都必须遵循既定的标准,有效减少了大型语言模型(LLM)间闲聊可能引起的误解,尤其是在角色扮演框架中,例如产品经理爱丽丝和架构师鲍勃之间的对话(如下图)。
元编程的概念也涵盖了诸如 CodeBERT、CodeLlama和 WizardCoder等先前和近期的工作。MetaGPT 作为一种独特的解决方案,通过一群有组织的专业化代理进行高效的元编程,每个代理都有特定的角色和专业知识,遵循既定的标准。这允许在运行时自动进行需求分析、系统设计、代码生成、修改、执行和调试,展示了基于代理的技术如何提升元编程的效率。
为了验证 MetaGPT 的设计,采用了公开可用的 HumanEval和 MBPP 进行评估。值得注意的是,在代码生成基准测试中,MetaGPT 在 Pass@1 的指标上达到了新的最佳水平,分别为 85.9% 和 87.7%。与其他创建复杂软件项目的流行框架相比,如 AutoGPT 、LangChain、AgentVerse 和 ChatDev,MetaGPT 在处理更高层次的软件复杂性和提供广泛功能方面表现出色。在实验评估中,MetaGPT 实现了 100% 的任务完成率,证明了MetaGPT设计的鲁棒性和效率。
什么是MetaGPT?
MetaGPT 是一个为基于大型语言模型(LLM)的多Agent系统设计的元编程框架。
上图左侧展示了通信协议的示例,代理们通过共享的消息池发布结构化消息,并根据各自的角色配置文件订阅相关信息。
右侧则展示了具有可执行反馈的迭代编程过程:在生成初始代码之后,工程师代理执行代码并检查错误。如果检测到错误,代理会回顾存储在记忆中的历史消息,并将其与产品需求文档(PRD)、系统设计和代码文件进行对照比较。
SOP中的Agent
角色明确分工
清晰的角色划分能够将繁琐的工作细化为更为具体和细分的任务。处理复杂任务或难题往往需要集合具备不同技能和专业知识的Agent,每个Agent都能针对特定问题提供专业化的解决方案。
比如,在一家软件公司里,产品经理一般负责进行业务分析并提炼出洞见,而软件工程师则负责编码工作。为软件公司定义了五个关键角色:产品经理、架构师、项目经理、工程师和质量(QA)工程师 。
在 MetaGPT 中,每个Agent设定了详细的个人档案,包括名称、角色描述、目标以及各自的约束条件。同时,还为每个角色配置了特定的工作背景和技能。例如,产品经理可以利用网络搜索工具,而工程师则能够执行代码。所有Agent都遵循 ReAct 风格的工作行为,持续监控环境中的关键信息(例如 MetaGPT 中的消息池),这些信息可能直接触发行动或辅助完成任务。
跨角色工作流程
通过明确Agent的角色和操作技能,可以构建基础的工作流程。
具体而言,如上图,产品经理在收集到用户需求后,会进行深入分析,制定详尽的产品需求文档(PRD),其中包含用户故事和需求池,作为初步的功能分解。然后,这份结构化的 PRD 将传递给架构师,后者将需求转化为系统设计要素,如文件列表、数据结构和接口定义。系统设计确定后,信息将传递给项目经理进行任务分配。工程师随后根据规划执行相应的类和函数,如下图所示。在随后的阶段,QA 工程师会制定测试案例,确保代码质量。最终,MetaGPT 将产出一个精心打造出来的软件解决方案。
下图提供了MetaGPT中SOP工作流程的详细示意图(更多内容参考论文原文)。
通信协议
结构化通信接口
当前,大多数基于大型语言模型(LLM)的多Agent系统框架采用了不加限制的自然语言作为通信接口,尽管自然语言极为灵活,但它是否足以应对解决复杂任务的需求仍有待商榷。例如,在“电话游戏”中,信息经过几轮传递后可能会变得面目全非。
借鉴人类社会结构的设计,MetaGPT采用结构化通信来规范代理间的交流。为每个角色和请求设定了特定的模式和格式 ,要求参与者根据其角色和具体情境提供必要的输出。如上图所示,架构代理会生成系统接口设计和序列流程图 这两种输出,它们包含了系统模块设计和交互序列,对工程师而言是至关重要的成果。与 ChatDev 不同,MetaGPT 中的代理通过文档和图表(即结构化输出)而非对话来进行通信 ,这些文档涵盖了所有必需信息,避免了信息的不相关或缺失。
发布-订阅机制
在协作中,信息共享是至关重要的。例如,架构师和工程师经常需要查阅产品需求文档(PRD)。然而,如果每次都以一对一的方式传递这些信息,将会使得通信网络变得复杂,降低效率。为了解决这一问题,MetaGPT将信息存储在全局消息池中 。如上图(左)所示,MetaGPT引入了一个共享的消息池,使所有代理能够直接交换消息。Agent不仅在共享信息池中发布结构化消息,还能透明地访问其他Agent的消息。任何Agent都可以直接从共享池中检索所需信息,无需询问其他代理或等待回应,这种设计提升了通信的效率。
然而,将所有信息分享给每个代理可能会导致信息过载。在执行任务时,代理通常只希望接收与任务直接相关的信息,避免被不相关的细节分散注意力。因此,信息的有效管理和精准传播非常关键。MetaGPT提出了一个简单而有效的解决方案——订阅机制 。代理根据自身的角色特定兴趣来筛选相关信息,而不是依赖对话。它们可以根据角色配置文件选择关注的信息。在实际操作中,代理仅在收到所有必要的先决条件信息后才会激活其行动。架构师主要集中精力处理产品经理提供的产品需求文档,而来自 QA 工程师等角色的文档则可能是次要的。
可执行反馈的迭代编程
在常规编程工作中,调试与优化是不可或缺的环节。但目前的方法往往缺少自我修正功能,这导致了代码生成的失败。以往的研究提出了非可执行代码的审查与自我反思机制,尽管如此,它们在保证代码的可执行性和运行时的正确性上仍面临挑战。
在最初的 MetaGPT 实现中,由于大型语言模型的“幻觉”效应,审查过程中忽略了一些错误。为了解决这个问题,在生成初始代码之后,MetaGPT引入了可执行反馈机制,以此来迭代地提升代码质量。比如,工程师需要根据产品原始需求和设计来编写代码。
这允许工程师利用自身的历史执行和调试经验来不断优化代码。为了收集更多信息,工程师会编写并运行相应的单元测试案例,然后获取测试结果。如果测试结果令人满意,则会继续进行下一步的开发任务;如果不满意,则工程师会先对代码进行调试再继续编程。
这一迭代测试过程将持续进行,直至测试通过,或者达到最多三次的重试限制。
效果测评
测评数据集
采用了两个知名的公共基准测试集:HumanEval和 MBPP,同时还有一个作者自创的、更具挑战性的软件开发测试集,称为 SoftwareDev:
- • HumanEval 收录了 164 项手写编程任务,涵盖功能规格说明、描述、参考代码以及测试案例。
- • MBPP 包含 427 项 Python 编程任务,覆盖了核心概念和标准库特性,同样提供了任务描述、参考代码和自动化测试。
- • SoftwareDev 数据集汇集了 70 个具有代表性的软件开发任务实例,每个任务都配有独特的任务提示,如下图。包括迷你游戏、图像处理算法和数据可视化等,为实际开发任务提供了一个全面的测试环境。与以往的数据集相比,SoftwareDev 更加注重工程实践方面。在对比测试中,我们随机挑选了七个具有代表性的开发任务进行评估。
评估指标
在 HumanEval 和 MBPP 的评估中,采用了无偏 Pass @k 版本,用以评价生成的前 k 个代码的功能准确性:Pass @k = EProblems × (1 − (n−c/k) / (n/k))。
对于 SoftwareDev,考虑到实用性,并通过人工评审(A, E)或统计分析(B, C, D)来衡量性能表现:
(A) 可执行性:该指标将代码的执行情况从 1 分(失败/非功能性)评为 4 分(完美无瑕)。其中,'1' 表示代码无法运行,'2' 表示代码可运行但存在缺陷,'3' 表示代码接近完美,'4' 则表示代码完美无瑕。(B) 成本:此处的成本评估涵盖了(1)运行时间,(2)令牌使用量,以及(3)开销。(C) 代码统计:包括(1)代码文件数量,(2)每个文件的代码行数,以及(3)总代码行数。(D) 生产力:这基本上定义为令牌使用量除以代码行数,即每行代码的令牌消耗率。(E) 人工修订成本:通过确保代码顺畅运行所需的修订轮数来量化,反映了人工干预的频率,例如调试或导入软件包的次数。
测评结果
如上图,MetaGPT 在 HumanEval 和 MBPP 两个基准测试中都超越了之前的所有方法。特别是当 MetaGPT 与 GPT-4 协同工作时,在 HumanEval 测试中的 Pass @k 指标显著优于 GPT-4 独立运行的结果,分别达到了 85.9% 和 87.7% 的高比率。
如上表,MetaGPT 在更具挑战性的 SoftwareDev 数据集上,在几乎所有评价指标上都超过了 ChatDev。以可执行性为例,MetaGPT 获得了接近完美的 3.75 分(满分为 4 分)。同时,MetaGPT 的运行时间更短,仅为 503 秒,显著少于 ChatDev。在代码统计和人工修订成本方面,MetaGPT 同样表现出色。尽管 MetaGPT 在生成代码时使用了更多的令牌(24,613 或 31,255 相对于 ChatDev 的 19,292),但它每生成一行代码所需的令牌数(126.5/124.3)远少于 ChatDev(248.9)。这些对比结果凸显了在多代理协作中采用 SOPs 的显著优势。
相较于开源的其他方法,如 AutoGPT,以及像 AgentVerse 和 ChatDev 这样的自主代理,MetaGPT 提供了专门用于软件工程任务的功能。如上图,MetaGPT的框架拥有广泛的能力,能够有效且高效地处理复杂和专业的开发任务。通过融合标准操作程序(SOPs,例如角色扮演的专业知识、结构化通信、优化的工作流程),可以显著提升代码生成的质量。其他基线方法也能够通过整合类似 SOP 的设计来提升性能,这与在大型语言模型(LLM)中嵌入思维链(Chain-of-Thought)的概念有异曲同工之妙。
结论
定义角色是否有效?
为了探究不同角色对最终成果的影响,作者开展了两项任务:一是生成高效能的代码,二是计算平均统计数据。排除某些角色会导致生成无法运行的代码。根据上表的数据,除了工程师角色之外,引入不同角色能够显著提升代码的修订质量和可执行性。尽管增加角色数量会小幅增加成本,但整体性能的显著提升反映了各个角色的重要作用。
可执行反馈机制的显著效果
根据上图的结果,将可执行反馈机制整合进 MetaGPT 系统后,在 HumanEval 和 MBPP 测试的 Pass @1 指标上分别实现了 4.2% 和 5.4% 的提升。如表 1 所示,该反馈机制不仅提升了代码的可行性评分(从 3.67 增至 3.75),还显著降低了人工修订的成本(从 2.25 降至 0.83)。这些成果清晰地展示了MetaGPT的反馈机制能够显著提升代码质量。
-
• 论文原文: https://arxiv.org/abs/2308.00352
-
• 获取更多最新 Arxiv 论文更新: https://github.com/HuggingAGI/HuggingArxiv!
-
• 加入社群,+v: iamxxn886