1 什么是LangGraph
LangGraph 是一个低级编排框架和运行时环境,用于构建、管理和部署长期运行的有状态智能体(agents)。核心理念是将 Agent 工作流建模为图(Graph),其中:
- 节点(Nodes):代表计算单元,可以是 LLM 调用、工具执行或任何自定义逻辑
- 边(Edges):定义节点之间的转换逻辑,决定执行流程
- 状态(State):在整个图执行过程中共享和传递的数据
LangGraph 独有的核心能力(生产 Agent 刚需)
- ✅循环:Agent 可以反复调用工具、反复反思,直到满足条件(最核心!普通 chain 做不到)
- ✅持久化 Checkpoint:执行一半暂停、断线、程序崩溃,下次可以从刚才的状态继续跑,不用从头来
- ✅Human-in-the-loop(人在回路):流程跑到某个节点自动暂停,交给人工审核、审批,再继续跑
- ✅ 支持多 Agent 协作:多个智能体分工(规划 Agent、检索 Agent、总结 Agent)互相调度
- ✅ 可观测:每一步状态都能看到,方便调试复杂 Agent
提供了构建生产级智能体应用的核心能力:
持久化执行:构建能够从故障中恢复并长时间运行的智能体
人机协作:在任何时刻检查和修改智能体状态
记忆管理:支持短期工作记忆和跨会话的长期记忆
流式处理:专为流式工作流设计
生产级部署:为有状态、长期运行的工作流提供可扩展的基础设施
LangGraph官方源码地址及官网地址如下:
- GitHub地址:https://github.com/langchain-ai/langgraph
- 官方文档:https://docs.langchain.com/oss/python/langgraph/overview
2 与 LangChain 区别
- LangChain
提供一堆可复用组件:PromptTemplate、LLM 封装、OutputParser、DocumentLoader、向量库、工具、LCEL 管道。
擅长:把各个模块拼起来,做固定流程。
LCEL(|管道)就是 LangChain 的链式语法,只能串行、并行,不能循环、不能动态分支。 - LangGraph
专门解决【动态不确定流程】,基于**图(Graph)**思想做状态驱动的流程控制。
它本身不提供 LLM、提示模板这些组件,里面节点直接用 LangChain 的 Chain、LLM、工具。
擅长:分支判断、循环迭代、人在回路、断点续跑的 Agent。
LangGraph与LangChain的高级抽象不同,它提供了更细粒度的控制,让开发者能够精确控制智能体的执行流程,适合需要定制化编排的复杂应用场景。
通过一句话概述LangChain和LangGraph的区别:当 LLM 应用需要「有状态、可循环、可分支的多步骤控制流(像一个可回溯的流程图/状态机)」时,LangChain 很难优雅完成,而必须用 LangGraph。
以下表格以更细粒度的方式展示了两者的区别:
| 特性 | LangGraph | LangChain |
|---|---|---|
| 抽象级别 | 低级,提供细粒度控制 | 高级,开箱即用 |
| 状态管理 | 内置状态机和检查点 | 需要自行管理状态 |
| 执行模型 | 基于图的并行执行 | 线性链式执行 |
| 持久化 | 原生支持 | 需要额外实现 |
| 适用场景 | 复杂、有状态的智能体应用开发 | 简单的链式调用 |
| 特性 | LangChain(LCEL Chain) | LangGraph |
|---|---|---|
| 流程形态 | 线性 / 并行,单向流水线 A→B→C | 图结构:节点 + 条件边,可以来回跳转、循环 |
| 循环 | ❌ 不支持,链条走完就结束 | ✅ 核心能力,反复思考、反复调用工具 |
| 分支判断 | 有限,很难做复杂条件路由 | ✅ 原生支持条件边,LLM 自主选择下一步 |
| 全局状态 | 每个节点输入输出传递,没有统一共享状态 | ✅ 统一 State 全局状态,所有节点读写同一份状态 |
| 断点 / 持久化 | ❌ 跑完就没了,不能暂停恢复 | ✅ Checkpoint,保存状态,随时暂停、继续 |
| 人在回路(人工审核) | 很难实现 | ✅ 原生支持,跑到节点停下来等人工确认 |
| 适合场景 固定逻辑:翻译、简单问答、同时并行调用多个 LLM(你刚才 RunnableParallel) | Agent、工具调用、自动研究、多智能体协作 |
正是因为LangGraph和LangChain上述的区别,使得LangGraph在以下场景下,有了更加广泛的应用:
- 复杂的多智能体系统
- 需要长期记忆的应用
- 需要人工审核的工作流
- 后台处理任务和实时交互
- 需要精细控制的定制化智能体编排
3.环境创建
conda create –-name=langgraph_venv3.12conda activate langgraph_venv pip install langgraph==1.0.5确认成功
pip show langgraph4. 简单实现
使用LangGraph构建一个应用,可以分为如下步骤:
(1)定义状态;
(2)定义节点函数;
(3)通过状态创建builder实例,并添加节点和边;
(4)对builder进行编译,得到可调用的graph对象;
(5)调用graph。
接下来的例子,以一个基于RAG的问答系统为例,来做一个快速入门展示。
该问答系统需要实现的功能如下:当接收用户问题之后,先分别进行联网搜索和基于知识库的检索,得到结果之后,使用大语言模型进行总结回答。
具体代码如下所示:
fromtypingimportTypedDictfrompydanticimportBaseModelfromlanggraph.constantsimportSTART,ENDfromlanggraph.graphimportStateGraphfromlanggraph.typesimportSend,Commandfromrichimportprintasrprint# 定义图的状态结构# 定义状态classMyAgentState(TypedDict):query:str# 用户提问rag_res:str# rag检索我接过web_res:str# web搜索结果llm_res:str# LLM回复结果# 定义节点## 定义RAG节点defrag_node(state:MyAgentState):#取到 用户的原始提问query=state.get('query')# 这边模拟获取到了结果reg_res=f"用户原始提问为:{query},返回rag检索结果"# 将结果更新到状态里面return{"rag_res":reg_res}## 定义web搜索节点defweb_node(state:MyAgentState):# 拿到客户的原始节点query=state.get("query")# 模拟得到了结果web_res=f"用户原始提问为:{query},返回web搜索结果"# 将结果更新到状态里面return{"web_res":web_res}## 定义LLM节点defLLM_node(state:MyAgentState):# 拿到客户的原始提问query=state.get("query")# 拿到 rag 的检索结果rag_res=state.get('rag_res')# 拿到 web 的搜索结果web_res=state.get('web_res')# 模拟得到了结果llm_res=f"用户原始输入:{query},rag检索结果:{rag_res},web搜索结果:{web_res}"return{"llm_res":llm_res}# 构建 builder 实例化状态图构建器,指定状态模板builder=StateGraph(state_schema=MyAgentState)# 王状态图中添加节点# "rag_node" -- 取了一个名字,重命名builder.add_node("rag_node",rag_node)builder.add_node("web_node",web_node)builder.add_node("LLM_node",LLM_node)# 网状态图中添加边#起点 → rag节点builder.add_edge(START,"rag_node")#起点 → web搜索节点builder.add_edge(START,"web_node")# rag节点完成后 → 汇总节点llmbuilder.add_edge("rag_node","LLM_node")# web节点完成后 → 汇总节点llmbuilder.add_edge("web_node","LLM_node")# llm节点完成 → 图结束builder.add_edge("LLM_node",END)# 编译图,得到可运行的buildercompile_graph=builder.compile()# 触发执行,传入初始状态res=compile_graph.invoke({"query":"如何使用LangGraph"})# 打印最终状态结果rprint(res)运行结果 :
编译好之后,可以通过mermaid查看图的结构。
# pip install grandalfgraph_structure=compiled_graph.get_graph()res=graph_structure.draw_ascii()print(res)