LangGraph学习笔记七(checkpointer)

一.checkpointer=InMemorySaver()保存到内存

python 复制代码
"""
MemoryPersistence.py
langgraph-checkpoint:检查点保存器(BaseCheckpointSaver)
的基础接口以及序列化/反序列化接口(SerializerProtocol)。
包含用于实验的内存中检查点实现(InMemorySaver)。
LangGraph 已内置 langgraph-checkpoint。


LangGraph 1.0 持久化存储演示 - 内存存储 (In-Memory)

特点:
- 数据暂存于内存,程序关闭后丢失
- 无需额外配置
- 适用于本地测试和临时验证工作流逻辑
"""

from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import InMemorySaver
import operator


# 定义状态
class PersistenceDemoState(TypedDict):
    # operator.add:将元素追加到现有元素中,支持列表、字符串、数值类型的追加
    messages: Annotated[list, operator.add]
    step_count: Annotated[int, operator.add]


# 节点函数
def step_one(state: PersistenceDemoState) -> dict:
    print("执行步骤 1")
    return {
        "messages": ["执行了步骤 1"],
        "step_count": 1
    }


def step_two(state: PersistenceDemoState) -> dict:
    print("执行步骤 2")
    return {
        "messages": ["执行了步骤 2"],
        "step_count": 1
    }


def step_three(state: PersistenceDemoState) -> dict:
    print("执行步骤 3")
    return {
        "messages": ["执行了步骤 3"],
        "step_count": 1
    }


# 构建图
def create_graph():
    builder = StateGraph(PersistenceDemoState)

    builder.add_node("step_one", step_one)
    builder.add_node("step_two", step_two)
    builder.add_node("step_three", step_three)

    builder.add_edge(START, "step_one")
    builder.add_edge("step_one", "step_two")
    builder.add_edge("step_two", "step_three")
    builder.add_edge("step_three", END)

    return builder


def main():
    print("=== LangGraph 1.0 内存持久化存储演示 ===\n")

    # 编译图并使用内存存储
    graph = create_graph()
    app = graph.compile(checkpointer=InMemorySaver())

    # 配置线程ID用于存储状态
    config = {"configurable": {"thread_id": "user_13811112222"}}

    print("1. 首次执行工作流:")
    result = app.invoke({
        "messages": ["开始执行"],
        "step_count": 0
    }, config)

    print(f"执行结果result: {result}\n")

    print("2. 检查存储的状态:")
    saved_state = app.get_state(config)
    print(f"保存的状态: {saved_state.values}")
    print(f"下一个节点: {saved_state.next}\n")

    # 获取指定线程的完整执行历史(正序:从最早到最晚,第一步在栈底)
    history = app.get_state_history(config)
    # 遍历历史中的每一个检查点快照
    for checkpoint in history:
        print("=" * 50)
        # 该时刻的完整State状态(最核心)
        print(f"当前状态: {checkpoint.values}")

    print("=" * 80)
    print("3. 恢复执行工作流:")
    # 由于工作流已经完成,这里会直接返回最终结果
    result2 = app.invoke(None, config)
    print(f"恢复执行结果: {result2}\n")

    print("=== 演示结束 ===")


if __name__ == "__main__":
    main()

执行结果:

二.checkpointer=from_conn_string(DB_URI)保存到数据库

python 复制代码
'''
SqlitePersistence.py
在底层,检查点功能由符合BaseCheckpointSaver接口的检查点对象提供支持。
LangGraph提供了多种检查点实现,所有这些实现都通过独立的、可安装的库来完成,数据库类型的有:
   langgraph-checkpoint-sqlite:使用SQLite数据库(SqliteSaver / AsyncSqliteSaver)存储检查点。
非常适合实验和本地工作流程。需要单独安装。
   langgraph-checkpoint-postgres:使用Postgres数据库(PostgresSaver / AsyncPostgresSaver)
存储检查点,用于LangSmith。非常适合在生产环境中使用。需要单独安装。
......

本次案例,安装sqlite所需依赖
pip install langgraph-checkpoint-sqlite

'''

import sqlite3
import operator
from typing import TypedDict, Annotated

from langgraph.checkpoint.postgres import PostgresSaver
from langgraph.checkpoint.sqlite import SqliteSaver
from langgraph.graph import StateGraph,START,END



class MyState(TypedDict):
    messages:Annotated[list,operator.add]

def node_1(state:MyState):

    return {"messages":["abc","def"]}

def main():
    DB_URI = "postgresql://postgres:123456@localhost:5432/postgres"
    builder = StateGraph(MyState)
    builder.add_node("node_1",node_1)

    builder.add_edge(START, "node_1")
    builder.add_edge("node_1", END)
    with PostgresSaver.from_conn_string(DB_URI) as checkpointer:
        checkpointer.setup()
        graph = builder.compile(checkpointer=checkpointer)
        # 同一个用户id下,每次执行都会插入一次新数据,上课时记得修改用户编号或者直接删除D:\44\sqlite_data.db
        config = {"configurable": {"thread_id": "user-002"}}

        initial_state = graph.get_state(config)
        print(f"Initial state: {initial_state}")

        # 执行图
        result = graph.invoke({"messages":[]}, config)
        print(f"Result: {result}")

        print()
        print("====================查看执行后的状态====================")
        # 查看执行后的状态
        final_state = graph.get_state(config)
        print()
        print(f"Final state: {final_state}")


if __name__ == '__main__':
    main()

执行了4次之后的结果:

相关推荐
alloc14 小时前
从延迟聚合到可解释诊断:MetricKit 的原理与工程化实践
前端
颜进强14 小时前
06 - OpenSpec change 从模糊想法到完整契约:new change / explore / propose 三连
前端·后端·ai编程
Cache技术分享14 小时前
499. Java 反射 - 获取类型上的注解
前端·后端
用户9210802628614 小时前
左侧历史对话模块:使用 Conversations 搭建会话入口
前端
用户693717500138414 小时前
9531 款 AI 工具流量真相:当 90% 的访问涌向 100 个平台,普通创业者还有机会吗?
前端·后端
莫问ABC15 小时前
HTML、CSS、JavaScript 前端三件套
前端·css·html
颜进强15 小时前
07 - OpenSpec change 修正带与照单施工:update 修订 + apply 实现
前端·后端·ai编程
京东云开发者15 小时前
【全栈实践】第一个 AI Agent 项目:从零搭建 AI 音频创作助手【最终版】
前端·vue.js·音视频开发
12.=0.15 小时前
【REVIEW_C】【持续更新】
服务器·前端·javascript
Vuji15 小时前
Pi 插件解剖|todo.ts:297 行,拼出工具+命令+状态的完整插件
前端·agent