LangGraph 是 LangChain 团队于 2024 年推出的 LLM Agent 编排框架。它的核心模型是「状态图」:节点是普通 Python 函数,边定义状态如何流转,图本身持有一份显式、可持久化的状态。传统链式编排难以表达的循环、分支、人工介入与崩溃恢复,在 LangGraph 里都是图的原生能力。框架提供检查点(每步落盘状态)、interrupt(暂停图等待人工输入)、流式输出与时间旅行调试,并配套 LangGraph Platform 托管部署和 LangSmith 可观测性,是目前构建生产级 Agent 系统的主流选择。本文按「安装 → 快速上手 → 核心能力 → 生产部署 → 选型对比」顺序组织,版本信息截至 0.5.x 正式版,末尾附常见误区与面试题,内容基于官方文档与发布记录整理。

岗位关联

掌握 LangGraph 等于掌握了 LLM Agent 从原型到生产的工程化基础:持久化、人工审批、可观测的 Agent 系统都建立在状态图这套抽象之上。

目录
  1. 为什么需要 LangGraph:链式调用扛不住 Agent 的循环与恢复
  2. 安装与环境配置:3 步就绪
  3. 快速上手:10 分钟跑通第一个带循环的状态图
  4. 核心能力详解:5 大支柱
  5. 生产部署与监控:从上线到运维
  6. 版本迭代
  7. AI 应用场景
  8. 常见误区
  9. 面试题
工具类型
Agent 状态图编排框架(图计算 + 持久化运行时)
开发商
LangChain(LangChain AI, Inc.)
开源协议
MIT(可商用)
GitHub Stars
无
主要语言
Python(另有官方 JS/TS 版 @langchain/langgraph)
当前版本
0.5.x(2025-06 发布 0.5.0)
安装方式
pip install langgraph
上手难度
★★★☆☆(需理解状态与图)
适合人群
LLM 应用/Agent 平台工程师、RAG 与多 Agent 团队
同类工具
LangChain(高层封装)· LlamaIndex(RAG 工作流)· AutoGen(多 Agent 对话)
托管服务
无

速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。

为什么需要 LangGraph:链式调用扛不住 Agent 的循环与恢复

LLM 应用早期用「链」或纯 Python 编排:一段接一段调 LLM,分支写在 if/else 里。到了 Agent 场景,三个工程问题浮出水面:其一,「思考 → 调工具 → 看结果 → 再思考」的反馈循环无法用线性链表达,最终写成递归或 while 循环加全局变量;其二,进程崩溃、请求超时后多轮对话状态全部丢失,无法从断点恢复;其三,并行分支、人工审批、多 Agent 协作这类生产需求没有统一抽象,每个团队各写一套。

LangGraph 把这些问题建模成状态图:节点是函数,边定义状态流转,图持有显式状态;运行层面提供检查点(每步落盘)、interrupt(暂停等人工输入)、流式输出与时间旅行调试,并把图编译成可嵌入任意服务的 Runnable。它以低层 API 起步,2024 年起迅速成为 Agent 生产化的主流选项之一。

与 LangChain 高层链式 API 不同,LangGraph 不替你封装 prompt 与模型路由,给的是状态机运行时。节点里可以自由调用任意函数——LangChain 组件、原生 API、数据库都行。这种「可控、可恢复、可观测」的特性,正是生产 Agent 基础设施所需要的。

安装与环境配置:3 步就绪

步骤一·建环境:需要 Python 3.9+(建议 3.11+),先建虚拟环境避免污染系统 Python。

步骤二·安装:pip 安装 langgraph 本体;接入 OpenAI 模型装 langchain-openai;需要自托管部署时再装 langgraph-cli。

步骤三·验证:打印版本号确认安装成功。

说明:langgraph 会自动拉取 langgraph-checkpoint、langgraph-sdk、langchain-core 等核心依赖,不需要手动安装。

bash5 行
python -m venv .venvsource .venv/bin/activate        # Windows: .venv\Scripts\activatepip install --upgrade pippip install langgraph langchain-openaipython -c "import langgraph; print(langgraph.__version__)"

快速上手:10 分钟跑通第一个带循环的状态图

最小流程 4 步:定义 State Schema → 实现节点函数 → 组装图 → compile 后 invoke。下面的例子不需要 API key,演示「循环 + 条件退出」。

1. 定义状态:messages 字段声明 Annotated[list, operator.add],多个节点写入时自动拼接而非覆盖。

2. 实现节点:node_a / node_b 是普通函数,返回要更新的字段字典。

