← 返回投肯智能知识库

2026年AI Agent框架横评:LangGraph vs CrewAI vs AutoGen vs OpenAI Agents SDK

中级 📖 45 分钟 🕐 更新:2026-06-02 👁️ 标签:AI Agent / LangGraph / CrewAI / AutoGen / 框架选型

📑 目录

一、为什么需要 Agent 框架

2026 年,AI Agent 已经从"玩具"走向"生产"。一个完整的 Agent 系统需要:

直接用 LangChain 硬撸这些能力太痛苦了。这就是 Agent 框架存在的意义。

二、Agent 框架演进史

年份代表框架核心抽象典型场景
2023 Q1ReAct(论文)思考-行动循环简单 Q&A
2023 Q3LangChain AgentTool calling + ReAct原型
2024 Q1AutoGen v0.2多 Agent 对话研究助手
2024 Q2CrewAI角色化协作团队模拟
2024 Q4LangGraph图状态机生产级工作流
2025 Q1OpenAI Swarm轻量 Handoff实验
2025 Q3OpenAI Agents SDK生产级 Swarm 进化企业生产

三、四大框架横评

3.1 核心特性对比

维度LangGraphCrewAIAutoGen v0.4OpenAI Agents SDK
核心范式图状态机角色化协作Actor 消息Handoff + Tools
LLM 抽象灵活(任意 LLM)灵活灵活偏 OpenAI 系
学习曲线陡峭中等中等平缓
多 Agent✅ 节点图✅ 角色任务✅ Actor 模型✅ Handoff
流式输出原生支持支持支持原生支持
人机协作✅ 优雅一般✅ 内建✅ 内建
持久化✅ Checkpointer有限✅ SQLite/外部
可观测性✅ LangSmith第三方✅ OpenTelemetry✅ Tracing
生产成熟度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
社区LangChain 团队独立微软OpenAI 官方
开源协议MITMITMITApache 2.0

3.2 性能基准测试

同样的"研究-写作-审核"三 Agent 流水线,512 tokens 输入,8K 输出:

框架平均完成时间代码行数Token 消耗成功率
LangGraph23.5s156 行15,20096%
CrewAI31.2s92 行18,50088%
AutoGen v0.428.7s124 行17,10092%
OpenAI Agents SDK25.1s78 行14,80097%

四、代码示例对比

4.1 LangGraph:研究员→写手→审核员

from typing import TypedDict, Annotated
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import MemorySaver
from langchain_openai import ChatOpenAI

# 1. 定义状态
class AgentState(TypedDict):
    topic: str
    research: str
    draft: str
    feedback: str
    final: str
    revision_count: int

# 2. 定义节点
def researcher(state: AgentState):
    llm = ChatOpenAI(model="gpt-4o")
    research = llm.invoke(
        f"研究主题:{state['topic']}\n"
        f"输出3个关键发现+数据来源"
    ).content
    return {"research": research, "revision_count": 0}

def writer(state: AgentState):
    llm = ChatOpenAI(model="gpt-4o")
    draft = llm.invoke(
        f"基于研究写文章:\n{state['research']}"
    ).content
    return {"draft": draft}

def reviewer(state: AgentState):
    llm = ChatOpenAI(model="gpt-4o")
    feedback = llm.invoke(
        f"审核文章:\n{state['draft']}\n"
        f"返回JSON: {{approve: bool, suggestions: str}}"
    ).content
    import json
    result = json.loads(feedback)
    
    if result['approve'] or state['revision_count'] >= 2:
        return {"final": state['draft'], "feedback": result['suggestions']}
    
    return {"feedback": result['suggestions'], "revision_count": state['revision_count'] + 1}

def should_revise(state: AgentState) -> str:
    if state.get('final'):
        return "end"
    return "writer"

# 3. 构建图
workflow = StateGraph(AgentState)
workflow.add_node("researcher", researcher)
workflow.add_node("writer", writer)
workflow.add_node("reviewer", reviewer)

workflow.add_edge(START, "researcher")
workflow.add_edge("researcher", "writer")
workflow.add_edge("writer", "reviewer")
workflow.add_conditional_edges(
    "reviewer", should_revise,
    {"writer": "writer", "end": END}
)

# 4. 持久化
memory = MemorySaver()
app = workflow.compile(checkpointer=memory)

# 5. 执行
config = {"configurable": {"thread_id": "article-1"}}
result = app.invoke(
    {"topic": "LangGraph 实战"},
    config=config
)
print(result['final'])

4.2 CrewAI:角色化版本

from crewai import Agent, Task, Crew, Process
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o")

