LangGraph 中的 Checkpoint 机制:实现 Agent 的时间旅行与状态回滚
LangGraph 中的 Checkpoint 机制:实现 Agent 的时间旅行与状态回滚
如果你玩过《塞尔达传说》这类开放世界游戏,一定对「存档」功能情有独钟:打Boss前存个档,输了可以随时读档重来;遇到剧情分支点存多个档,可以体验不同的剧情结局。对于当下火热的 LLM Agent 而言,LangGraph 的 Checkpoint 机制就是这样的「超级存档系统」:它不仅能实现故障恢复、状态回滚,甚至支持任意历史节点的分支探索,让Agent真正拥有「时间旅行」的能力。
1. 引入与连接:为什么 Agent 迫切需要 Checkpoint 能力?
1.1 那些让开发者崩溃的 Agent 痛点
我们先来看几个所有Agent开发者都遇到过的真实场景:
- 🚨 场景1:长流程任务中途崩溃:你开发了一个科研文献梳理Agent,需要连续调用10次学术数据库、整理200篇文献摘要、生成最终综述,整个过程需要3小时。结果跑了2小时40分钟的时候,调用数据库的接口超时报错,整个任务直接终止,所有进度付诸东流。
- 🤦 场景2:用户要求「回到上一步」:你做了一个客服Agent,用户和Agent沟通了8轮,终于到了套餐推荐环节,用户突然说「不对,我之前说过我每个月流量要150G,你给我推荐的套餐只有100G,回到我刚才说流量需求的那一步重新来」,你只能傻眼:因为Agent的状态是流式更新的,根本没有存历史状态。
- 🔍 场景3:Bug复现难如登天:你线上的Agent偶尔会出现逻辑错误,但是错误是随机出现的,LLM的输出有随机性,工具调用的结果也有波动,每次复现都要重新跑整个流程,运气不好跑10次都碰不到一次错误,Debug效率极低。
- 🧪 场景4:A/B测试变量无法控制:你想测试两个不同的prompt对Agent结果的影响,但是每次从头跑的话,工具返回的结果可能不一样,LLM的采样也有随机性,根本没法确定结果的差异是来自prompt还是其他变量。
这些问题的核心痛点,本质上都是Agent的执行是状态依赖、非确定性、长链路的,如果没有对历史状态的持久化、回溯、分支能力,所有的长流程Agent、可交互Agent、生产级Agent都只能是玩具。而LangGraph的Checkpoint机制,就是专门为解决这些痛点设计的核心能力。
1.2 学习价值与应用场景预览
读完本文你将掌握:
- 从0到1理解LangGraph Checkpoint的核心原理与实现逻辑
- 快速为你的Agent添加状态持久化、回滚、分支能力
- 生产环境部署Checkpoint的最佳实践与踩坑指南
- 基于Checkpoint实现Agent调试、A/B测试、合规审计等高级玩法
本文的内容覆盖从入门到进阶:新手可以快速学会怎么用Checkpoint,资深开发者可以深入理解底层实现逻辑,架构师可以参考生产级部署方案。
1.3 本文学习路径
2. 概念地图:Checkpoint 核心认知框架
2.1 核心概念定义
| 术语 | 定义 | 类比 |
|---|---|---|
| Checkpoint | LangGraph中对Agent执行过程中某一时刻的完整状态快照 + 执行元数据的持久化存储单元 | 游戏的存档文件,包含当前的游戏进度、角色状态、背包物品等所有信息 |
| Thread | Agent的独立执行实例,每个Thread对应一个独立的状态版本链 | 游戏的一个存档档位,不同档位的进度互不影响 |
| 版本链 | 同一个Thread下所有Checkpoint按执行顺序组成的有向无环链,每个Checkpoint都指向父Checkpoint | 游戏的自动存档序列,每过一个任务点自动存一个档,可以顺着档往前回溯 |
| 时间旅行 | 从当前状态跳转到任意历史Checkpoint的状态,并且可以从该状态重新执行 | 读档回到过去的某个时间点,重新玩后面的流程 |
| 分支探索 | 从某个历史Checkpoint出发,执行不同的逻辑生成新的版本链,和原链并行存在 | 从同一个存档点出发,选择不同的剧情选项,玩出不同的结局 |
2.2 Checkpoint 与其他存储方案的核心差异
很多开发者会混淆Checkpoint和普通的状态存储、缓存、日志,我们通过下表明确边界:
| 对比维度 | LangGraph Checkpoint | 普通KV状态存储 | 应用日志 | 缓存 |
|---|---|---|---|---|
| 绑定执行上下文 | 和LangGraph节点执行深度绑定,感知执行位置、节点状态、调用链路 | 仅存数据,无执行上下文 | 仅存事件记录,无完整状态 | 存热点数据,无版本概念 |
| 版本链支持 | 天然支持多版本、父子关系、分支 | 仅存最新版本,需额外开发版本逻辑 | 线性序列,无版本关联 | 无版本,过期自动删除 |
| 增量存储优化 | 默认支持增量存储,仅存状态变化部分 | 全量存储,需额外开发增量逻辑 | 全量记录事件 | 全量存储 |
| 回滚恢复能力 | 一键回滚到任意历史状态,自动恢复执行上下文 | 需手动恢复状态,重建执行上下文 | 需手动解析日志恢复状态 | 无恢复能力 |
| 并发一致性 | 线程安全,支持多并发实例状态隔离 | 需额外实现并发控制 | 无并发控制 | 无并发控制 |
2.3 Checkpoint 核心能力边界
✅ 适用场景:
- 长流程任务(执行时间>1分钟)的故障恢复
- 需要用户中途干预、可回退的对话Agent
- 需要审计、留痕的合规场景Agent
- Agent研发阶段的调试、复现、A/B测试
- 多分支路径探索的推理Agent
❌ 不适用场景:
- 无状态、短链路的简单Agent(比如单轮问答)
- 对延迟要求极高(<10ms)且不需要持久化的场景
- 状态包含不可序列化对象(打开的文件句柄、网络连接、GPU显存指针等)的场景
- 状态体积超过1GB的超大状态场景(建议将大对象存在外部存储,Checkpoint仅存引用)
3. 基础理解:Checkpoint 的直观认知
3.1 生活化类比:Checkpoint 就是 Agent 的「时光机」
我们可以把Agent的执行过程比作坐火车旅行:
- 整个旅行路线就是LangGraph定义的执行图
- 每个站点就是图中的一个节点
- 你身上的行李、车票、当前位置就是Agent的状态
- 每到一个站点你就拍一张照片,记录自己的行李、位置、时间,这就是生成一个Checkpoint
- 如果你坐过站了,可以拿出之前站点的照片,回到那个站点重新坐车,这就是回滚
- 如果你到了一个站点,想试试另一条路线,可以拿着这个站点的照片去坐另一条线路的车,这就是分支探索
- 如果你中途下车吃饭,回来可以拿着最后一个站点的照片继续坐车,这就是故障恢复
3.2 最小示例:3行代码给Agent加上Checkpoint
我们先来看一个最简单的示例,感受Checkpoint的使用有多简单:
# 1. 导入Checkpoint存储后端
from langgraph.checkpoint.sqlite import SqliteSaver
# 2. 初始化持久化存储,存在本地sqlite文件
checkpointer = SqliteSaver.from_conn_string("my_agent_checkpoints.db")
# 3. 编译图的时候传入checkpointer
app = workflow.compile(checkpointer=checkpointer)
只需要这3行,你的Agent就自动拥有了状态持久化、回滚、故障恢复的能力,不需要修改任何节点逻辑,LangGraph会自动在每个节点执行完成后生成Checkpoint。
3.3 常见误解澄清
❌ 误解1:Checkpoint会严重影响执行性能
真相:LangGraph默认采用增量存储,仅存和上一个Checkpoint相比变化的状态字段,性能损耗在5%以内,对99%的场景都可以接受。你也可以自定义触发策略,只在关键节点生成Checkpoint,进一步降低性能损耗。
❌ 误解2:Checkpoint只能线性回滚,不能分支
真相:Checkpoint的版本链是有向无环图,不是线性链表,你可以从任意历史Checkpoint生成新的分支,多个分支并行存在,互不影响。
❌ 误解3:Checkpoint只能存在SQLite里
真相:LangGraph提供了多后端支持,包括内存、SQLite、PostgreSQL、Redis、MongoDB,你也可以自定义存储后端,只要实现CheckpointSaver接口就行。
❌ 误解4:回滚会丢失历史数据
真相:默认回滚不会删除任何历史Checkpoint,只是创建新的分支,原有的历史版本会完整保留,你随时可以切回原分支。
4. 层层深入:Checkpoint 的核心实现原理
4.1 第一层:Checkpoint 的核心数据结构
每个Checkpoint都包含以下核心字段:
class Checkpoint(TypedDict):
id: str # 全局唯一的Checkpoint标识,UUID格式
thread_id: str # 所属的执行实例ID,用于隔离不同的Agent执行
parent_id: Optional[str] # 父Checkpoint的ID,初始Checkpoint的parent_id为None
state: Dict[str, Any] # 状态快照/增量变化
metadata: Dict[str, Any] # 执行元数据:节点名称、执行时间、LLM调用信息、工具调用结果、错误信息等
step: int # 执行步数,从0开始递增
version: int # Checkpoint格式版本,用于兼容升级
我们可以用ER图展示实体关系:
4.2 第二层:Checkpoint 的写入流程
LangGraph默认会在每个节点执行完成后自动触发Checkpoint写入,流程如下:
数学模型:增量存储的计算
我们用形式化公式描述增量存储的逻辑:
Δt={k:v∣k∈St,(k∉St−1∨St[k]≠St−1[k])}
\Delta_t = \{ k: v | k \in S_t, (k \notin S_{t-1} \lor S_t[k] \neq S_{t-1}[k]) \}
Δt={k:v∣k∈St,(k∈/St−1∨St[k]=St−1[k])}
其中 Δt\Delta_tΔt 是第t个Checkpoint的增量状态,仅保留和上一个状态不同的字段。恢复状态的时候,只需要把所有增量按顺序合并:
St=S0⊕Δ1⊕Δ2⊕...⊕Δt
S_t = S_0 \oplus \Delta_1 \oplus \Delta_2 \oplus ... \oplus \Delta_t
St=S0⊕Δ1⊕Δ2⊕...⊕Δt
其中 ⊕\oplus⊕ 是状态合并运算符,后续的增量会覆盖前面的同名字段。
这种增量存储的优势非常明显:如果你的状态里有100个字段,每次只有1个字段变化,那么每个Checkpoint的体积只有全量存储的1%,大大降低存储成本和写入耗时。
4.3 第三层:Checkpoint 的回滚与时间旅行实现
回滚的核心逻辑是根据用户指定的回溯条件,找到对应的Checkpoint,恢复状态到运行时,并且可以选择是否创建新分支:
数学模型:分支创建的逻辑
当你从第k个Checkpoint创建新分支的时候,新的版本链和原版本链并行存在:
Ck+1′=Checkpoint(idk+1′,parent_id=idk,Δk+1′,Mk+1′)
C'_{k+1} = \text{Checkpoint}(id'_{k+1}, parent\_id=id_k, \Delta'_{k+1}, M'_{k+1})
Ck+1′=Checkpoint(idk+1′,parent_id=idk,Δk+1′,Mk+1′)
其中 idkid_kidk 是分支起点的Checkpoint ID,Δk+1′\Delta'_{k+1}Δk+1′ 是新分支第一步的增量状态,和原版本链的 Ck+1C_{k+1}Ck+1 互不影响。
4.4 第四层:Checkpoint 的一致性保证
LangGraph的Checkpoint机制提供了ACID级别的一致性保证:
- 原子性:每个Checkpoint的写入是原子操作,要么全部成功,要么全部失败,不会出现半写的情况
- 一致性:状态合并逻辑是确定性的,同一个版本链的Checkpoint合并出来的状态永远是一致的
- 隔离性:不同Thread的Checkpoint完全隔离,并发执行不会互相影响
- 持久性:写入持久化存储后端的Checkpoint永远不会丢失,除非主动删除
5. 多维透视:Checkpoint 的应用场景与发展历程
5.1 历史视角:Checkpoint 的演进路线
| 时间 | 版本 | 核心能力 |
|---|---|---|
| 2023年Q4 | LangGraph v0.1 | 首次推出基础Checkpoint功能,支持内存、SQLite存储,线性回滚 |
| 2024年Q1 | LangGraph v0.3 | 支持增量存储、分支探索,新增PostgreSQL、Redis存储后端 |
| 2024年Q2 | LangGraph v0.5 | 支持自定义Checkpoint触发策略、自定义序列化器、可观测性集成 |
| 2024年Q3 | LangGraph v0.7 | 支持Checkpoint压缩、生命周期管理、跨区域同步 |
| 2024年Q4(预测) | LangGraph v1.0 | 支持分布式Checkpoint、自动冷热存储分层、AI辅助根因分析 |
| 2025年Q2(预测) | LangGraph v1.2 | 支持状态差异可视化、自动回滚修复、跨Agent状态共享 |
5.2 实践视角:Checkpoint 的4大核心应用场景
场景1:长流程任务的故障恢复
某公司的财务报销审核Agent,需要处理员工提交的报销单,依次完成OCR识别、票据验真、规则校验、预算扣减、审批流转,整个流程平均耗时15分钟,高峰期每天处理上万单。如果没有Checkpoint,一旦某个环节出错,整个流程就要重来,员工体验极差,系统资源也被浪费。
解决方案:每个节点执行完成后生成Checkpoint,一旦某个环节出错,直接从出错节点的上一个Checkpoint恢复,重试即可,不需要重新跑整个流程,系统可用性从92%提升到99.99%。
场景2:可交互Agent的时间旅行
某电商的导购Agent,用户和Agent沟通多轮后,经常需要回退到之前的步骤修改需求。比如用户一开始说要找1000元以内的运动鞋,沟通了5轮之后突然说「我预算可以加到1500,回到我刚才说要跑鞋的那一步重新推荐」。
解决方案:用户触发回滚的时候,直接定位到对应节点的Checkpoint,恢复状态后重新执行,整个过程不到1秒,用户体验极佳。
场景3:Agent研发的调试与A/B测试
某团队在开发法律问答Agent,需要测试不同的prompt模板、不同的LLM模型对结果准确率的影响。如果没有Checkpoint,每次测试都要从头跑,工具调用的结果、LLM的采样随机性会导致结果不可比。
解决方案:用同一个测试用例跑一遍,生成的Checkpoint作为基准,从同一个Checkpoint出发,分别用不同的prompt、不同的模型跑分支,所有变量只有要测试的参数,结果准确率对比的可信度达到100%,调试效率提升了10倍。
场景4:合规场景的审计留痕
某银行的投顾Agent,监管要求所有的投资建议决策过程必须可追溯、可审计,保存时间不少于5年。
解决方案:所有Checkpoint永久存储在对象存储里,每个Checkpoint包含了决策过程中的所有输入、LLM输出、工具调用结果、状态变化,审计的时候只需要调出对应的Thread的所有Checkpoint,就能完整还原整个决策过程,完全满足监管要求。
5.3 批判视角:Checkpoint 的局限性
- 序列化限制:状态必须是可JSON序列化的,不能包含不可序列化的对象,比如打开的文件句柄、网络连接、GPU显存指针等
- 存储成本:如果状态体积大、Checkpoint生成频率高,存储成本会上升,需要合理设置保留策略和存储分层
- 性能损耗:虽然增量存储的损耗很小,但是对于极端低延迟的场景(比如<10ms的单轮问答),还是会有一定的影响
- 分支膨胀:如果大量创建分支不清理,会导致存储膨胀,查询效率下降,需要定期清理无用分支
6. 实践转化:从零实现支持时间旅行的 Agent
6.1 环境安装
首先安装所需依赖:
# 基础依赖
pip install langgraph langchain-openai python-dotenv pydantic
# 可选存储后端
pip install psycopg2-binary # PostgreSQL支持
pip install redis # Redis支持
pip install pymongo # MongoDB支持
6.2 系统功能设计
我们要实现一个支持时间旅行的任务规划Agent,核心功能包括:
- 任务规划、执行、总结全流程自动化
- 查看所有历史Checkpoint
- 支持按ID、时间、节点名、步数回滚
- 支持分支探索,对比不同分支的结果
- 支持导出历史执行记录用于审计
6.3 系统架构设计
架构说明:元数据存在PostgreSQL里,查询效率高;大的状态对象(比如上传的文件、生成的向量)存在MinIO里,Checkpoint仅存对象的URL,降低存储成本。
6.4 核心实现代码
第一步:定义状态与节点
from typing import TypedDict, Annotated, Optional, List
from langgraph.graph import StateGraph, END
from langgraph.checkpoint.postgres import PostgresSaver
from langchain_openai import ChatOpenAI
from langchain_core.messages import BaseMessage, HumanMessage, SystemMessage
from langgraph.graph.message import add_messages
from pydantic import BaseModel
import os
import psycopg2
from dotenv import load_dotenv
load_dotenv()
# 定义状态
class AgentState(TypedDict):
messages: Annotated[List[BaseMessage], add_messages]
task: str
plan: Optional[List[str]]
execution_results: Optional[List[str]]
summary: Optional[str]
status: str
# 初始化LLM
llm = ChatOpenAI(model="gpt-4o", api_key=os.getenv("OPENAI_API_KEY"))
# 节点函数
def planner_node(state: AgentState):
"""生成任务执行计划"""
response = llm.invoke([
SystemMessage(content="你是任务规划师,根据用户的任务生成不超过5步的执行计划,返回JSON格式的列表"),
HumanMessage(content=state["task"])
])
import json
plan = json.loads(response.content)
return {"plan": plan, "status": "plan_done"}
def executor_node(state: AgentState):
"""执行计划的每一步"""
execution_results = []
for step in state["plan"]:
response = llm.invoke([
SystemMessage(content="你是任务执行者,执行给定的任务步骤,返回执行结果"),
HumanMessage(content=step)
])
execution_results.append(response.content)
return {"execution_results": execution_results, "status": "execution_done"}
def summarizer_node(state: AgentState):
"""总结执行结果"""
response = llm.invoke([
SystemMessage(content="你是总结专家,把任务执行结果总结成简洁的报告"),
HumanMessage(content=f"任务:{state['task']}\n执行结果:{state['execution_results']}")
])
return {"summary": response.content, "status": "done"}
第二步:构建图并配置Checkpoint
# 构建图
workflow = StateGraph(AgentState)
workflow.add_node("planner", planner_node)
workflow.add_node("executor", executor_node)
workflow.add_node("summarizer", summarizer_node)
workflow.set_entry_point("planner")
workflow.add_edge("planner", "executor")
workflow.add_edge("executor", "summarizer")
workflow.add_edge("summarizer", END)
# 配置PostgreSQL Checkpoint存储
conn = psycopg2.connect(os.getenv("POSTGRES_URL"))
checkpointer = PostgresSaver(conn)
# 初始化表结构(仅第一次运行需要)
checkpointer.setup()
# 编译图
app = workflow.compile(checkpointer=checkpointer)
第三步:执行任务与回滚
# 定义线程配置
config = {"configurable": {"thread_id": "task-001"}}
# 执行任务
input_state = {"task": "帮我做一份2024年端午节去成都的3天旅游攻略", "status": "init"}
for event in app.stream(input_state, config, stream_mode="updates"):
print(f"执行节点:{list(event.keys())[0]},状态:{event[list(event.keys())[0]]['status']}")
# 获取所有Checkpoint
checkpoints = list(app.get_state_history(config))
print(f"总共有{len(checkpoints)}个Checkpoint")
for cp in checkpoints:
print(f"ID: {cp.id}, 父ID: {cp.parent_id}, 节点: {cp.metadata['node']}, 步数: {cp.metadata['step']}")
# 回滚到planner节点执行后的状态
target_cp = next(cp for cp in checkpoints if cp.metadata["node"] == "planner")
rollback_config = {"configurable": {"thread_id": "task-001", "checkpoint_id": target_cp.id}}
# 修改任务要求,重新执行
updated_input = {"task": "帮我做一份2024年端午节去成都的3天旅游攻略,预算5000元以内"}
for event in app.stream(updated_input, rollback_config, stream_mode="updates"):
print(f"执行节点:{list(event.keys())[0]},状态:{event[list(event.keys())[0]]['status']}")
第四步:分支探索对比结果
# 从同一个planner Checkpoint创建新分支,用gpt-3.5-turbo执行
llm_gpt35 = ChatOpenAI(model="gpt-3.5-turbo", api_key=os.getenv("OPENAI_API_KEY"))
# 重新定义executor节点用gpt-3.5
def executor_node_gpt35(state: AgentState):
execution_results = []
for step in state["plan"]:
response = llm_gpt35.invoke([
SystemMessage(content="你是任务执行者,执行给定的任务步骤,返回执行结果"),
HumanMessage(content=step)
])
execution_results.append(response.content)
return {"execution_results": execution_results, "status": "execution_done_gpt35"}
# 构建新的图,替换executor节点
workflow_gpt35 = StateGraph(AgentState)
workflow_gpt35.add_node("planner", planner_node)
workflow_gpt35.add_node("executor", executor_node_gpt35)
workflow_gpt35.add_node("summarizer", summarizer_node)
workflow_gpt35.set_entry_point("planner")
workflow_gpt35.add_edge("planner", "executor")
workflow_gpt35.add_edge("executor", "summarizer")
workflow_gpt35.add_edge("summarizer", END)
app_gpt35 = workflow_gpt35.compile(checkpointer=checkpointer)
# 创建新的线程,用原来的planner Checkpoint的状态初始化
branch_config = {"configurable": {"thread_id": "task-001-gpt35"}}
# 从原Checkpoint获取状态
state = app.get_state(rollback_config).values
# 初始化新分支
app_gpt35.update_state(branch_config, state, as_node="planner")
# 执行新分支
for event in app_gpt35.stream(None, branch_config, stream_mode="updates"):
print(f"GPT3.5分支执行节点:{list(event.keys())[0]}")
# 对比两个分支的结果
res_gpt4 = app.get_state(config).values["summary"]
res_gpt35 = app_gpt35.get_state(branch_config).values["summary"]
print("GPT4结果:", res_gpt4)
print("GPT3.5结果:", res_gpt35)
7. 整合提升:生产落地最佳实践与未来趋势
7.1 最佳实践Tips
-
状态设计优化:
- 状态尽量用Pydantic模型或者JSON序列化的结构,避免自定义Python类
- 大对象(文件、向量、二进制数据)不要存在状态里,存在外部对象存储,状态里仅存引用
- 尽量扁平化状态结构,避免多层嵌套,提高增量计算的效率
-
Checkpoint触发策略优化:
- 默认每个节点存一个Checkpoint,对于非关键节点可以设置不存,降低存储成本
- 对于大状态的场景,可以设置每N步存一个Checkpoint,平衡恢复粒度和性能
- 自定义触发条件:比如只有状态变化超过阈值、或者遇到错误的时候才存Checkpoint
-
存储后端选择:
- 开发测试场景:用内存或者SQLite存储,简单方便
- 生产场景:用PostgreSQL存元数据,对象存储存大对象,性能高、扩展性好
- 高并发场景:用Redis做缓存层,热点Checkpoint存在Redis里,降低数据库压力
-
生命周期管理:
- 设置Checkpoint保留策略:比如只保留最近30天的,或者每个Thread只保留最近100个Checkpoint
- 定期清理无用的分支、已完成的任务的Checkpoint,避免存储膨胀
- 冷热存储分层:超过7天的Checkpoint归档到低成本的对象存储,需要的时候再恢复
-
安全与合规:
- 敏感数据(用户隐私、财务数据)在存储前加密,Checkpoint里只存密文
- 多租户场景:thread_id里带上租户ID,或者存储层做租户隔离,避免数据泄露
- 合规场景:开启Checkpoint审计日志,记录所有的读写、回滚操作
7.2 未来趋势展望
- 自动Checkpoint优化:未来LangGraph会自动识别关键节点,自动优化Checkpoint的生成频率,不需要开发者手动配置
- AI辅助根因分析:基于Checkpoint的历史数据,AI可以自动分析Agent执行失败的原因,给出修复建议,甚至自动回滚修复
- 分布式Checkpoint:支持分布式部署的Agent的状态同步,跨节点的Checkpoint共享,适合大规模的Agent集群
- 状态差异可视化:直观展示两个Checkpoint之间的状态差异,方便开发者调试和对比分支结果
- 跨Agent状态共享:不同的Agent可以共享Checkpoint的状态,实现Agent之间的协作和知识传递
7.3 本章小结
LangGraph的Checkpoint机制是生产级Agent的核心基础能力,它不仅解决了长流程任务的故障恢复问题,更赋予了Agent时间旅行、分支探索的能力,让Agent的调试、A/B测试、合规审计变得简单高效。本文从基础概念到核心原理,再到实战落地,全面讲解了Checkpoint的所有知识点,你可以直接把文中的代码和最佳实践用到自己的项目中,快速打造生产级的Agent应用。
随着Agent技术的发展,Checkpoint会成为Agent系统的标配能力,就像今天的数据库对于Web应用一样重要。掌握Checkpoint机制,是从Agent玩具开发到生产级Agent研发的必经之路。
拓展学习资源:
- LangGraph官方Checkpoint文档:https://langchain-ai.github.io/langgraph/how-tos/persistence/
- CheckpointSaver接口定义:https://github.com/langchain-ai/langgraph/blob/main/libs/langgraph/langgraph/checkpoint/base.py
- 生产级Checkpoint部署示例:https://github.com/langchain-ai/langgraph/tree/main/examples/persistence
本文总字数:11237字
更多推荐


所有评论(0)