AI创想

标题: 【LangGraph】04-LangGraph之checkpointer [打印本页]

作者: AI小编    时间: 3 小时前
标题: 【LangGraph】04-LangGraph之checkpointer
作者:CSDN博客
LangGraph 内置了一个持久层,可以将图状态保存为检查点。当您使用检查点编译图时,执行的每一步的图状态都会保存成快照,并将其组织成线程。checkpointer非常重要,它是LangGraph中人机协作、对话记忆、中断恢复、时间旅行等核心功能的基础。
checkpoint可以选择保存在内存中或持久化到数据库中,我们在开发调试阶段通常可以选择保存在内存中,生产过阶段一定要持久化到数据库中。
一、使用检查点
  1. from langgraph.graph import StateGraph, START, END
  2. from langgraph.checkpoint.memory import InMemorySaver
  3. from langchain_core.runnables import RunnableConfig
  4. from typing import Annotated
  5. from typing_extensions import TypedDict
  6. from operator import add
  7. # 自定义状态
  8. class State(TypedDict):
  9.     foo: str
  10.     bar: Annotated[list[str], add]
  11. # 定义节点a
  12. def node_a(state: State):
  13.     return {"foo": "a", "bar": ["a"]}
  14. # 定义节点b
  15. def node_b(state: State):
  16.     return {"foo": "b", "bar": ["b"]}
  17. # 定义图
  18. workflow = StateGraph(State)
  19. workflow.add_node(node_a)
  20. workflow.add_node(node_b)
  21. workflow.add_edge(START, "node_a")
  22. workflow.add_edge("node_a", "node_b")
  23. workflow.add_edge("node_b", END)
  24. # 定义内存检查点
  25. checkpointer = InMemorySaver()
  26. # 使用checkpointer
  27. graph = workflow.compile(checkpointer=checkpointer)
  28. # 指定线程id
  29. config: RunnableConfig = {"configurable": {"thread_id": "1"}}
  30. result = graph.invoke({"foo": "", "bar":[]}, config)
  31. print(result)
复制代码
输出结果:
{'foo': 'b', 'bar': ['a', 'b']}


二、获取状态
  1. # 根据thread_id获取当前最新的状态
  2. config = {"configurable": {"thread_id": "1"}}
  3. print(graph.get_state(config))
  4. # 根据thread_id和checkpoint_id(检查点id)获取指定检查点的状态
  5. config = {"configurable": {"thread_id": "1", "checkpoint_id": "1ef663ba-28fe-6528-8002-5a559208592c"}}
  6. print(graph.get_state(config))
复制代码
输出如下类似结果:
StateSnapshot(values={'foo': 'b', 'bar': ['a', 'b']}, next=(), config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1f13ad3e-311d-6a98-8002-fd67129c8a6f'}}, metadata={'source': 'loop', 'step': 2, 'parents': {}}, created_at='2026-04-18T03:08:34.730448+00:00', parent_config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1f13ad3e-311c-660c-8001-10e55b51e9b4'}}, tasks=(), interrupts=())

三、获取历史状态
  1. config = {"configurable": {"thread_id": "1"}}
  2. print(list(graph.get_state_history(config)))
复制代码
输出结果:
[StateSnapshot(values={'foo': 'b', 'bar': ['a', 'b']}, next=(), config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1f13ad5a-3d70-6522-8002-18cb8a9c2920'}}, metadata={'source': 'loop', 'step': 2, 'parents': {}}, created_at='2026-04-18T03:21:07.641875+00:00', parent_config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1f13ad5a-3d6f-632a-8001-9ab89bfb348b'}}, tasks=(), interrupts=()),
StateSnapshot(values={'foo': 'a', 'bar': ['a']}, next=('node_b',), config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1f13ad5a-3d6f-632a-8001-9ab89bfb348b'}}, metadata={'source': 'loop', 'step': 1, 'parents': {}}, created_at='2026-04-18T03:21:07.641414+00:00', parent_config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1f13ad5a-3d6d-60b6-8000-f56001163fe7'}}, tasks=(PregelTask(id='3bfd0ac1-5282-474b-72bf-9fb36ddc1d53', name='node_b', path=('__pregel_pull', 'node_b'), error=None, interrupts=(), state=None, result={'foo': 'b', 'bar': ['b']}),), interrupts=()),
StateSnapshot(values={'foo': '', 'bar': []}, next=('node_a',), config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1f13ad5a-3d6d-60b6-8000-f56001163fe7'}}, metadata={'source': 'loop', 'step': 0, 'parents': {}}, created_at='2026-04-18T03:21:07.640512+00:00', parent_config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1f13ad5a-3d66-648c-bfff-2a16f380b5a4'}}, tasks=(PregelTask(id='2ec94e33-4f22-0756-b2b3-6e069e77a6c5', name='node_a', path=('__pregel_pull', 'node_a'), error=None, interrupts=(), state=None, result={'foo': 'a', 'bar': ['a']}),), interrupts=()),
StateSnapshot(values={'bar': []}, next=('__start__',), config={'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1f13ad5a-3d66-648c-bfff-2a16f380b5a4'}}, metadata={'source': 'input', 'step': -1, 'parents': {}}, created_at='2026-04-18T03:21:07.637766+00:00', parent_config=None, tasks=(PregelTask(id='552648e3-7d04-2dc8-5c52-105425a246d7', name='__start__', path=('__pregel_pull', '__start__'), error=None, interrupts=(), state=None, result={'foo': '', 'bar': []}),), interrupts=())]

四、持久化到数据库

安装依赖
  1. pip install langgraph-checkpoint-sqlite
复制代码
代码
  1. from langgraph.checkpoint.sqlite import SqliteSaver
  2. with SqliteSaver.from_conn_string("checkpoints.db") as checkpointer:
  3.     # 使用checkpointer
  4.     graph = workflow.compile(checkpointer=checkpointer)
  5.     config: RunnableConfig = {"configurable": {"thread_id": "1"}}
  6.     result = graph.invoke({"foo": "", "bar":[]}, config)
  7.     print(result)
  8.     config = {"configurable": {"thread_id": "1"}}
  9.     print(list(graph.get_state_history(config)))
复制代码
执行后可以看到当前文件夹中生成了一个sqlitedb文件,打开后可以开到状态的数据已经持久化到数据库中了
(, 下载次数: 0)


(, 下载次数: 0)


五、总结


原文地址:https://blog.csdn.net/lilianggui/article/details/149094448




欢迎光临 AI创想 (http://llms-ai.com/) Powered by Discuz! X3.4