调查研究-186 LangChain 和 LangGraph 的区别:从快速构建 Agent 到生产级工作流编排

LangChain vs LangGraph:2025 Agent 框架选型全景指南(组件抽象 vs 流程编排)

TL;DR

  • 场景:选型时同时遇到 LangChain 和 LangGraph,搞不清谁替代谁、什么时候该用哪个、复杂 Agent 该怎么组合。
  • 结论:LangChain 是 LLM 应用开发框架(组件层:模型/Prompt/工具/Retriever/Middleware),LangGraph 是 Agent Runtime(流程层:State/Node/Edge/Checkpoint/Interrupt);生产级 Agent 通常需要二者组合。
  • 产出:七维差异表 + RAG / Tool Calling / 多 Agent 选型策略 + 18 节工程实践建议 + 生产级组合架构图。

版本矩阵

功能 状态 说明
LangChain v1.0 create_agent API ✅ 已验证 2025-10 发布,统一 Agent 构建入口(model / tools / system_prompt)
LangChain Middleware 系统 ✅ 已验证 内置 Summarization / Human-in-the-loop / Model call limit 等中间件
LangChain v1.0 Pydantic v2 State ✅ 已验证 状态层基于 Pydantic v2,与 LangGraph 共享 State 语义
LangGraph v1.0 Durable Execution ✅ 已验证 langgraph==1.0.2,checkpoint 持久化 + 断点续传
LangGraph Human-in-the-loop ✅ 已验证 interrupt() API 支持暂停等外部输入后继续
LangGraph Checkpoint 多后端 ✅ 已验证 InMemorySaver / SQLite / PostgresSaver 可插拔
AgentExecutor 官方标记遗留 ✅ 已验证 官方文档推荐新 Agent 使用 LangGraph 构建
Multi-Agent Subgraph ✅ 已验证 子流程可封装为 subgraph 表达多 Agent 协作
LangSmith 调试追踪 ✅ 已验证 与 LangGraph 可视化调试 + 监控无缝集成

摘要:LangChain 和 LangGraph 不是"谁替代谁"的关系,而是站在不同抽象层级解决不同问题。LangChain 更像 LLM 应用开发框架,负责模型、Prompt、工具、Retriever、Agent、Middleware 等组件抽象,让开发者快速把大模型能力接进应用。LangGraph 更像 Agent runtime / 工作流编排引擎,负责 State、Node、Edge、条件跳转、checkpoint、interrupt、人类介入、持久化和失败恢复。本文从工程选型视角拆解二者差异、典型场景、代码组织方式、RAG/工具调用/多 Agent 选择策略,以及生产级 Agent 为什么通常需要 LangChain + LangGraph 组合。

关键词:LangChain、LangGraph、AI Agent、Agent 工作流、LangChain vs LangGraph、StateGraph、Human-in-the-loop、Durable Execution、RAG、Tool Calling、多 Agent、生产级 Agent、LLM 应用开发

手绘风格对比信息图:左侧 LangChain 用"黄色工具箱"类比,封装 Prompt / Tool / RAG 组件;右侧 LangGraph 用"网格纸上的有向图"类比,含 State / Node / Edge / Checkpoint 四要素;右下角 CSDN @武子康 署名。

1. 先说结论:不是替代关系

如果你最近开始做 AI Agent,大概率会同时看到 LangChain 和 LangGraph。

很多人的第一反应是:LangGraph 是不是 LangChain 的升级版?以后是不是只用 LangGraph,不用 LangChain?或者反过来,LangChain 已经能做 Agent,为什么还要学 LangGraph?

这个问题不能用"谁替代谁"来理解。

更准确的说法是:

  • LangChain 关注"怎么更快地构建 LLM 应用"。
  • LangGraph 关注"怎么更可靠地编排 Agent 的执行过程"。

简单类比:

text 复制代码
LangChain 更像应用开发框架
LangGraph 更像工作流引擎 / 状态机 / Agent Runtime

如果你只是想快速做一个能调用工具的 Agent,LangChain 会更快。

如果你要做一个可控、可恢复、可观测、能插入人工审核、能处理复杂分支的生产级 Agent 系统,LangGraph 更合适。

2. LangChain 是什么

LangChain 最早被大量开发者认识,是因为它提供了一套比较完整的大模型应用开发抽象。