3. 组装图:add_node 注册节点;add_edge(START, “a“) 固定入口;add_conditional_edges(”a”, route, ……) 让 route 函数根据当前状态决定去 b 还是终止。

4. 执行:app.invoke 返回最终状态字典。

执行路径是 a → b → a → END:node_a 执行后 route 判断消息不足 3 条去 b,b 执行完回 a,再次 route 判定达到 3 条终止。关键在于「条件转移由路由函数读状态决定」,这正是 Agent 思考循环的底层机制。进阶方向:把节点换成 LLM 工具调用(用 prebuilt 的 create_react_agent),或在 compile 时传入 checkpointer 体验断点恢复。

python33 行
import operatorfrom typing import Annotated, TypedDict from langgraph.graph import END, START, StateGraph  class State(TypedDict):    messages: Annotated[list, operator.add]  # 同 key 多次写入时按顺序拼接  def node_a(state: State) -> dict:    return {"messages": ["A 已执行"]}  def node_b(state: State) -> dict:    return {"messages": ["B 已执行"]}  def route(state: State) -> str:    # 消息累计 3 条就退出循环,否则回到 b    return END if len(state["messages"]) >= 3 else "b"  builder = StateGraph(State)builder.add_node("a", node_a)builder.add_node("b", node_b)builder.add_edge(START, "a")builder.add_conditional_edges("a", route, {"b": "b", END: END})builder.add_edge("b", "a") app = builder.compile()print(app.invoke({"messages": []})["messages"])# 输出:['A 已执行', 'B 已执行', 'A 已执行']

核心能力详解:5 大支柱

支柱一·StateGraph 显式状态:状态是全图共享的 TypedDict(或 pydantic 模型)。节点函数入参为当前状态,返回值按 key 合并进状态:未声明 reducer 的 key 直接覆盖,声明了 Annotated[list, operator.add] 的 key 走追加合并。分支汇聚、多 Agent 协作时,不同路径的产出能自然合并,不需要手工拼接上下文。编译产物是与 LangChain 生态一致的 Runnable,天然支持 invoke / stream / ainvoke。

支柱二·条件边与循环:Agent 的「观察-思考-行动」本质是环。add_conditional_edges 注册路由函数,读状态返回下一节点名,从而实现循环、早停、回退。0.2 起引入 Command,节点可直接返回 Command(goto=……, update=……) 同时决定去向与状态更新。注意图默认 recursion_limit=25,死循环会在超限时抛 GraphRecursionError。

支柱三·检查点持久化:compile() 传入 checkpointer 后,每个节点执行完状态即落盘。自带 MemorySaver(内存)、SqliteSaver(本地文件)、PostgresSaver(生产),社区另有 Redis、MongoDB 等实现。thread_id 是会话隔离键,同一 thread 的多次 invoke 从上次中断处继续——这是多轮记忆与任务恢复的基础;get_state_history 可回放任意历史状态,配合 update_state 做「时间旅行」调试。

支柱四·Human-in-the-loop:interrupt() 是暂停原语。节点里调用 interrupt(payload) 会停下图并把 payload 返回给外部调用方;外部通过 Command(resume=……)(或 LangGraph Platform 的 Assistants API)传回人工输入,图从断点继续。退款审批、人工修正 LLM 输出等流程都靠它实现。

支柱五·流式与多 Agent:stream() 支持 values(每节点后全量状态)、updates(增量)、messages(LLM token 级)、custom(自定义事件)四种模式。多 Agent 上,官方模式包括 Supervisor 主管路由、Handoff 转交、Send API 动态扇出(map-reduce,每个子任务走独立检查点分支)。

生产部署与监控:从上线到运维

部署方式一·LangGraph Platform(托管):项目根目录放 langgraph.json(声明 graphs 入口、依赖与模型配置),关联 GitHub 仓库后平台自动构建部署,或本地用 langgraph-cli 的 langgraph deploy 推送。平台内置 Postgres 持久化、任务队列、并发控制与 LangSmith 观测,前端通过 Assistants API 按 thread_id 调用,是最省事的生产路径。

部署方式二·自托管 Docker:pip install langgraph-cli 后,用 langgraph build 构建镜像、langgraph dev 启动本地服务(0.1.x 版 CLI 命令为 langgraph up)。生产环境把检查点从内存切换为 Postgres(官方提供 PostgresSaver 文档),长时间运行任务建议接 Redis 队列,避免单实例进程重启丢状态。自托管适合私有化部署或成本敏感团队。

可观测性:LangSmith 自动记录每个节点的输入输出、LLM 调用与耗时,可按 thread_id 检索整条链路;不接入外部服务时,用 graph.get_state(thread_id) 查看当前检查点、get_state_history(thread_id) 查看历史版本。线上应盯三个指标:节点级延迟、GraphRecursionError 出现频率、interrupt 等待时长(反映人工审批瓶颈)。

