从0到1:MetaGPT源码解读,看懂软件开发Agent的内部机制

引言

背景介绍

2023年被称为AI Agent元年,从最早爆火的AutoGPT开始,行业就一直在探索:能不能让大模型像真实的开发团队一样,自主完成从需求到上线的全流程软件开发?AutoGPT虽然证明了单Agent自主决策的可行性,但在复杂软件开发场景下的表现差强人意:经常跑偏、任务完成率不足30%、生成的代码无法运行,核心原因就是没有标准化的流程约束,单Agent很难覆盖软件开发全链路的专业能力要求。
2023年6月MetaGPT横空出世,核心思路就是把人类软件开发团队的标准化SOP(标准作业流程)融入多Agent协作体系,让产品经理、架构师、工程师、测试等不同角色的Agent按照固定流程配合,把软件开发任务的完成率提升到了70%以上,GitHub星量短短一年就突破了39k,成为了软件开发Agent领域的标杆项目。

核心问题

很多开发者跑过MetaGPT的demo,输入一句“开发一个2048网页游戏”就能得到完整可运行的项目,但很少有人深入了解它的内部实现:

  1. MetaGPT的核心组件有哪些?是怎么设计出高度可扩展的多Agent协作架构的?
  2. 一个需求从输入到输出可运行代码的完整流程是什么?SOP是怎么约束Agent行为、避免跑偏的?
  3. 怎么基于MetaGPT做二次开发,自定义角色和动作适配自己的业务场景?
    本文就带着这三个问题,从源码层面深入拆解MetaGPT的内部机制,让你不仅能看懂原理,还能动手改造出属于自己的多Agent开发团队。

文章脉络

本文按照「基础概念铺垫→核心模块源码拆解→全流程运行机制解析→实战二次开发→最佳实践与趋势展望」的结构展开,所有源码都基于MetaGPT v0.8.0稳定版本,可对照官方仓库同步阅读。


基础概念

在解读源码之前,我们先统一MetaGPT涉及的核心术语,帮助你快速建立认知框架:

术语定义对应软件开发场景的实例
Environment(环境)所有Agent的通信中枢,存储全局消息和状态,负责消息的分发和流转开发团队的共享办公空间、钉钉/企业微信群
Role(角色)具备特定专业能力的智能体,有自己的目标、技能、记忆和行为规则产品经理、架构师、前端工程师、测试工程师
Action(动作)角色可以执行的具体任务,每个动作对应一个Prompt模板和执行逻辑写PRD、输出架构设计、编写代码、写测试用例
Memory(记忆)角色存储历史信息的载体,分为短时记忆、长时记忆、工作记忆三类需求文档、历史项目经验、当前任务的中间结果
SOP(标准作业流程)预设的任务流转规则,定义了不同角色动作的执行顺序和依赖关系软件开发的需求分析→架构设计→编码→测试→上线流程
Tool(工具)Agent可以调用的外部能力,补充大模型的能力边界浏览器、Python解释器、Git、Vercel部署工具

核心原理解析

整体架构

MetaGPT采用分层架构设计,从下到上分为大模型层、核心引擎层、交互层、输出层四层,各层之间解耦,可独立扩展:

用户输入层: CLI/Web/API

核心引擎层

环境管理模块 Environment

角色管理模块 Role

动作管理模块 Action

记忆管理模块 Memory

工具调用模块 Tool

SOP管控模块

LLM适配层

大模型层: GPT-4o/Claude3/Llama3/通义千问

存储层: 文件系统/向量数据库/关系库

输出层: PRD/架构图/源代码/测试报告/可运行项目

接下来我们逐个拆解核心模块的源码实现。

1. Environment 模块:多Agent的通信中枢

Environment是MetaGPT的核心调度中心,所有角色都注册在环境中,所有消息都通过环境分发,源码位于metagpt/environment.py,核心实现如下:

from pydantic import BaseModel, Field
from typing import dict, list
from metagpt.schema import Message
from metagpt.roles.role import Role
from metagpt.serializer import Serializer, PickleSerializer