在没有这些封装之前,开发一个 LLM 应用通常要自己处理很多胶水代码:

  • 调用不同模型厂商 API。
  • 管理 Prompt 模板。
  • 组织多轮对话上下文。
  • 接入外部工具。
  • 接入向量数据库。
  • 实现 RAG 检索增强生成。
  • 解析模型输出。
  • 构建 Agent 循环。

LangChain 把这些能力封装成统一组件,让开发者可以更快组合应用。

例如官方 v1 文档里的风格是:

python 复制代码
from langchain.agents import create_agent

def get_weather(city: str) -> str:
    return f"It's always sunny in {city}!"

agent = create_agent(
    model="anthropic:claude-sonnet-4-5",
    tools=[get_weather],
    system_prompt="You are a helpful assistant",
)

agent.invoke(
    {"messages": [{"role": "user", "content": "what is the weather in sf"}]}
)

这段代码背后的意思是:模型、工具、消息格式、Agent loop 都被统一成高层接口。你不用从零写一套 Agent 框架。

这就是 LangChain 的核心价值:减少重复工程,让开发者快速把大模型能力接入真实应用。

手绘插图"LangChain 快在哪":模型(机器人)、Prompt(对话气泡)、工具(工具箱)、Retriever(放大镜+文档)四个核心组件,组合快速做出 Agent;右下角 CSDN @武子康 署名。

3. LangChain 适合什么

LangChain 适合普通 LLM 应用,比如聊天机器人、文档问答、总结生成、文本分类、结构化信息抽取。

它也很适合常见 RAG:

text 复制代码
用户提问
  ↓
查询向量数据库
  ↓
取回相关文档
  ↓
拼接 Prompt
  ↓
调用大模型
  ↓
返回答案

如果你的流程就是这样,LangChain 的 Document Loader、Text Splitter、Retriever、Vector Store、Prompt Template、Model wrapper 都可以直接用。

它还适合简单工具调用 Agent:

text 复制代码
用户问天气 → 调天气 API
用户问汇率 → 调汇率工具
用户问指标 → 调 SQL 工具
用户要报告 → 调文档生成工具

如果 Agent 的主要流程是"模型思考、决定是否调用工具、调用工具、继续思考、最终回答",LangChain 的高层 Agent 封装会比较省事。

项目早期 Demo / PoC 也适合 LangChain。早期最大问题不是流程是否极致可控,而是能不能快速验证方向。

4. LangChain 的局限:复杂 Agent 会撞到封装边界

LangChain 的优点是快,局限也来自"快"。

简单 Agent 用高层封装很舒服,但复杂 Agent 往往会出现这些问题:

  • 流程不够透明。
  • 状态不够清晰。
  • 失败恢复不好控制。
  • 多分支决策难维护。
  • 人工审核节点不好插入。
  • 工具调用副作用难管理。
  • 长任务中断后难恢复。

举个例子:你要做"自动处理客户邮件"的 Agent。

流程可能是:

text 复制代码
读取邮件
判断邮件类型
识别紧急程度
检索知识库
生成回复草稿
如果涉及退款则人工审核
如果是技术问题则创建工单
如果是普通问题则直接回复
记录处理日志
失败后允许恢复

这已经不是一个"会自己思考的 Agent"就能优雅解决的问题。你真正需要的是一个可控业务流程:

  • 哪些步骤固定执行?
  • 哪些步骤交给模型判断?
  • 哪些节点可以重试?
  • 哪些节点需要人工确认?
  • 哪些状态必须持久化?
  • 哪些外部副作用必须幂等?
  • 失败后从哪个节点恢复?

这就是 LangGraph 出现的意义。

5. LangGraph 是什么

LangGraph 是一个面向 Agent 工作流的低层编排框架。官方文档把它定位为构建 long-running、stateful agents 的 orchestration framework,也明确提到 persistence、human-in-the-loop、durable execution 等能力。

它的核心思想是:把复杂 Agent 拆成图。

图里有几个核心概念:

  • State:状态。
  • Node:节点。
  • Edge:边。
  • Conditional Edge:条件边。
  • Checkpoint:检查点。
  • Interrupt:中断。
  • Thread:一次可恢复的执行上下文。

一句话解释:

