🌐 Multi-Agent 系统概述
通过多个协作的智能代理构建复杂应用,实现专业化分工、 智能路由、灵活交接和可扩展的工作流。
📚 什么是 Multi-Agent 系统?
Multi-Agent 系统是由多个协作的智能代理组成的架构模式, 每个代理专注于特定的任务领域,通过协作、交接和路由机制共同完成复杂的业务流程。
| 特性 | 单 Agent 系统 | Multi-Agent 系统 |
|---|---|---|
| 专业化程度 | 一个 Agent 处理所有任务 | 每个 Agent 专注于特定领域 |
| 上下文管理 | 所有信息堆积在一个上下文 | 分布在多个隔离的上下文 |
| 模型选择 | 使用单一模型 | 不同代理使用最适合的模型 |
| 可扩展性 | 添加功能需修改主 Agent | 添加新代理即可扩展 |
| 维护性 | 单点维护,易出问题 | 模块化,独立维护 |
复杂业务流程"] --> Router["🧭 路由器
智能分发"] Router -->|"客服问题"| Agent1["📞 客服 Agent
FAQ + 订单查询"] Router -->|"技术支持"| Agent2["🔧 技术 Agent
问题诊断 + 解决方案"] Router -->|"销售咨询"| Agent3["💼 销售 Agent
产品推荐 + 报价"] Agent1 -->|"需要技术支持"| Handoff1["🔄 交接
转给技术 Agent"] Agent2 -->|"需要销售跟进"| Handoff2["🔄 交接
转给销售 Agent"] Agent3 -->|"需要查询订单"| Handoff3["🔄 交接
转给客服 Agent"] Handoff1 --> Agent2 Handoff2 --> Agent3 Handoff3 --> Agent1 Agent1 --> Skills["🎯 共享技能
搜索、数据库、邮件"] Agent2 --> Skills Agent3 --> Skills Agent1 --> Result["协作完成
返回用户"] Agent2 --> Result Agent3 --> Result style Router fill:#3b82f6,color:#fff style Agent1 fill:#10b981,color:#fff style Agent2 fill:#f59e0b,color:#fff style Agent3 fill:#8b5cf6,color:#fff style Skills fill:#ef4444,color:#fff style Result fill:#10b981,color:#fff
Multi-Agent 系统的组成要素
- Subagents(子代理):专门化的独立代理,各自处理特定任务
- Handoffs(交接机制):代理之间的控制转移和状态传递
- Skills(技能系统):可在多个代理之间共享的能力和工具
- Router(路由机制):智能分发请求到最合适的代理
- Custom Workflow(自定义工作流):复杂的多步骤协作流程
🔀 Multi-Agent vs DeepAgents
Multi-Agent 和 DeepAgents 是两个不同但互补的概念:
TodoList, Filesystem, SubAgent"] DA --> Backend["后端
State, Store"] DA --> HITL["人工介入
审批机制"] DA --> Memory["长期记忆
Store 系统"] end subgraph MultiAgent["Multi-Agent - 多代理协作"] MA["多个 Agent"] --> Subagents["子代理
专业化分工"] MA --> Handoffs["交接机制
控制转移"] MA --> Router["路由器
智能分发"] MA --> Skills["技能系统
共享能力"] MA --> Workflow["自定义工作流
复杂编排"] end DeepAgents -.->|"可用于构建"| MultiAgent MultiAgent -.->|"每个代理可以是"| DeepAgents style DeepAgents fill:#10b981,color:#fff style MultiAgent fill:#3b82f6,color:#fff
| 维度 | DeepAgents | Multi-Agent |
|---|---|---|
| 关注点 | 增强单个 Agent的能力 | 多个 Agent的协作 |
| 核心机制 | 中间件、后端、人工介入、长期记忆 | 子代理、交接、路由、技能、工作流 |
| 使用场景 | 复杂任务规划、文件管理、持久化 | 多领域协作、分工协作、动态路由 |
| 架构模式 | 垂直深化(单个 Agent 功能增强) | 水平扩展(多个 Agent 协作) |
| 典型应用 | 研究助手、数据分析、长期项目 | 客服系统、工作流引擎、多角色协作 |
| 组合使用 | ✅ 可以结合:每个 Multi-Agent 节点都可以是一个 DeepAgent | |
- 使用 DeepAgents:需要一个功能强大的单一代理,具备规划、记忆、文件管理等高级能力
- 使用 Multi-Agent:需要多个专业化代理协作,每个代理处理不同领域或任务
- 结合使用:构建生产级系统,每个 Multi-Agent 节点使用 DeepAgent 增强其能力
🎯 五大核心协作模式
Multi-Agent 系统提供了五种核心协作模式,可以单独使用或组合构建复杂应用:
1. Subagents(子代理)- 专业化分工
创建多个专门化的子代理,每个代理专注于特定的任务领域。
"""
Subagents 模式 - 专业化分工
"""
from langchain_core.messages import HumanMessage
from langgraph.graph import StateGraph, MessagesState, START
# 定义专门化的子代理节点
def research_agent(state: MessagesState):
"""研究专员:负责信息收集和分析"""
# 使用搜索工具收集信息
return {"messages": ["研究结果:已收集相关数据..."]}
def writer_agent(state: MessagesState):
"""写作专员:负责内容创作"""
# 基于研究结果创作内容
return {"messages": ["文章草稿:基于研究数据撰写..."]}
def editor_agent(state: MessagesState):
"""编辑专员:负责内容审核和优化"""
# 审核和优化内容
return {"messages": ["最终稿件:已优化并审核完成"]}
# 构建工作流
graph = StateGraph(MessagesState)
graph.add_node("researcher", research_agent)
graph.add_node("writer", writer_agent)
graph.add_node("editor", editor_agent)
# 定义执行顺序
graph.add_edge(START, "researcher")
graph.add_edge("researcher", "writer")
graph.add_edge("writer", "editor")
app = graph.compile()
# 使用
result = app.invoke({
"messages": [HumanMessage(content="写一篇关于 AI 的文章")]
})
# 优势:
# - 每个代理专注于自己的领域
# - 易于维护和扩展
# - 可以为不同代理配置不同的模型和工具
2. Handoffs(交接机制)- 动态转移控制
允许代理之间动态转移控制权,实现灵活的协作流程。
"""
Handoffs 模式 - 动态交接控制
"""
from typing import Literal
from langgraph.graph import StateGraph, MessagesState
def customer_service_agent(state: MessagesState):
"""客服代理:处理常规问题"""
messages = state["messages"]
last_message = messages[-1].content
# 判断是否需要转给技术支持
if "技术问题" in last_message or "bug" in last_message:
return {
"messages": ["我将为您转接技术支持团队"],
"next": "technical_support" # 交接指令
}
return {
"messages": ["问题已解决"],
"next": "end"
}
def technical_support_agent(state: MessagesState):
"""技术支持代理:处理技术问题"""
messages = state["messages"]
last_message = messages[-1].content
# 判断是否需要升级到工程师
if "严重" in last_message or "紧急" in last_message:
return {
"messages": ["问题已升级,转接工程师"],
"next": "engineer"
}
return {
"messages": ["技术问题已解决"],
"next": "end"
}
def engineer_agent(state: MessagesState):
"""工程师代理:处理复杂技术问题"""
return {
"messages": ["工程师已介入,正在处理"],
"next": "end"
}
# 构建带交接的工作流
def route_next(state: MessagesState) -> Literal["customer_service", "technical_support", "engineer", "end"]:
"""根据 next 字段路由"""
return state.get("next", "customer_service")
graph = StateGraph(MessagesState)
graph.add_node("customer_service", customer_service_agent)
graph.add_node("technical_support", technical_support_agent)
graph.add_node("engineer", engineer_agent)
# 添加条件路由
graph.add_conditional_edges("customer_service", route_next)
graph.add_conditional_edges("technical_support", route_next)
app = graph.compile()
# 优势:
# - 动态决策何时交接
# - 支持多层级升级
# - 保持上下文连续性
3. Skills(技能系统)- 共享能力
定义可在多个代理之间共享的技能和工具集。
"""
Skills 模式 - 共享技能系统
"""
from langchain.tools import tool
# 定义共享技能
@tool
def search_database(query: str) -> dict:
"""搜索数据库的共享技能"""
# 所有代理都可以使用此技能
return {"results": ["数据 1", "数据 2", "数据 3"]}
@tool
def send_notification(recipient: str, message: str) -> str:
"""发送通知的共享技能"""
# 所有代理都可以发送通知
return f"通知已发送给 {recipient}"
@tool
def format_report(data: dict, format: str) -> str:
"""格式化报告的共享技能"""
# 所有代理都可以使用统一的格式化
return f"报告已格式化为 {format}"
# 为多个代理配置相同的技能
common_skills = [search_database, send_notification, format_report]
# Agent 1: 数据分析师(使用共享技能)
from langchain_core.agents import create_agent
analyst_agent = create_agent(
model="gpt-4o",
tools=common_skills, # 共享技能
system_prompt="你是数据分析师,可以搜索数据、发送通知、格式化报告"
)
# Agent 2: 报告生成器(使用相同的共享技能)
reporter_agent = create_agent(
model="claude-sonnet-4-5",
tools=common_skills, # 相同的共享技能
system_prompt="你是报告生成器,可以搜索数据、发送通知、格式化报告"
)
# 优势:
# - 避免重复定义工具
# - 保证工具行为一致性
# - 易于统一维护和升级
4. Router(路由机制)- 智能分发
根据请求内容智能路由到最合适的代理。
"""
Router 模式 - 智能路由分发
"""
from typing import Literal
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, MessagesState
# 定义路由决策系统
route_prompt = ChatPromptTemplate.from_messages([
("system", """你是路由助手。根据用户请求,决定分配给哪个专员:
- sales: 销售咨询、产品介绍、报价
- support: 售后问题、技术支持、故障排除
- billing: 账单查询、支付问题、发票
- general: 其他一般性问题
仅返回一个词:sales, support, billing, 或 general"""),
("human", "{input}")
])
router_llm = ChatOpenAI(model="gpt-4o")
router_chain = route_prompt | router_llm
def router(state: MessagesState) -> Literal["sales", "support", "billing", "general"]:
"""智能路由器"""
user_input = state["messages"][-1].content
result = router_chain.invoke({"input": user_input})
return result.content.strip().lower()
# 定义各个专员代理
def sales_agent(state: MessagesState):
"""销售专员"""
return {"messages": ["销售专员:我来帮您介绍产品和报价"]}
def support_agent(state: MessagesState):
"""技术支持专员"""
return {"messages": ["技术支持:我来帮您解决技术问题"]}
def billing_agent(state: MessagesState):
"""账单专员"""
return {"messages": ["账单专员:我来帮您处理账单问题"]}
def general_agent(state: MessagesState):
"""通用专员"""
return {"messages": ["客服:我来为您服务"]}
# 构建路由工作流
graph = StateGraph(MessagesState)
# 添加所有代理节点
graph.add_node("sales", sales_agent)
graph.add_node("support", support_agent)
graph.add_node("billing", billing_agent)
graph.add_node("general", general_agent)
# 添加条件路由(从起点根据内容路由)
graph.add_conditional_edges(START, router)
app = graph.compile()
# 测试路由
test_cases = [
"我想了解你们的产品价格", # → sales
"我的账单有问题", # → billing
"软件崩溃了", # → support
"你们的营业时间是什么?" # → general
]
for test in test_cases:
result = app.invoke({"messages": [HumanMessage(content=test)]})
print(f"请求: {test}")
print(f"响应: {result['messages'][-1]}\n")
# 优势:
# - 自动分配到最合适的代理
# - 减少人工分类工作
# - 提高响应效率
5. Custom Workflow(自定义工作流)- 复杂编排
设计复杂的多步骤工作流,灵活组合多个代理和逻辑。
"""
Custom Workflow 模式 - 复杂工作流编排
"""
from typing import TypedDict, Annotated, Literal
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
# 定义工作流状态
class WorkflowState(TypedDict):
messages: Annotated[list, add_messages]
research_data: str
analysis_result: str
report_draft: str
approved: bool
# 步骤 1: 研究代理
def research_phase(state: WorkflowState):
"""研究阶段:收集数据"""
return {
"research_data": "已收集的研究数据...",
"messages": ["研究阶段完成"]
}
# 步骤 2: 分析代理
def analysis_phase(state: WorkflowState):
"""分析阶段:数据分析"""
return {
"analysis_result": "分析结果:关键发现...",
"messages": ["分析阶段完成"]
}
# 步骤 3: 写作代理
def writing_phase(state: WorkflowState):
"""写作阶段:生成报告"""
return {
"report_draft": "报告草稿:基于分析结果...",
"messages": ["报告草稿完成"]
}
# 步骤 4: 人工审批(模拟)
def human_review(state: WorkflowState):
"""人工审批阶段"""
# 实际应用中会暂停等待人工审批
# 这里模拟自动批准
return {
"approved": True,
"messages": ["报告已批准"]
}
# 步骤 5: 发布代理
def publish_phase(state: WorkflowState):
"""发布阶段:格式化和发布"""
return {
"messages": ["报告已发布"]
}
# 决策节点:根据审批结果决定下一步
def should_publish(state: WorkflowState) -> Literal["publish", "revise"]:
"""决策:是否发布"""
return "publish" if state.get("approved") else "revise"
# 步骤 6: 修订代理
def revise_phase(state: WorkflowState):
"""修订阶段:根据反馈修改"""
return {
"report_draft": "修订后的报告...",
"messages": ["报告已修订,重新提交审批"]
}
# 构建复杂工作流
workflow = StateGraph(WorkflowState)
# 添加所有节点
workflow.add_node("research", research_phase)
workflow.add_node("analysis", analysis_phase)
workflow.add_node("writing", writing_phase)
workflow.add_node("review", human_review)
workflow.add_node("publish", publish_phase)
workflow.add_node("revise", revise_phase)
# 定义流程路径
workflow.add_edge(START, "research")
workflow.add_edge("research", "analysis")
workflow.add_edge("analysis", "writing")
workflow.add_edge("writing", "review")
# 条件分支:根据审批结果
workflow.add_conditional_edges(
"review",
should_publish,
{
"publish": "publish",
"revise": "revise"
}
)
# 修订后重新审批
workflow.add_edge("revise", "review")
# 发布后结束
workflow.add_edge("publish", END)
# 编译工作流
app = workflow.compile()
# 使用
result = app.invoke({
"messages": [HumanMessage(content="创建季度销售报告")]
})
print("工作流执行完成")
print("最终消息:", result["messages"])
# 工作流执行路径:
# 研究 → 分析 → 写作 → 审批 → 发布(如批准)
# ↓
# 修订 → 重新审批(如未批准)
# 优势:
# - 灵活定义复杂业务流程
# - 支持条件分支和循环
# - 易于可视化和维护
# - 可集成人工审批节点
🎨 典型应用场景
Multi-Agent 系统在以下场景中表现出色:
场景 1: 客户服务系统
- 路由器:根据问题类型分配给不同专员
- 客服代理:处理常规问题
- 技术代理:解决技术问题
- 销售代理:处理销售咨询
- 交接机制:在代理之间流畅转移
场景 2: 内容创作流水线
- 研究代理:收集背景资料
- 写作代理:创作内容
- 编辑代理:审核和优化
- SEO 代理:优化搜索引擎可见性
- 工作流:顺序执行各阶段
场景 3: 数据分析平台
- 收集代理:从多源获取数据
- 清洗代理:数据标准化
- 分析代理:执行统计分析
- 可视化代理:生成图表
- 报告代理:生成分析报告
场景 4: 智能助理生态
- 日程代理:管理日历和提醒
- 邮件代理:处理邮件
- 搜索代理:信息检索
- 文档代理:文档管理
- 协调器:统筹各代理协作
🏗️ 架构设计原则
1. 单一职责原则
- 每个代理专注于一个明确的职责
- 避免功能重叠和职责不清
- 便于维护和测试
2. 最小知识原则
- 代理只需要知道完成自己任务所需的信息
- 通过明确的接口传递数据
- 减少代理之间的耦合
3. 可组合性原则
- 设计可重用的代理组件
- 通过组合而非继承扩展功能
- 支持灵活的工作流编排
4. 错误隔离原则
- 一个代理的失败不应导致整个系统崩溃
- 实现优雅的降级和错误处理
- 保持系统的韧性
5. 可观测性原则
- 记录代理之间的交互和状态变化
- 使用 LangSmith 等工具追踪
- 便于调试和优化
✨ Multi-Agent 最佳实践
1. 代理职责划分
- 明确边界:"客服代理"处理FAQ,"技术代理"处理故障
- 领域专注:"销售代理"专注产品推荐和报价
- 可测试:每个代理可独立测试
- 职责重叠:多个代理都能处理相同问题
- 过于宽泛:"通用代理"处理所有事情
- 边界模糊:不清楚哪个代理负责什么
2. 状态管理策略
| 状态类型 | 存储位置 | 生命周期 |
|---|---|---|
| 对话上下文 | MessagesState | 单次对话 |
| 工作流状态 | Custom State | 工作流执行期间 |
| 用户会话 | Checkpointer | 单个线程 |
| 长期数据 | Store 系统 | 跨会话持久化 |
3. 错误处理和降级
# 错误处理模式
def robust_agent(state: MessagesState):
"""带错误处理的代理"""
try:
# 尝试主要功能
result = primary_function(state)
return result
except SpecificError as e:
# 特定错误的降级策略
logger.error(f"主功能失败: {e}")
return fallback_function(state)
except Exception as e:
# 通用错误处理
logger.error(f"未预期错误: {e}")
return {
"messages": ["抱歉,遇到问题。请稍后重试。"],
"error": str(e)
}
# 优雅降级示例
def search_with_fallback(query: str):
"""带降级的搜索"""
try:
# 尝试主搜索引擎
return primary_search(query)
except:
# 降级到备用搜索
return fallback_search(query)
4. 性能优化
- 并行执行:独立任务可并行处理
- 懒加载:按需加载代理和资源
- 缓存:缓存重复请求的结果
- 流式输出:大响应使用流式传输
- 超时控制:设置合理的超时时间
5. 监控和调试
# 使用 LangSmith 追踪
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-api-key"
os.environ["LANGCHAIN_PROJECT"] = "multi-agent-system"
# 所有代理交互会被自动记录到 LangSmith
# 可以查看:
# - 代理调用序列
# - 每个代理的输入输出
# - 执行时间和成本
# - 错误和异常
❓ 常见问题
Q1: Multi-Agent 会增加成本吗?
可能会,但整体可能更划算:
- 每个代理调用都消耗 API token
- 但可以为不同代理使用不同成本的模型(简单任务用便宜模型)
- 专业化代理通常更高效,减少重复和错误
- 通过缓存和并行化可以优化成本
Q2: 如何决定是否使用 Multi-Agent?
使用 Multi-Agent 的信号:
- 任务需要多个不同领域的专业知识
- 单个 Agent 的上下文过于复杂
- 需要并行处理多个子任务
- 有明确的工作流阶段(研究 → 写作 → 编辑)
- 需要动态路由到不同处理逻辑
Q3: Multi-Agent 和 LangGraph 的关系?
LangGraph 是实现 Multi-Agent 的基础框架:
- LangGraph 提供状态图、节点、边等基础概念
- Multi-Agent 是在 LangGraph 之上的架构模式
- 可以用 LangGraph 构建任何 Multi-Agent 协作模式
- LangChain 提供了一些预置的 Multi-Agent 模式
Q4: 如何处理代理之间的冲突?
冲突解决策略:
- 优先级规则:定义代理的优先级
- 仲裁代理:引入专门的仲裁者
- 人工介入:复杂冲突交由人工决策
- 投票机制:多个代理投票决定
Q5: 如何测试 Multi-Agent 系统?
测试策略:
- 单元测试:单独测试每个代理
- 集成测试:测试代理之间的交互
- 端到端测试:测试完整工作流
- 模拟测试:模拟各种场景和边界情况
- 负载测试:测试并发和性能
Q6: 何时应该使用 DeepAgents 而非 Multi-Agent?
选择 DeepAgents:
- 需要单个强大的 Agent处理复杂任务
- 需要规划、记忆、文件管理等高级能力
- 任务不需要多个专业化角色
选择 Multi-Agent:
- 需要多个专业化代理协作
- 有明确的角色分工和工作流
- 需要动态路由和交接
结合使用:
- 每个 Multi-Agent 节点可以是一个 DeepAgent
- 获得两者的优势:专业化分工 + 强大能力