class Environment(BaseModel):
    """环境类,作为所有Agent的通信中间件和全局状态存储"""
    # 所有注册的角色,key为角色名称
    roles: dict[str, Role] = Field(default_factory=dict)
    # 全局消息历史,存储所有发送过的消息
    history: list[Message] = Field(default_factory=list)
    # 序列化器,用于环境状态的持久化
    serializer: Serializer = Field(default=PickleSerializer())

    def add_role(self, role: Role) -> None:
        """添加角色到环境,同时给角色绑定当前环境"""
        self.roles[role.name] = role
        role.set_env(self)

    def publish_message(self, message: Message) -> None:
        """发布消息到环境,会自动推送给所有注册的角色"""
        self.history.append(message)
        for role in self.roles.values():
            role.recv(message)

    def run(self, round: int = 1) -> None:
        """运行环境指定轮数,每轮所有存活的角色依次执行一次动作"""
        for _ in range(round):
            for role in self.roles.values():
                if role.is_alive():
                    # 角色执行动作,返回结果消息
                    result_msg = role.run()
                    if result_msg:
                        # 把结果消息发布到环境,供其他角色消费
                        self.publish_message(result_msg)

    def save(self, path: str) -> None:
        """持久化环境状态到文件,可用于中断后恢复任务"""
        self.serializer.save(self, path)

    @classmethod
    def load(cls, path: str) -> "Environment":
        """从文件加载环境状态,恢复之前的任务"""
        return cls.serializer.load(path)
设计思路解析

Environment的设计借鉴了发布订阅模式:

  • 生产者(角色执行动作后)发布消息到环境,不需要关心哪些消费者会接收
  • 消费者(角色)自主过滤感兴趣的消息,不需要关心消息是谁生产的
    这种设计极大降低了角色之间的耦合度,新增/删除角色不需要修改其他角色的代码,非常适合多Agent协作的场景。同时环境支持持久化,执行到一半的任务可以保存状态,下次直接恢复继续执行,不需要从头跑。

2. Role 模块:智能体的核心抽象

Role是对具备专业能力的智能体的抽象,所有自定义角色都要继承Role基类,源码位于metagpt/roles/role.py,核心实现如下:

from pydantic import BaseModel, Field
from typing import list, Type
from metagpt.schema import Message
from metagpt.actions.action import Action
from metagpt.memory.memory import Memory
from metagpt.planner import Planner
from metagpt.roles.role_context import RoleContext

class Role(BaseModel):
    """角色基类,所有自定义角色的父类"""
    # 角色基本属性
    name: str = ""
    profile: str = "" # 角色定位,比如"产品经理"
    goal: str = "" # 角色的目标,比如"输出符合用户需求的高质量PRD"
    constraints: str = "" # 角色的约束条件,比如"PRD必须包含功能列表、用户故事、非功能需求"
    desc: str = ""

    # 角色的能力和状态
    actions: list[Action] = Field(default_factory=list) # 角色可以执行的动作列表
    states: list[State] = Field(default_factory=list) # 角色的状态机,用于SOP流转
    watch_actions: set[Type[Action]] = Field(default_factory=set) # 角色关注的动作类型,收到对应动作的消息会触发处理

    # 角色的核心组件
    memory: Memory = Field(default_factory=Memory) # 角色的记忆
    planner: Planner = Field(default_factory=Planner) # 角色的规划器,用于决策下一步执行什么动作
    rc: RoleContext = Field(default_factory=RoleContext) # 角色的上下文,存储当前任务的临时状态

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 初始化角色的动作和状态
        self._init_actions()
        self._init_states()

    def _init_actions(self) -> None:
        """子类重写这个方法,初始化自己的动作列表"""
        pass

    def _init_states(self) -> None:
        """子类重写这个方法,初始化自己的状态机"""
        pass

    def _watch(self, actions: set[Type[Action]]) -> None:
        """设置角色关注的动作类型"""
        self.watch_actions = actions

    def recv(self, message: Message) -> None:
        """接收环境推送的消息,存入记忆"""
        self.memory.add(message)

    def observe(self) -> None:
        """观察环境,过滤出自己需要处理的新消息"""
        # 从记忆中筛选出自己关注的、未处理过的新消息
        self.rc.news = self.memory.filter_news(
            processed_msg_ids=self.rc.processed_msg_ids,
            watch_actions=self.watch_actions
        )

    def _think(self) -> Action | None:
        """思考阶段:根据当前消息和状态,决策下一步要执行的动作"""
        if not self.rc.news:
            return None
        # 调用规划器,选择最适合的动作
        selected_action = self.planner.plan(
            news=self.rc.news,
            actions=self.actions,
            states=self.states,
            context=self.memory.get()
        )
        return selected_action

    async def _act(self, action: Action) -> Message:
        """执行阶段:执行选中的动作,返回结果消息"""
        # 把记忆作为上下文传入动作
        result = await action.run(context=self.memory.get())
        # 标记消息为已处理
        self.rc.processed_msg_ids.update([msg.id for msg in self.rc.news])
        return result

    async def run(self) -> Message | None:
        """角色的运行入口,被Environment调用"""
        self.observe()
        action = self._think()
        if not action:
            return None
        return await self._act(action)