text 复制代码
LangGraph 把 Agent 从"黑盒循环"变成"显式可控的状态图"。

传统 Agent loop 通常像这样:

text 复制代码
while not finished:
    model decides next action
    run tool if needed
    append result
    continue

LangGraph 的模式更像:

text 复制代码
用户输入
  ↓
意图识别节点
  ↓
条件判断
  ├── 普通问答 → 直接回答节点
  ├── 知识库问题 → 检索节点 → 回答节点
  ├── 工单问题 → 创建工单节点 → 人工审核节点
  └── 高风险操作 → 人工确认节点 → 执行节点
  ↓
结束

每个节点是明确函数,每条边是明确流转关系,状态在节点之间传递。

手绘信息图"LangGraph 强在哪":中心四要素 State(蓝色)/ Node(绿色齿轮)/ Edge(黄色箭头)/ Bot(粉色机器人)相互连接,左侧 Checkpoint(带软盘的剪贴板,支持状态回溯与错误恢复)与 Interrupt(带暂停按钮的虚线框,代表 Human-in-the-loop)作为扩展能力;右下角 CSDN @武子康 署名。

6. LangGraph 的核心价值:可靠执行过程

LangGraph 的核心不是让模型更聪明,而是让执行过程更可靠。

复杂 Agent 系统里,模型只是其中一个组件。生产系统真正难的是:

  • 状态怎么保存?
  • 节点怎么重试?
  • 失败怎么恢复?
  • 工具调用怎么记录?
  • 人工审批怎么插入?
  • 流程分支怎么表达?
  • 多轮任务怎么延续?

一个简化 LangGraph 代码大概是:

python 复制代码
from typing import TypedDict
from langgraph.graph import StateGraph, START, END

class AgentState(TypedDict):
    question: str
    route: str
    answer: str

def classify_node(state: AgentState):
    if "审批" in state["question"]:
        return {"route": "approval"}
    return {"route": "normal"}

def normal_answer_node(state: AgentState):
    return {"answer": "这是普通问题回答"}

def approval_node(state: AgentState):
    return {"answer": "这个问题需要审批"}

def route_decision(state: AgentState):
    return state["route"]

builder = StateGraph(AgentState)
builder.add_node("classify", classify_node)
builder.add_node("normal_answer", normal_answer_node)
builder.add_node("approval", approval_node)

builder.add_edge(START, "classify")
builder.add_conditional_edges(
    "classify",
    route_decision,
    {"normal": "normal_answer", "approval": "approval"},
)
builder.add_edge("normal_answer", END)
builder.add_edge("approval", END)

graph = builder.compile()

这段代码表达的不是简单对话,而是一个可控流程。你可以清楚知道 Agent 每一步会走到哪里。

7. LangChain 和 LangGraph 的关系

现在可以这样概括:

text 复制代码
LangChain 是高层 Agent 框架
LangGraph 是低层 Agent Runtime
LangChain 的 Agent 能力建立在 LangGraph 之上
LangGraph 可以独立使用
二者可以组合使用

你可以只用 LangChain:快速做文档问答、简单工具调用 Agent、自然语言数据库查询助手。

你也可以只用 LangGraph:自己定义状态、节点、边、条件跳转、持久化和恢复。

更常见的生产方式是组合使用:

text 复制代码
LangChain 负责模型、工具、Retriever、Prompt
LangGraph 负责编排、状态、分支、恢复、人工介入

LangChain 解决组件层问题,LangGraph 解决流程层问题。

8. 用后端视角理解

如果你是 Java / 后端开发者,可以这样类比:

text 复制代码
LangChain 像 Spring Boot + 一批 AI Starter
LangGraph 像轻量级工作流引擎 / 状态机 / DAG Runtime

LangChain 让你快速搭应用:

  • 模型调用封装。
  • 工具封装。
  • Prompt 模板。
  • RAG 组件。
  • Agent 抽象。
  • 第三方集成。

LangGraph 关心流程运行:

  • 流程节点。
  • 状态流转。
  • 条件分支。
  • 失败恢复。
  • 任务持久化。
  • 人工审批。
  • 执行轨迹。

这个类比不是完全等价,但能帮助抓住本质:

text 复制代码
LangChain 让你更快写 AI 应用
LangGraph 让你更稳地跑 AI 工作流

