LangGraph / LangChain
LangChain 生态中面向生产级 Agent 的底层编排框架,专注构建长时间运行的有状态 Agent。2025 年 5 月 LangGraph 和 LangChain 同时达到 v1.0 GA 里程碑。
代码优先
有向图
Python / JS
v1.0 GA
32.9K
GitHub Stars
~400
企业生产使用
3880万
PyPI 月下载
v1.0
GA 版本
2 语言
Python + JS
核心架构:有向图(DAG)
开发者将 Agent 步骤定义为图中的节点,用边控制执行流转。支持单 Agent、多 Agent、层级式等多种控制流模式。
[用户输入] ──→ [节点A: 意图分析] ──→ 条件边 ──┬──→ [节点B: 工具调用] ──→ [END]
│
├──→ [节点C: 人工审批] ──→ [节点D: 执行] ──→ [END]
│
└──→ [节点E: 直接回复] ──→ [END]
节点 Node
每个步骤是图中的一个节点,执行具体逻辑(LLM 调用、工具调用、数据处理等)
边 Edge
控制执行流转,支持无条件边和条件分支边,决定下一步走哪个节点
状态 State
全局共享的类型化状态对象,节点间通过读写状态通信,贯穿整个图的执行
检查点 Checkpoint
内置持久化状态,服务器重启或工作流中断后可自动恢复,支持跨会话延续
评分卡
👨💻 开发者推荐9/10
🏢 企业推荐8/10
👤 普通用户推荐3/10
🎯 控制力9/10
📈 复杂度8/10
有向图编排
持久化状态
Human-in-the-loop
多Agent层级
v1.0 GA
优劣势
✅ 优势
- • 图结构提供极高的灵活性和可控性,任何工作流都可以用图表达
- • 近 400 家企业生产环境使用,经过大规模验证
- • LangChain 生态集成极其丰富,第三方工具/模型切换方便
- • PyPI 月下载量 3880 万,社区支持强大
- • 内置持久化 + Human-in-the-Loop,生产级特性完备
- • 同时支持 Python 和 JavaScript
❌ 劣势与局限
- • 学习曲线较陡峭,抽象层次多,概念需要时间理解
- • 调试复杂度高,图结构的执行路径不如线性代码直观
- • 与 LangChain 的耦合让部分开发者感到"过度封装"
- • 简单场景下使用图编排显得过重
- • 非技术用户难以上手(普通用户推荐仅 3/10)
应用场景
🔄
多步骤复杂工作流
需要精确控制执行顺序的业务流程:贷款审批、合同审查、供应链决策等
👤
Human-in-the-Loop 审批
任意节点可暂停等待人工介入:资金转账、内容发布、数据删除等高风险操作
🤝
多 Agent 协作
层级式编排——主 Agent 分配任务,子 Agent 独立执行后汇报:研究助手、代码审查
⏳
长时间运行任务
持久化检查点支持跨小时/跨天执行:数据分析管道、批量处理、定时任务
🧠
ReAct / 工具调用循环
经典"思考→行动→观察"循环,LLM 自主决定是否继续调用工具
📚
RAG + Agent 混合
检索增强生成中加入 Agent 决策:自适应检索、查询改写、多源融合
Demo 示例
① 基础 ReAct Agent — 工具调用循环
最简单的 LangGraph Agent——LLM 自主决定何时调用工具、何时结束。
# pip install langgraph langchain-openai
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent
# 定义工具
def get_weather(city: str) -> str:
"""获取城市天气"""
data = {"北京": "晴天 28°C", "上海": "多云 25°C", "深圳": "雷阵雨 30°C"}
return data.get(city, f"未找到 {city} 的天气数据")
def search_flights(origin: str, destination: str) -> str:
"""搜索航班"""
return f"{origin} → {destination}: MU5101 08:00 ¥980 / CA1234 14:30 ¥1200"
# 创建 Agent(一行搞定)
agent = create_react_agent(
model=ChatOpenAI(model="gpt-4o"),
tools=[get_weather, search_flights],
)
# 运行
result = agent.invoke({
"messages": [{"role": "user", "content": "我想从北京飞上海,帮我看看天气和航班"}]
})
for msg in result["messages"]:
print(f"[{msg.type}] {msg.content[:200]}")
执行流程
用户提问 → LLM 调用 get_weather("北京") → LLM 调用 get_weather("上海")
→ LLM 调用 search_flights("北京","上海") → LLM 汇总回复 → END
② 自定义有向图 — 条件分支路由
手动定义图结构,精确控制流转逻辑。以客服意图分类为例。
from typing import TypedDict, Literal
from langgraph.graph import StateGraph, START, END
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o")
# 1. 定义状态
class OrderState(TypedDict):
user_input: str
intent: str # "refund" | "exchange" | "inquiry"
response: str
# 2. 定义节点
def classify_intent(state: OrderState) -> dict:
"""意图分类"""
resp = llm.invoke(
f"将以下客服请求分类为 refund/exchange/inquiry,只返回分类词:\n{state['user_input']}"
)
return {"intent": resp.content.strip().lower()}
def handle_refund(state: OrderState) -> dict:
return {"response": f"已为您发起退款流程。原始请求:{state['user_input']}"}
def handle_exchange(state: OrderState) -> dict:
return {"response": f"已为您创建换货工单。原始请求:{state['user_input']}"}
def handle_inquiry(state: OrderState) -> dict:
resp = llm.invoke(f"作为客服回答:{state['user_input']}")
return {"response": resp.content}
# 3. 路由函数
def route_by_intent(state: OrderState) -> Literal["refund", "exchange", "inquiry"]:
return state["intent"]
# 4. 构建图
graph = StateGraph(OrderState)
graph.add_node("classify", classify_intent)
graph.add_node("refund", handle_refund)
graph.add_node("exchange", handle_exchange)
graph.add_node("inquiry", handle_inquiry)
graph.add_edge(START, "classify")
graph.add_conditional_edges("classify", route_by_intent, {
"refund": "refund",
"exchange": "exchange",
"inquiry": "inquiry",
})
graph.add_edge("refund", END)
graph.add_edge("exchange", END)
graph.add_edge("inquiry", END)
# 5. 编译 & 运行
app = graph.compile()
result = app.invoke({"user_input": "我买的耳机坏了,想退款"})
print(result["response"])
图结构
START → [classify_intent] ─┬─ intent=="refund" → [handle_refund] → END
├─ intent=="exchange" → [handle_exchange] → END
└─ intent=="inquiry" → [handle_inquiry] → END
③ Human-in-the-Loop — 人工审批暂停/恢复
在关键节点暂停执行,等待人工确认后继续。适合转账、发布等高风险操作。
from typing import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import MemorySaver
class TransferState(TypedDict):
amount: float
to_account: str
approved: bool
result: str
def prepare_transfer(state: TransferState) -> dict:
return {"result": f"准备转账 ¥{state['amount']} 到 {state['to_account']}"}
def execute_transfer(state: TransferState) -> dict:
if state.get("approved"):
return {"result": f"✅ 已成功转账 ¥{state['amount']} 到 {state['to_account']}"}
return {"result": "❌ 转账已被拒绝"}
graph = StateGraph(TransferState)
graph.add_node("prepare", prepare_transfer)
graph.add_node("execute", execute_transfer)
graph.add_edge(START, "prepare")
graph.add_edge("prepare", "execute")
graph.add_edge("execute", END)
# interrupt_before=["execute"] 会在进入 execute 节点前暂停
checkpointer = MemorySaver()
app = graph.compile(checkpointer=checkpointer, interrupt_before=["execute"])
config = {"configurable": {"thread_id": "transfer-001"}}
# 第一次运行 → 在 execute 前暂停
result = app.invoke(
{"amount": 50000, "to_account": "622848***1234", "approved": False},
config=config,
)
print("⏸️ 等待审批...", result["result"])
# 人工审批通过 → 更新状态
app.update_state(config, {"approved": True})
# 恢复执行
result = app.invoke(None, config=config)
print(result["result"]) # ✅ 已成功转账 ¥50000 到 622848***1234
执行流程
START → [prepare] → ⏸️ 暂停等待审批 → 人工: approved=True → [execute] → END
④ 多 Agent 层级协作
主 Agent(Supervisor)将任务分配给专门的子 Agent,各 Agent 独立执行后汇总。
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o")
# 子 Agent 1:研究员
def web_search(query: str) -> str:
"""搜索网络信息"""
return f"搜索结果:关于'{query}'的最新数据和报告..."
researcher = create_react_agent(
model=llm,
tools=[web_search],
prompt="你是研究员,负责搜索和收集信息。只返回事实,不做主观分析。",
)
# 子 Agent 2:分析师
def create_chart(data: str) -> str:
"""生成数据图表"""
return f"已根据数据生成可视化图表"
analyst = create_react_agent(
model=llm,
tools=[create_chart],
prompt="你是数据分析师,负责分析研究员提供的数据并生成报告。",
)
# 主 Agent:协调者——把子 Agent 封装为工具
def call_researcher(task: str) -> str:
"""委托研究员收集信息"""
result = researcher.invoke({"messages": [{"role": "user", "content": task}]})
return result["messages"][-1].content
def call_analyst(task: str) -> str:
"""委托分析师分析数据"""
result = analyst.invoke({"messages": [{"role": "user", "content": task}]})
return result["messages"][-1].content
supervisor = create_react_agent(
model=llm,
tools=[call_researcher, call_analyst],
prompt="你是项目主管。分解用户需求,协调研究员和分析师完成任务。",
)
result = supervisor.invoke({
"messages": [{"role": "user", "content": "调研 2026 年新能源汽车市场并出分析报告"}]
})
print(result["messages"][-1].content)
协作结构
┌──→ [Researcher] web_search → 返回事实
[Supervisor] ──┤
└──→ [Analyst] create_chart → 返回报告
→ Supervisor 汇总最终结果
⑤ 持久化对话 Agent — 跨请求记忆
使用 Checkpointer 让对话状态跨请求持久化,Agent 记住对话上下文。
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import MemorySaver
from langchain_openai import ChatOpenAI
def lookup_order(order_id: str) -> str:
"""查询订单状态"""
orders = {
"ORD001": "已发货,预计明天到达",
"ORD002": "待支付",
"ORD003": "已签收",
}
return orders.get(order_id, "订单不存在")
checkpointer = MemorySaver()
agent = create_react_agent(
model=ChatOpenAI(model="gpt-4o"),
tools=[lookup_order],
prompt="你是电商客服助手。记住用户的上下文,提供连贯的对话服务。",
checkpointer=checkpointer,
)
config = {"configurable": {"thread_id": "user-session-42"}}
# 第一轮
r1 = agent.invoke(
{"messages": [{"role": "user", "content": "帮我查一下 ORD001"}]},
config=config,
)
print("客服:", r1["messages"][-1].content)
# 第二轮 — Agent 记住了上下文
r2 = agent.invoke(
{"messages": [{"role": "user", "content": "那 ORD002 呢?"}]},
config=config,
)
print("客服:", r2["messages"][-1].content)
# 第三轮 — 跨轮次记忆
r3 = agent.invoke(
{"messages": [{"role": "user", "content": "刚才那两个订单哪个先到?"}]},
config=config,
)
print("客服:", r3["messages"][-1].content)
框架横向对比
| 对比维度 | LangGraph | CrewAI | OpenAI SDK | Anthropic SDK | Google ADK |
|---|---|---|---|---|---|
| 编排模式 | 有向图 | 角色协作 | 委托链 | Agent循环 | 事件驱动 |
| 控制粒度 | 极高(节点/边级别) | 中等(角色/任务) | 低(handoff) | 中等 | 高 |
| 学习曲线 | 陡峭 | 平缓 | 平缓 | 中等 | 中等 |
| 持久化/恢复 | 内置 ✓ | 无 | 无 | 无 | 有限 |
| HITL | 原生支持 ✓ | 有限 | 无 | 无 | 有限 |
| 适合场景 | 复杂工作流、精确控制 | 团队模拟、快速搭建 | 简单链式任务 | MCP 集成 | Google 生态 |
| 语言 | Python / JS | Python | Python / TS | Python / TS | 4 种语言 |
选型建议
✅ 适合使用 LangGraph
- • 需要精细控制每一步执行逻辑的生产系统
- • 有 Human-in-the-Loop 审批需求
- • 长时间运行、需要断点恢复的任务
- • 已在使用 LangChain 生态
- • 需要多 Agent 层级编排的复杂场景
- • 团队有图结构/状态机的开发经验
❌ 不适合使用 LangGraph
- • 简单的单轮问答或工具调用
- • 追求最快上手速度的原型验证
- • 团队对图结构概念不熟悉
- • 非技术用户为主的团队
- • 只需要角色扮演式协作(CrewAI 更合适)
- • 需要拖拽可视化搭建(Dify / Coze 更合适)
快速开始
# 安装
pip install langgraph langchain-openai
# 设置 API Key
export OPENAI_API_KEY=sk-xxx
# 可选:启用 LangSmith 追踪(可视化调试利器)
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=lsv2_xxx
# 最小可运行示例
python -c "
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent
agent = create_react_agent(ChatOpenAI(model='gpt-4o'), tools=[])
result = agent.invoke({'messages': [{'role': 'user', 'content': '你好'}]})
print(result['messages'][-1].content)
"