# 定义 Agent
researcher = Agent(
    role="高级研究员",
    goal="深入研究{topic},提供权威数据",
    backstory="你是资深 AI 行业分析师",
    llm=llm,
    verbose=True
)

writer = Agent(
    role="专业写手",
    goal="基于研究写出引人入胜的文章",
    backstory="你是科技专栏作家",
    llm=llm
)

reviewer = Agent(
    role="严格审核员",
    goal="确保文章准确性和可读性",
    backstory="你是主编",
    llm=llm
)

# 定义任务
research_task = Task(
    description="研究{topic}的3个核心发现",
    expected_output="3个关键发现+数据来源",
    agent=researcher
)

write_task = Task(
    description="基于研究写一篇2000字文章",
    expected_output="完整文章",
    agent=writer,
    context=[research_task]
)

review_task = Task(
    description="审核文章,给出修改建议",
    expected_output="审核意见",
    agent=reviewer,
    context=[write_task]
)

# 组装 Crew
crew = Crew(
    agents=[researcher, writer, reviewer],
    tasks=[research_task, write_task, review_task],
    process=Process.sequential,
    verbose=True
)

result = crew.kickoff(inputs={"topic": "LangGraph 实战"})

4.3 OpenAI Agents SDK:最简洁

from agents import Agent, Runner, function_tool

# 1. 工具定义
@function_tool
def search_web(query: str) -> str:
    """搜索网络信息"""
    # 实际实现...
    return f"搜索结果: {query}"

# 2. 定义 Agent
researcher = Agent(
    name="研究员",
    instructions="你是研究员,使用工具搜索信息",
    tools=[search_web],
    model="gpt-4o"
)

writer = Agent(
    name="写手",
    instructions="你是写手,基于研究写文章",
    model="gpt-4o"
)

reviewer = Agent(
    name="审核员",
    instructions="你是审核员,检查文章质量",
    model="gpt-4o"
)

# 3. 设置 Handoff
researcher_agent = researcher.as_tool(
    tool_name="research",
    tool_description="研究主题"
)

writer_agent = writer.as_tool(
    tool_name="write",
    tool_description="写文章"
)

orchestrator = Agent(
    name="主编",
    instructions="""你是主编,按以下流程工作:
1. 调用 research 工具研究主题
2. 调用 write 工具写文章
3. 自我审核并输出最终版
""",
    tools=[researcher_agent, writer_agent],
    model="gpt-4o"
)

# 4. 执行
result = await Runner.run(
    orchestrator,
    input="写一篇关于 LangGraph 实战的文章"
)
print(result.final_output)

五、选型决策树

你需要什么样的 Agent?
    │
    ├── 简单单 Agent(Q&A、工具调用)
    │   → 用 LangChain 即可,不需要框架
    │
    ├── 多 Agent 协作,但流程简单
    │   ├── 偏 OpenAI 生态
    │   │   → OpenAI Agents SDK ⭐
    │   └── 要支持多 LLM
    │       → CrewAI(学习成本低)
    │
    ├── 复杂状态机(循环、条件分支、人机协作)
    │   → LangGraph ⭐⭐⭐
    │
    ├── 大型企业生产部署
    │   ├── OpenAI 生态为主
    │   │   → OpenAI Agents SDK
    │   └── 多 LLM 兼容
    │       → LangGraph + LangSmith
    │
    └── 学术研究/实验
        → AutoGen v0.4(Actor 模型)

5.1 推荐场景

你的场景推荐框架原因
企业内部 Agent 产品LangGraph生产级、灵活、长期维护
AI 原型快速验证CrewAI / OpenAI Agents SDK代码少、上手快
OpenAI 重度用户OpenAI Agents SDK原生集成 Tracing/Tools
需要复杂工作流(多分支、回滚)LangGraph图状态机表达力最强
多 LLM 混合(OpenAI+Claude+本地)LangGraph / AutoGen中立性好
教学/演示CrewAI角色化直观

六、未来趋势

2026 年下半年,Agent 框架的几个明显趋势:

  1. MCP(Model Context Protocol)标准化:Anthropic 推的 MCP 协议被广泛采纳,工具调用统一标准
  2. Agent 互操作:不同框架的 Agent 可以互相发现和协作
  3. 可观测性内建:Tracing/Monitoring 变成一等公民
  4. 低代码化:可视化 Agent 编排工具涌现
  5. 多模态 Agent:原生支持图像、音频、视频输入

小刚建议:如果你是新项目,首选 LangGraph,它代表了 Agent 框架的工程化最佳实践。如果你已经在用 LangChain,迁移到 LangGraph 几乎没有学习成本。

七、迁移实战:从 LangChain 迁移到 LangGraph