9. 简单 Agent:优先 LangChain

假设你要做一个简单工具调用 Agent:

text 复制代码
用户问问题
Agent 可以调用搜索工具
Agent 可以调用计算器
最后返回答案

这种场景下,LangChain 更合适。

你只需要关心:

  • 模型是什么。
  • 工具有哪些。
  • 系统提示词是什么。
  • 用户输入是什么。

如果需求只是这样,强行上 LangGraph 反而会增加状态设计、节点拆分和流程维护成本。

10. 复杂工作流:优先 LangGraph

再看"AI 客服邮件处理系统"。

需求可能是:

text 复制代码
读取用户邮件
判断问题类型
判断紧急程度
普通问题 → 检索知识库并生成回复
Bug → 创建工单并回复用户
退款 → 人工审批
信息不足 → 继续追问用户
所有结果记录日志
失败后从中断位置恢复

这就是典型的 deterministic workflow + agentic behavior:

text 复制代码
一部分流程由代码控制
一部分决策交给模型

可以设计成:

text 复制代码
START
  ↓
read_email
  ↓
classify_intent
  ↓
route_by_intent
  ├── faq → search_docs → draft_reply → send_reply
  ├── bug → create_ticket → draft_reply → send_reply
  ├── refund → human_review → approved? → refund / reject
  └── unclear → ask_followup
  ↓
END

这时每个节点职责明确,状态可测试,失败可恢复,人工审核也能插入。

手绘流程图"客服 Agent 工作流":横向五个彩色便签依次为 分类(放大镜)→ 检索(文档)→ 工单(剪贴板)→ 人工审核(人形)→ 回复(对话气泡),下方虚线连接 Checkpoint(带软盘勾选)与 Logbook(带心形的打开书本),表示持久化和日志能力;右下角 CSDN @武子康 署名。

11. 七个关键区别

第一,抽象层级不同。

LangChain 是高层抽象,目标是少写代码、快速组合。LangGraph 是低层抽象,目标是显式定义流程。

第二,流程控制不同。

LangChain 的 Agent 更偏模型驱动循环;LangGraph 允许把业务规则写进图结构。比如退款前必须人工审批、删除数据前必须二次确认、执行 SQL 前必须校验权限,这些不应该交给模型自由发挥。

第三,状态管理不同。

复杂 Agent 会产生大量中间状态:任务计划、工具结果、检索结果、审批结果、失败原因、重试次数。LangGraph 强调显式 State,比把所有内容都塞进 message history 更工程化。

第四,失败恢复不同。

Demo 失败可以重跑,生产失败不能随便重跑。重复创建工单、重复发邮件、重复调用付费 API 都会出问题。LangGraph 的 checkpoint 和 durable execution 思路更适合长任务恢复。

第五,human-in-the-loop 不同。

生产系统里,退款、发邮件、数据库修改、执行命令都可能需要人工确认。LangGraph 的 interrupt 模式可以在图执行到某个节点时暂停,保存当前状态,等外部输入后继续。

第六,可观测性不同。

复杂 Agent 调试时,你需要知道走了哪些节点、每个节点输入输出是什么、状态怎么变化、工具返回什么、失败在哪一步。图结构天然更适合 tracing 和回放。

第七,代码组织方式不同。

LangChain 围绕 model、prompt、retriever、tool、agent、chain 组织;LangGraph 围绕 state、node、edge、conditional edge、checkpoint、interrupt 组织。

12. RAG 场景怎么选

简单 RAG:

text 复制代码
用户提问 → 检索文档 → 调模型 → 返回答案

用 LangChain 就够。

复杂 RAG:

text 复制代码
先判断问题类型
不同类型查不同知识库
检索结果不足时改写 query
多轮检索后合并证据
答案生成后做事实校验
低置信度时转人工
最终答案需要审批

这时 RAG 已经不是一个简单 chain,而是复杂工作流。LangGraph 更适合表达。

13. Tool Calling 怎么选

简单工具调用,比如搜索、计算、查天气、查指标,LangChain 足够。

但工具调用一旦有副作用,就要谨慎:

  • 发邮件。
  • 删数据。
  • 改数据库。
  • 下订单。
  • 退款。
  • 创建工单。
  • 执行 Shell 命令。
  • 重启服务。

