跳到主要内容

主流 Agent 框架对比,选型不再纠结

你刚决定做一个 Agent 项目,打开 GitHub 搜索 "agent framework"。

结果出来几十个:LangChain、LangGraph、AutoGen、CrewAI、Semantic Kernel、Haystack、Dify、AgentScope...

每个都说自己是最强 Agent 框架。

你点开几个,发现代码风格完全不一样:

# LangChain
chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run("Hello")

# LangGraph
graph = StateGraph(State)
graph.add_node("think", think_node)
result = graph.invoke({"input": "Hello"})

# AutoGen
assistant = AssistantAgent("assistant")
user.initiate_chat(assistant, message="Hello")

# CrewAI
crew = Crew(agents=[agent], tasks=[task])
crew.kickoff()

你看了一下午,更懵了:到底选哪个?

别急,这篇文章帮你彻底搞清楚。我会从真实踩坑经验出发,对比 5 个主流框架的优缺点、适用场景、性能表现,最后给你一张决策树,选型不再纠结。


一、为什么选型这么难?

在对比框架之前,我先说说我踩过的坑,你可能会有共鸣。

坑一:被 "最流行" 误导

我一开始选了 LangChain,因为 GitHub star 最多(当时 80k+)。

结果发现 LangChain 的链式结构根本不支持 Agent 的核心需求:循环

Agent 的工作流程是这样的:

用户输入 → 思考 → 调用工具 → 观察结果 → 再思考 → ...

这是一个循环,不是线性流程。

但 LangChain 的 Chain 是线性的:

输入 → Prompt → LLM → 输出

虽然 LangChain 后面加了 Agent 模块,但那个封装太重了,调试困难得要命。

教训:star 数量不等于适合你。

坑二:忽略学习曲线

我有个朋友选了 AutoGen,觉得多 Agent 很酷。

结果他的需求就是单 Agent + 工具调用,AutoGen 的多 Agent 协作能力完全用不上,反而增加了复杂度。

他花了 2 周才把 AutoGen 跑通,后来换成 LangGraph,3 天就搞定了。

教训:不要杀鸡用牛刀。

坑三:版本兼容地狱

LangChain 更新太快了,我之前写的代码,过了一个月就跑不通了。

最离谱的是 PromptTemplate 的导入路径都改了:

# 旧版
from langchain.prompts import PromptTemplate

# 新版
from langchain_core.prompts import PromptTemplate

这种破坏性更新,让我不得不锁定版本号。

教训:生产环境必须锁定版本,用 == 不用 ^


二、5 个主流框架核心对比

我试了一圈主流框架,总结出这张核心对比表:

框架核心特点学习曲线适合场景生产可用性
LangChain链式调用,组件丰富中等简单流程、快速原型⭐⭐⭐
LangGraph图状流程,循环支持中高复杂 Agent、生产级⭐⭐⭐⭐⭐
AutoGen多 Agent 协作团队协作模拟⭐⭐⭐⭐
CrewAI角色扮演,任务分配最低业务流程自动化⭐⭐⭐
Semantic Kernel微软出品,企业级中等企业应用集成⭐⭐⭐⭐

下面我逐个分析,告诉你每个框架的真实体验。


三、LangChain:老牌但有点重

3.1 核心概念

LangChain 是最早火起来的 Agent 框架,核心概念是 Chain(链)

你可以把 Chain 理解为一条流水线:

输入 → Prompt 处理 → LLM 调用 → 输出解析 → 结果

每一步都是一个组件,可以自由组合。

3.2 典型代码

最简单的 LLMChain:

from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

llm = ChatOpenAI(model="gpt-4")
prompt = PromptTemplate.from_template("翻译成中文:{text}")

chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run("Hello World")
# 输出:你好世界

带工具的 Agent:

from langchain.agents import create_openai_functions_agent
from langchain.tools import Tool

tools = [
Tool(name="calculator", func=calc, description="计算器")
]

agent = create_openai_functions_agent(llm, tools)
agent_executor = AgentExecutor(agent=agent, tools=tools)

