引言
2025-2026年是AI Agent工程化的爆发期。当你的Agent从"单个LLM+Prompt"进化到"多Agent协作系统"时,一个不可回避的问题浮现:用什么框架编排?
目前开源社区三大主流选择——LangGraph、CrewAI、AutoGen——代表了三种截然不同的架构哲学:
- LangGraph:图驱动,用显式状态机精确控制每一步
- CrewAI:角色驱动,模拟人类团队的自然协作模式
- AutoGen:对话驱动,通过Agent间的多轮对话迭代求解
本文将从架构设计哲学、核心抽象、代码实战、生产就绪性四个维度进行全方位对比,并给出选型决策树。
一、三大框架的架构哲学
1.1 LangGraph:图驱动的精确控制
LangGraph是LangChain团队推出的底层编排框架,核心思想是:一切皆节点,一切皆边。
┌─────────────────────────────────────────────────┐
│ LangGraph 架构 │
│ │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ Node │───▶│ Node │───▶│ Node │ │
│ │(分类) │ │(检索) │ │(生成) │ │
│ └──────┘ └──────┘ └──────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────┐ │
│ │ Shared State (TypedDict) │ │
│ │ messages / intent / context / ... │ │
│ └─────────────────────────────────────┘ │
│ │ │
│ Checkpointer │
│ (Memory / SQLite / Postgres) │
└─────────────────────────────────────────────────┘
核心抽象:
| 概念 | 说明 |
|---|---|
| State | TypedDict定义的共享状态,在节点间传递 |
| Node | 纯函数,接收State、返回State更新 |
| Edge | 控制流连接(普通边/条件边) |
| Checkpointer | 每步自动保存状态,支持断点恢复 |
设计哲学: 开发者必须显式定义所有可能的执行路径和条件分支。这种"白盒"设计保证了流程的可预测性、可审计性、可调试性,代价是代码量较大、学习曲线陡峭。
1.2 CrewAI:角色驱动的团队协作
CrewAI的核心隐喻是人类团队。你定义角色(Agent)、分配任务(Task)、组建团队(Crew),框架自动处理协作流程。
┌─────────────────────────────────────────────────┐
│ CrewAI 架构 │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Agent │ │ Agent │ │ Agent │ │
│ │研究员 │ │写作者 │ │审核员 │ │
│ │goal:... │ │goal:... │ │goal:... │ │
│ │backstory│ │backstory│ │backstory│ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Task │──▶│ Task │──▶│ Task │ │
│ │(调研) │ │(撰写) │ │(审核) │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ Process: Sequential / Hierarchical / Flows │
│ Memory: Short-term / Long-term / Entity │
└─────────────────────────────────────────────────┘
核心抽象:
| 概念 | 说明 |
|---|---|
| Agent | 角色+目标+背景故事+工具集 |
| Task | 任务描述+预期输出+关联Agent |
| Crew | Agent集合+Process流程模式 |
| Process | Sequential(顺序)/ Hierarchical(层级经理调度)/ Flows(事件驱动) |
设计哲学: 用最直觉的方式映射人类协作模式。Agent的backstory让LLM更好地理解角色定位,降低Prompt工程负担。代码量少、上手快,但复杂流程的控制粒度不如LangGraph。
1.3 AutoGen:对话驱动的迭代求解
AutoGen是Microsoft研究院推出的多Agent对话框架,核心思想是:Agent通过"聊天"来协作,问题通过多轮对话浮现答案。
┌─────────────────────────────────────────────────┐
│ AutoGen 架构 │
│ │
│ ┌───────────┐ ┌───────────────────────┐ │
│ │UserProxy │ │ GroupChat │ │
│ │Agent │ │ ┌─────┐ ┌─────┐ │ │
│ │ │──▶│ │Code │ │Writer│ │ │
│ │ │ │ │Gen │ │ │ │ │
│ │ │ │ └──┬──┘ └──┬──┘ │ │
│ └───────────┘ │ │ │ │ │
│ │ ▼ ▼ │ │
│ │ ┌──────────────┐ │ │
│ │ │ GroupChat │ │ │
│ │ │ Manager │ │ │
│ │ │ (发言选择策略) │ │ │
│ │ └──────────────┘ │ │
│ └───────────────────────┘ │
│ │
│ 终止条件: TERMINATE / max_round / custom │
│ 发言选择: RoundRobin / Auto(LLM决策) │
└─────────────────────────────────────────────────┘
v0.4 架构三层分层设计(2025年1月重构):
| 层级 | 名称 | 职责 |
|---|---|---|
| Core | 核心层 | 事件驱动代理系统基础构建块 |
| AgentChat | 中间层 | 任务驱动高级API(群聊、代码执行、预构建代理) |
| Extensions | 扩展层 | 第三方集成(Azure代码执行器、OpenAI客户端、MCP等) |
⚠️ 重要变更: 2025年10月,Microsoft宣布AutoGen与Semantic Kernel合并为Microsoft Agent Framework(MAF)。AutoGen不再作为独立库接收重大功能更新,但其对话驱动的架构思想被MAF继承。
二、核心机制对比:状态、控制与工具
2.1 状态管理
这是三个框架最本质的差异:
# LangGraph:显式类型化状态
class AgentState(TypedDict):
messages: Annotated[list, add_messages] # 自定义reducer
intent: str
retrieved_docs: list[str]
response: str
# CrewAI:任务间上下文传递
task_research = Task(
description="研究{topic}",
expected_output="研究报告JSON",
agent=researcher
)
task_write = Task(
description="基于研究撰写文章",
expected_output="完整文章",
agent=writer,
context=[task_research] # 依赖上游任务输出
)
# AutoGen:对话历史即状态
# 状态隐含在GroupChat的messages列表中
# v0.4支持自定义内存组件
关键差异:
| 维度 | LangGraph | CrewAI | AutoGen |
|---|---|---|---|
| 状态可见性 | 全局显式TypedDict | 任务间context传递 | 隐含在对话历史 |
| 类型安全 | ✅ 编译期检查 | ❌ 动态 | ❌ 动态 |
| 持久化 | ✅ 内置Checkpointer | ⚠️ 需配置Memory | ❌ 需自行实现 |
| 断点恢复 | ✅ 原生支持 | ⚠️ 有限支持 | ❌ 无官方方案 |
2.2 执行控制
LangGraph提供最精细的控制——条件边、并行边、循环:
from langgraph.graph import StateGraph, START, END
workflow = StateGraph(AgentState)
workflow.add_node("classify", classify_intent)
workflow.add_node("retrieve", retrieve_documents)
workflow.add_node("generate", generate_response)
workflow.add_node("escalate", human_review)
workflow.add_edge(START, "classify")
workflow.add_edge("classify", "retrieve")
# 条件路由:根据意图决定是否需要人工审核
workflow.add_conditional_edges(
"retrieve",
lambda state: "escalate" if state["risk_level"] > 0.8 else "generate",
{"escalate": "escalate", "generate": "generate"}
)
workflow.add_edge("escalate", "generate")
workflow.add_edge("generate", END)
graph = workflow.compile(
checkpointer=MemorySaver(), # 状态持久化
interrupt_before=["escalate"] # Human-in-the-Loop
)
CrewAI提供三种流程模式:
from crewai import Agent, Task, Crew, Process
# 模式1:顺序执行(任务按定义顺序逐一完成)
crew = Crew(
agents=[researcher, writer, reviewer],
tasks=[task_research, task_write, task_review],
process=Process.sequential
)
# 模式2:层级管理(Manager Agent自动调度)
crew = Crew(
agents=[researcher, writer, reviewer],
tasks=[task_research, task_write, task_review],
process=Process.hierarchical,
manager_llm="gpt-4o" # 经理Agent使用的模型
)
# 模式3:Flows(事件驱动,生产级架构)
# @start / @listen / @router 装饰器定义事件流
AutoGen通过对话轮次和发言策略控制:
from autogen import AssistantAgent, UserProxyAgent
from autogen import RoundRobinGroupChat, SelectorGroupChat
# AutoGen v0.4 (AgentChat层)
code_agent = AssistantAgent(name="Coder", system_message="...")
review_agent = AssistantAgent(name="Reviewer", system_message="...")
# 发言选择策略
group_chat = SelectorGroupChat(
participants=[code_agent, review_agent],
max_round=10, # 防止无限循环
termination_condition=lambda msgs: "TERMINATE" in msgs[-1].content
)
2.3 Human-in-the-Loop
| 框架 | 实现方式 | 灵活度 |
|---|---|---|
| LangGraph | interrupt_before/after + Checkpointer | ⭐⭐⭐⭐⭐ 精确到任意节点 |
| CrewAI | 通过自定义工具回调 | ⭐⭐⭐ 需额外工程 |
| AutoGen | UserProxyAgent 多种输入模式 | ⭐⭐⭐⭐ 天然支持 |
LangGraph的HITL是最成熟的,可精确中断在任意节点前/后,等待人工审核后恢复执行:
# 中断图执行,等待人工输入
graph = workflow.compile(
checkpointer=PostgresSaver(conn_string),
interrupt_before=["human_review"]
)
# 恢复执行
config = {"configurable": {"thread_id": "user-123"}}
result = graph.invoke(
{"messages": [HumanMessage(content="继续执行,我已批准")]},
config=config
)
三、生产就绪性对比
3.1 可观测性
| 能力 | LangGraph | CrewAI | AutoGen |
|---|---|---|---|
| 追踪集成 | LangSmith(一等公民) | 内置日志 | OpenTelemetry(v0.4) |
| 可视化 | Mermaid图导出 | CLI工具 | AutoGen Studio |
| 节点级追踪 | ✅ 每步状态快照 | ❌ 任务级 | ❌ 消息级 |
| Token监控 | ✅ LangSmith | ⚠️ 基础 | ⚠️ v0.4增强 |
3.2 Token效率
这是一个常被忽视但极其重要的生产指标:
LangGraph: ~2000 tokens/次(聚焦提示,节点独立)
CrewAI: ~3500 tokens/次(Agent背景故事增加开销)
AutoGen: ~8000 tokens/次(多轮对话历史累积)
AutoGen的对话驱动模式导致上下文窗口快速膨胀。在生产环境中,20轮对话可能消耗数万Tokens,成本显著高于其他两个框架。
3.3 错误处理与可靠性
# LangGraph:节点级装饰器容错
from langgraph.errors import GraphRecursionError
try:
result = graph.invoke(input, config, recursion_limit=25)
except GraphRecursionError:
# 图循环次数超限
fallback_handler()
# CrewAI:任务级重试(需手动配置)
task = Task(
description="...",
agent=agent,
max_iter=5 # Agent内部重试
)
# AutoGen:终止条件兜底
group_chat = SelectorGroupChat(
participants=[...],
max_round=15 # 硬性终止
)
3.4 部署架构
LangGraph: LangGraph Cloud / LangGraph Studio(官方托管)
+ 自托管(FastAPI + PostgreSQL Checkpointer)
CrewAI: CrewAI Enterprise(官方托管)
+ 自托管(FastAPI wrapper)
AutoGen: 已并入Microsoft Agent Framework
+ Azure AI Foundry托管
+ 自托管(Docker + 自定义持久化)
四、代码实战:同一个场景,三种实现
场景: 用户提交技术问题 → 分类意图 → 检索知识库 → 生成回答 → 必要时升级人工
LangGraph实现(~80行)
from typing import TypedDict, Annotated
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langgraph.checkpoint.memory import MemorySaver
class State(TypedDict):
messages: Annotated[list, add_messages]
intent: str
docs: list
needs_human: bool
def classify(state: State) -> dict:
"""意图分类节点"""
response = llm.invoke([
{"role": "system", "content": "分类用户意图: tech_support / billing / other"},
*state["messages"]
])
return {"intent": response.content, "needs_human": response.content == "billing"}
def retrieve(state: State) -> dict:
"""检索节点"""
docs = vector_store.similarity_search(state["messages"][-1].content, k=3)
return {"docs": docs}
def respond(state: State) -> dict:
"""生成回答节点"""
context = "\n".join([d.page_content for d in state["docs"]])
response = llm.invoke([
{"role": "system", "content": f"基于以下资料回答:\n{context}"},
*state["messages"]
])
return {"messages": [response]}
def route(state: State) -> str:
return "human" if state["needs_human"] else "retrieve"
graph = StateGraph(State)
graph.add_node("classify", classify)
graph.add_node("retrieve", retrieve)
graph.add_node("respond", respond)
graph.add_node("human", human_review)
graph.add_edge(START, "classify")
graph.add_conditional_edges("classify", route, {"retrieve": "retrieve", "human": "human"})
graph.add_edge("retrieve", "respond")
graph.add_edge("human", "respond")
graph.add_edge("respond", END)
app = graph.compile(checkpointer=MemorySaver())
CrewAI实现(~40行)
from crewai import Agent, Task, Crew, Process
classifier = Agent(
role="意图分类器",
goal="精确分类用户问题意图",
backstory="你是一个经验丰富的客服路由专家",
llm="gpt-4o-mini"
)
researcher = Agent(
role="知识检索员",
goal="从知识库中找到最相关的技术文档",
backstory="你擅长在大量技术文档中快速定位答案",
tools=[search_tool]
)
writer = Agent(
role="回答生成器",
goal="基于检索结果生成专业准确的技术回答",
backstory="你是一个技术写作专家"
)
task_classify = Task(description="分类用户意图: {query}", expected_output="意图类别", agent=classifier)
task_search = Task(description="检索相关文档: {query}", expected_output="相关文档列表", agent=researcher, context=[task_classify])
task_respond = Task(description="生成专业回答", expected_output="最终回答", agent=writer, context=[task_search])
crew = Crew(agents=[classifier, researcher, writer], tasks=[task_classify, task_search, task_respond], process=Process.hierarchical, manager_llm="gpt-4o")
result = crew.kickoff(inputs={"query": "如何配置Kubernetes GPU调度?"})
AutoGen实现(~35行)
from autogen import AssistantAgent, UserProxyAgent, SelectorGroupChat
classifier = AssistantAgent(
name="Classifier",
system_message="分类用户意图并转发给合适的专家。用TERMINATE结束。",
llm_config={"config_list": [{"model": "gpt-4o-mini"}]}
)
researcher = AssistantAgent(
name="TechExpert",
system_message="你是技术专家,负责检索知识库并回答技术问题。",
tools=[search_function],
llm_config={"config_list": [{"model": "gpt-4o"}]}
)
user = UserProxyAgent(
name="User",
human_input_mode="NEVER",
max_consecutive_auto_reply=0
)
group_chat = SelectorGroupChat(
participants=[classifier, researcher, user],
max_round=10
)
result = user.initiate_chat(
group_chat,
message="如何配置Kubernetes GPU调度?"
)
代码量对比:LangGraph(~80行)> CrewAI(~40行)> AutoGen(~35行),但LangGraph提供了最精确的控制粒度。
五、选型决策树
你的需求是什么?
│
┌──────────┼──────────┐
▼ ▼ ▼
精确控制 角色化协作 迭代优化
+ 合规审计 + 快速原型 + 代码执行
│ │ │
▼ ▼ ▼
LangGraph CrewAI AutoGen
/MAF
按场景推荐
| 场景 | 推荐框架 | 理由 |
|---|---|---|
| 企业级客服系统(合规/审计/可控路由) | LangGraph | 显式状态机、条件分支、审计追踪、HITL |
| 内容生产流水线(角色分工/创意协作) | CrewAI | 角色隐喻直觉、backstory增强角色一致性 |
| 代码生成与自动化(迭代开发/沙盒执行) | AutoGen | 内置代码执行、多轮对话优化 |
| 复杂数据分析(多步骤、分支决策) | LangGraph | 精确流程控制、状态持久化 |
| 销售自动化(线索-分析-跟进-转化) | CrewAI | 自然映射销售团队角色分工 |
| 研发原型验证(快速验证想法) | CrewAI | 学习曲线最低、代码量最少 |
| Microsoft生态深度集成 | AutoGen/MAF | 原生Azure集成、Semantic Kernel协同 |
| 需要LangChain生态工具链 | LangGraph | 无缝集成LangChain工具库 |
避坑指南
1. 不要从复杂架构开始 无论选择哪个框架,都从2-3个Agent开始验证核心流程。过早引入层级、并行、循环是Agent项目失败的首要原因。
2. 设置循环上限
# LangGraph
graph.invoke(input, config={"recursion_limit": 25})
# CrewAI
crew = Crew(..., max_iter=10)
# AutoGen
group_chat = SelectorGroupChat(..., max_round=15)
3. 控制上下文膨胀 AutoGen多轮对话会快速填满上下文窗口。使用摘要模型定期压缩对话历史,或用滑动窗口保留最近N轮。
4. 错误隔离 单点Agent故障不应导致整个系统崩溃。用装饰器或错误边界包裹每个Agent节点。
六、趋势展望
三大框架的演进方向正在趋同:
- LangGraph 持续强化生产能力,LangGraph Cloud提供托管服务,LangGraph Studio提供可视化调试
- CrewAI 从"快速原型"向"生产级"进化,Flows架构引入事件驱动、支持Guardrails
- AutoGen 并入Microsoft Agent Framework,与Semantic Kernel统一,Python/.NET双语言支持
2026年的趋势是框架融合:LangGraph的精确控制、CrewAI的直觉化配置、AutoGen的对话驱动——优秀的设计理念正在互相渗透。选择框架时不要被社区热度绑架,回归你的具体场景需求才是正确答案。
总结
| 维度 | LangGraph | CrewAI | AutoGen |
|---|---|---|---|
| 架构哲学 | 图驱动显式控制 | 角色驱动团队协作 | 对话驱动迭代优化 |
| 学习曲线 | ⭐⭐(陡峭) | ⭐⭐⭐⭐(平缓) | ⭐⭐⭐(中等) |
| 生产就绪 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| Token效率 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ |
| 可观测性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ |
| HITL支持 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 适用规模 | 企业级复杂流程 | 中小规模快速迭代 | 研究探索/代码生成 |
| 社区活跃度 | 最活跃 | 快速增长 | 并入MAF |
一句话选型:需要极致控制选LangGraph,追求快速上手选CrewAI,对话式迭代选AutoGen。