导读 本文将介绍 MetaGPT 在多智能体协作和智能体能力增强方面的一些工作。
主要内容包括以下四个方面:1. MetaGPT 的发展和影响
2. 多智能体协作与自我提升
3. 探索智能体能力增强
4. 问答环节
分享嘉宾|洪思睿 DeepWisdom MetaGPT - 论文一作 - 算法/技术负责人
编辑整理|吴叶国
内容校对|李瑶
出品社区|DataFun
MetaGPT 的发展与影响
1. MetaGPT:或许是中国历史上涨速最快的开源工程
MetaGPT 是 DeepWisdom在 2023 年 6 月开源的一个先进的多智能体框架,一经开源就受到大量关注,火爆全网。截至目前,MetaGPT 在 GitHub 已经收获了 40K star,也多次获得 GitHub Trending 的第一名。2023 年 8 月,公布了 MetaGPT 的技术论文,并获得了 ICLR 2024 oral 的机会,在 2024 ICLR 的相关工作中,该论文在 LLM-based Agent 等关键词的论文中总分第一。目前 MetaGPT 社区总人数已经超过 10, 000 人,上图中右上部分展示了由社区小伙伴基于 MetaGPT 框架开发的各种各样有趣的应用。2. MetaGPT:多智能体协同的新范式
MetaGPT 为什么能够吸引大家的关注?其背后的原理是什么?随着大语言模型的提出及其能力的持续提升,有很多常见的任务会开始结合大语言模型来做一些处理,比如代码补全、客服对话问题等。但是在解决更为复杂的人类社会常见问题,比如软件生成开发、项目级别的代码生成时,现在的大语言模型常常有产生幻觉,比如不能理解从自然语言到代码对齐的过程,很难把简单的一句自然语言翻译成为一个项目级别的代码内容,在数据分析的过程中也很难自动解决动态变化的问题。而在人类社会实践中已经沉淀了非常多的最佳实践。例如,在软件开发过程中,瀑布流模式可以把复杂的长期任务分解成不同专家或角色分工解决的问题,每个角色或岗位都能提供高质量的输出,以完成长期工作。MetaGPT 就是希望能够结合人类社会的最佳实践来驱动大语言模型,自动实现这些工作的完成。MetaGPT 提出把人类社会的标准化操作程序(SOPs)通过元编程的方式嵌入到智能体的开发框架中来自动驱动智能体完成结构化协作。简单来说,我们设计了软件开发流程中的常见智能体,比如产品经理、架构师、项目经理、开发和测试工程师等。当产品经理接收到用户的需求时,会利用自己的专业知识和背景,将简单而模糊的需求转化为结构化、详细的信息,包括竞品分析、用户故事以及与需求相关的开发任务描述等。这些信息对于大型语言模型在后续角色中将任务转化为代码至关重要。接下来,架构师会根据已经扩展的丰富的结构化表述,自动生成相关的任务列表、API 设计以及项目技术设计等。通过自然语言到符号语言的转换,LLM 在解决复杂的代码生成任务上又向前迈进了一步。最后借助上面生成的结构化信息,工程师可以根据 API 设计文档或简化的伪代码,进一步生成有效的代码,提升代码生成能力。3. MetaGPT:实际应用与优势
MetaGPT 采用多智能体协作的方法在相对简单的项目级别的软件生成任务上取得了令人满意的成果。与同期的其他框架相比,如生成小游戏(例如 2048)或创建 CRUD 管理系统等任务,MetaGPT 框架的完成度非常高。这是因为它融合了人类的知识,而其他框架通常在这方面存在缺陷,或者因为生成的代码过于简单,或者因为代码的完成度不够导致整个项目升级失败。在 MetaGPT 中,多个角色的输出呈现出瀑布流的形式。这些角色的输出文档可以实时显示在与人机交互的工作空间中,可以被开发者或用户实时访问和调整,进一步辅助了基于多智能体协同框架的开发者进行需求细化或代码优化。MetaGPT 的主要工作是将复杂或模糊的 high level 的用户意图和需求翻译成复杂且长的多文件的代码片段。为了评估 MetaGPT 是否真的能够提高大型语言模型在代码生成上的效果,我们进行了一些量化实验,例如在 HumanEval 和MBPP 这两个数据集上进行比较。我们发现,仅使用大型语言模型,如 GPT-4,在 HumanEval 数据集上的 Pass@1(一个成功率指标)只有 67 分,但基于 MetaGPT 的多角色协作,成功率可以达到 85.9,可见多智能体协作的范式可以帮助人类开发者生成更高质量的代码。多智能体协作与自我提升
1. 软件公司:MetaGPT "Create a 2048 game."
MetaGPT 开源框架提供了支持瀑布流式软件开发流程的智能体和协作模式,人们可以方便地基于 MetaGPT 完成软件开发工作。如上图,仅需要大约 20 行代码就可以创建一个软件公司团队并完成生产任务。2. MG 虚拟小镇:记忆的重要性、近因性,和相关性
MetaGPT 作为一个多智能体框架,支持在不同的协作场景中进行模拟和仿真。在一些社会学仿真中,人们强烈的希望看到不同智能体在模拟环境中进行交互,并且整个环境会提供一些基础信息,例如地点、生活状态,甚至每个智能体都有自己的个人画像。基于 MetaGPT,我们创建了一个虚拟小镇,并在整个模拟过程中探索了可以增强 MetaGPT 框架的技术。在这个过程中,我们发现社会学仿真对于大型语言模型的要求非常具有挑战性,因为它需要输出的内容以及所依赖的上下文通常是非常复杂和长期的,这些信息可能分散在不同的时间周期和生活片段中。因此,如何让智能体在需要输出有效结果时检索和利用这些记忆和内容,是基于 LLM 的智能体需要解决的一个问题。除了对长期记忆内容本身的连贯性管理能力,我们还需要考虑到所使用的大型语言模型窗口的限制。在框架层面,我们需要提供一个自主、方便和通用的记忆管理机制。为此,我们更新了 MetaGPT 的记忆模块设计,增加了几个关于记忆存储和检索的重要方法,为每个存储和应用的记忆评估其重要性、近因性和相关性,然后在 Agent 检索上下文并提供给大型语言模型时,综合考虑不同记忆节点的因素,并根据动态组合的上下文来生成回复。3. MG 狼人杀智能体:经验获取
除了社会模拟场景中的研究外,还有大量学术工作致力于基于大型语言模型的推理能力和知识进行游戏探索,以观察基于大型语言模型的智能体是否能在游戏中做出高水平的表现。我们创建了基于 MetaGPT 的狼人杀智能体团队,生产了 6-8 个狼人杀智能体,并要求它们在对局中产生有效互动。我们观察了每种玩家的胜率,比如狼人的胜率是否足够高,以及不同策略下村民的胜率是否受到压制。我们发现了一个有趣的现象,即在当前大型语言模型的基础数据下,初步配置的 6-8 人狼人杀游戏中,村民的胜率非常低。这主要是因为他们经常由于对局势判断的失误或对伪装策略的理解不足而导致识别错误或者被投票淘汰。因此,在这个过程中,我们希望能够通过框架来增强这些智能体。在游戏对局中,理解对局以及通过反思能力形成经验是相当重要的。智能体需要根据对局信息来增强自己的策略效果。因此,我们增加了一些基础的反思和经验池,这些经验池可以在实际游戏中获取,并通过简单的经验检索和判断来优化当前的输出。在调用大型语言模型时,可以动态地嵌入相关的上下文,并根据上下文来优化对局的经验。4. MG Minecraft:程序记忆 & 终身学习
Agent 概念并非是仅限于大型语言模型的新概念,在许多强化学习相关的工作中,早已有涉及 Agent 的概念。在游戏仿真场景中,除了文本游戏仿真外,还有许多工作致力于探索基于智能体和大型语言模型的游戏环境建模和反馈,比如 Minecraft 游戏。举例来说,Minecraft 中一个常见的任务是挖钻石。了解 Minecraft 游戏背景的人都知道,挖钻石是一项非常困难的任务,它不仅需要智能体自动升级工具,解锁每一个工具的使用,还要求智能体对周围环境进行判断和任务调整,以提高挖到钻石的可能性。通过参考 Minecraft 的一些经典工作,如 Voyager,我们基于 MetaGPT 构建了一个 Minecraft 游戏团队,旨在帮助玩家更好地解锁 Minecraft 中的技能树,提高其生存率或任务解决效率。我们为 Minecraft 游戏智能体构建了四个小型的 LLM 智能体,分别负责课程学习、技能检索、代码生成和执行反馈。这些智能体遵循一套基础的任务优化 SOP,以帮助 Minecraft 玩家在游戏中成功地并最高速度地获取物品和解锁技能。与经典 Voyager 对比,相同轮次下 MetaGPT 的多智能体团队能够获得更多的既有物品,而 Voyager 的获取速度相对不稳定。在挖取钻石等较困难的任务中,MetaGPT 的多智能体可以在 16 轮内挖取到钻石,并且输出相对稳定,而 Voyager 通常需要 30~50 轮才能挖取钻石。探索智能体能力增强
1. 技术挑战:HumanEval
前置的多智能体在不同场景的应用工作实际上是为了辅助我们在解决软件开发任务以外,赋予多智能体研究的使用者增强 Agent 的能力。因此,在 MetaGPT 的框架中,我们增强了它的记忆能力、反思能力和经验获取能力,包括长期任务规划的能力。回归到单 Agent 的效果提升,针对代码补全和代码生成任务,目前的 MetaGPT 智能体还缺少什么?我们发现在典型数据集 HumanEval 上,目前 GPT-4 只能达到 67 分(这是一个较早的数字),而在前置仅引入 SOP 流程和执行反馈流程的情况下,MetaGPT 可以达到 86 分的效果。那么它的突破点在于哪里呢?我们发现,之前的工作中缺少一个重要环节,即没有验证执行的代码是否可靠,而人类可以依赖代码执行结果,通过频繁的代码调试和修改来提高问题解决效率。在代码补全任务中,我们是否可以引入相关能力来提升 Agent 的编码效果?答案当然是肯定的。因此,在当前工作中,我们为每个编码智能体引入了代码反馈和代码执行能力,要求每个智能体自主验证所生成的代码,以弥补大型语言模型在生成和解释上的一些幻觉问题。在下一个阶段,大型语言模型除了在单函数补全任务(HumanEval 是一个简单的单函数的补全的数据集)上的能力外,还应具备模仿人类进行 repo 级别的代码修复、代码生成,甚至整个 repo 级别代码架构生成的能力。比如,最近有一项名为 Devin 的工作,是由国外团队提出的 LLM 智能体,它可以在 GitHub 上找到一个 issue,并根据该 issue 的描述修复相应的 repo 代码解决问题,并自主提交修复代码。我们期待 MetaGPT 能够完成这样的任务。2. Data Interpreter:重塑数据科学领域
基于前期在代码工作上的探索,我们在 2024 年 3 月提出了一个名为数据解释器的工作。这项工作额外探索了基于代码解释和代码执行的能力在解决具体的数据科学和机器学习相关任务时,MetaGPT 所能达到的程度。在这项工作中,与一些先进的框架进行了比较,比如 OpenInterpreter、TaskWeaver 和 AutoGen。我们发现,相比 AutoGen,MetaGPT 的数据解释器在机器学习任务上从 0.86 提升到了 0.95,并且将整个开放世界任务的完成率提高了 112%。这个数据解释器本质上也是基于任务规划、任务执行、动态调整以及工具集成的能力。这些能力是现在基于大型语言模型 Agent 开发的常见范式。3. 基于代码解释器的能力补充
数据科学领域的任务和代码生成任务有所不同。经典的机器学习应用场景中,任务和数据都是动态变化的,导致数据的行和列在执行过程中经常发生变化。比如,在数据清洗和数据特征工程中,数据的列就可能发生大量变化。如何让大型语言模型能够有效地捕捉到输入信息的变化,并生成适应这种变化数据的有效代码,是数据科学领域面临的一个挑战。此外,我们在代码解释器的基础上为智能体增加了基于代码执行结果的反馈,但这种反馈并不完备。因为一个代码执行不报错,并不意味着代码写对了,可能存在逻辑或语义理解上的问题。因此,我们在工作中引入了基于验证和基于经验驱动的推理,要求数据智能体在编写完代码后主动进行一次白盒测试,验证代码逻辑,并基于已有经验补充代码 debug 的效果。此外,在机器学习场景中,许多人类专家依赖现有知识或特定行业的背景知识和代码,而这些信息可能并不存在于大型语言模型的语料库中。因此,我们提出了一些创新的工具集成和工具进化的方法,使数据智能体能够动态地结合本地代码和已有知识来产生相关的代码,以提高效果。上图左上是我们的数据智能体自动执行 Kaggle 数据集的任务,并产生数据可视化结果,既可以与人类进行实时交互,也可以被智能体自身捕捉为上下文,智能体将根据执行结果调整代码,也会根据执行报错进行反思和优化。上图右上是基于英伟达股价做的趋势预测,右下是智能体做的深度学习相关的实践,一个人脸识别的任务。4. 动态规划与层次图结构
这里着重分享下数据智能体中的规划器,称为动态规划与层次图结构。基于之前从事自动机器学习的工作背景,我们引入了一种在自动机器学习领域常见的层次图分类方法。具体而言,用户的输入会首先由数据智能体进行两层分解。第一层是任务规划,对待解决问题进行更细粒度的 task level 的规划和推理,将用户的目标转化为任务图结构。然后,在具体执行过程中,基于任务图结构进一步组合相关代码,进行代码层面的图结构处理和生成。这种做法的好处在于,基于任务粒度的规划,可以让数据解释器广泛适应不同的任务场景,而无需通过提示词强制和生硬的切入来进行数据效果优化。另一个引入的能力是任务粒度的动态管理。动态管理指的是当任务在执行过程中被修改或编辑时,例如增加了一个需求或修改了一个输出要求,数据解释器的智能体可以根据人类的修改信息自动重新规划所有下游任务,并根据规划内容进行数据合并,以完成相关任务节点的更新。如果数据解释器的任务在执行过程中失败,例如,代码一直写错无法执行,或者出现一些数据库连接问题。数据解释器的智能体将暂停当前计划的节点,并根据失败原因自动对节点进行更细致的拆解和规划,以生成所有与当前任务相关的下游任务,尽可能完成整个任务的实现。5. 工具集成 & 应用场景
我们的一项创新实践是给数据智能体做了工具的集成和应用。与大家可能了解到的一些 function calling 方法不同,这里的工具指的是一个完整的代码片段。智能体或者大语言模型可以在一次代码生成的过程中既生成本地已有的代码,也生成自有知识的代码,并且将它们动态组合在一起,就像人类将本地已有的代码片段和新写的代码片段自动融合的过程一样。实际上会经历两个阶段的处理。第一个阶段是工具的推荐。在实际的工作中,会有很多本地的代码片段,我们可以将这些本地的代码片段注册到智能体的工具箱,让智能体关注到工具的实际代码片段和代码描述。在实际应用的过程中,数据智能体会根据每一个任务的自然语言描述,动态地进行工具推荐、筛选和排序,以选择 top k 个最适合解决当前任务的工具。选择到的这些工具,可以认为是独立的代码片段,可能是一个类(Class)、一个脚本、一个函数等。然后,要求数据智能体,基于当前要解决的问题,自动地进行代码层面的组合和规划,将前面检索和排序得到的代码片段与自己要解决的任务所需的代码片段组合在一起,完成工具的组合和推荐。这样,工具在执行的过程中会得到验证,验证后的工具可以被进一步自动加入到工具箱中,完成了工具使用的闭环和进化。上图展示了我们基于数据智能体开发的不同工具,比如 stable diffusion 的调用代码,它可以自动结合 stable diffusion 的代码去调用 stable diffusion 的工具来完成一些多模态的任务,还加入了一些图像去背景的代码片段,让数据智能体在解决问题的过程中可以调用到这些相关的工具。甚至我们给它开发了一些网页仿写和邮件回复的工具,让它增强自己解决实际问题的能力。6. 能力效果提升
我们对能力效果的提升进行了量化分析,收集了一个机器学习的基准测试集,这个基准测试集是从 Kaggle 上收集的 20 个经典的机器学习数据集。我们选择了经典的开源框架,在两个维度上进行了比较。首先是任务完成度指标,即是否能够完全正确地完成一个机器学习建模的任务,从数据读入到数据清洗、特征建模、模型训练、模型评估、输出指标等等。第二是在具体数据集上的输出效果,比如对于 Titanic 数据集,要求输出 ACC 指标,关注在这个数据集上能够通过数据拟合到什么程度。每个数据集都有自己的相关指标,最后会综合任务完成度和数据效果指标得到综合得分。上图左上显示了综合得分效果指标。可以看到,Data Interpreter 在 7 个典型数据集上的得分都是接近最高的,并且最终综合得分的平均分从同期其他框架的最高分 0.86 提升到了 0.95。同时,我们也收集了一些开放的任务,比如图像去背景、网页搜索、网页仿写等任务。这些任务相比我们之前提到的软件开发任务,任务粒度更细,流程也相对更为复杂。在这样的任务中,Data Interpreter 也能够获得一个比较好的完成度,在大部分的任务上可以基于自己工具的能力来解决这些任务场景所需要的特殊技能。上图右边显示的是 Data Interpreter 在实际解决问题过程中自动生成的数据分析图像,这对于智能体自己在解决问题的过程中和人类的介入过程中还是比较有帮助的。下一阶段,针对 Data Interpreter 现有的能力,我们正在做自动机器学习的工作。我们希望能够让 Data Interpreter 通过自己在一个数据集上多次调试的经验发现优化的方法,自动地去做每一个步骤搜索空间的裁剪和算子的优化。比如它可以在 Titanic 的数据集上从 0.91 提升到 0.97,我们希望它也能够在一些自己不常见的任务上学会相关的技能,并且能够去做自我的迭代和优化。这也是 Data Interpreter 接下来的工作重点。问答环节
Q1:Data Interpreter 和其他团队的 CodeInterpreter 比较大的差异点是什么?A1:在这方面,我可以分享一些情况。我们在过程中尝试了CodeInterpreter,但是 CodeInterpreter 很难自动正确地完成数据建模的任务,除了需要更多的人工引导外,还必须明确告诉它数据的变化、期望的效果,以及数据之间的依赖关系,以便它能够逐步地完成任务。Data Interpreter 除了完成自动化的 Plan 外,还进行了大量的自动调试,让它能够自行发现和解决问题。另外,与 CodeInterpreter 不同的是,Data Interpreter 可以自动地嵌入本地代码和算法。对于大多数用户来说,如果已经有大量的项目代码,他们可以快速地接入 Data Interpreter,让它利用这些代码来解决问题。Q2:对比 AutoGen,MetaGPT 在哪些方面或者是方向上有更强的核心的优势?A2:AutoGen 是一个非常出色的框架,它简化了人们在设计和使用 Agent 时的方法和门槛,然而,使用 AutoGen 时,人们仍然需要配置 Agent 的流程或设置交互模式。与此不同的是,MetaGPT 将这种配置和设计融入到了 Agent 的开发过程中。因此,在使用过程中,只需定义好 Agent 的交互方法或执行任务的流程,用户就可以直接开发智能体并进行动态修改。这是 MetaGPT 和 AutoGen 之间的一个典型区别。MetaGPT 已在支持各种不同的多智能体应用场景和环境方面做了大量工作。这能够帮助各个研究领域的多智能体研究者快速接入这样的环境,而无需考虑智能体在环境中观察和执行任务时的工程问题。目前,MetaGPT 在 Agent 和 Action 层面都进行了许多原子化的设计,并且在 SOP 的嵌入中使用了 Meta Programming 的思想。因此,大家会发现很容易复用这些 Agent 和 Action。Q3:如何从大量的 tool 中选择比较好的 tool,如何保证工具使用的效果?A3:在当前 agent 使用场景中,工具选择是一个普遍存在的问题。在我们的工作经验中,前期工具选择流程不仅需要召回,还需要排序,以便根据任务和工具代码描述准确地理解工具,并选择合适的工具。为了保证工具的使用效果,一些有效实践是通过 ensemble、debating 或 review 来实现的。这不仅让工具生成结果,还让它 review 自己的结果,或者引入一个额外的智能体来 review 它的结果,或者让它们产生辩论,以发现前期选择中的问题。此外,有许多经典工作,如多次结果投票等,也能够辅助解决问题的准确率。
分享嘉宾
INTRODUCTION
洪思睿
DeepWisdom
MetaGPT - 论文一作 - 算法/技术负责人
洪思睿,DeepWisdom 团队 NLP&AIGC 方向算法负责人。前智能控制上市企业 NLP 团队负责人,牵头千万级行业知识图谱及多项自然语言处理技术的应用落地;在 DeepWisdom 负责包括法律、物流、美妆、电商等多个领域的知识问答,搜索系统、多模态应用等行业落地;开源多智能体框架 MetaGPT 一作;NeurIPS AutoDL 顶级竞赛世界冠军,相关工作/论文发表于 TPAMI 顶刊。
点个在看你最好看
SPRING HAS ARRIVED