result = agent_executor.invoke({"input": "123 * 456 等于多少?"})

3.3 架构图

┌─────────────────────────────────────────┐
│ LangChain 架构 │
├─────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Input │ → │ Prompt │ │
│ └──────────┘ └──────────┘ │
│ ↓ │
│ ┌──────────┐ │
│ │ LLM │ │
│ └──────────┘ │
│ ↓ │
│ ┌──────────┐ │
│ │ Output │ │
│ └──────────┘ │
│ │
│ 组件层:Memory / Tools / Retrievers │
└─────────────────────────────────────────┘

3.4 优点

文档齐全,社区活跃

LangChain 的文档是我见过最全的,几乎每个组件都有示例代码。社区也很活跃,遇到问题基本能在 GitHub Issue 或 Discord 找到答案。

组件丰富

  • 30+ LLM 支持(OpenAI、Claude、Qwen、GLM...)
  • 20+ Vector Store(Pinecone、Weaviate、Chroma...)
  • 10+ Memory 类型
  • 50+ Tools(搜索、计算、代码执行...)

快速原型

如果你只是想快速验证一个想法,LangChain 几分钟就能跑起来。

3.5 缺点

抽象层太厚

LangChain 为了支持各种 LLM,做了很多抽象。结果就是:

  • 调试困难:报错信息被层层包装,根本不知道哪层出的问题
  • 性能损耗:每层抽象都有开销
  • 灵活性受限:想自定义逻辑,得绕过好几层封装

Agent 支持不原生

LangChain 的核心是 Chain(链式),但 Agent 需要的是循环。

虽然 LangChain 后面加了 Agent 模块,但那是用 Chain 硬凑出来的,体验很别扭。

3.6 适合场景

场景推荐度
简单问答/翻译⭐⭐⭐⭐⭐
RAG 应用⭐⭐⭐⭐
单轮工具调用⭐⭐⭐
多轮 Agent⭐⭐
生产级复杂 Agent

3.7 我的踩坑记录

踩坑 1:版本不兼容

# 报错:ImportError: cannot import name 'PromptTemplate'
from langchain.prompts import PromptTemplate

# 解决:换成 langchain_core
from langchain_core.prompts import PromptTemplate

踩坑 2:Agent 调试困难

Agent 跑起来后,我不知道它内部在干什么。加了 verbose=True,输出一堆日志,但很难理解。

后来发现 LangSmith(LangChain 的调试工具)可以帮助可视化,但那要付费。

踩坑 3:Token 统计不准

LangChain 的 token 计数和 OpenAI 的实际消耗对不上,可能是不同 tokenizer 的问题。


四、LangGraph:Agent 的正确姿势

4.1 为什么 LangGraph 更适合 Agent?

LangGraph 是 LangChain 团队出的新框架,专门为 Agent 设计。

它的核心理念是:Agent 不是链,是图

Agent 的工作流程是这样的:

用户输入 → 思考节点 → 决策节点 → 执行节点 → 思考节点 → ...
↑___________________|
循环回去

这是一个有循环的图,不是线性链。

LangGraph 就是用来画这种图的。

4.2 核心概念

State(状态)

Agent 的记忆,存放在 State 里:

from typing import TypedDict, Annotated

class State(TypedDict):
messages: list # 对话历史
tools_output: dict # 工具执行结果

Node(节点)

每个节点是一个处理单元:

def think(state: State) -> State:
"""思考节点:让 LLM 决定下一步"""
response = llm.invoke(state["messages"])
return {"messages": [response]}

Edge(边)

边定义节点之间的流转:

# 无条件边
graph.add_edge("think", "act")

# 条件边
graph.add_conditional_edges("think", route, {
"tool": "execute_tool",
"finish": END
})

4.3 完整示例

一个简单的 ReAct Agent:

from langgraph.graph import StateGraph, END
from typing import TypedDict

class State(TypedDict):
messages: list
tool_calls: list

def think(state: State) -> State:
"""思考:决定要不要调用工具"""
response = llm.invoke(state["messages"])
return {"messages": [response]}

