Multi-Agent Collaboration(多智能体协作)模式
概述
Multi-Agent Collaboration 模式将复杂任务分配给多个专业化的 Agent,每个 Agent 有自己的角色、能力和职责。Agent 之间通过对话、消息传递或共享记忆进行协作,共同完成单个 Agent 难以独立解决的任务。
原理
flowchart TD
Orchestrator["Orchestrator<br/>(编排器 / 协调)"]
Orchestrator --> AgentA["Agent A<br/>角色: 研究员"]
Orchestrator --> AgentB["Agent B<br/>角色: 编码员"]
Orchestrator --> AgentC["Agent C<br/>角色: 审查员"]
AgentA --> SharedMemory["Shared Memory<br/>(共享上下文)"]
AgentB --> SharedMemory
AgentC --> SharedMemory
两种主流协作模式:
1. 对话式协作(Conversational)
Agent 之间通过自然语言对话进行交互,类似团队讨论
2. 编排式协作(Orchestrated)
一个中心化的 Orchestrator 分配任务、收集结果、做出决策
使用场景
- 软件开发生命周期:需求分析 → 架构设计 → 编码 → 测试 → Code Review
- 内容创作流水线:选题策划 → 素材收集 → 撰写 → 配图 → 审核发布
- 复杂决策:多个角度(技术、商业、合规)分析同一问题
- 角色扮演/辩论:让不同立场 Agent 辩论以探索问题全貌
- 数据处理流水线:数据采集 Agent → 清洗 Agent → 分析 Agent → 报告 Agent
- 客户服务升级:初级客服 → 专家客服 → 主管逐级升级
示例代码
from enum import Enum
from typing import List, Dict, Any, Optional
from queue import Queue
import threading
import json
class MessageType(Enum):
TASK = "task"
RESULT = "result"
QUESTION = "question"
REVIEW = "review"
class Message:
"""Agent 间通信消息"""
def __init__(self, sender: str, receiver: str,
msg_type: MessageType, content: str):
self.sender = sender
self.receiver = receiver
self.msg_type = msg_type
self.content = content
class BaseAgent:
"""Agent 基类"""
def __init__(self, name: str, role: str, llm, tools: Dict = None):
self.name = name
self.role = role
self.llm = llm
self.tools = tools or {}
self.memory: List[Message] = []
def receive(self, message: Message):
"""接收消息"""
self.memory.append(message)
def act(self) -> Optional[Message]:
"""执行行动,子类实现"""
raise NotImplementedError
@property
def system_prompt(self) -> str:
return f"你是 {self.name},角色是 {self.role}。"
# ========== 预定义专业 Agent ==========
class ResearcherAgent(BaseAgent):
"""研究员 Agent:负责信息搜索和分析"""
def act(self) -> Optional[Message]:
if not self.memory:
return None
last_msg = self.memory[-1]
prompt = f"""{self.system_prompt}
你需要研究以下问题,收集相关信息并整理成结构化报告。
用户问题:{last_msg.content}
请使用搜索工具收集信息,然后生成研究报告。
"""
result = self.llm.generate(prompt)
return Message(
sender=self.name,
receiver="Orchestrator",
msg_type=MessageType.RESULT,
content=result
)
class CoderAgent(BaseAgent):
"""编码 Agent:负责代码编写"""
def act(self) -> Optional[Message]:
if not self.memory:
return None
# 获取来自 Orchestrator 的任务和研究结果
context = "\n---\n".join([m.content for m in self.memory])
prompt = f"""{self.system_prompt}
你是一名资深软件工程师。根据以下需求和上下文,编写高质量代码。
上下文:
{context}
要求:
- 代码包含完整的类型注解和 docstring
- 处理边界条件和异常
- 编写清晰的注释
- 只输出代码,不要额外说明
"""
result = self.llm.generate(prompt)
return Message(
sender=self.name,
receiver="Orchestrator",
msg_type=MessageType.RESULT,
content=result
)
class ReviewerAgent(BaseAgent):
"""审查员 Agent:负责代码审查和质量检查"""
def act(self) -> Optional[Message]:
if not self.memory:
return None
last_msg = self.memory[-1]
prompt = f"""{self.system_prompt}
你是一名严格的代码审查员。审查以下代码,给出评审意见。
代码:
{last_msg.content}
请从以下维度评审:
1. 正确性:逻辑是否正确
2. 可读性:命名、注释、结构
3. 性能:时间和空间复杂度
4. 安全性:是否存在漏洞
5. 测试:是否容易测试
以 JSON 格式返回评审结果,包含 score (0-100) 和 issues 列表。
"""
result = self.llm.generate(prompt)
return Message(
sender=self.name,
receiver="Orchestrator",
msg_type=MessageType.REVIEW,
content=result
)
class Orchestrator:
"""编排器:协调多个 Agent 协作完成任务"""
def __init__(self, llm):
self.llm = llm
self.agents: Dict[str, BaseAgent] = {}
def register(self, agent: BaseAgent):
"""注册 Agent"""
self.agents[agent.name] = agent
def run(self, task: str) -> str:
"""
编排多 Agent 协作执行任务
"""
# Step 1: 分析任务,制定协作计划
plan = self._plan(task)
print(f"[Orchestrator] 制定协作计划:")
for p in plan:
print(f" {p['agent']} → {p['action']}")
# Step 2: 按计划执行
results = {}
for step in plan:
agent_name = step["agent"]
action = step["action"]
if agent_name not in self.agents:
print(f" [Error] 未找到 Agent: {agent_name}")
continue
agent = self.agents[agent_name]
# 发送任务
context_msg = self._build_context(results, step)
task_msg = Message(
sender="Orchestrator",
receiver=agent_name,
msg_type=MessageType.TASK,
content=context_msg
)
agent.receive(task_msg)
# Agent 执行
print(f" [{agent_name}] 执行中...")
result = agent.act()
if result:
results[agent_name] = result.content
print(f" [{agent_name}] 完成")
# Step 3: 汇总最终结果
return self._summarize(task, results)
def _plan(self, task: str) -> List[Dict]:
"""制定多 Agent 协作计划"""
agents_desc = "\n".join([
f"- {name}: {agent.role}"
for name, agent in self.agents.items()
])
prompt = f"""可用 Agent:
{agents_desc}
用户任务:{task}
制定这些 Agent 的协作计划。以 JSON 数组格式返回:
[
{{"agent": "Agent名", "action": "要执行的操作"}},
...
]
确保 Agent 的执行顺序合理,充分利用各自的专长。
"""
response = self.llm.generate(prompt)
return json.loads(response)
def _build_context(self, results: Dict, step: Dict) -> str:
"""为当前步骤构建上下文"""
parts = [f"任务:{step['action']}"]
if results:
parts.append("\n前置结果:")
for agent_name, content in results.items():
parts.append(f"\n[{agent_name}] 的输出:\n{content[:500]}...")
return "\n".join(parts)
def _summarize(self, task: str, results: Dict) -> str:
"""汇总各 Agent 结果"""
prompt = f"""原始任务:{task}
各 Agent 的执行结果:
{json.dumps(results, ensure_ascii=False, indent=2)}
请整合以上结果,生成最终答案。
"""
return self.llm.generate(prompt)
# ========== 使用示例:软件开发任务 ==========
# 创建协作系统
orchestrator = Orchestrator(llm=YourLLM())
# 注册专业化 Agent
orchestrator.register(ResearcherAgent(
name="Alice",
role="技术研究员",
llm=YourLLM(),
tools={"search": search_function}
))
orchestrator.register(CoderAgent(
name="Bob",
role="高级后端工程师",
llm=YourLLM()
))
orchestrator.register(ReviewerAgent(
name="Charlie",
role="代码审查专家",
llm=YourLLM()
))
# 执行任务
result = orchestrator.run(
"实现一个基于 Redis 的分布式锁,包含自动续期和可重入特性"
)
print("\n" + "=" * 50)
print(result)
对话式协作示例
class ConversationCollaboration:
"""对话式多 Agent 协作"""
def __init__(self, agents: List[BaseAgent], max_rounds: int = 5):
self.agents = agents
self.max_rounds = max_rounds
self.chat_history: List[Message] = []
def discuss(self, topic: str) -> str:
"""发起 Agent 间讨论"""
# 初始消息
initial_msg = Message(
sender="User",
receiver="all",
msg_type=MessageType.QUESTION,
content=topic
)
self.chat_history.append(initial_msg)
for round_num in range(self.max_rounds):
print(f"\n--- 第 {round_num + 1} 轮讨论 ---")
for agent in self.agents:
# 构建当前 agent 的对话上下文
context = self._build_conversation_context(agent.name)
prompt = f"""{agent.system_prompt}
你正在参与一个团队讨论。以下是对话历史:
{context}
请发表你的观点。你可以:
- 补充之前发言人遗漏的信息
- 质疑或挑战其他观点
- 提出新的角度
- 综合各方观点形成共识
只回复你的发言,不要模仿其他人的格式。
"""
response = agent.llm.generate(prompt)
msg = Message(
sender=agent.name,
receiver="all",
msg_type=MessageType.RESULT,
content=response
)
self.chat_history.append(msg)
print(f" [{agent.name}]: {response[:100]}...")
# 汇总结论
return self._build_conclusion(topic)
def _build_conversation_context(self, current_agent: str) -> str:
"""构建当前 agent 可见的对话上下文"""
context = []
for msg in self.chat_history:
if msg.sender == current_agent:
continue
context.append(f"[{msg.sender}]: {msg.content}")
return "\n\n".join(context)
def _build_conclusion(self, topic: str) -> str:
"""汇总讨论结论"""
history_text = "\n".join([
f"[{msg.sender}]: {msg.content[:200]}..."
for msg in self.chat_history
])
prompt = f"""原始问题:{topic}
讨论记录:
{history_text}
请综合各方观点,给出最终结论和建议。
"""
return self.agents[0].llm.generate(prompt)
常见协作拓扑
flowchart TD
subgraph 流水线["1. 流水线 (Pipeline)"]
A1["A"] --> B1["B"] --> C1["C"] --> D1["D"]
end
subgraph 星型["2. 星型 (Star)"]
O2["Orchestrator"] --> A2["A"]
O2 --> B2["B"]
O2 --> C2["C"]
end
subgraph 网状["3. 网状 (Mesh)"]
A3["A"] <--> B3["B"]
A3 <--> C3["C"]
B3 <--> C3["C"]
C3 <--> D3["D"]
end
subgraph 层级["4. 层级 (Hierarchical)"]
M4["Manager"] --> TeamA4["Team A"]
M4 --> TeamB4["Team B"]
end
subgraph 辩论["5. 辩论 (Debate)"]
Pro5["Proponent"] <--> Opp5["Opponent"]
Pro5 --> Judge5["Judge"]
Opp5 --> Judge5
end
优点与局限
| 优点 | 局限 |
|---|---|
| 每个 Agent 专注于特定领域,专业性强 | LLM 调用次数大幅增加,成本高 |
| 任务可分解、可并行 | Agent 间可能出现冲突或信息冗余 |
| 天然支持角色分离和权限控制 | 编排策略依赖 prompt 质量 |
| 可扩展,新增 Agent 即可扩展能力 | 上下文在 Agent 间传递可能丢失信息 |
| 模拟真实团队协作流程 | 调试和追踪复杂度高 |
框架参考
业界主流多 Agent 框架:
- AutoGen(Microsoft):对话式多 Agent 框架
- CrewAI:基于角色的 Agent 编排
- LangGraph(LangChain):状态图驱动的多 Agent 系统
- MetaGPT:模拟软件公司的多 Agent 协作
评论
评论加载中…