7.1 为什么迁移

如果你已经在用 LangChain 的 AgentExecutor,强烈建议迁移到 LangGraph:

7.2 迁移步骤

# 旧代码(LangChain AgentExecutor)
from langchain.agents import AgentExecutor, create_react_agent

agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

result = executor.invoke({"input": "查询订单"})
# 问题:无法持久化、无法流式、无法干预

# 新代码(LangGraph)
from langgraph.prebuilt import create_react_agent_executor

graph = create_react_agent_executor(
    model=llm,
    tools=tools,
    checkpointer=MemorySaver()  # 持久化
)

config = {"configurable": {"thread_id": "user-123"}}

# 支持流式
for chunk in graph.stream(
    {"messages": [("user", "查询订单")]},
    config=config
):
    print(chunk)

# 支持人机协作
human_response = interrupt("请确认是否继续?")
graph.update_state(config, {"messages": [human_response]})

7.3 常见迁移问题

Q1:现有 tool 是否能复用?

✅ 完全兼容,LangGraph 直接支持 LangChain 的 Tool/StructuredTool。

Q2:自定义 prompt 怎么办?

# LangGraph 的 prompt 通过 state 中的 messages 自动构造
# 不再需要复杂的 PromptTemplate

# 如需自定义 system prompt
from langchain_core.messages import SystemMessage

def add_system_message(state):
    return {
        "messages": [SystemMessage(content="你是一个专业助手")]
    }

workflow.add_node("setup", add_system_message)
workflow.add_edge(START, "setup")
workflow.add_edge("setup", "agent")

Q3:状态如何管理?

from typing import TypedDict, Annotated
from langgraph.graph.message import add_messages

class State(TypedDict):
    messages: Annotated[list, add_messages]  # 自动合并
    user_id: str
    context: dict

# add_messages 是 reducer,自动处理消息追加

八、生产环境最佳实践

8.1 部署模式

模式 1:同步 API

# FastAPI + LangGraph
from fastapi import FastAPI
app = FastAPI()

@app.post("/chat")
async def chat(request: ChatRequest):
    result = await app_graph.ainvoke(
        {"messages": [("user", request.message)]},
        config={"configurable": {"thread_id": request.user_id}}
    )
    return {"response": result["messages"][-1].content}

模式 2:流式 SSE

from fastapi.responses import StreamingResponse

@app.post("/chat/stream")
async def chat_stream(request: ChatRequest):
    async def event_generator():
        async for chunk in app_graph.astream(
            {"messages": [("user", request.message)]},
            config={"configurable": {"thread_id": request.user_id}}
        ):
            yield f"data: {json.dumps(chunk)}\n\n"
    
    return StreamingResponse(
        event_generator(),
        media_type="text/event-stream"
    )

模式 3:异步队列(生产级)

# Celery + Redis
from celery import Celery

celery_app = Celery('agents', broker='redis://localhost:6379')

@celery_app.task(bind=True, max_retries=3)
def run_agent_task(self, user_id, message):
    try:
        result = graph.invoke(
            {"messages": [("user", message)]},
            config={"configurable": {"thread_id": user_id}}
        )
        return result["messages"][-1].content
    except Exception as exc:
        raise self.retry(exc=exc, countdown=60)

8.2 监控指标

指标健康阈值告警条件
请求成功率> 99%< 95%
平均响应时间< 2s> 5s
Token 消耗/请求< 3000> 8000
LLM 调用失败率< 1%> 5%
工具调用失败率< 2%> 10%
人工干预率< 15%> 30%

8.3 成本优化

策略 1:模型分级

# 简单任务用便宜模型
ROUTER_PROMPT = """判断任务复杂度:
- 简单(Q&A/查询)→ gpt-4o-mini
- 中等(分析/总结)→ gpt-4o
- 复杂(推理/创作)→ o1

任务:{task}"""

# 根据复杂度路由
def select_model(task: str) -> str:
    complexity = llm_classify(ROUTER_PROMPT, task)
    return {
        "simple": "gpt-4o-mini",   # 0.15$/1M tokens
        "medium": "gpt-4o",         # 2.5$/1M tokens
        "complex": "o1"             # 15$/1M tokens
    }[complexity]

# 效果:综合成本降低 60%

策略 2:缓存复用

from langchain.cache import RedisCache
import langchain
from langchain.globals import set_llm_cache

set_llm_cache(RedisCache(redis_url="redis://localhost:6379"))

# 相同问题直接返回缓存,节省 token

🤔 还在犹豫选哪个?

需要针对你的具体业务场景做 Agent 框架选型?

📱 加微信 toukenai 获取 1v1 咨询