<p class="para-label">避坑清单:</p>

<ul class="dash-list"><li>未声明 reducer 的字段会被覆盖:多节点写入同一 key 时,无 Annotated[list, operator.add] 等 reducer 的字段采用覆盖语义,后写覆盖先写,数据静默丢失。</li><li>配了 checkpointer 却漏传 thread_id:恢复会话与记忆都依赖 thread_id,漏传会直接抛错或每次当新会话处理,多轮功能全部失效。</li><li>忽略默认 recursion_limit=25:复杂循环图超过 25 步会抛 GraphRecursionError,需在 invoke 时显式调大,否则上线后流量一大必现。</li><li>异步框架里调同步 invoke:FastAPI 等事件循环中调用同步 invoke 会阻塞整个进程,应使用 ainvoke/astream;节点内也不要混用同步与异步工具调用。</li></ul>

维度LangGraphLangChainLlamaIndexAutoGen
定位Agent 状态图编排框架(底层运行时)LLM 应用开发框架(高层抽象)RAG/文档智能工作流框架多 Agent 对话框架
编排范式图:节点=函数,边=条件转移链式/LCEL + 高层 AgentExecutor索引与 RAG 管道为主对话驱动的自动编排
类型约束State 用 TypedDict/pydantic 声明弱类型,结构自由强类型数据组件(pydantic)弱类型异步消息
学习曲线中高:需理解状态与图低中:链式思维上手快低中:RAG 起点高中:异步编程有门槛
生态集成LangChain 生态 + LangSmith + Platform集成数量最多(模型/工具/向量库)数据连接器与向量库最全微软与 Azure 生态
生产部署Platform 托管/自托管 Docker需自建(LangServe 等)需自建服务AutoGen Studio 偏实验
LicenseMIT(Platform 为商业托管)MITMITMIT(部分扩展协议不同)
适合谁需要状态机、持久化与人工介入的 Agent 团队快速搭 LLM 应用原型文档问答/RAG 系统团队多 Agent 对话研究

选型建议:快速出原型、顺序调用为主选 LangChain;核心场景是文档检索问答选 LlamaIndex;需要可控状态、多轮恢复、人工审批的生产 Agent 用 LangGraph。三者不互斥——LangGraph 节点里可直接调用 LangChain 组件,官方推荐组合是「LangChain 管模型与工具、LangGraph 管编排」。

版本迭代

LangGraph 从 2024 年初的图执行器起步,主线是「低层运行时 → Agent 生产平台」:0.2 引入 Command 并开放云平台预览,0.3 推出 LangGraph Platform 正式版与多 Agent 模式,0.4/0.5 聚焦长会话稳定性与 CLI 体验。(截至训练数据,可能已有更新版本)

版本时间变化提升
0.1.02024-03首个正式版:StateGraph 与内存检查点确立「图 + 检查点」核心 API
0.2.02024-07Command 动态转移、丰富流式模式、LangGraph Cloud 预览节点内可动态决定去向;平台化起步
0.3.02024-10LangGraph Platform GA、长期记忆与多 Agent 官方模板托管部署可商用;Supervisor 等模式沉淀
0.4.02025-02状态 schema 校验与 CLI 升级、长会话恢复优化本地开发与断点恢复体验提升
0.5.02025-06运行时与持久化稳定性增强生产稳定性成为迭代核心
结论

LangGraph 无 MMLU 类模型基准,框架能力只能从架构与社区采用衡量。版本间实测差异集中在工程面:0.3 起 create_react_agent 让最小 Agent 从几十行缩到几行;0.4/0.5 在长会话检查点恢复稳定性上有明显提升,选型时应优先使用最新稳定版。

AI 应用场景

可恢复的客服 Agent(人工审批 + 多轮记忆)

阶段:Agent 编排 / Human-in-the-loop

解决的问题:客服机器人涉及退款、改单等敏感操作,需要暂停等待人工审批;传统链式实现无法暂停,只能整轮重跑。LangGraph 用 interrupt 挂起图、检查点落盘,人工在审批面板通过后 resume 从断点继续,之前所有对话与工具结果原样保留——恢复开销从「重跑整个会话」降到「单节点重放」。

具体案例:电商售后 Agent 处理退款工单:Agent 调 CRM 拉取订单信息并整理证据 → interrupt 交人工审核 → 审核通过后从断点继续执行退款并写回工单状态。状态存 Postgres,服务重启后同一 thread_id 可从检查点直接恢复,无需重新收集信息。

