The Design of MetaGPT - Yigeng’s Blog

The Design of MetaGPT

yigeng 2024-06-10 {Machine Learning} [Python, Agent, Software Engineering]

过去几乎有一年的时间都在做模型压缩,从剪枝到蒸馏再到量化,最后组合压缩。虽然没做出什么成果,但至少觉得自己的代码能力有较大提升,对科研也有更深一层的理解。

到后来做组合压缩的时候,其实认为这不是理想中的科研模式,当时导师让我做的唯一事情就是无论用什么方法,将精度刷到sota。而不是抱着解决实际问题的心态,去探索解决问题,如果在过程中有结果,以论文形式发表。

回过头去看,大学为保研、高中为高考、初中为中考…这一路走来基本以功利主义为导向。研究生希望能够跳出这个循环,去做一些真正感兴趣而且有意义的事情,毕竟很可能以后不做学生了。

现在,我们进入正题。我的研究方向从模型压缩转到了LLM Agent,估计接下来的时间都会花在LLM Agent上。最近精读了一篇论文MetaGPT,我和师兄的想法是会将其作为baseline,在其上进行改进迭代。于是,我打算开一个Serie讲解研究MetaGPT的一些思考。

MetaGPT是一个Multi-Agent的框架,你将需求传给它,由多个agent模拟成软件公司,以瀑布式开发完成你的需求。

image-20240610203312174 The software development SOPs between MetaGPT and real-world human teams. (Image source: Fig 1 in MetaGPT 2023.)

在这里,你可能会问什么是Agent? 我先不忙给出完整严谨的定义,后续我会写一篇blog专门讨论我们对Agent范式的抽象。

本文重点讨论MetaGPT的代码设计。因此,你可以暂时将Agent理解为对LLM赋予一个角色,例如你对LLM进行prompt为You are a profession engineer, your goal is to write beautiful codes...,得到prompt后,LLM摇身一变,成为Engineer Agent。

那么,MetaGPT是如何用代码实现的呢?

我们先来看一下MetaGPT中类的组织,下图是我将MetaGPT中主要的类提出来,画了一个UML图。

MetaGPT-UML0117

  1. team类决定有哪些Role(即Agent),完成怎样的项目以及项目的投资成本(调LLMAPI需要钱),并负责启动项目。
  2. Role类则说明一个Role的基本信息,工作模式是怎样的,以及能够做出哪些动作。
  3. Environment类则是为Role之间信息的交流提供一个平台,类似于沟通的桥梁。(是不是有点生产者消费者模式的感觉)
  4. Action类则是对Role能够采取动作的抽象,例如Writecode,WritePRD,而ActionNode1则是对一个动作的拆解,将其分为多个节点。Memory类负责存储Role的历史信息。
  5. 其余的类则是为对应的类提供一些上下文和配置信息。

了解完MetaGPT的组织,在实际的运行中又是怎样呢?

MetaGPT用例图

上图是一个不太严谨的时序图,描述了整个项目的运行过程,大概可分为3个阶段。

  1. 我们将需求idea通过命令行传给程序。
  2. 软件公司将idea发布到环境中,然后遍历所有的Role,每个Role将idea消息放入到消息池中。
  3. 软件公司开始运行整个项目,完成需求。遍历每个Role,Role从消息池中弹出消息,检查是否是自己需要处理的消息,若否则不做任何处理,否则,与LLM交互拿到处理后的结果,封装成消息发布到环境中。

整个程序终止的条件有两个,分别是超过investmentn_round为0。n_round的值决定了会有多少个Role处理消息,执行动作。在round中,我们会给每个Role一次执行动作的选择权,而瀑布式开发的模式决定了每个消息有且只能由一个Role处理。

而在具体的实现上,主要依靠两个包,分别是使用asyncio实现并发和利用Pydantic实现对数据的组织和封装。

最后,个人认为MetaGPT项目的代码是写的很漂亮的。对于比较难懂的地方采用了google风格的注释提高了可读性,此外,代码具有良好的模块化设计,对于不同代码文件的组织和封装做得很好。

# 下面是一个google风格注释的例子
def add_numbers(a, b):
    """
    Adds two numbers and returns the result.

    Args:
        a (int): The first number.
        b (int): The second number.

    Returns:
        int: The sum of the two numbers.

    Raises:
        TypeError: If either `a` or `b` is not an integer.
    """
    if not isinstance(a, int) or not isinstance(b, int):
        raise TypeError('Both a and b must be integers')
    return a + b

References

  1. Hong S, Zheng X, Chen J, et al. Metagpt: Meta programming for multi-agent collaborative framework[J]. arXiv preprint arXiv:2308.00352, 2023.
  2. RFC-116-MetaGPT Role对象间消息机制优化方案
  3. MultiAgent 101
comments powered by Disqus