多智能体框架
引言
多智能体框架提供了构建多 Agent 系统的基础设施,封装了通信、协作、任务分配等底层逻辑。本节介绍当前最流行的 LLM 多智能体框架。
AutoGen(Microsoft)
概述
AutoGen 是 Microsoft 推出的多 Agent 对话框架,核心概念是"可对话的 Agent"(Conversable Agent)。
核心概念
- ConversableAgent:可以与其他 Agent 对话的基础类
- AssistantAgent:使用 LLM 生成回复的 Agent
- UserProxyAgent:代表用户、可执行代码的 Agent
- GroupChat:多个 Agent 的群聊
代码示例
from autogen import AssistantAgent, UserProxyAgent, GroupChat, GroupChatManager
# 定义 Agent
coder = AssistantAgent(
name="Coder",
system_message="你是一个 Python 专家。编写清晰、高效的代码。",
llm_config={"model": "gpt-4o"},
)
reviewer = AssistantAgent(
name="Reviewer",
system_message="你是一个代码审查专家。审查代码的质量、安全性和性能。",
llm_config={"model": "gpt-4o"},
)
tester = AssistantAgent(
name="Tester",
system_message="你是一个测试工程师。编写全面的测试用例。",
llm_config={"model": "gpt-4o"},
)
user_proxy = UserProxyAgent(
name="User",
human_input_mode="NEVER",
code_execution_config={"work_dir": "coding_output"},
)
# 创建群聊
group_chat = GroupChat(
agents=[user_proxy, coder, reviewer, tester],
messages=[],
max_round=20,
)
manager = GroupChatManager(groupchat=group_chat, llm_config={"model": "gpt-4o"})
# 开始对话
user_proxy.initiate_chat(
manager,
message="请实现一个 LRU 缓存,包含完整的测试。"
)
AutoGen 特点
| 特性 | 说明 |
|---|---|
| 对话驱动 | Agent 通过自然语言对话协作 |
| 代码执行 | 内置安全的代码执行环境 |
| 灵活的对话流程 | 支持两人对话、群聊、嵌套对话 |
| 人类参与 | 支持 human-in-the-loop |
| 工具调用 | Agent 可以注册和使用工具 |
CrewAI
概述
CrewAI 采用角色扮演模式,将多 Agent 协作组织为"团队"(Crew)。
核心概念
- Agent:有角色、目标和背景的智能体
- Task:需要完成的具体任务
- Crew:Agent 和 Task 的组合
- Process:执行方式(顺序/层级)
代码示例
from crewai import Agent, Task, Crew, Process
# 定义 Agent
researcher = Agent(
role="研究分析师",
goal="深入研究给定主题并提供全面的分析",
backstory="你是一位经验丰富的研究分析师,擅长信息收集和深度分析。",
tools=[search_tool, scrape_tool],
llm="gpt-4o",
verbose=True,
)
writer = Agent(
role="技术写作者",
goal="将研究成果转化为清晰、引人入胜的文章",
backstory="你是一位专业的技术作家,擅长将复杂概念用简明的语言表达。",
llm="gpt-4o",
)
editor = Agent(
role="编辑",
goal="确保文章质量,检查事实准确性和可读性",
backstory="你是一位严谨的编辑,对质量有极高的标准。",
llm="gpt-4o",
)
# 定义任务
research_task = Task(
description="研究 {topic} 的最新发展、关键技术和市场趋势。",
expected_output="一份全面的研究报告,包含关键发现和数据支持。",
agent=researcher,
)
writing_task = Task(
description="基于研究报告撰写一篇技术文章。",
expected_output="一篇 2000 字左右的技术文章,结构清晰、内容丰富。",
agent=writer,
context=[research_task], # 依赖研究任务的输出
)
editing_task = Task(
description="审核和编辑文章,确保质量达标。",
expected_output="一篇经过审核的最终版文章。",
agent=editor,
context=[writing_task],
)
# 创建团队
crew = Crew(
agents=[researcher, writer, editor],
tasks=[research_task, writing_task, editing_task],
process=Process.sequential, # 顺序执行
verbose=True,
)
# 执行
result = crew.kickoff(inputs={"topic": "LLM Agent 技术"})
print(result)
MetaGPT
概述
MetaGPT(Hong et al., 2023)将标准操作流程(SOP)引入多 Agent 协作,模拟软件公司的开发流程。
核心理念
- Agent 通过 SOP 约束行为,而不是自由对话
- 结构化的输出格式(PRD、设计文档、代码等)
- 明确的角色定义和职责分工
角色定义
# MetaGPT 的预定义角色
roles = {
"ProductManager": {
"goal": "创建成功的产品",
"constraints": "使用与用户需求相同的语言",
"actions": ["WritePRD"],
},
"Architect": {
"goal": "设计简洁可用的系统",
"constraints": "使用现有的 API/库",
"actions": ["WriteDesign"],
},
"ProjectManager": {
"goal": "提高团队效率",
"actions": ["WriteTasks"],
},
"Engineer": {
"goal": "编写优雅、模块化的代码",
"actions": ["WriteCode"],
},
"QAEngineer": {
"goal": "确保质量",
"actions": ["WriteTest"],
},
}
工作流程
graph LR
U[用户需求] --> PM[产品经理<br/>写 PRD]
PM --> ARCH[架构师<br/>系统设计]
ARCH --> PJM[项目经理<br/>任务分解]
PJM --> ENG[工程师<br/>编写代码]
ENG --> QA[QA 工程师<br/>编写测试]
QA --> OUTPUT[交付物]
OpenAI Swarm
概述
OpenAI Swarm 是一个轻量级的多 Agent 编排框架,核心概念是 Agent 之间的"交接"(Handoff)。
核心概念
- Agent:有 instructions 和 tools 的对话实体
- Handoff:Agent 将对话控制权交给另一个 Agent
- Context Variables:跨 Agent 共享的上下文
代码示例
from swarm import Swarm, Agent
client = Swarm()
# 定义 Agent
triage_agent = Agent(
name="分诊 Agent",
instructions="你是客服分诊员。根据用户问题将其转接到合适的专家。",
)
sales_agent = Agent(
name="销售 Agent",
instructions="你是销售专家。帮助用户了解产品和购买。",
)
support_agent = Agent(
name="技术支持 Agent",
instructions="你是技术支持专家。帮助用户解决技术问题。",
)
# 定义交接函数
def transfer_to_sales():
"""转接到销售"""
return sales_agent
def transfer_to_support():
"""转接到技术支持"""
return support_agent
triage_agent.functions = [transfer_to_sales, transfer_to_support]
# 运行
response = client.run(
agent=triage_agent,
messages=[{"role": "user", "content": "我想了解你们的企业版定价"}]
)
# triage_agent 会自动交接给 sales_agent
Swarm 特点
- 极其轻量(单文件实现)
- 适合简单的路由和分工场景
- 无状态设计
- 教育/实验目的为主
LangGraph 多 Agent
使用 LangGraph 构建多 Agent
from langgraph.graph import StateGraph, END
class MultiAgentState(TypedDict):
messages: list
current_agent: str
task_status: str
# 定义 Agent 节点
def researcher_node(state):
# 研究 Agent 的逻辑
result = research_agent.invoke(state["messages"])
return {"messages": state["messages"] + [result], "current_agent": "writer"}
def writer_node(state):
result = writer_agent.invoke(state["messages"])
return {"messages": state["messages"] + [result], "current_agent": "reviewer"}
def reviewer_node(state):
result = reviewer_agent.invoke(state["messages"])
if "approved" in result.lower():
return {"messages": state["messages"] + [result], "task_status": "done"}
return {"messages": state["messages"] + [result], "current_agent": "writer"}
# 构建图
graph = StateGraph(MultiAgentState)
graph.add_node("researcher", researcher_node)
graph.add_node("writer", writer_node)
graph.add_node("reviewer", reviewer_node)
# 定义边
graph.set_entry_point("researcher")
graph.add_edge("researcher", "writer")
graph.add_edge("writer", "reviewer")
graph.add_conditional_edges("reviewer",
lambda s: END if s["task_status"] == "done" else "writer"
)
app = graph.compile()
result = app.invoke({"messages": [initial_task], "current_agent": "researcher", "task_status": ""})
框架对比
| 特性 | AutoGen | CrewAI | MetaGPT | Swarm | LangGraph |
|---|---|---|---|---|---|
| 协作模式 | 对话驱动 | 角色任务 | SOP 驱动 | 交接式 | 图工作流 |
| 复杂度 | 中 | 低 | 高 | 极低 | 中 |
| 灵活性 | 高 | 中 | 低 | 低 | 高 |
| 代码执行 | 内置 | 通过工具 | 内置 | 通过函数 | 通过节点 |
| 人类参与 | 支持 | 支持 | 有限 | 有限 | 支持 |
| 生产就绪 | 中 | 中 | 低 | 实验性 | 高 |
| 状态管理 | 对话历史 | 上下文传递 | 文档流 | 无状态 | 图状态 |
选型建议
| 场景 | 推荐框架 | 原因 |
|---|---|---|
| 快速原型 | CrewAI | 简单直观的 API |
| 对话式协作 | AutoGen | 灵活的对话管理 |
| 软件开发模拟 | MetaGPT | 内置的开发 SOP |
| 简单路由/分工 | Swarm | 极其轻量 |
| 复杂工作流 | LangGraph | 精确的流程控制 |
| 生产环境 | LangGraph / AutoGen | 成熟度和可靠性 |
实践建议
常见陷阱
- 过度设计:简单任务不需要多 Agent,单 Agent 即可
- 通信爆炸:Agent 之间过多的对话消耗 token 和时间
- 职责不清:Agent 之间的职责边界要明确
- 缺乏终止条件:Agent 可能陷入无限循环对话
何时使用多 Agent
- 任务涉及多个明确不同的专业领域
- 需要质量检查/审核环节
- 任务可以自然分解为独立子任务
- 需要多角度分析或辩论
何时不使用多 Agent
- 简单的单步任务
- 延迟敏感的场景
- 预算有限(多 Agent 消耗更多 token)
参考文献
- Wu, Q., et al. (2023). "AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation"
- Hong, S., et al. (2023). "MetaGPT: Meta Programming for Multi-Agent Collaborative Framework"
- CrewAI Documentation (crewai.com)
- OpenAI Swarm GitHub Repository