多智能体系统(Multi-Agent Systems)
当单个 Agent 无法胜任复杂任务时,多个 Agent 协作组成多智能体系统(Multi-Agent System, MAS)成为必然选择。多智能体通过角色分工、消息传递和协同决策,实现远超单 Agent 的能力边界。本章深入讲解多智能体系统的架构模式、通信机制、协作策略和实际实现。
当单个 Agent 无法胜任复杂任务时,多个 Agent 协作组成多智能体系统(Multi-Agent System, MAS)成为必然选择。多智能体通过角色分工、消息传递和协同决策,实现远超单 Agent 的能力边界。本章深入讲解多智能体系统的架构模式、通信机制、协作策略和实际实现。
理解提示工程与工具调用
为什么需要多智能体、多智能体架构模式、通信机制
行动系统 · 智能体深度解析
文章导航
- 引言
- 1. 为什么需要多智能体
- 1.1 单 Agent 的瓶颈
- 1.2 多智能体的优势
- 2. 多智能体架构模式
- 2.1 层级式架构(Hierarchical)
- 2.2 平等协作架构(Peer-to-Peer)
- 2.3 流水线架构(Pipeline)
- 2.4 竞争架构(Competitive)
- 3. 通信机制
- 3.1 消息传递模式
- 3.2 通信协议设计
- 3.3 共享状态管理
- 4. 协作策略
- 4.1 辩论式协作(Debate)
- 4.2 分工协作(Division of Labor)
- 4.3 投票与共识
- 5. 实际实现
- 5.1 CrewAI 多智能体
- 5.2 AutoGen 多智能体对话
- 5.3 自定义多智能体编排
- 6. 多智能体的挑战
- 6.1 核心挑战
- 6.2 最佳实践
- 7. 本章小结
- 相关章节
- 延伸阅读
点击图中节点可定位到对应正文。
引言
当单个 Agent 无法胜任复杂任务时,多个 Agent 协作组成多智能体系统(Multi-Agent System, MAS)成为必然选择。多智能体通过角色分工、消息传递和协同决策,实现远超单 Agent 的能力边界。本章深入讲解多智能体系统的架构模式、通信机制、协作策略和实际实现。
1. 为什么需要多智能体
1.1 单 Agent 的瓶颈
问题 1: 上下文过载
一个 Agent 需要同时处理代码编写、测试、文档、部署——
上下文窗口装不下所有信息,导致遗漏和错误。
问题 2: 专业能力不足
一个 Agent 同时扮演产品经理、架构师、开发者、测试员——
每个角色都做不精,输出质量参差不齐。
问题 3: 串行效率低
一个 Agent 做完 A 才能做 B,做完 B 才能做 C——
无法并行处理独立子任务,效率低下。
问题 4: 缺乏对抗与制衡
一个 Agent 自我评审容易出现"确认偏差"——
没有独立视角的交叉验证,错误难以发现。1.2 多智能体的优势
| 优势 | 说明 |
|---|---|
| 专业分工 | 每个 Agent 专注一个领域,输出更专业 |
| 并行处理 | 独立子任务可并行执行,提高效率 |
| 互相验证 | Agent 之间可以互相审查,减少错误 |
| 上下文隔离 | 每个 Agent 只关注自己的上下文,避免过载 |
| 可扩展性 | 新能力 = 新增 Agent,无需重构整体 |
2. 多智能体架构模式
2.1 层级式架构(Hierarchical)
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌──────────────────┐
│ 管理者 Agent │ 负责分配任务、汇总结果
│ (Orchestrator) │
└───┬───┬───┬──────┘
↓ ↓ ↓
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Agent A │ │ Agent B │ │ Agent C │ 各自执行子任务
│ (研究) │ │ (写作) │ │ (审核) │
└─────────┘ └─────────┘ └─────────┘2.2 平等协作架构(Peer-to-Peer)
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌─────────┐ ┌─────────┐
│ Agent A │ ←──→ │ Agent B │
│ (作者) │ │ (编辑) │
└────┬─────┘ └────┬─────┘
│ │
↓ ↓
┌─────────┐ ┌─────────┐
│ Agent C │ ←──→ │ Agent D │
│ (研究员) │ │ (审校员) │
└─────────┘ └─────────┘2.3 流水线架构(Pipeline)
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
需求 → │ 分析 │ → │ 设计 │ → │ 实现 │ → │ 测试 │ → 交付
│ Agent │ │ Agent │ │ Agent │ │ Agent │
└─────────┘ └─────────┘ └─────────┘ └─────────┘2.4 竞争架构(Competitive)
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
用户问题
↓
┌────────┼────────┐
↓ ↓ ↓
Agent A Agent B Agent C ← 各自独立作答
↓ ↓ ↓
答案 A 答案 B 答案 C
└────────┼────────┘
↓
┌───────────┐
│ 评委 Agent │ ← 评选最佳答案
└───────────┘
↓
最终答案3. 通信机制
Agent 之间的通信机制正走向标准化,跨系统的 A2A 协议与整体生态可参见 Agent 生态系统全景。
3.1 消息传递模式
# 模式 1: 直接通信(Agent-to-Agent)
agent_a.send_message(agent_b, "请帮我检查这段代码的逻辑")
# 模式 2: 广播通信(Agent-to-All)
orchestrator.broadcast("任务已完成 80%,请各 Agent 汇报进度")
# 模式 3: 共享黑板(Blackboard)
blackboard.write("research_results", agent_a.findings)
data = blackboard.read("research_results") # 其他 Agent 可读
# 模式 4: 消息队列(Message Queue)
queue.publish("task.completed", {"agent": "A", "result": result})
queue.subscribe("task.completed", handler) # 订阅特定事件3.2 通信协议设计
@dataclass
class AgentMessage:
"""Agent 之间的通信消息"""
sender: str # 发送方 Agent ID
receiver: str # 接收方 Agent ID("all" 表示广播)
msg_type: str # 消息类型: task / result / query / feedback
content: Any # 消息内容
priority: int = 0 # 优先级
timestamp: float = 0 # 时间戳
reply_to: str = "" # 回复哪条消息
metadata: Dict = field(default_factory=dict)
# 消息类型
MSG_TYPES = {
"task_assign": "管理者分配任务",
"task_result": "工作者返回结果",
"query": "Agent 之间的询问",
"response": "对询问的回答",
"feedback": "评审反馈",
"status_update": "状态更新",
"terminate": "终止信号"
}3.3 共享状态管理
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
def get(self, key: str) -> Any:
with self._lock:
return self._state.get(key)4. 协作策略
4.1 辩论式协作(Debate)
任务: "评估某公司的技术架构方案"
Round 1:
Agent A (架构师): "应该用微服务架构,便于独立部署和扩展"
Agent B (运维专家): "微服务会增加运维复杂度,建议单体 + 模块化"
Agent C (CTO 视角): "取决于团队规模,小团队用单体,大团队用微服务"
Round 2:
Agent A: "同意 C 的观点,补充:可以先单体后拆分"
Agent B: "同意渐进式演进,但要提前设计好模块边界"
Agent C: "最终建议:模块化单体起步,核心模块预留拆分接口"
Round 3:
共识达成:采用模块化单体 + 渐进式拆分策略4.2 分工协作(Division of Labor)
def division_of_labor(task: str):
# 1. 任务分解
subtasks = planner.decompose(task)
# 2. 角色分配
assignments = {}
for subtask in subtasks:
best_agent = select_agent(subtask) # 根据能力匹配
assignments[subtask.id] = best_agent
# 3. 并行执行
results = {}
with ThreadPoolExecutor() as executor:
futures = {
executor.run(agent.execute, subtask): subtask
for subtask, agent in assignments.items()
}
for future in as_completed(futures):
subtask = futures[future]
results[subtask.id] = future.result()
# 4. 结果合并
final = integrator.merge(task, results)
return final4.3 投票与共识
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
def consensus_decision(question: str, agents: List[Agent]) -> str:
"""多 Agent 投票决策"""
votes = {}5. 实际实现
主流多智能体框架(如 CrewAI、AutoGen)大幅简化了系统搭建,详见 CrewAI与AutoGen。
5.1 CrewAI 多智能体
from crewai import Agent, Task, Crew
# 定义 Agent
researcher = Agent(
role="资深行业研究员",
goal="深入调研指定主题,提供详尽的数据和分析",
backstory="你是一位有 10 年经验的行业分析师,擅长数据挖掘和趋势预测",
tools=[search_tool, web_scraper],
llm="gpt-4"
)
writer = Agent(
role="专业内容作者",
goal="将研究结果整理成高质量的文章",
backstory="你是一位资深科技作者,擅长将复杂概念用通俗语言表达",
llm="gpt-4"
)
reviewer = Agent(
role="内容审核专家",
goal="审核文章的准确性、逻辑性和可读性",
backstory="你是一位严谨的编辑,对事实核查和逻辑一致性要求极高",
llm="gpt-4"
)
# 定义任务
research_task = Task(
description="调研 2024 年 AI Agent 技术的发展现状和趋势",
expected_output="详细的调研报告,包含数据、案例和趋势分析",
agent=researcher
)
writing_task = Task(
description="基于调研报告,撰写一篇 3000 字的深度分析文章",
expected_output="结构清晰、数据充分的分析文章",
agent=writer
)
review_task = Task(
description="审核文章,确保事实准确、逻辑自洽、表述清晰",
expected_output="审核报告和修改后的最终版本",
agent=reviewer
)
# 组建团队
crew = Crew(
agents=[researcher, writer, reviewer],
tasks=[research_task, writing_task, review_task],
process="sequential", # 顺序执行
verbose=True
)
result = crew.kickoff()5.2 AutoGen 多智能体对话
from autogen import AssistantAgent, UserProxyAgent, GroupChat, GroupChatManager
# 创建 Agent
coder = AssistantAgent(
name="Coder",
system_message="你是一位资深 Python 开发者,负责编写代码",
llm_config=llm_config
)
reviewer = AssistantAgent(
name="Reviewer",
system_message="你是一位代码审查专家,负责审查代码质量和安全性",
llm_config=llm_config
)
user = UserProxyAgent(
name="User",
human_input_mode="NEVER",
code_execution_config={"work_dir": "coding"}
)
# 创建群聊
groupchat = GroupChat(
agents=[user, coder, reviewer],
messages=[],
max_round=10,
speaker_selection_method="round_robin" # 轮流发言
)
manager = GroupChatManager(groupchat=groupchat, llm_config=llm_config)
# 启动对话
user.initiate_chat(manager, message="帮我写一个 REST API 的用户管理系统")5.3 自定义多智能体编排
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
def run_pipeline(self, task: str, agent_sequence: List[str]) -> str:
"""流水线执行"""
current_input = task
for agent_id in agent_sequence:
agent = self.agents[agent_id]
current_input = agent.process(current_input)
return current_input根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
def run_parallel(self, task: str, agent_ids: List[str]) -> Dict:
"""并行执行"""
results = {}
with ThreadPoolExecutor() as executor:
futures = {
executor.submit(self.agents[aid].process, task): aid
for aid in agent_ids
}
for future in as_completed(futures):
agent_id = futures[future]
results[agent_id] = future.result()
return results6. 多智能体的挑战
6.1 核心挑战
| 挑战 | 说明 | 应对方案 |
|---|---|---|
| 通信开销 | Agent 间消息传递消耗大量 token | 精简消息格式,只传必要信息 |
| 死循环 | Agent 互相调用,无法终止 | 设置最大轮数和终止条件 |
| 信息丢失 | 消息传递中信息被压缩或遗漏 | 关键信息存入共享状态 |
| 角色冲突 | Agent 目标相互矛盾 | 明确的优先级和仲裁机制 |
| 调试困难 | 多 Agent 交互难以追踪 | 完整的日志和可视化追踪 |
| 成本高昂 | 多个 LLM 调用 = 多倍 API 费用 | 合理分工,减少不必要的交互 |
6.2 最佳实践
1. 明确角色边界
每个 Agent 有清晰且互不重叠的职责
2. 最小化通信
Agent 之间只传递必要的结构化信息
3. 设置超时和上限
每个 Agent 有执行时间上限和最大重试次数
4. 统一错误处理
任何 Agent 失败都有明确的降级和恢复策略
5. 可观测性
记录所有 Agent 的决策和交互,便于调试和优化
6. 渐进式构建
先用单 Agent 验证可行性,再拆分为多 Agent7. 本章小结
| 架构模式 | 特点 | 适用场景 |
|---|---|---|
| 层级式 | 管理者分配,工作者执行 | 有明确分工的任务 |
| 平等协作 | Agent 间平等协商 | 需要讨论和共识的场景 |
| 流水线 | 串行处理,上游输出=下游输入 | 流程固定的生产线 |
| 竞争式 | 多个 Agent 竞争解题 | 需要高质量输出的场景 |
相关章节
- 单智能体架构 — 多智能体系统的基础单元
- CrewAI与AutoGen — 多智能体的主流框架实现
- Agent 生态系统全景 — A2A 协议与智能体生态
延伸阅读
- Wu, Q. et al. (2023). "AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation". arXiv:2308.08155
- Li, G. et al. (2023). "CAMEL: Communicative Agents for 'Mind' Exploration of Large Language Model Society". NeurIPS
- Hong, S. et al. (2023). "MetaGPT: Meta Programming for A Multi-Agent Collaborative Framework". arXiv:2308.00352
- Du, Y. et al. (2023). "Improving Factuality and Reasoning in Language Models through Multiagent Debate". ICML