一: 持久化能力
LangGraph 支持图状态的持久化和重放。
利用检查点(checkpointing)来持久化图状态,以及利用检查点执行图得重放和状态更新
检查点是图状态的快照,在图的每个超级步骤(superstep)执行后保存。每个检查点都与一个**线程(thread)**相关联,线程是检查点的集合。
当您调用图时,可以指定 thread_id 作为图配置的一部分。如果您不提供 thread_id,LangGraph 会自动生成一个。
持久化能力的基础:
①: 检查点:
本质:图状态的快照,在每个执行步骤(超级步骤)后自动保存。
作用:支撑状态恢复、重放和调试。
检查点结构:
每个检查点都是一个 StateSnapshot 对象,其中包含:
values: 图状态的值
next: 下一个要执行的节点
config: 检查点配置,包括 thread_id 和 checkpoint_id
metadata: 关于检查点的元数据,如源节点和写入的内容
created_at: 创建时间
parent_config: 父检查点的配置
tasks: 与检查点相关的任务
②线程(Thread)
定义:关联特定执行实例的检查点集合,通过 thread_id 标识(可自定义为会话 ID、用户 ID 等)。
特性:调用图时指定 thread_id 即可绑定线程,未指定则自动生成。
持久化能力核心功能:状态的管理与操作
① 状态保存与启用
启用方式:编译图时指定检查点保存器(如 InMemorySaver 内存保存、SqliteSaver 数据库保存)。
自动保存:图执行时,每个步骤后自动生成检查点,覆盖初始状态、各节点执行后状态。
②状态获取
获取最新状态:通过 graph.get_state(config),传入 thread_id 即可。
获取历史状态:通过 graph.get_state_history(config),按时间顺序返回线程的所有检查点(最新在前)。
③状态重放
逻辑:指定 thread_id 和 checkpoint_id,图会跳过该检查点之前的已执行步骤,仅执行后续步骤。
用途:调试、复现执行流程、分支探索。
④状态更新
方法:通过 graph.update_state(config, values) 编辑状态,支持分支现有检查点。
规则:无 reducer 的状态字段直接覆盖,有 reducer 的字段按规则合并(如列表拼接)。
可选参数 as_node:指定更新来源节点,影响后续执行路径。
扩展:
内置:InMemorySaver(适合实验)。
扩展:SqliteSaver(本地生产)、PostgresSaver(分布式生产),需单独安装。
持久化的核心价值
人机循环:支持流程暂停(如人工审核)后恢复,保留中间状态。
记忆保留:跨对话 / 线程共享用户信息,无需重复输入。
时间旅行:重放执行流程,快速调试问题。
容错恢复:节点故障后,从最后一个成功检查点重启,避免重复执行。
二. 持久执行
持久执行是一种技术,其中流程或工作流在关键点保存其进度,使其能够暂停并在稍后从停止的确切位置恢复。
通过保留已完成的工作,持久执行使流程能够恢复而无需重新处理之前的步骤------即使在显著延迟后(例如,一周后)。
核心定义与价值:
①持久执行:工作流在关键点保存进度,可暂停并从停止位置恢复,无需重跑已完成步骤。
②核心场景:人在循环交互(如人工审核)、长时间任务(如 LLM 超时)、系统故障恢复(中断后免重复处理)。
③启用前提:编译图时指定 checkpointer(检查点),即默认开启持久执行。
三种持久性模式:
调用方式:通过 durability 参数指定(如 graph.stream(input, durability="sync"))。
| 模式 | 核心逻辑 | 性能 | 一致性 | 适用场景 |
|---|---|---|---|---|
| exit | 仅工作流完成(成功 / 失败)后持久化状态 | 最佳 | 最低 | 无需中途恢复的短任务 |
| async | 异步持久化(并行执行下一步与保存检查点) | 良好 | 中等 | 多数常规场景 |
| sync | 同步持久化(保存检查点后再执行下一步) | 较差 | 最高 | 数据不允许丢失的核心任务 |
三. 流式传输
LangGraph实现了一个流式传输系统,用于实时输出执行进度与数据。
支持的流式传输模式
| 模式 | 描述 |
|---|---|
| values | 在图的每个步骤后流式传输状态的完整值 |
| updates | 在图的每个步骤后流式传输状态的更新。如果在同一步骤中进行了多次更新(例如,运行了多个节点),这些更新会分别流式传输。 |
| custom | 从图节点内部流式传输自定义数据。 |
| messages | 从调用LLM的任何图节点流式传输2元组(LLM令牌,元数据)。 |
| debug | 在图执行过程中流式传输尽可能多的信息。 |
四. 中断
LangGraph 的中断(Interrupt) 功能允许在图执行的任意点动态暂停流程,等待外部输入(如人工审批、内容编辑)后再恢复,核心依赖检查点(持久化状态) 和thread_id(定位待恢复状态);
中断通过在图节点的任何点调用interrupt()函数来工作。该函数接受任何JSON可序列化的值,这些值会显示给调用者。当您准备好继续时,您通过使用Command重新调用图来恢复执行,然后它成为节点内部interrupt()调用的返回值。
中断定义:LangGraph 中用于动态暂停图执行、等待外部输入的功能,区别于静态断点(固定节点前后暂停),可在节点代码任意位置触发,适配人在循环场景。
价值: 解决 "流程需外部干预" 的需求,如关键操作审批、LLM 输出纠错、工具调用确认等,确保流程安全性和灵活性。
依赖基础:
① 检查点(Checkpointer):必须启用(如InMemorySaver、SqliteSaver),用于持久化暂停时的图状态,确保恢复时不丢失进度。
② thread_id:作为 "持久游标",通过config={"configurable": {"thread_id": ...}}配置,复用该 ID 可恢复对应状态,新 ID 则启动全新流程。
核心要求:必须使用与暂停时相同的 thread_id