多个 LLM 智能体协同工作时,复杂性不是线性增长——是呈指数级。从简单的主从分工到复杂的自主组织,每一个设计选择都会产生大量连带影响。本文系统拆解多智能体架构的 5 大核心挑战,用 3 个主流框架的实战代码给出落地方案。
1. 为什么需要多智能体?
单智能体的瓶颈:
- 上下文窗口限制 → 知识过载导致决策质量下降
- 角色模糊 → 同一模型既要技术决策又要商业判断
- 并发瓶颈 → 顺序执行无法处理并行任务
- 不稳定 → 复杂任务中错误容易扩散
多智能体的价值:
- 分工:每个 Agent 专精一个领域(研究、写作、代码、测试)
- 并行:信息收集和代码实现可以同时进行
- 审查:Agent A 写完代码,Agent B 自动做代码审查
- 弹性:一个 Agent 失败,其他 Agent 可以接管或通知人类
2. 通信协议:Agent 之间怎么说话?
2.1 直接对话(Direct Message)
Agent-A ←→ Agent-B
↑ ↓
Agent-C ←→ Agent-D
简单、直接。适合小规模协作(2-4 个 Agent)。
2.2 共享黑板(Shared Blackboard)
┌─────────────┐
│ Shared DB │ ← 所有 Agent 读写
└─────────────┘
↑ ↑ ↑ ↑
A B C D
Agent 将自己的结论写入黑板,其他 Agent 读取。状态集中、可观测性强。
2.3 层级汇报(Hierarchical)
Manager
/ | \
Dev Q&A Ops
/\ | /\
FE BE Test Mtr Alert
适合有明确汇报线的组织结构。Manager Agent 负责任务分发和冲突仲裁。
2.4 联邦协商(Federated Negotiation)
代理人之间通过协商分配资源(如 CPU、API 调用额度、优先级)。
3. 主流框架对比
| 维度 | CrewAI | AutoGen (Microsoft) | LangGraph |
|---|---|---|---|
| 核心思想 | 角色驱动 + 任务流程 | 对话驱动 + 可编程 Agent | 图结构 + 状态机 |
| 抽象层级 | 高(几行代码定义角色和任务) | 中(Agent + Conversation) | 低(Nodex + Edge) |
| 并行支持 | 顺序执行为主,可配置并行 | 支持并发 Agent 会话 | 完全并行(图驱动) |
| 工具调用 | 自动注入到角色 Prompt | Agent-level Function Calling | 节点级工具集成 |
| 记忆管理 | 每轮任务记忆 | 会话级 + 语义记忆 | 显式状态管理 |
| 调式友好度 | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
| 最佳场景 | 内容创作、产品分析 | 代码生成、数据分析 | 复杂流程编排 |
4. CrewAI 实战:产品开发团队仿真
4.1 安装
pip install crewai crewai-tools langchain-openai
4.2 定义角色和任务
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool
# 工具
search = SerperDevTool()
# 定义 Agent
researcher = Agent(
role="产品研究员",
goal="深入研究目标用户、竞品和市场机会",
backstory="你是一位有 10 年经验的 SaaS 产品研究员,擅长提炼用户痛点。",
tools=[search],
verbose=True,
)
writer = Agent(
role="产品文档撰写者",
goal="基于研究成果撰写高质量的产品需求文档",
backstory="你是一位资深的 Agile 产品负责人,擅长将模糊的想法转化为可执行的 PRD。",
verbose=True,
)
reviewer = Agent(
role="产品文档审查者",
goal="审查 PRD 的完整性和可执行性",
backstory="你是一位严格的技术 VP,确保每个 PRD 都有清晰的验收标准。",
verbose=True,
)
# 定义任务
task1 = Task(
description="研究 '个人开发者 AI 工具 SaaS' 市场。包括:1) 目标用户画像;2) TOP5 竞品及其定价;3) 核心痛点未满足”。输出结构化的调研报告。",
expected_output="500 字以上的结构化调研报告,包含用户画像、竞品分析和 3 个核心痛点。",
agent=researcher,
)
task2 = Task(
description="基于调研报告,撰写产品需求文档(PRD),包括:产品概述、核心功能列表、用户故事、验收标准。",
expected_output="完整的 Markdown PRD 文档,不少于 800 字。",
agent=writer,
)
task3 = Task(
description="审查 PRD:检查是否包含用户故事、是否有明确验收标准、技术可行性如何。给出修改建议。",
expected_output="审查报告,列出 5-10 条详细的修改建议。",
agent=reviewer,
)
# 组装 Crew
crew = Crew(
agents=[researcher, writer, reviewer],
tasks=[task1, task2, task3],
process=Process.sequential, # 顺序执行(也可以 Process.parallel)
verbose=True,
)
# 运行
result = crew.kickoff(inputs={"topic": "个人开发者 AI 工具 SaaS"})
print(result)
4.3 从顺序到并行
from crewai import Process
# Process.parallel — 所有 Agent 同时工作
crew = Crew(
agents=[researcher, writer, reviewer],
tasks=[task1, task2, task3],
process=Process.parallel,
)
# Process.hierarchical — Manager Agent 动态调度
crew = Crew(
agents=[researcher, writer, reviewer],
tasks=[task1, task2, task3],
process=Process.hierarchical,
manager_llm="gpt-4o", # 指定 Manager 的模型
)
5. LangGraph 实战:复杂工作流编排
LangGraph 允许你定义显式的状态转换图,每个节点是一个 Agent,每条边是条件分支。
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator
# 定义状态
class AgentState(TypedDict):
messages: Annotated[list, operator.add]
next_step: str
research_done: bool
code_done: bool
test_passed: bool
# 定义节点(Agent 函数)
def research_agent(state):
# 调用 LLM 做研究
return {"messages": ["Research completed"], "research_done": True, "next_step": "code"}
def code_agent(state):
if not state["research_done"]:
return {"messages": ["Need research first"], "next_step": "research"}
# 生成代码
return {"messages": ["Code generated"], "code_done": True, "next_step": "test"}
def test_agent(state):
if not state["code_done"]:
return {"messages": ["Need code first"], "next_step": "code"}
# 运行测试
passed = True # 模拟
return {
"messages": ["Tests passed" if passed else "Tests failed"],
"test_passed": passed,
"next_step": "end" if passed else "code",
}
# 定义条件路由
def router(state):
return state["next_step"]
# 构建图
builder = StateGraph(AgentState)
builder.add_node("research", research_agent)
builder.add_node("code", code_agent)
builder.add_node("test", test_agent)
builder.add_edge("research", "code")
builder.add_edge("code", "test")
builder.add_conditional_edges("test", router, {"end": END, "code": "code"})
builder.set_entry_point("research")
graph = builder.compile()
# 运行
result = graph.invoke({
"messages": ["Implement REST API for user management"],
"research_done": False,
"code_done": False,
"test_passed": False,
})
6. 性能优化与故障注入
6.1 常见性能问题
| 问题 | 原因 | 解决策略 |
|---|---|---|
| Agent 死锁 | 循环依赖(A 等 B,B 等 A) | 设置全局超时;引入 Manager Agent |
| 令牌膨胀 | 聊天记录无限增长 | 滑动窗口摘要;向量记忆 |
| 工具选择失败 | 工具描述模糊,模型选错 | 增加工具名字的唯一性;One-shot prompting |
| 达成共识慢 | N 个 Agent 需要全体一致 | 多数投票制 > 全员一致 |
6.2 容错策略
from tenacity import retry, stop_after_attempt, wait_exponential
class FaultTolerantAgent:
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=4, max=10)
)
def invoke_with_retry(self, agent, task):
try:
return agent.run(task)
except Exception as e:
# 降级策略:跳过当前任务,流式报告错误
return {"status": "error", "fallback": str(e)}
7. 选型决策树
团队规模 ≤ 3 Agent?
├── 是 → Agent 间通信复杂度低
│ ├── 任务高度结构化(如流水线)? → LangGraph (图编排)
│ └── 任务偏创意协作(如写作)? → CrewAI (角色驱动)
│
└── 否 → 需要水平扩展
├── 需要动态角色创建? → AutoGen (对话驱动)
├── 需要严格状态管理? → LangGraph
└── 快速原型验证? → CrewAI
推荐阅读
📂 相关专题:
- AI 智能体架构设计 — 单智能体五大核心组件
- Agent 工作流编排设计 — DAG 与状态机实现
- LLM Agent 安全与评估 — 多智能体红队测试
FAQ
Q: CrewAI 和 AutoGen 哪个更适合代码生成团队?
A: AutoGen 更适合。AutoGen 的 CodeInterpreter + UserProxy 模式允许代码自动执行 + 人类确认,在代码验证环节比 CrewAI 的纯文本输出更直接。
Q: Manager Agent 用 GPT-4o-mini 还是 GPT-4o?
A: 如果 Manager 主要做任务分发(简单分类),mini 即可。如果 Manager 需要理解复杂依赖、动态调整优先级,用 GPT-4o。成本差异约为 10 倍。
Q: 怎么判断 “该用单智能体还是多智能体”?
A: 如果任务需要 >5 步且步骤之间存在明确的并行机会或专业壁垒(如需要同时调用数据库和视觉模型),则用多智能体。如果只是顺序工具调用,单智能体更简单可靠。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。