多 Agent 平台(Supervisor 模式)

阶段:多 Agent 编排

解决的问题:单 Agent 挂载工具过多时路由混乱、上下文互相污染。LangGraph 上用「主管-员工」图:主管节点用 LLM 判断请求类型,条件边路由到对应子 Agent 子图;每个子图独立状态,互不干扰。

具体案例:企业内部助手拆成「SQL 查询 Agent」「文档撰写 Agent」「工单操作 Agent」三个子图,主管按意图路由。新增一个子 Agent 只需加一个子图节点与一条条件边,不动其他任何节点;各子 Agent 的中间状态不会泄漏给对方。

自适应 RAG(评估循环)

阶段:RAG 管道构建

解决的问题:固定流水线的 RAG 检索不到相关内容就「硬答」。LangGraph 把「检索 → 生成 → 评估 → 重查」建模成带条件边的环:评估节点给答案打分,不合格则改写查询词重新检索,最多重试 N 次。这是 LangGraph 社区最流行的官方模板之一(Adaptive RAG)。

具体案例:企业内部知识库问答:首轮检索召回不足时,评估节点触发改写(加限定词、拆子问题)再检索,重试上限由状态字段计数控制。相比单轮 RAG,低质量答案在「重查环」内被拦截,不会直接出给用户。

常见误区

误区LangGraph 比 LangChain 底层,LangChain 是不是快淘汰了?我直接学 LangGraph 就行。

正解两者互补而非替代。LangGraph 依赖 langchain-core 提供消息、工具与模型调用抽象,官方示例大量使用 LangChain 组件;高层链式 API 在简单顺序场景依然更省事。实际工程是 LangChain 管模型与工具规范、LangGraph 管状态编排。

为何常见:LangGraph 文档自称「低层」,且 Agent 场景里 LangChain 高层封装不够用,误导初学者以为必须二选一。

误区条件判断嘛,我在节点里写 if/else 不就行了,为什么还要学 conditional edges?

正解节点内的 if 只改变该函数内部逻辑,无法让执行流「跳到另一个节点」或「退出循环」。图的循环、早停、重试全由边驱动(add_conditional_edges 或 Command 的 goto);只有边层面的转移才能被检查点、流式与重放正确记录。

为何常见:传统编程思维默认逻辑都在函数体里,忽略了 LangGraph 是数据流结构,执行路径由图决定。

误区compile 时传了 checkpointer,Agent 应该记得所有历史对话,为什么第二轮什么都忘了?

正解检查点只是「每步落盘」,跨轮次恢复还需要两个条件:每次 invoke 传相同的 thread_id;State 里设计累积字段(如 messages 带 operator.add reducer)。缺了任一条件,状态存了也取不回。

为何常见:官方把 checkpointer(持久化)与记忆(状态累积)分成两个概念讲,速览教程常被合并理解。

误区LangGraph 官网要注册还要 API key,是商业闭源工具吧?

正解核心库 langgraph 是 MIT 开源、免费可商用,pip 安装即可用。商业部分只有 LangGraph Platform(托管部署与运维);开源版可以用 langgraph-cli 自托管 Docker,达到同等功能。

为何常见:官方宣传重心在平台,文档入口常引导注册 LangSmith,造成开源与付费边界模糊。

误区图里有两个节点,LangGraph 会自动开两个线程并行跑吗?

正解LangGraph 默认是确定性的拓扑执行,只有拓扑上无依赖关系的节点才可能并行。要做动态扇出(map-reduce)应使用 Send API,每个扇出任务走独立的检查点分支;普通先后关系的节点严格按边顺序执行。

为何常见:看到「图/并行」字样就联想到线程池,忽略了图执行是事件驱动的拓扑遍历。

面试题

Q1. 在 StateGraph 中,节点函数的返回值应当是什么?

单选题 · easy

  • A.要更新的状态字段字典← 正确答案
  • B.完整的新状态对象
  • C.下一个节点的名称
  • D.LLM 生成的文本

答案:A。节点返回 dict,其中的 key 会被合并进图状态(reducer 决定冲突语义),因此只返回需要更新的字段即可。返回下一个节点名是条件边路由函数的职责;返回完整状态对象虽可行但没必要,且容易误覆盖其他节点写入的字段。

Q2. 安装 LangGraph 核心库的正确命令?

单选题 · easy

  • A.pip install langchain
  • B.pip install langgraph← 正确答案
  • C.npm install langgraph
  • D.pip install langgraph-ai

