Multi-Agent 多智能体协作
AutoGen / CrewAI / MetaGPT 框架对比、Agent 间通信与任务编排、角色分工
为什么需要多智能体
单 Agent 的局限性
单个 LLM Agent 在独立完成复杂任务时面临多重瓶颈。首先,单一 Agent 的知识范围受限于其训练语料与上下文窗口,无法同时覆盖多个专业领域(如同时需要编程、产品设计和法律合规)。其次,单 Agent 的推理链容易在长流程中产生累积误差——一步出错导致后续决策全部偏离。此外,单 Agent 缺乏外部验证机制,无法自我纠偏,输出质量完全依赖于模型本身的能力上限。
多 Agent 协作的优势
多智能体系统通过引入分工、对话和验证机制,有效克服了上述局限:
- 角色专业化:每个 Agent 聚焦于特定领域,通过提示词约束其行为模式,使输出更精准。
- 交叉验证:Agent 之间可以互相审核结果,通过辩论与反馈提升最终质量。
- 并行处理:无依赖的子任务可由不同 Agent 同时推进,缩短整体执行时间。
- 扩展性:新增 Agent 即可引入新的能力维度,无需重新训练模型。
现实场景映射
多智能体架构与现实团队协作高度对应。例如,软件开发团队包含产品经理、架构师、开发者和测试人员,各自承担不同职责并通过会议和文档沟通。同样,在多 Agent 系统中,不同角色的 Agent 通过结构化通信协议交换消息,协同完成需求分析、代码编写、测试验证等环节。金融分析、法律文书审核、科学研究等需要多角色协作的领域,均可从多智能体模式中受益。
AutoGen 框架
AutoGen 由微软研究院推出,是一个以对话驱动为核心的多 Agent 开发框架。
核心概念
- AssistantAgent:由 LLM 驱动的智能体,负责推理、生成回复和提出建议。它可以配置不同的系统提示来承担特定角色。
- UserProxyAgent:模拟人类用户的代理,负责执行 AssistantAgent 生成的代码或指令。它拥有代码执行环境,可以将结果反馈回对话中。
- GroupChat:多个 Agent 参与的群组聊天管理器。GroupChatManager 负责调度发言顺序、维护聊天历史以及判断对话终止条件。
对话流与终止条件
AutoGen 的 Agent 之间通过连续对话推进任务。典型流程为:UserProxyAgent 提出任务 -> AssistantAgent 生成方案 -> UserProxyAgent 执行并返回结果 -> AssistantAgent 基于结果继续迭代。对话持续直到满足终止条件,包括达到最大对话轮数、检测到终止关键词或收到特定的终止函数信号。
代码执行沙箱
AutoGen 支持在隔离的 Docker 容器中执行代码,确保安全性。UserProxyAgent 可以配置执行环境(如 Python、Jupyter 内核),并捕获标准输出和错误信息。这使得 Agent 可以编写代码、运行测试、查看结果并自动修正错误,形成完整的闭环。
CrewAI 框架
CrewAI 是一个专注于角色协作与任务编排的多 Agent 框架,设计理念贴近项目管理实践。
Agent / Task / Crew 三要素
- Agent:定义角色的核心单元,包含角色名称(role)、目标(goal)和背景故事(backstory)。每个 Agent 可以绑定特定的 LLM 实例和工具集。
- Task:描述需要完成的具体工作,包括任务描述、期望输出以及分配给哪个 Agent。Task 可以设置依赖关系来控制执行顺序。
- Crew:将 Agent 和 Task 组合在一起的编排器。Crew 负责协调 Agent 之间的协作,管理任务队列,并收集最终结果。
角色定义与任务委派
定义 Agent 时需要明确其专业领域和行为边界。例如,"资深 Python 工程师"角色的 goal 是"编写高质量、可维护的代码",其 backstory 包含多年的技术经验描述。CrewAI 根据任务类型和目标自动将 Task 分配给最合适的 Agent,支持一对多和多对一的分配关系。
顺序 / 层级流程
CrewAI 支持两种流程模式:
- 顺序流程(Sequential Process):Task 按定义顺序依次执行,前一个 Task 的输出可作为后一个 Task 的上下文输入。适合有明确上下游依赖的流水线任务。
- 层级流程(Hierarchical Process):引入一个管理 Agent(Manager Agent)来动态决策任务分配和执行顺序。管理 Agent 会评估每个 Agent 的能力,将子任务拆分并分派,适合更复杂的动态场景。
MetaGPT 框架
MetaGPT 将软件公司组织架构映射到多智能体系统中,强调角色分工与标准化输出。
软件公司模拟
MetaGPT 定义了多个对标真实岗位的角色:
- 产品经理(PM):负责需求分析,输出产品需求文档(PRD)。
- 架构师(Architect):基于 PRD 设计系统架构文档,包括类图、接口设计。
- 工程师(Engineer):根据架构文档编写代码实现。
- 测试工程师(QA):编写测试用例并验证代码质量。
每个角色都有独立的提示词模板和输出规范,确保各阶段产出物质量。
SOP 驱动的角色分工
MetaGPT 的核心创新在于将**标准作业程序(SOP)**嵌入到 Agent 的协作流程中。每个角色的工作流被固化为一组可执行的步骤。例如,产品经理角色的 SOP 包括:分析需求 -> 编写用户故事 -> 输出 PRD。SOP 的存在使得 Agent 的行为可预测、可审计,同时也降低了 LLM 输出偏移的风险。
文档生成流水线
文档是 MetaGPT 各角色之间传递信息的主要载体。PM 生成 PRD 文档后,自动触发 Architect 读取并生成架构设计文档;架构文档完成后,Engineer 读取并开始编码。文档化流水线确保了信息的可追溯性,也方便人类开发者介入审查和修改。
三大框架对比表
| 维度 | AutoGen | CrewAI | MetaGPT |
|---|---|---|---|
| 开发者 | 微软研究院 | CrewAI 开源社区 | 深度理想科技 |
| 角色模型 | 基于对话角色(Assistant / UserProxy) | 灵活的 role / goal / backstory 定义 | 模拟软件公司固定角色 |
| 通信方式 | 双 Agent 对话 / GroupChat 群聊 | Task 输出传递 / 上下文共享 | 文档驱动(结构化文档传递) |
| 任务编排 | 对话流 + 终止条件控制 | 顺序流程 / 层级流程 | SOP 流水线(预定义工作流) |
| 代码执行 | 内置 Docker 沙箱 | 依赖 Agent 工具配置 | 通过 Engineer 角色间接执行 |
| 灵活性 | 高,可自定义对话流程 | 高,角色和任务可自由组合 | 中,固定角色模板 |
| 上手难度 | 中 | 低 | 中 |
| 适用场景 | 需要代码执行和迭代的复杂任务 | 项目管理、内容创作、分析报告 | 软件开发全流程自动化 |
| 扩展方式 | 自定义 Agent 和对话模式 | 自定义工具和流程 | 自定义角色和 SOP |
Agent 间通信模式
多智能体系统中 Agent 之间的通信模式直接影响系统的效率与可靠性。常见的通信模式包括:
广播(Broadcast)
一个 Agent 将消息发送给所有其他 Agent。适用于全局通知和状态更新场景。缺点是所有 Agent 都需要处理消息,造成不必要的计算开销。
点对点(Point-to-Point)
两个 Agent 之间直接通信,消息定向传递。适合特定角色之间的协作,如 PM 单独与 Architect 讨论技术方案。CrewAI 的 Task 依赖本质上是一种点对点的输出传递。
群组聊天(GroupChat)
多个 Agent 共同参与一个聊天会话,由调度器管理发言顺序。AutoGen 的 GroupChat 采用轮询或预定义的发言顺序,所有 Agent 共享聊天历史。这种方式接近人类团队会议场景,信息透明度高。
轮询调度(Round-Robin)
按固定顺序轮流让每个 Agent 发言或执行任务。在 MetaGPT 中,各角色按 SOP 定义的阶段依次产出文档,本质上是一种轮询调度。这种方式简单可靠,但缺乏动态调整能力。
消息协议与同步
在实际系统中,Agent 间传递的消息通常包含以下要素:
- 发送者与接收者:确定消息的来源和去向。
- 消息类型:如请求、回复、审核、通知等。
- 负载内容:具体的数据或指令,可以是文本、代码片段或结构化数据。
- 上下文 ID:关联对话或任务实例,用于维护状态一致性。
同步机制方面,常用的策略包括等待所有 Agent 完成(barrier 同步)、等待任意 Agent 完成(race 同步)以及超时机制。AutoGen 的终止条件本质上是一种同步控制,而 CrewAI 的 Task 依赖则是更精细化的同步原语。
代码示例
以下是一个基于 CrewAI 的多 Agent 协作示例,展示一个由研究员和写作者组成的内容创作团队:
from crewai import Agent, Task, Crew, Process
# 定义研究员 Agent
researcher = Agent(
role="技术研究员",
goal="收集并分析最新的技术趋势信息",
backstory="你是一名资深技术研究员,擅长从大量信息中提炼关键洞察。",
verbose=True,
)
# 定义写作者 Agent
writer = Agent(
role="技术写作者",
goal="将研究结果撰写成清晰易懂的技术文章",
backstory="你是一名技术内容创作者,擅长将复杂概念转化为通俗语言。",
verbose=True,
)
# 定义研究任务
research_task = Task(
description="调研 2025 年多智能体框架的最新发展,"
"重点关注 AutoGen、CrewAI 和 MetaGPT 的更新内容。",
expected_output="一份包含关键技术点和对比分析的研究摘要",
agent=researcher,
)
# 定义写作任务
writing_task = Task(
description="基于研究摘要撰写一篇技术博客文章,"
"要求结构清晰、内容准确、适合技术读者阅读。",
expected_output="一篇约 1000 字的技术博客文章",
agent=writer,
context=[research_task], # 依赖研究任务的输出
)
# 创建 Crew 并编排任务
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, writing_task],
process=Process.sequential, # 顺序执行
verbose=True,
)
# 启动协作
result = crew.kickoff()
print("最终输出:")
print(result)该示例中,研究员 Agent 首先执行信息收集与分析任务,将结果摘要传递给写作者 Agent;写作者 Agent 在此基础上完成文章撰写。CrewAI 的 context 参数自动处理了任务间的依赖关系和上下文传递,开发者无需手动管理中间结果。
使用 AutoGen 实现类似的协作可以通过 AssistantAgent 与 UserProxyAgent 的对话交替完成:
import autogen
# 配置 LLM
config_list = [
{"model": "gpt-4", "api_key": "your-api-key"},
]
# 定义研究员助手
researcher = autogen.AssistantAgent(
name="Researcher",
llm_config={"config_list": config_list},
system_message="你是一名技术研究员,负责收集和分析信息。"
"请输出结构化的研究摘要。",
)
# 定义写作者助手
writer = autogen.AssistantAgent(
name="Writer",
llm_config={"config_list": config_list},
system_message="你是一名技术写作者,负责将研究结果写成文章。",
)
# 用户代理负责启动和反馈
user_proxy = autogen.UserProxyAgent(
name="UserProxy",
human_input_mode="NEVER",
code_execution_config={"use_docker": False},
)
# 启动对话
user_proxy.initiate_chat(
researcher,
message="请调研 2025 年多智能体框架的最新发展。",
)两个框架各有侧重:CrewAI 更贴近项目管理思维,定义清晰的角色和任务即可工作;AutoGen 则提供更灵活的对话控制,适合需要多轮迭代和代码执行的复杂场景。开发者可以根据任务类型选择最适合的框架。