LangGraph 快速上手指南:如何构建可恢复、可持久化的有状态智能体
【免费下载链接】langgraphBuild resilient agents.项目地址: https://gitcode.com/GitHub_Trending/la/langgraph
做 Agent 的人大概率踩过这两个坑:模型中途报错,整个对话上下文全丢;流程跑到一半想让人类插一手改个参数,却发现根本没法暂停。LangGraph 就是为了解决这类问题而生的低层编排框架:它把智能体拆成一张状态图,每一步都能落盘存档、随时断点续跑,并原生支持在任意节点暂停等待人工确认。核心功能词就三个——状态图(StateGraph)、检查点(checkpoint)、持久执行。
最快上手步骤:5 分钟跑通第一个状态图
本节帮你解决"装完包之后第一步该敲什么"的问题。不需要接 LLM,15 行以内就能看到图在跑。
pip install -U langgraphfrom typing import TypedDict from langgraph.graph import StateGraph, START, END from langgraph.checkpoint.memory import InMemorySaver class State(TypedDict): count: int def add_one(state: State) -> dict: return {"count": state["count"] + 1} builder = StateGraph(State) builder.add_node("add_one", add_one) builder.add_edge(START, "add_one") builder.add_edge("add_one", END) graph = builder.compile(checkpointer=InMemorySaver()) config = {"configurable": {"thread_id": "t1"}} print(graph.invoke({"count": 0}, config)) # {'count': 1} print(graph.invoke({"count": 0}, config)) # {'count': 2} 同一线程,状态接着上次第二段invoke的结果是 2 而不是 1——同一个thread_id会加载上次的检查点继续跑。这就是 LangGraph 和"一次性脚本"的本质区别。如果你要的是开箱即用的对话 Agent,直接用预构建模块from langgraph.prebuilt import create_react_agent,省掉上面的搭图过程。
核心机制拆解:状态图、检查点、Pregel 循环
本节帮你解决"这三个词到底怎么协作"的问题,只讲最关键的三处,不逐文件展开。
1. 状态图 StateGraph它是什么:你用add_node/add_edge声明节点和流转关系,节点读入当前状态、返回一个增量字典,框架负责合并。为什么这么设计:节点不共享内存、只通过状态交换数据,流程天然是可序列化的。你什么时候会碰到它:写业务逻辑时全部在这层完成,入口在 StateGraph 类定义。
2. 检查点 Checkpointer它是什么:每个超步(super-step)结束,框架把全部通道值写成快照。为什么这么设计:故障恢复和时间回溯都靠它——恢复时从最近快照 + 未完成的写入重建现场。你什么时候会碰到它:只要compile(checkpointer=...),后续任何thread_id都能续跑。仓库自带内存版 InMemorySaver,另有 SQLite / Postgres 两套实现放在libs/checkpoint-sqlite、libs/checkpoint-postgres。
3. Pregel 执行循环它是什么:核心调度源码 里的Pregel类,把执行切成"规划→并行执行→更新"三阶段,循环直到没有节点可跑。为什么这么设计:同一步内节点的写操作互不可见,下一才对可见,所以并行节点不会读到彼此的半成品。你什么时候会碰到它:多节点并发写同一字段、或怀疑执行顺序时,先理解这个"批量同步"模型再定位问题。
参数与配置速查:最常碰的几个开关
本节帮你解决"调哪个参数、什么时候才需要动"的问题。
| 参数名 | 作用 | 什么时候需要改 |
|---|---|---|
checkpointer | 指定状态存档后端 | 默认不传则不持久化;需要跨进程恢复、多轮记忆时必须传 |
thread_id(config 内) | 标识一条独立会话线 | 多用户/多会话场景,每个会话一个 id |
stream_mode | 控制stream()吐什么:values/updates/messages | 做前端流式 UI 时改成messages,只看节点结果用updates |
interrupt_before/interrupt_after | 在指定节点前/后暂停,等待人工输入 | 做 human-in-the-loop 审批、改状态时 |
recursion_limit | 最大超步数,防止死循环 | 循环型图(Agent 反复调工具)跑超时再调大 |
📌 划重点:最容易配错的两处——thread_id不传时每次运行都是新线程,"记忆失效"十有八九是它;InMemorySaver只适合调试,进程一退数据全没,生产环境务必换成 Postgres 或 SQLite 实现。
高频问题排查:三个最典型的症状
本节帮你解决"报错/行为怪异时先查哪里"的问题。
症状一:图跑完没记忆,第二次调用状态是空的。原因:要么compile()时没传checkpointer,要么两次调用用了不同(或缺失)的thread_id。解法:确认graph.get_graph()之外,invoke的第二个参数config里带了configurable.thread_id,且全程一致。
症状二:节点写了新值,下游读到的还是旧值。原因:这往往不是 bug 而是 Pregel 模型的正常行为——同一步并行的节点看不到彼此本步的写入,更新要到下一超步才可见。解法:如果依赖"先 A 后 B"的严格顺序,把两条并行边改成串行边(A → B),或把该字段放到独立的节点里。
症状三:跑到某个节点报错,想从错误处继续而不是从头再来。原因:没有检查点存档,或错误发生在节点函数内部且重试耗尽。解法:给易失败节点配retry_policy(如{"max_attempts": 3}),并挂上持久化 checkpointer;需要人工介入的用interrupt()(预构建模块)暂停,修好状态后用Command(resume=...)续跑。
下一步怎么走:三条进阶路径
本节帮你解决"跑通之后往哪深入"的问题。
- 读官方示例学模式:多智能体、RAG、人在环路的完整笔记本都在 examples 目录,建议从
examples/react-agent-from-scratch.ipynb开始。 - 换持久化后端:看 Postgres 检查点实现,理解
get_tuple/put/put_writes三件套协议,之后实现任意存储都能照抄。 - 摸执行引擎细节:顺着 Pregel 主类 读
_loop.py与_algo.py,搞懂超步是怎么调度和落盘的。
把上面的 15 行示例存成脚本跑一遍,然后给它换个thread_id再跑两次——看到状态各自独立地累加,你就真正入门 LangGraph 了。
【免费下载链接】langgraphBuild resilient agents.项目地址: https://gitcode.com/GitHub_Trending/la/langgraph
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考