设计思路解析

Role的核心逻辑是感知-思考-执行的OODA循环:

  1. Observe(感知):从环境中过滤出自己需要处理的新消息
  2. Orient(研判):结合记忆和当前状态,判断当前的任务阶段
  3. Decide(决策):选择下一步要执行的动作
  4. Act(执行):执行动作,输出结果,发布到环境
    这种设计和人类处理任务的逻辑完全一致,每个角色只关心自己的职责范围内的事,不需要了解其他角色的实现细节,符合软件工程的单一职责原则。
    比如产品经理角色只需要关注用户需求消息,执行写PRD的动作;架构师只需要关注PRD消息,执行架构设计的动作,角色之间完全解耦。

3. Action 模块:具体任务的执行单元

Action是对具体任务的抽象,每个Action对应一个特定的Prompt模板和执行逻辑,源码位于metagpt/actions/action.py,核心实现如下:

from pydantic import BaseModel, Field
from typing import list
from metagpt.schema import Message
from metagpt.llm import LLM

class Action(BaseModel):
    """动作基类,所有自定义动作的父类"""
    name: str = ""
    desc: str = ""
    # 动作的Prompt模板,子类需要重写
    prompt_template: str = """
    你是一个{profile},你的目标是{goal},请遵守以下约束:{constraints}
    请根据以下上下文,完成对应的任务:
    {context}
    输出结果:
    """
    # 大模型实例,支持不同动作绑定不同的大模型
    llm: LLM = Field(default_factory=LLM)

    def _render_prompt(self, context: list[Message], **kwargs) -> str:
        """把上下文和参数填充到Prompt模板中"""
        context_str = "\n".join([f"{msg.role}: {msg.content}" for msg in context])
        return self.prompt_template.format(
            profile=kwargs.get("profile", ""),
            goal=kwargs.get("goal", ""),
            constraints=kwargs.get("constraints", ""),
            context=context_str
        )

    async def run(self, context: list[Message], **kwargs) -> Message:
        """动作的执行入口,子类可以重写这个方法实现自定义逻辑"""
        prompt = self._render_prompt(context, **kwargs)
        # 调用大模型生成结果
        llm_response = await self.llm.aask(prompt)
        # 封装成消息返回
        return Message(
            content=llm_response,
            role=kwargs.get("profile", "assistant"),
            cause_by=type(self)
        )
设计思路解析

Action的设计把大模型调用和具体任务逻辑解耦:

  • 通用的大模型调用逻辑封装在基类中,子类只需要定义自己的Prompt模板和特殊的执行逻辑即可
  • 不同的Action可以绑定不同的大模型,比如写PRD用GPT-4o,写简单代码用GPT-3.5-turbo,平衡成本和效果
    比如写PRD的WritePRD动作只需要继承Action基类,重写prompt_template即可:
class WritePRD(Action):
    name: str = "WritePRD"
    desc: str = "根据用户需求输出完整的PRD文档"
    prompt_template: str = """
    你是一个拥有10年经验的资深互联网产品经理,你的目标是输出符合用户需求的高质量PRD文档。
    请遵守以下约束:
    1. PRD必须包含需求背景、目标用户、功能列表、用户故事、非功能需求、原型设计说明6个部分
    2. 功能描述要足够详细,开发人员可以直接根据你的PRD开发
    3. 不要输出多余的解释性内容,只输出PRD本身
    请根据以下用户需求,输出PRD:
    {context}
    PRD文档:
    """

4. Memory 模块:智能体的记忆载体

Memory解决了大模型上下文窗口有限的问题,支持记忆的存储、检索、过滤,源码位于metagpt/memory/memory.py,核心实现如下:

from pydantic import BaseModel, Field
from typing import list
from metagpt.schema import Message
from metagpt.embedding import Embedding, OpenAIEmbedding
import math