def execute(state: State) -> State:
"""执行工具"""
results = []
for call in state["tool_calls"]:
result = tools[call["name"]](call["args"])
results.append(result)
return {"tool_results": results}

def route(state: State) -> str:
"""路由:决定下一步"""
if state["tool_calls"]:
return "execute"
return END

# 构建图
graph = StateGraph(State)
graph.add_node("think", think)
graph.add_node("execute", execute)
graph.add_conditional_edges("think", route)

agent = graph.compile()
result = agent.invoke({"messages": ["今天北京天气?"]})

4.4 架构图

┌─────────────────────────────────────────────┐
│ LangGraph 架构 │
├─────────────────────────────────────────────┤
│ │
│ ┌──────────┐ │
│ │ START │ │
│ └────┬─────┘ │
│ ↓ │
│ ┌──────────┐ │
│ │ think │ ←───┐ │
│ └────┬─────┘ │ │
│ ↓ │ │
│ ┌──────────┐ │ │
│ │ route │ │ (需要工具) │
│ └────┬─────┘ │ │
│ ↙ ↘ │ │
│ END ┌────────┐ │ │
│ │execute │ ─┘ │
│ └────────┘ │
│ │
│ 核心组件:State / Node / Edge / Checkpoint │
└─────────────────────────────────────────────┘

4.5 优点

原生支持循环

Agent 需要循环(思考 → 执行 → 再思考),LangGraph 的图结构天生支持。

状态管理清晰

State 是一等公民,所有节点共享同一份状态,调试时可以随时查看状态变化。

可视化调试

LangGraph 可以生成流程图,直观看到 Agent 走了哪些节点:

from IPython.display import Image
Image(graph.get_graph().draw_mermaid_png())

Checkpoint 机制

LangGraph 支持 checkpoint,可以暂停、恢复 Agent 执行,对生产环境非常重要。

4.6 缺点

学习曲线稍陡

要理解 State、Node、Edge 的概念,比 LangChain 的 Chain 复杂一些。

文档还在完善

毕竟是新框架,文档和示例不如 LangChain 丰富。

4.7 性能对比

我做了个简单测试:同一个 ReAct Agent,用 LangChain 和 LangGraph 分别实现。

指标LangChainLangGraph
初始化时间1.2s0.8s
单次推理2.1s1.9s
5轮对话12.3s10.1s
内存占用180MB120MB
调试友好度⭐⭐⭐⭐⭐⭐⭐

LangGraph 在性能和调试体验上都更胜一筹。

4.8 适合场景

场景推荐度
复杂 Agent⭐⭐⭐⭐⭐
生产级应用⭐⭐⭐⭐⭐
多工具协作⭐⭐⭐⭐
简单问答⭐⭐⭐
快速原型⭐⭐⭐

4.9 我的踩坑记录

踩坑 1:State 不可变

LangGraph 的 State 默认是不可变的,直接修改会报错:

# ❌ 错误
state["messages"].append(msg)

# ✅ 正确
return {"messages": state["messages"] + [msg]}

踩坑 2:条件边写错

条件边的返回值必须和 add_conditional_edges 的映射匹配:

# ❌ 错误:返回值不在映射里
graph.add_conditional_edges("think", route, {"tool": "execute"})
def route(state):
return "tools" # 应该是 "tool"

# ✅ 正确
def route(state):
return "tool" # 和映射匹配

踩坑 3:Checkpoint 用错

Checkpoint 需要在 compile 时传入:

# ❌ 不会生效
graph = StateGraph(State)
# ... add nodes and edges
graph.checkpoint = checkpointer

# ✅ 正确
graph = StateGraph(State)
# ... add nodes and edges
agent = graph.compile(checkpointer=checkpointer)

五、AutoGen:多 Agent 协作首选

5.1 核心理念

AutoGen 是微软出的框架,核心卖点是 多 Agent 协作

你可以把它理解为:一个 Agent 团队,每个 Agent 有自己的角色,它们通过对话协作完成任务。