这类动作不能让模型随便调用。你需要权限校验、参数校验、风险识别、人工确认、执行记录、失败回滚、幂等控制。

LangGraph 更适合把这些控制点显式建模:

text 复制代码
model_generate_action
  ↓
validate_action
  ↓
risk_check
  ↓
human_approval
  ↓
execute_action
  ↓
audit_log

14. 多 Agent 怎么选

多 Agent 不等于先进。

很多项目一上来设计:

text 复制代码
Planner Agent
Research Agent
Coder Agent
Reviewer Agent
Executor Agent

看起来很高级,但真正的问题是:

  • 谁负责调度?
  • 状态怎么共享?
  • 任务怎么拆分?
  • 结果怎么合并?
  • 冲突怎么处理?
  • 失败怎么恢复?

如果这些问题没有解决,多 Agent 只是多个黑盒互相甩锅。

LangGraph 的图结构适合表达多 Agent 协作。你可以把不同 Agent 当成节点,也可以把子流程封装成 subgraph。

15. 选型判断表

需求 推荐
快速做 Demo LangChain
普通聊天机器人 LangChain
简单 RAG LangChain
简单工具调用 Agent LangChain
复杂 RAG 流程 LangGraph
多步骤业务流程 LangGraph
有人工审批 LangGraph
长任务执行 LangGraph
失败后恢复 LangGraph
多 Agent 协作 LangGraph
生产级自动化 Agent LangGraph
需要组件生态 LangChain + LangGraph
需要流程编排 LangGraph
需要快速接模型和工具 LangChain

最常见的真实答案是:

text 复制代码
早期用 LangChain
复杂后引入 LangGraph
生产级系统二者组合

手绘决策图"Agent 框架怎么选":三栏对比------黄色栏 LangChain(工具箱图标,主打"快速搭建 / Demo / RAG");蓝色栏 LangGraph(白板流程图+终点旗帜,主打"复杂编排 / 长任务 / 审核");绿色栏"组合使用"(三层堆叠图标,象征二者叠加);右下角 CSDN @武子康 署名。

16. 什么时候从 LangChain 迁移到 LangGraph

如果你的 Agent 出现下面这些信号,就应该考虑 LangGraph:

  • 流程开始出现多个分支。
  • 不同任务需要不同路径。
  • 中间状态越来越多。
  • 工具调用有副作用。
  • 需要人工审核。
  • 失败后不能简单重跑。
  • 需要记录完整执行轨迹。
  • 需要长时间运行。
  • 需要多个 Agent 协作。
  • 需要可视化流程和调试。

尤其是三个信号最关键:

text 复制代码
需要状态持久化
需要人工介入
需要失败恢复

只要出现这三个需求,LangGraph 的价值就会明显提升。

17. 工程实践建议

第一,先把业务流程画出来,不要一上来就写 Agent。

先问:

  • 这个任务有哪些步骤?
  • 哪些步骤固定?
  • 哪些步骤需要模型?
  • 哪些步骤需要工具?
  • 哪些步骤有副作用?
  • 哪些步骤需要人工审核?
  • 失败后能不能重试?

第二,不要把所有状态塞进 message history。Message history 适合对话,不适合承载所有业务状态。

第三,高风险工具调用必须加防护节点。

第四,节点要小。每个节点只做一件事。

第五,副作用操作要幂等。创建工单、发送邮件、执行命令,都要考虑重复执行问题。

第六,尽早接入 tracing。Agent 系统没有执行轨迹,很难排查问题。

第七,先做单 Agent,再考虑多 Agent。多 Agent 是复杂度放大器,不是万能药。

18. 一个生产级组合架构

一个比较合理的生产级 Agent 架构可以这样设计:

text 复制代码
前端 / API
  ↓
任务入口服务
  ↓
LangGraph 工作流
  ↓
LangChain 组件层
  ├── Model
  ├── Tool
  ├── Retriever
  ├── Prompt
  └── Output Parser
  ↓
外部系统
  ├── 数据库
  ├── 向量库
  ├── 搜索服务
  ├── 工单系统
  ├── 邮件系统
  └── 内部 API
  ↓
日志 / 监控 / 评估

在这个架构里:

