MGX 与 RoleZero:TeamLeader 调度的动态命令智能体
30 秒导读: 前四章讲的是「第一代」MetaGPT——角色沿着写死的 SOP 流水线(需求→PRD→设计→代码)一棒接一棒跑。本章讲第二代:
Team默认use_mgx=True,换上MGXEnv环境和一个叫 Mike 的TeamLeader。此后每个角色不再走固定剧本,而是每一轮都让 LLM 现场决定「这一步调哪个工具、传什么参数」。这些角色全都继承同一个基类RoleZero——一个"能动态思考和行动"的智能体骨架。
本章是第 4 章「经典 SOP 流水线」的对照面。读之前建议先读过第 1 章 Role 循环、第 3 章 Environment 消息总线,本章会大量复用它们的概念(_observe/_think/_act、publish_message、Message 路由)。
1. 这是什么(零基础也能懂)
一句话定义: MGX(MetaGPT 的第二代多智能体模式)是"一个 LLM 队长 + 一群通用工具型智能体"的团队;每个成员靠逐轮生成工具命令干活,而不是照着固定流程走。
它解决的问题。 第一代 SOP 流水线的强项是"确定性"——步骤写死,产物齐整。但它也僵:每个角色只会做剧本里那一步,遇到剧本没覆盖的需求(改个 bug、爬个网页、临时查资料)就抓瞎。MGX 想要的是通用性:同一套角色,既能写 2048 小游戏,也能解 GitHub issue、做数据分析,靠的是"给角色一批工具,让它自己看着办"。
两代对比(先建立心智模型):
| 维度 | 第一代 SOP(第 4 章) | 第二代 MGX(本章) |
|---|---|---|
| 每一步怎么定 | 写死的 Action 序列 | 每轮 LLM 现场选工具命令 |
| 角色 | 专职(ProductManager 只写 PRD) | 通用(RoleZero 子类,配一批工具) |
| 谁来调度 | Environment 按订阅广播 | TeamLeader「Mike」居中收发、派活 |
| 停不停 | 跑完 n_round | 角色自己发 end 命令收工 |
| 适合 | 结构化、可预测的软件生成 | 开放任务、需要临场应变 |
用起来什么样。 用户几乎无感——入口还是那句 generate_repo("write a 2048 game")。差别在内部:software_company.py:45 雇的第一个人就是 TeamLeader(),后面跟着 ProductManager / Architect / Engineer2 / DataAnalyst(metagpt/software_company.py:45-53)。这些成员大多是 RoleZero 的子类。
一句话直觉/类比。 把它想成一个真实的项目组:第一代像工厂流水线(每个工位固定动作);第二代像一个有项目经理(Mike)的敏捷小组——你把需求丢给经理,经理拆活、点名派给合适的人,每个人拿到活后自己决定用什么工具、怎么下手,干完汇报,经理再决定下一步。
2. 顶层全景(它大概怎么转)
MGX 有两个主角:消息怎么流(MGXEnv + TeamLeader),和单个角色怎么想-做(RoleZero)。先看全景,再逐个拆。
怎么读下面这张图: 左边是"消息中转"——所有消息都先经过队长 Mike;右边是"一个角色收到活之后的内循环"。数字是一次任务的大致时序。
用户需求 "写个 2048"
│
▼
┌───────────────────────────────────────── ────┐
│ MGXEnv.publish_message (mgx_env.py:24) │
│ 规则:除队长自己发的,一切消息都追加 send_to=Mike │
└───────────────┬─────────────────────────────┘
│ ① 需求先到 Mike
▼
┌──────────────────────┐
│ TeamLeader「Mike」 │ ② _think:LLM 生成命令
│ (RoleZero 子类) │ Plan.append_task(...) 拆活
│ │ publish_team_message(→Alex)
└──────────┬───────────┘
│ ③ 派活:发一条 UserMessage 给 Alex,并把自己挂起
▼
┌────────────────────── ────────────────┐
│ Engineer2「Alex」= RoleZero 子类 │
│ ┌── _react 每轮重新 observe ────────┐ │
│ │ _think: 拼 system_prompt │ │ ④ 角色内循环
│ │ = 角色说明 + 工具schema + 计划状态 │ │
│ │ → LLM 吐一段 JSON 命令 │ │
│ │ _act: parse_commands → 逐个执行 │ │
│ │ Editor.write / Terminal.run / ... │ │
│ └── 直到发出 end 命令 ───────────────┘ │
└───────────────┬──────────────────────┘
│ ⑤ 干完汇报,消息又经 MGXEnv 回到 Mike
▼
Mike 标记任务完成 → 派下一个 → …
部件一句话职责:
| 部件 | 干什么 | 在哪 |
|---|---|---|
MGXEnv | 消息总线的 MGX 版:强制一切消息经队长中转 | metagpt/environment/mgx/mgx_env.py:11 |
TeamLeader(Mike) | 拆需求成计划、点名派活、跟踪进度 | metagpt/roles/di/team_leader.py:23 |
RoleZero | 动态智能体基类:think→act→react 的通用引擎 | metagpt/roles/di/role_zero.py:55 |
Engineer2/DataAnalyst/SWEAgent | RoleZero 的具体职业子类,各配一批工具 | metagpt/roles/di/engineer2.py:32 等 |
Planner/Plan/Task | 计划数据模型 + 更新/评审逻辑 | metagpt/strategy/planner.py:58、metagpt/schema.py:496 |
ToolRegistry + BM25ToolRecommender | 工具注册表 + 每轮召回"该给 LLM 看哪些工具" | metagpt/tools/tool_registry.py:91、tool_recommend.py:195 |
exp_cache 经验池 | 缓存/复用历史决策,省 LLM 调用 | metagpt/exp_pool/decorator.py:29 |
主线走一遍(高层): 需求 → MGXEnv 转给 Mike → Mike Plan.append_task 拆活 + publish_team_message 点名 → 被点到的 RoleZero 子类进入 _react 内循环:每轮 recommend_tools 挑工具、_think 让 LLM 出命令、_act 执行 → 角色发 end 收工汇报 → 消息回 Mike → Mike 推进下一任务。