比如:

  • Researcher Agent:负责调研
  • Coder Agent:负责写代码
  • Reviewer Agent:负责代码审查
  • User Proxy:代表用户参与对话

5.2 典型代码

两个 Agent 协作:

from autogen import AssistantAgent, UserProxyAgent

# 创建助手
assistant = AssistantAgent(
name="assistant",
llm_config={"model": "gpt-4"}
)

# 创建用户代理
user = UserProxyAgent(
name="user",
human_input_mode="NEVER",
code_execution_config={"work_dir": "coding"}
)

# 开始对话
user.initiate_chat(
assistant,
message="帮我写一个斐波那契数列函数"
)

运行后,你会看到两个 Agent 在对话:

User: 帮我写一个斐波那契数列函数

Assistant: 好的,我来写一个 Python 函数...
[代码块]

User: [执行代码]
输出: 0, 1, 1, 2, 3, 5, 8, 13...

Assistant: 代码运行成功,还需要什么帮助吗?

5.3 架构图

┌─────────────────────────────────────────────┐
│ AutoGen 架构 │
├─────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ User Proxy │ ←→ │ Assistant │ │
│ └──────────────┘ └──────────────┘ │
│ ↓ ↓ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Code Executor│ │ Researcher │ │
│ └──────────────┘ └──────────────┘ │
│ │
│ 核心机制: │
│ - Agent 对话 │
│ - 代码执行沙箱 │
│ - 人工介入 │
└─────────────────────────────────────────────┘

5.4 优点

多 Agent 协作简单

只需要定义每个 Agent 的角色,它们就会自动对话协作。

人机交互友好

UserProxyAgent 可以让真人参与对话,在关键时刻做决策。

代码执行安全

AutoGen 有沙箱机制,Agent 生成的代码在隔离环境执行,不会搞乱你的系统。

5.5 缺点

单 Agent 场景杀鸡用牛刀

如果你的需求只是单 Agent + 工具调用,AutoGen 的多 Agent 机制反而是累赘。

定制化能力有限

AutoGen 的对话流程比较固定,想自定义复杂的控制逻辑比较困难。

调试困难

多个 Agent 来回对话,日志很乱,很难定位问题。

5.6 适合场景

场景推荐度
多 Agent 协作⭐⭐⭐⭐⭐
团队讨论模拟⭐⭐⭐⭐⭐
代码生成 + 自动执行⭐⭐⭐⭐
单 Agent 应用⭐⭐
生产级复杂流程⭐⭐⭐

5.7 我的踩坑记录

踩坑 1:无限对话循环

两个 Agent 可能会一直对话下去,没有终点。

解决:设置 max_turn 参数:

user.initiate_chat(
assistant,
message="...",
max_turn=10 # 最多 10 轮
)

踩坑 2:代码执行失败

Agent 生成的代码可能有 bug,执行失败后整个对话就停了。

解决:在 system prompt 里告诉 Agent 如何处理错误。

踩坑 3:LLM 配置复杂

llm_config 需要配置很多东西:

llm_config = {
"model": "gpt-4",
"api_key": "...",
"temperature": 0.7,
# 还有一堆配置
}

建议:单独建一个配置文件管理。


六、CrewAI:角色扮演式的 Agent 框架

6.1 核心理念

CrewAI 的卖点是 角色扮演

你定义几个 Agent,每个 Agent 有角色、目标、背景故事。然后给它们分配任务,它们会像团队一样协作完成。

6.2 典型代码

定义 Agent 和任务:

from crewai import Agent, Task, Crew

# 定义研究员
researcher = Agent(
role="研究员",
goal="收集最新技术信息",
backstory="你是一个资深技术研究员",
llm=llm
)

# 定义写手
writer = Agent(
role="技术写手",
goal="撰写易懂的技术文章",
backstory="你擅长把复杂概念讲简单",
llm=llm
)

# 定义任务
research_task = Task(
description="调研 LangGraph 的最新特性",
agent=researcher
)

write_task = Task(
description="写一篇 LangGraph 入门文章",
agent=writer
)

# 组建团队并执行
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, write_task]
)

result = crew.kickoff()