text 复制代码
LangGraph 负责流程怎么跑
LangChain 负责组件怎么接
业务代码负责规则和边界
基础设施负责稳定性和治理

这比"让一个大模型自己决定所有事情"更像真正的 Agent 工程。

19. 最终结论

LangChain 和 LangGraph 的区别,本质是抽象层级和工程目标不同。

LangChain 解决 LLM 应用开发效率问题。它让你快速接入模型、Prompt、工具、检索器和 Agent。

LangGraph 解决复杂 Agent 执行可靠性问题。它让你把 Agent 拆成状态图,用节点、边、条件跳转、持久化和中断机制来控制执行过程。

如果你的需求是快速构建、简单问答、简单 RAG、简单工具调用,优先 LangChain。

如果你的需求是复杂流程、长期运行、失败恢复、人工介入、多分支决策、生产级 Agent,优先 LangGraph。

如果你要做真正工程化的 AI Agent 系统,最合理的方式通常不是二选一,而是组合使用:

text 复制代码
LangChain 负责组件抽象
LangGraph 负责任务编排
业务代码负责规则边界
基础设施负责稳定运行

前者解决"能不能跑起来"。

后者解决"能不能可靠地跑下去"。


错误速查卡

症状 根因 定位 修复
Agent 第 N 步报错,无法从第 M 步重试 早期 AgentExecutor 是 while 循环、无结构化状态 检查是否仍使用 AgentExecutor 迁移到 LangGraph,用 checkpoint + thread_id 断点续传
关键操作(退款/删除数据)无人审批 高层 Agent 封装未暴露 hook 点 检查节点是否有 interrupt 机制 用 LangGraph interrupt() 在高风险节点前插入人工审核
工具调用有副作用,重跑导致重复创建工单/邮件 工具未做幂等,流程无 checkpoint 检查是否有幂等 key、checkpoint 配置 工具接入幂等 key + LangGraph Checkpoint 持久化
中间状态难追踪、状态散落在 message history 状态全塞进消息列表,无 schema 检查状态存储位置 用 LangGraph TypedDict State + 显式 channel 分层
流程分支被模型自由判断、不可控 业务规则写进 Prompt 而不是图结构 检查是否有显式路由节点 把规则写进 LangGraph add_conditional_edges
复杂 RAG 多轮检索链路混乱 把 RAG 写成单 chain 检查图结构是否包含多分支 用 LangGraph 节点化 RAG 流程 + 跨节点状态共享
多 Agent 互相甩锅、调度不清 没有显式 planner / 状态层 检查是否只有一个 while 循环 用 LangGraph 把 Agent 当节点,子流程封装 subgraph
高风险工具调用无人值守 工具调用路径未分层 检查是否直接 model → tool 增加 validate_action + risk_check + human_approval 节点
生产环境 Agent 服务重启就丢状态 使用 InMemorySaver 内存 checkpoint 检查 Checkpointer 类型 切换 PostgresSaver / SQLiteSaver 持久化存储
调试时无法定位 Agent 走到哪一步、状态怎么变 未接入 LangSmith 等 tracing 检查是否有 span trace 接入 LangSmith,记录每节点 input/output/state diff

作者:武子康的个人博客

相关推荐
武子康2 小时前
调查研究-185 CodeGraph 调研:给 AI 编程 Agent 一张代码库地图,少一点反复 grep(2026)
人工智能·openai·claude
aqi002 小时前
15天学会AI应用开发(八)使用向量数据库实现RAG功能
人工智能·python·大模型·ai编程·ai应用
JouYY3 小时前
简单聊一下Harness层中的人机协同(HITL)
前端框架·llm·agent
混沌福王4 小时前
Electron三端统一架构:运行时Adapter、IPC能力边界与分层设计
人工智能·agent·ai编程
说了很好4 小时前
马尔可夫扩散链+损失函数推导,手把手实现原生Diffusion
人工智能
聂二AI落地内参4 小时前
合同抽取别停在 JSON:标准规则和交易日历才是硬仗
人工智能
冬哥聊AI4 小时前
滴滴Agent岗二面:RAG 系统的 LLM 幻觉怎么治?从两类根源讲到四道防线
人工智能
AINative软件工程4 小时前
LLM 应用的 Bad Case 反馈闭环工程:别再把用户差评丢进客服表了
llm·openai·agent