class Memory(BaseModel):
    """记忆基类,支持短时记忆、长时记忆和语义检索"""
    # 记忆存储,所有消息都存在这里
    storage: list[Message] = Field(default_factory=list)
    #  embedding模型,用于语义检索
    embedding: Embedding = Field(default_factory=OpenAIEmbedding)
    # 向量索引,加速检索
    index: Any = None

    def add(self, message: Message) -> None:
        """添加消息到记忆,自动生成embedding"""
        if not message.embedding:
            message.embedding = self.embedding.get_embedding(message.content)
        self.storage.append(message)
        if self.index:
            self.index.add(message.embedding)

    def get_recent(self, k: int = 10) -> list[Message]:
        """获取最近的k条记忆,对应短时记忆"""
        return self.storage[-k:] if k > 0 else self.storage

    def retrieve(self, query: str, top_k: int = 5) -> list[Message]:
        """根据query语义检索相关的记忆,对应长时记忆"""
        query_embedding = self.embedding.get_embedding(query)
        # 计算query和所有记忆的余弦相似度
        similarities = [
            self._cosine_similarity(query_embedding, msg.embedding)
            for msg in self.storage
        ]
        # 按相似度排序,返回top_k条
        top_indices = sorted(range(len(similarities)), key=lambda i: similarities[i], reverse=True)[:top_k]
        return [self.storage[i] for i in top_indices]

    def _cosine_similarity(self, vec1: list[float], vec2: list[float]) -> float:
        """余弦相似度计算,公式如下:
        $$similarity(vec1, vec2) = \frac{\sum_{i=1}^{n} vec1_i * vec2_i}{\sqrt{\sum_{i=1}^{n} vec1_i^2} * \sqrt{\sum_{i=1}^{n} vec2_i^2}}$$
        """
        dot_product = sum(a * b for a, b in zip(vec1, vec2))
        norm1 = math.sqrt(sum(a**2 for a in vec1))
        norm2 = math.sqrt(sum(b**2 for b in vec2))
        return dot_product / (norm1 * norm2) if norm1 and norm2 else 0.0
设计思路解析

MetaGPT的记忆分为三类:

  1. 短时记忆:最近的k条对话消息,对应大模型的上下文窗口,默认保留最近10条
  2. 长时记忆:所有历史消息,存储在向量数据库中,需要的时候用语义检索召回相关的记忆,解决上下文窗口有限的问题
  3. 工作记忆:当前任务的中间结果,比如PRD内容、架构设计,存储在RoleContext中,当前任务执行完后清空
    这种分层记忆的设计既保证了上下文的相关性,又突破了大模型上下文窗口的限制,是长任务执行的核心保障。

5. SOP 管控模块:避免Agent跑偏的核心

SOP管控模块是MetaGPT和其他Agent框架最大的区别,它把人类软件开发的标准化流程抽象成状态机,严格约束角色动作的执行顺序,从根源上避免了Agent跑偏的问题,源码位于metagpt/sop/sop.py,对应的状态机如下:

ProductManager执行WritePRD

ProductManager执行WritePRD

Architect执行SystemDesign

Architect执行TaskSplit

Engineer执行WriteCode

Tester执行WriteTest

Engineer执行DebugCode

项目交付

代码调试

需求输入

需求分析

PRD输出

架构设计

任务拆分

代码编写

测试用例编写

代码调试

测试通过?

项目交付

SOP模块的核心逻辑是状态流转校验:只有上一个状态的动作执行完成,并且输出符合要求,才会进入下一个状态,比如产品经理没有输出PRD之前,架构师不会开始做架构设计,从流程上保证了任务不会跑偏。


全流程运行机制解析

我们以用户输入“开发一个2048网页游戏”为例,走通MetaGPT的完整运行流程,你可以对照源码理解每个步骤的调用关系:

用户输入需求: 开发一个2048网页游戏

实例化Environment,注册4个角色: 产品经理/架构师/工程师/测试

把需求封装成Message发布到Environment

产品经理observe到需求消息,_think选择WritePRD动作

WritePRD调用大模型生成PRD,发布到Environment

架构师observe到PRD消息,_think选择SystemDesign动作

SystemDesign生成架构设计+文件列表: index.html/style.css/game.js,发布到Environment

工程师observe到架构设计,_think选择WriteCode动作