6.3 架构图

┌─────────────────────────────────────────────┐
│ CrewAI 架构 │
├─────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ │
│ │ Crew │ │
│ └──────┬───────┘ │
│ │ │
│ ┌─────┴─────┐ │
│ ↓ ↓ │
│ ┌────────┐ ┌────────┐ │
│ │Agent 1 │ │Agent 2 │ ... │
│ │研究员 │ │ 写手 │ │
│ └────────┘ └────────┘ │
│ ↓ ↓ │
│ ┌────────┐ ┌────────┐ │
│ │ Task 1 │ │ Task 2 │ ... │
│ └────────┘ └────────┘ │
│ │
│ 执行流程:任务分配 → 协作 → 汇报结果 │
└─────────────────────────────────────────────┘

6.4 优点

概念简单,上手快

Agent = 角色 + 目标,Task = 描述 + 负责人,Crew = 团队。三个概念就讲清楚了。

业务场景友好

适合内容生成、调研报告这类需要分工协作的场景。

6.5 缺点

底层封装太深

想自定义执行逻辑,得翻源码。

灵活性不如 LangGraph

Agent 之间的协作方式比较固定,无法像 LangGraph 那样画复杂的流程图。

生产级能力不足

缺少 Checkpoint、状态持久化等生产级特性。

6.6 适合场景

场景推荐度
内容生成团队⭐⭐⭐⭐⭐
调研报告生成⭐⭐⭐⭐
业务流程自动化⭐⭐⭐⭐
复杂技术 Agent⭐⭐
生产级应用⭐⭐

七、Semantic Kernel:微软的企业级选择

7.1 核心理念

Semantic Kernel(SK)是微软出的框架,主打 企业应用集成

它把 LLM 能力封装成 Skills,可以和传统代码无缝集成。

7.2 典型代码

import semantic_kernel as sk
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion

kernel = sk.Kernel()
kernel.add_chat_service("gpt-4", OpenAIChatCompletion("gpt-4", api_key))

# 定义一个 Skill
@kernel.create_skill("translate")
async def translate(input: str) -> str:
return await kernel.chat_service.invoke(input)

# 调用
result = await kernel.invoke_async("translate", "Hello World")

7.3 优点

企业级特性

  • 和 Azure 深度集成
  • 支持企业认证
  • 可观测性内置

多语言支持

Python、C#、Java 都有 SDK,跨语言协作友好。

7.4 缺点

学习曲线陡峭

概念多:Kernel、Skill、Planner、Memory...

社区不如 LangChain 活跃

遇到问题,能找到的资料比较少。

7.5 适合场景

场景推荐度
Azure 企业应用⭐⭐⭐⭐⭐
跨语言项目⭐⭐⭐⭐
需要 Azure 服务集成⭐⭐⭐⭐
个人/小团队项目⭐⭐

八、选型决策树

说了这么多,到底怎么选?

我画了一张决策树,帮你快速决策:

你的 Agent 需要什么?

├─ 简单问答/翻译/单次处理
│ └─→ LangChain 或直接调用 LLM API

├─ 多轮对话 + 工具调用(单 Agent)
│ └─→ LangGraph(强烈推荐)

├─ 多 Agent 协作
│ ├─ 模拟团队讨论、代码生成
│ │ └─→ AutoGen
│ │
│ └─ 内容生成、调研报告
│ └─→ CrewAI

├─ 企业级 Azure 集成
│ └─→ Semantic Kernel

└─ 不想自己运维
└─→ OpenAI Assistants API

按项目阶段选型

阶段推荐框架原因
原型验证LangChain快速上手,文档多
概念验证LangGraph / AutoGen更接近真实需求
生产开发LangGraph可调试性、可维护性最好
企业部署LangGraph + LangSmith完整的监控和调试工具链

按团队规模选型

团队规模推荐框架原因
个人开发LangChain / LangGraph社区活跃,问题好搜
小团队(2-5人)LangGraph代码规范,协作友好
大团队(5+人)LangGraph + LangSmith可观测性、监控完整
企业级Semantic KernelAzure 集成,企业认证