答案:B。PyPI 包名是 langgraph,核心依赖(langgraph-checkpoint、langchain-core 等)自动安装。langchain 是另一个生态库;npm 安装的是 JS 版包 @langchain/langgraph;langgraph-ai 包不存在。

Q3. LangGraph 中实现 Agent「观察→思考→行动」循环的机制是?

单选题 · easy

  • A.在节点里写循环
  • B.条件边指回前面节点成环← 正确答案
  • C.递归调用节点自身
  • D.多图实例轮流执行

答案:B。LangGraph 的循环由图的环表达:条件边的路由函数根据状态把下一跳指回前面的节点,迭代直到满足退出条件。节点内 while 会阻塞图执行且无法被检查点记录;递归容易爆栈;多实例轮流执行与「同一张图的循环」是两回事。

Q4. Checkpointer(检查点)的核心作用?

单选题 · mid

  • A.缓存 LLM 输出来降低费用
  • B.校验 LLM 输出的格式
  • C.加速模型的推理速度
  • D.每步保存状态支持断点恢复← 正确答案

答案:D。检查点在每个节点执行后把图状态写入存储(内存/文件/Postgres),配合 thread_id 可从上次中断恢复、支持多轮对话与时间旅行调试。节省费用、校验输出、加速推理分别是缓存、validator、推理优化组件的职责,不属于 checkpointer。

Q5. 配置了 checkpointer 后,invoke 时通过什么区分不同会话?

单选题 · mid

  • A.调用时传入的 thread_id← 正确答案
  • B.图中节点函数的命名
  • C.图编译时的版本号
  • D.会话所用模型名称

答案:A。thread_id 是会话隔离键,位于 invoke 的 config["configurable"]["thread_id"]。同一 thread_id 的调用共享检查点历史(可恢复、可累积),不同 thread_id 之间互不可见。节点名、图版本、模型名都不是会话标识。

Q6. interrupt() 在 LangGraph 中的用途?

单选题 · mid

  • A.暂停图执行等待外部输入← 正确答案
  • B.终止整个图并清空状态
  • C.中断 LLM 的流式输出
  • D.抛出异常通知调用方

答案:A。interrupt(payload) 会暂停图执行并把 payload 返回给外部调用方(如前端审批界面);外部通过 Command(resume=……) 传回人工输入后,图从断点继续。这是 Human-in-the-loop 的核心原语;清空状态、中断流式、抛异常都不是它的语义。

Q7. State 中 messages: Annotated[list, operator.add] 的含义?

单选题 · hard

  • A.字段数据只增不减
  • B.对该字段做强类型校验
  • C.写入时按列表拼接非覆盖← 正确答案
  • D.每次更新自动去重

答案:C。Annotated + operator.add 是 reducer 声明:同 key 被多个节点写入时,用 operator.add 把新值与旧值拼接(list 拼接),避免默认的「覆盖」语义丢消息。它不控制增删、不做类型校验也不去重。reducer 是 LangGraph 状态合并机制的入口。

Q8. 以下哪些是 LangGraph 用于生产部署与观测的能力?

多选题 · mid

  • A.平台托管部署与持久化← 正确答案
  • B.自托管 Docker 部署← 正确答案
  • C.LangSmith 追踪 trace← 正确答案
  • D.内置模型能力评测

答案:ABC。平台托管、CLI 自托管、LangSmith 节点级 trace 都是官方提供的生产路径;stream() 的 updates/messages 模式也常用于过程观测。MMLU 一类是模型能力评测基准,与框架无关,LangGraph 内置不包含任何模型评测。

Q9. 关于 LangGraph 的边与执行流,下列说法正确的是?

多选题 · hard

  • A.条件边路由函数返回下一节点名称← 正确答案
  • B.节点函数必须返回下一节点名称
  • C.START 是图执行的唯一入口← 正确答案
  • D.END 表示执行正常终止← 正确答案

答案:ACD。条件边的路由函数读状态并返回目标节点名,驱动循环与分支;START/END 是伪节点,分别标记唯一入口与正常终止。普通节点函数只返回状态更新,去向完全由边决定,不需要也不允许返回下一节点名——除非改用 Command 动态转移。

Q10. 关于 LangGraph 与 LangChain 的关系,正确的是?

多选题 · hard

  • A.两者互斥只能二选一
  • B.官方团队持续开源维护← 正确答案
  • C.底层依赖它的核心抽象← 正确答案
  • D.节点内可调用其组件← 正确答案

答案:BCD。LangGraph 由 LangChain 团队维护,底层依赖 langchain-core 的消息、工具与模型抽象,并可与高层链式 API 混用——把 LCEL 链当普通函数放进节点即可。两者互补而非互斥,官方推荐组合使用。