WriteCode逐个生成每个文件的代码,写入本地目录,发布代码完成消息

测试observe到代码消息,_think选择WriteTest动作

WriteTest生成测试用例,执行测试,发现bug发布bug消息

工程师observe到bug消息,_think选择DebugCode动作,修复bug

测试重新执行测试,所有用例通过,发布测试通过消息

任务结束,输出可运行项目,用户可以直接打开index.html玩2048

整个流程和真实的开发团队的工作流程完全一致,每个角色只做自己职责范围内的事,SOP保证了流程不会乱,记忆模块保证了每个步骤的上下文不会丢失,最终输出的项目准确率远高于单Agent框架。


实践应用:自定义运维角色实现自动部署

接下来我们动手实战,基于MetaGPT自定义一个运维角色,自动把生成的前端项目部署到Vercel平台,让你掌握二次开发的方法。

环境准备

  1. 安装MetaGPT:git clone https://github.com/geekan/MetaGPT.git && cd MetaGPT && pip install -e .
  2. 配置大模型密钥:复制config/config.yaml.exampleconfig/config.yaml,填入你的OPENAI_API_KEY
  3. 申请Vercel Token:登录Vercel,进入Settings->Tokens,生成一个有部署权限的Token,设置为环境变量VERCEL_TOKEN

步骤1:自定义部署动作

新建deploy_to_vercel.py文件,实现部署到Vercel的Action:

from metagpt.actions import Action
from metagpt.schema import Message
import requests
import os
import json

class DeployToVercel(Action):
    name: str = "DeployToVercel"
    desc: str = "把前端项目部署到Vercel平台"
    vercel_token: str = os.getenv("VERCEL_TOKEN")
    vercel_team_id: str = os.getenv("VERCEL_TEAM_ID", "")

    async def run(self, context: list[Message], **kwargs) -> Message:
        # 从上下文获取项目路径
        project_path = self._get_project_path(context)
        # 读取项目所有文件
        files = self._read_project_files(project_path)
        # 调用Vercel API部署
        deploy_url = self._call_vercel_api(files, project_name="metagpt-2048-demo")
        return Message(
            content=f"✅ 项目部署完成,访问地址:{deploy_url}",
            role="运维工程师",
            cause_by=type(self)
        )

    def _get_project_path(self, context: list[Message]) -> str:
        """从上下文获取生成的项目路径"""
        for msg in reversed(context):
            if msg.cause_by.__name__ == "WriteCode":
                return json.loads(msg.content).get("project_path")
        raise ValueError("未找到项目路径")

    def _read_project_files(self, project_path: str) -> dict:
        """读取项目下的所有静态文件"""
        files = {}
        for root, _, filenames in os.walk(project_path):
            for filename in filenames:
                if filename.endswith((".html", ".css", ".js", ".png", ".jpg", ".svg")):
                    file_path = os.path.join(root, filename)
                    relative_path = os.path.relpath(file_path, project_path)
                    with open(file_path, "r", encoding="utf-8") as f:
                        files[relative_path] = f.read()
        return files

    def _call_vercel_api(self, files: dict, project_name: str) -> str:
        """调用Vercel API部署项目"""
        url = "https://api.vercel.com/v13/deployments"
        if self.vercel_team_id:
            url += f"?teamId={self.vercel_team_id}"
        headers = {
            "Authorization": f"Bearer {self.vercel_token}",
            "Content-Type": "application/json"
        }
        payload = {
            "name": project_name,
            "files": [{"file": path, "data": content} for path, content in files.items()],
            "projectSettings": {"framework": "vanilla"}
        }
        rsp = requests.post(url, headers=headers, json=payload)
        rsp.raise_for_status()
        return f"https://{rsp.json()['alias'][0]}"

步骤2:自定义运维角色

新建ops_engineer.py文件,实现运维角色:

from metagpt.roles import Role
from metagpt.actions import WriteCode
from .deploy_to_vercel import DeployToVercel

class OpsEngineer(Role):
    name: str = "李运维"
    profile: str = "运维工程师"
    goal: str = "把项目部署到线上,确保可以正常访问"
    constraints: str = "部署完成后要提供可访问的地址,确保没有报错"

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 初始化动作列表
        self._init_actions([DeployToVercel])
        # 关注代码编写完成的消息,代码写完后自动触发部署
        self._watch({WriteCode})

步骤3:修改启动脚本