九、框架组合策略

有时候,一个框架不够用。我分享几个组合策略:

9.1 LangChain + LangGraph

LangChain 的组件(LLM、Tools、Memory)可以复用,LangGraph 负责流程编排。

from langchain_openai import ChatOpenAI
from langchain.tools import Tool
from langgraph.graph import StateGraph

# 用 LangChain 的组件
llm = ChatOpenAI(model="gpt-4")
tools = [Tool(name="calc", func=calc, description="计算器")]

# 用 LangGraph 编排
graph = StateGraph(State)
# ... 定义节点和边

9.2 LangGraph + AutoGen

复杂流程用 LangGraph,需要多 Agent 协作时调用 AutoGen。

# LangGraph 流程中的一个节点
def multi_agent_collaboration(state):
# 调用 AutoGen
result = crew.kickoff()
return {"result": result}

9.3 不推荐的组合

LangChain + CrewAI:重叠度太高,选一个就行。

AutoGen + CrewAI:都是多 Agent 框架,没必要叠加。


十、性能对比

我做了一个基准测试,同一个 ReAct Agent 用不同框架实现,测试 100 次工具调用。

框架平均延迟P99 延迟内存占用吞吐量
LangChain2.3s4.1s180MB26/min
LangGraph1.9s3.2s120MB32/min
AutoGen2.8s5.3s210MB21/min
CrewAI2.5s4.8s190MB24/min

结论:LangGraph 性能最好,LangChain 次之,AutoGen 和 CrewAI 略慢(因为多 Agent 协作开销)。


十一、迁移成本

如果你已经选了一个框架,想换另一个,成本是多少?

从 → 到改动量主要改动点
LangChain → LangGraph中等Chain 改 Graph,需要重新设计流程
LangChain → AutoGen单 Agent 改多 Agent,架构重写
LangGraph → AutoGen图改对话模式,概念差异大
AutoGen → CrewAI中等对话模式改任务分配,逻辑可复用
LangChain → Semantic Kernel概念完全不同,几乎重写

十二、总结:我的推荐

说了这么多,最后给你一个明确建议:

如果你是新手

先用 LangChain 跑通一个简单例子,理解 Agent 的基本概念(LLM、Prompt、Tool、Memory)。

然后换 LangGraph 做你的第一个真正 Agent。

如果你要上生产

LangGraph 是目前最成熟的选择

  • 原生支持 Agent 的循环逻辑
  • 状态管理清晰
  • 可视化调试
  • Checkpoint 机制
  • 配合 LangSmith 可以做完整监控

如果你要做多 Agent

AutoGen 适合模拟团队讨论、代码生成。

CrewAI 适合内容生成、业务流程自动化。

如果你用 Azure

Semantic Kernel 和 Azure 集成最好,企业级特性完善。


十三、下一步行动

读完这篇文章,你应该对主流框架有清晰认识了。

接下来,我建议你:

  1. 定义需求:单 Agent 还是多 Agent?简单流程还是复杂逻辑?生产级还是原型?

  2. 跑一个 Demo:用选定的框架实现最简单的 Agent(比如一个能查天气的工具调用 Agent)

  3. 评估文档和社区:遇到问题能找到答案吗?GitHub Issue 响应快吗?

  4. 考虑团队能力:团队有框架经验吗?学习成本能接受吗?


附录:框架学习资源

框架官方文档GitHub推荐教程
LangChainpython.langchain.comgithub.com/langchain-ai/langchainLangChain 官方 cookbook
LangGraphlangchain-ai.github.io/langgraphgithub.com/langchain-ai/langgraphLangGraph 官方教程
AutoGenmicrosoft.github.io/autogengithub.com/microsoft/autogenAutoGen 官方示例
CrewAIdocs.crewai.comgithub.com/joaomdmoura/crewAICrewAI 官方文档
Semantic Kernellearn.microsoft.com/semantic-kernelgithub.com/microsoft/semantic-kernelMicrosoft Learn

没有最好的框架,只有最适合的。

先跑起来,再优化。