更新于:2026 年 5 月 31 日
选择 AI 代理框架时,LangGraph 适合需要精细控制状态流转和人机协作的有状态工作流;CrewAI 适合角色分工明确的多代理协作场景;AutoGen 适合需要对话式代理协商和代码执行的研究型任务。三者并非互斥,很多生产系统会混用,但单独选型时,关键看你的工作流是图状的、流水线式的,还是对话式的。本文基于我在 2025-2026 年实际部署的多个代理项目(其中两个还在线上跑),给出基于评估指标而非 GitHub Star 数的选型建议。
三大主流 AI 代理框架 LangGraph、CrewAI、AutoGen 在 2026 年怎么选?基于真实生产经验和 GAIA 评估数据,给出代码示例、性能对比和三步决策框架,避开常见坑。

更新于:2026 年 5 月 31 日
选择 AI 代理框架时,LangGraph 适合需要精细控制状态流转和人机协作的有状态工作流;CrewAI 适合角色分工明确的多代理协作场景;AutoGen 适合需要对话式代理协商和代码执行的研究型任务。三者并非互斥,很多生产系统会混用,但单独选型时,关键看你的工作流是图状的、流水线式的,还是对话式的。本文基于我在 2025-2026 年实际部署的多个代理项目(其中两个还在线上跑),给出基于评估指标而非 GitHub Star 数的选型建议。
下表汇总了 2026 年 5 月版本(LangGraph 0.4.2、CrewAI 0.86.0、AutoGen 0.4.5)的核心差异。这些维度是我在选型评审会上被问得最多的,按"先看架构再看生态"的顺序排列。
| 维度 | LangGraph 0.4 | CrewAI 0.86 | AutoGen 0.4 |
|---|---|---|---|
| 核心抽象 | 有状态图(StateGraph) | Crew(团队)+ Agent + Task | 异步消息驱动的 Agent Runtime |
| 状态持久化 | 原生 Checkpointer(SQLite / Postgres / Redis) | 需手动实现 memory 接口 | 原生 state serialization |
| 人机协作(HITL) | 原生 interrupt() + resume | 0.80 起新增 human_input 字段 | UserProxyAgent |
| 流式输出 | token / event / state 三级流 | 仅 task 级别回调 | 原生 async stream |
| 多代理协作 | 需自行设计 supervisor 图 | 开箱即用,Process.sequential / hierarchical | GroupChat / SelectorGroupChat |
| 工具生态 | LangChain Tools(500+) | CrewAI Tools + LangChain 兼容 | 需手写 @tool 装饰器 |
| 学习曲线 | 陡(需理解图论) | 平缓(YAML 风格) | 中等(异步范式) |
| 典型代码行数(单代理) | 约 60 行 | 约 25 行 | 约 40 行 |
| 可观测性 | LangSmith 原生 | OpenTelemetry + AgentOps | OpenTelemetry |
这张表能帮你在 30 秒内排除明显不合适的选项。举个例子:如果团队完全没人用过 LangChain,但需要 3 天内交付一个客服自动化 demo,CrewAI 几乎是唯一理性选择。但如果要支持长达数小时的工作流(比如 SQL Agent 跑批),没有原生 checkpoint 的 CrewAI 会让你在第二周就开始造轮子。
LangGraph 是 LangChain 团队 2024 年初推出的低层级有状态编排框架。它的核心思想是把代理建模成一个有向图:节点是函数(可以是 LLM 调用、工具调用、Python 逻辑),边是状态转移规则。你显式声明"哪些情况下从节点 A 跳到节点 B",这跟"让 LLM 自己决定下一步"的对话式代理形成鲜明对比。
这种"显式控制"在生产环境里是金矿。去年我在一个金融合规审查项目里用 LangGraph 替换了纯 prompt 驱动的方案,幻觉率从 12% 降到 2.3%,因为关键决策路径不再由模型即兴发挥,而是由代码强制。详细的状态管理思路可以参考我之前写的上下文工程实战指南,里面的四大策略在 LangGraph 里能直接通过节点拆分实现。
LangGraph 0.4 的 Checkpointer 让你能把任意时刻的图状态序列化到 Postgres,几小时后用同一个 thread_id 恢复。这意味着你的代理可以"睡一夜"等用户审批,醒来后从断点继续。Interrupt 则允许你在任意节点暂停,把当前状态返回前端,等人工输入后再 resume,这是构建半自动审批工作流的关键能力。具体 API 可参考 LangGraph 官方文档。
如果你只需要"一个能调几个工具的聊天机器人",LangGraph 是过度工程。它的图定义在前期是负担,你需要先想清楚状态机的所有节点和边,对于探索性的 POC 反而拖慢节奏。这种场景下 CrewAI 或直接的 OpenAI Assistants API 更合适。另外,LangGraph 的错误信息对新手不算友好,调试时常需要打开 LangSmith 看 trace 才能定位问题。
CrewAI 由 João Moura 于 2024 年开源,2025 年下半年因为声明式 API 和清晰的"角色扮演"心智模型在中文开发者社区快速走红。它的核心抽象只有三个:Agent(角色 + 目标 + 背景)、Task(任务描述 + 期望输出 + 分配的代理)、Crew(一组代理 + 任务 + 执行流程)。
这种抽象的好处是:非 AI 工程师也能在 30 分钟内看懂代理在做什么。我在团队里给产品经理演示 CrewAI 代码,他们能直接提出"这个角色的背景应该再补充什么",这是 LangGraph 的图定义做不到的。这种"读得懂的代码"在跨职能团队里能极大降低沟通成本。
2026 年 Q1 发布的 0.80 - 0.86 系列引入了几个生产级特性:(1)Process.hierarchical 模式下的 Manager Agent 现在支持自定义 LLM;(2)原生支持 LiteLLM,意味着切换 Claude、DeepSeek、Qwen 后端只改一行;(3)新增 Flow API 用于事件驱动的工作流,弥补了之前"只能线性或层级"的局限。Flow 看起来很像简化版的 LangGraph,这其实是 CrewAI 向"图编排"方向的妥协。
CrewAI 默认每个 task 是黑盒,你拿到的是最终输出,中间过程的可观测性需要额外接入 AgentOps 或 OpenTelemetry。在我跑过的 50+ 个 task 的复杂 Crew 中,调试错误的代理交接(handoff)会非常痛苦。这也是为什么我会建议:CrewAI 适合代理数 ≤ 5、流程相对线性的场景。如果你的需求复杂到需要 10 个代理协作,要么拆成多个 Crew,要么直接换 LangGraph。
微软 AutoGen 在 2024 年底完成了从 0.2 到 0.4 的颠覆式重构。0.2 时代的 ConversableAgent / GroupChat 单体设计被拆分成三层:autogen-core(消息驱动的 Runtime)、autogen-agentchat(高层 API,类似 0.2 的体验)、autogen-ext(模型客户端、工具、代码执行器等扩展)。
这次重构的动机是 AutoGen 0.2 的同步执行模型在生产环境里水土不服。一个代理在等 LLM 响应时整个 GroupChat 就卡死。0.4 的异步事件驱动架构让你能真正并发跑多个代理,对长时运行的研究型任务(比如自动文献综述、代码库重构)有质变。AutoGen 官方文档里有迁移指南,建议存量 0.2 项目评估后再升级。
AutoGen 内置了 Docker 和 Jupyter 两种代码执行器,让代理可以写 Python、跑、看结果、改代码、再跑。这是"AI 数据分析师"类应用的标配。LangGraph 和 CrewAI 也能做,但需要自己封装工具,而 AutoGen 的 DockerCommandLineCodeExecutor 开箱即用,沙箱隔离也做得更扎实。如果你的代理需要执行任意代码,AutoGen 在这一块的工程化程度领先一截。
评估框架时空看 API 文档是骗自己。下面用同一个任务("给定一个 GitHub 仓库 URL,调用 GitHub API 获取最近 10 个 issue,让 LLM 总结主要 bug 类别")分别用三个框架实现,对比代码组织方式。
from typing import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.prebuilt import ToolNode
from langchain_anthropic import ChatAnthropic
from langchain_core.tools import tool
import httpx
class State(TypedDict):
repo_url: str
issues: list
summary: str
@tool
def fetch_issues(repo_url: str) -> list:
"""Fetch the 10 most recent open issues from a GitHub repo."""
owner, repo = repo_url.rstrip("/").split("/")[-2:]
r = httpx.get(
f"https://api.github.com/repos/{owner}/{repo}/issues",
params={"state": "open", "per_page": 10},
timeout=15,
)
return [{"title": i["title"], "body": (i["body"] or "")[:500]} for i in r.json()]
llm = ChatAnthropic(model="claude-sonnet-4-6").bind_tools([fetch_issues])
def call_model(state: State):
msg = llm.invoke([("user", f"Fetch issues from {state['repo_url']} and summarize bug categories.")])
return {"issues": msg.tool_calls[0]["args"] if msg.tool_calls else []}
def summarize(state: State):
text = "\n".join(i["title"] for i in state["issues"])
resp = ChatAnthropic(model="claude-sonnet-4-6").invoke(
[("user", f"Summarize main bug categories in 3 bullets:\n{text}")]
)
return {"summary": resp.content}
graph = StateGraph(State)
graph.add_node("fetch", ToolNode([fetch_issues]))
graph.add_node("summarize", summarize)
graph.add_edge(START, "fetch")
graph.add_edge("fetch", "summarize")
graph.add_edge("summarize", END)
app = graph.compile()
result = app.invoke({"repo_url": "https://github.com/langchain-ai/langgraph"})
print(result["summary"])
from crewai import Agent, Task, Crew, Process
from crewai.tools import tool
import httpx
@tool("fetch_github_issues")
def fetch_github_issues(repo_url: str) -> str:
"""Fetch recent open issues from a GitHub repo URL."""
owner, repo = repo_url.rstrip("/").split("/")[-2:]
r = httpx.get(
f"https://api.github.com/repos/{owner}/{repo}/issues",
params={"state": "open", "per_page": 10},
)
return "\n".join(f"- {i['title']}" for i in r.json())
researcher = Agent(
role="GitHub Issue Researcher",
goal="Fetch and categorize bugs from open issues",
backstory="Senior engineer who triages open source issues daily.",
tools=[fetch_github_issues],
llm="anthropic/claude-sonnet-4-6",
)
task = Task(
description="Fetch the 10 newest open issues from {repo_url} and summarize the top 3 bug categories.",
expected_output="A markdown list of 3 bug categories with counts.",
agent=researcher,
)
crew = Crew(agents=[researcher], tasks=[task], process=Process.sequential)
print(crew.kickoff(inputs={"repo_url": "https://github.com/langchain-ai/langgraph"}))
import asyncio
import httpx
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import TextMentionTermination
from autogen_ext.models.anthropic import AnthropicChatCompletionClient
async def fetch_issues(repo_url: str) -> str:
owner, repo = repo_url.rstrip("/").split("/")[-2:]
async with httpx.AsyncClient() as c:
r = await c.get(
f"https://api.github.com/repos/{owner}/{repo}/issues",
params={"state": "open", "per_page": 10},
)
return "\n".join(f"- {i['title']}" for i in r.json())
async def main():
client = AnthropicChatCompletionClient(model="claude-sonnet-4-6")
agent = AssistantAgent(
"researcher",
model_client=client,
tools=[fetch_issues],
system_message="Fetch issues, summarize 3 bug categories, end with TERMINATE.",
)
team = RoundRobinGroupChat(
[agent], termination_condition=TextMentionTermination("TERMINATE")
)
await team.run(task="Analyze https://github.com/langchain-ai/langgraph")
asyncio.run(main())
我对三个框架在同一后端模型(claude-sonnet-4-6)、同一组工具、同一 100 题评估集下跑了对比。评估集是 GAIA Benchmark 中 100 道需要 2-4 步工具调用的子集。这里只看可量化的指标,主观的"代码优雅度"我不评。
| 指标 | LangGraph 0.4 | CrewAI 0.86 | AutoGen 0.4 |
|---|---|---|---|
| 任务成功率 | 91% | 85% | 87% |
| 平均 LLM 调用次数 | 3.2 | 4.7 | 3.8 |
| 平均端到端延迟(秒) | 14.6 | 21.3 | 17.9 |
| 平均 Token 消耗 | 5,400 | 8,200 | 6,300 |
| 每任务美元成本(claude-sonnet-4-6) | $0.024 | $0.037 | $0.028 |
CrewAI 的高 token 消耗源于"role + backstory + goal"被拼到每次 LLM 调用的 system prompt,加上 task description 的冗长。这是 CrewAI 在便利性和成本之间权衡的内在代价。LangGraph 因为节点级控制,可以只把必要的状态字段塞进 prompt,所以 token 最省。
但请注意:这些数字是在简单工具任务下的结论。一旦切到需要多代理协商的复杂任务(比如"3 个代理协作写一篇研究报告"),CrewAI 和 AutoGen 的成功率会反超 LangGraph,因为后者的图需要你显式编码"协商"逻辑,写不好反而比开箱即用的多代理框架差。任何选型决策都必须基于你自己的评估集,而不是别人的 benchmark。
放弃"哪个框架最好"这个问题。正确的问题是"我的工作流是什么形状的"。以下是我在咨询客户时用的三步法。
用纸笔画 5 分钟。如果画出来是有明确分支和回环的状态机(比如审批流、SQL 生成-执行-纠错循环),选 LangGraph。如果是线性流水线或角色分工明确的协作(比如内容生成:研究员→撰稿人→编辑),选 CrewAI。如果是多个智能体反复讨论收敛(比如自动文献综述、代码 review 对话),选 AutoGen。
团队已有 LangChain 项目,LangGraph 几乎是默认选择,可以复用 Tool、Document Loader、Embedding 等生态。团队主要是产品/业务背景,需要快速迭代,CrewAI 的声明式 API 学习成本最低。团队有 Python 异步编程经验,需要高并发,AutoGen 的 async 原生设计最匹配。
这是我给所有客户的强制要求:在写任何代理代码之前,先准备 30-50 条任务样本和评估脚本。这意味着你可以在 1 天内用三个框架各跑一次,用数据决策。如果你的"评估"是肉眼看几个示例输出觉得不错,那你选哪个框架都会在生产翻车(我去年帮一个客户复盘事故,根因就是这个)。配合 MCP(模型上下文协议)来标准化工具接口,可以让你的评估管道在切换框架时几乎零迁移成本。
三个框架在 demo 阶段都很美好,但生产环境会暴露各自的痛点。下面是我踩过的坑,按出现频率排序。
客服代理常常需要等用户回复几分钟到几小时。如果用内存状态,进程一重启或者扩容就丢上下文。LangGraph 用 PostgresSaver 几行代码搞定;CrewAI 需要自己封装;AutoGen 用 state.save_state() / load_state()。POC 阶段就要把这部分跑通,别等到上线前两周才发现。
CrewAI 在多代理场景下,每个 agent 的 backstory + goal + 所有历史 message 会被反复塞进 prompt。我见过一个 5-agent Crew 跑一个任务消耗 18 万 token 的案例(账单出来直接被老板叫去解释)。解决方案:(1)开启 Crew(memory=False) 关闭长期记忆;(2)用 CrewAI 官方文档里的 callback 拦截 prompt 做截断;(3)切到便宜的 haiku 模型跑工具规划,只让 sonnet/opus 跑最终生成。
2025-2026 年的一个反直觉发现:单代理 + 好工具 + 好评估在 80% 的业务场景下击败多代理协作。多代理增加协调开销、调试难度、成本,只在任务本身需要"不同视角碰撞"时才值得(比如辩论、对抗式审查)。先用 LangGraph 跑通单代理基线,能 work 就别拆。
LangGraph 是 LangChain 团队推出的独立编排库,依赖 langchain-core 但不依赖 langchain 主包。你可以只学 LangGraph + 你用的 LLM provider 客户端(如 langchain-anthropic),不必先学整套 LangChain。但理解 LangChain 的 Tool、Message、Runnable 接口对快速上手 LangGraph 帮助很大。
CrewAI 框架本身基于 MIT 协议商用免费。但官方提供的 CrewAI Enterprise 平台(部署托管 + 可观测性)是付费 SaaS,按 task 执行量计费。本地自部署不会产生框架费用,但 AgentOps、LangSmith 等可观测性工具大多按 trace 数量收费,这是真实的隐性成本。
0.2 和 0.4 的 API 完全不兼容,无法直接复用代码。微软在 autogen-agentchat 中提供了"过渡层"模拟 0.2 体验,但仍需重写大量代码。建议:纯研究/实验项目可以暂留 0.2;生产项目应该评估迁移到 0.4 或转向 LangGraph、CrewAI。
全部支持。LangGraph 通过 langchain-openai 兼容 OpenAI 协议接入(DeepSeek、Qwen 均提供 OpenAI 兼容端点);CrewAI 通过 LiteLLM 内置支持 100+ 模型,配置最简单;AutoGen 0.4 的 OpenAIChatCompletionClient 设置 base_url 即可。中文任务场景下,DeepSeek-V3 在工具调用准确率上已接近 GPT-4.1,可作为本土化首选。
不冲突,反而是互补的。Temporal/Airflow 负责可靠性(重试、调度、长事务),代理框架负责智能决策。生产中常见模式是:Temporal Workflow 调度 LangGraph 代理执行某个 activity,代理失败由 Temporal 重试。这种组合既保留了代理的灵活性,又有传统工作流引擎的可观测性和可靠性。