新建main.py文件,把运维角色加入团队:

import asyncio
from metagpt.team import Team
from metagpt.roles import ProductManager, Architect, Engineer, Tester
from ops_engineer import OpsEngineer

async def main():
    # 创建团队
    team = Team()
    # 雇佣角色,加入我们自定义的运维工程师
    team.hire([
        ProductManager(),
        Architect(),
        Engineer(),
        Tester(),
        OpsEngineer()
    ])
    # 设置预算,超过3美元自动停止
    team.invest(investment=3.0)
    # 启动项目
    team.run_project("开发一个2048网页游戏,支持计分、重新开始功能,UI要美观")
    # 运行10轮
    await team.run(n_round=10)

if __name__ == "__main__":
    asyncio.run(main())

步骤4:运行测试

执行python main.py,等待1-2分钟,你就会看到输出的Vercel访问地址,打开就可以直接玩生成的2048游戏了。


最佳实践Tips

  1. 大模型选型:开发测试阶段用GPT-3.5-turbo降低成本,正式生成项目用GPT-4o/Claude3 Opus提升准确率,对接本地大模型只需要修改config.yaml的llm配置为兼容OpenAI API的本地地址即可。
  2. Prompt优化:如果需要生成特定领域的代码,可以修改对应Action的Prompt模板,加入领域知识,比如生成电商系统的代码可以加入“要支持分布式事务、高并发1000QPS”的约束。
  3. 减少幻觉:可以把企业内部的编码规范、技术栈要求导入向量数据库,在Action执行前检索相关规范加入Prompt上下文,生成的结果会更符合企业要求。
  4. 调试技巧:运行时加上--debug参数可以看到所有大模型的请求和响应,方便排查问题,也可以把环境状态保存下来,中断后恢复执行。
  5. 成本优化:开启LLM缓存,相同的请求不会重复调用大模型,对于简单的任务可以用更小的模型,比如Llama3-8B就能满足大部分基础代码生成的需求。

行业发展与未来趋势

多智能体开发框架发展历史

时间框架名称核心事件核心特点
2023年3月AutoGPT首个爆火的通用Agent框架单Agent自主决策,支持工具调用
2023年6月MetaGPT开源,主打软件开发多Agent内置软件工程SOP,多角色协作,代码生成完成率达70%+
2023年10月LangGraphLangChain官方推出的Agent编排框架基于状态机的工作流编排,灵活度高
2024年1月AgentScope阿里推出的多Agent框架支持多模态、高并发、分布式部署
2024年3月CrewAI主打轻量多角色协作的Agent框架低代码配置角色和任务,上手简单

未来趋势

  1. 多模态支持:未来MetaGPT会支持图片、音频、视频的输入输出,比如用户上传一张手绘的原型图就能直接生成对应的网页。
  2. 企业级适配:会对接企业内部的需求管理系统、代码仓库、CI/CD系统,完全融入企业现有的研发流程,支持大规模团队的协作开发。
  3. 轻量化版本:会推出基于小模型的轻量化版本,7B级别的小模型就能跑通完整流程,支持离线部署,降低使用成本。
  4. 跨领域扩展:现在MetaGPT主要做软件开发,未来会扩展到法律、医疗、教育等更多领域,只需要定义对应的角色和SOP就能生成对应领域的解决方案。

总结与展望

本文从源码层面深入拆解了MetaGPT的核心机制:核心组件包括Environment、Role、Action、Memory、SOP五大模块,基于发布订阅模式实现了低耦合的多Agent通信,通过SOP管控实现了标准化的流程流转,极大提升了软件开发任务的完成率。
MetaGPT虽然还存在长流程一致性不足、大模型成本高等问题,但已经代表了未来AI辅助开发的方向,现在的MetaGPT就像20年前的Java,虽然还不够完善,但已经能实实在在提升开发效率,对于中小项目的原型开发,能节省70%以上的时间。
如果你想深入学习MetaGPT,可以阅读官方仓库的源码,也可以参与社区贡献,一起推动多智能体开发的发展。

参考资源

  • MetaGPT官方仓库:https://github.com/geekan/MetaGPT
  • MetaGPT官方文档:https://docs.metagpt.com/
  • 论文《MetaGPT: Meta Programming for Multi-Agent Collaborative Framework》:https://arxiv.org/abs/2308.00352

(全文约12800字)

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