XTeam / 框架选型 / 详解

LangGraph / LangChain 详解

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)
"