LangGraph学习笔记(四)---LangGraph检查点和Send机制

LangGraph学习笔记(四)---LangGraph检查点和Send机制


文章目录


一、检查点

检查点是每个超级步骤保存的图状态的快照,并由StateSnapshot对象表示,具有以下关键属性:

  • config:与此检查点相关的配置。
  • metadata:与此检查点相关的元数据。
  • values:此时状态通道的值。
  • next:将要在图中执行的下一个节点名称的元组。
  • tasks:包含有关要执行的下一个任务信息的PregelTask对象的元组。如果该步骤之前尝试过,它将包含错误信息。如果图在节点内部被动态中断,任务将包含与中断相关的其他数据。

官方文档地址:https://langchain-ai.github.io/langgraph/concepts/persistence/#checkpoints

中文文档地址:https://www.aidoczh.com/langgraph/concepts/persistence/#_3

1.持久化机制

LangGraph 内置基于 检查点 的持久化层。在每个超级步骤中,系统会保存图形状态的检查点,支持2中的高级功能。

2.核心功能

  1. 支持人机交互工作流
  • 允许人类在任何时间点检查、中断或批准执行步骤。
  • 图形可在人类更新状态后恢复执行。
  1. 提供交互间记忆能力
  • 可通过检查点创建线程,并在图形执行后保存状态。
  • 在对话等重复交互场景中,后续消息可发送至该检查点,保留历史记忆。
  1. 跨交互共享上下文
  • 为 AI 应用提供必要的记忆支持,通过检查点为所有 StateGraph 实现。

3.启用持久化的步骤

  1. 配置一个检查点(例如 AsyncSqliteSaver)。
  2. 在编译图形时调用 compile(checkpointer=my_checkpointer)。

4.示例

python 复制代码
# 导入 asyncio 模块,用于处理异步编程
import asyncio

# 从 langgraph.checkpoint.sqlite.aio 模块中导入 AsyncSqliteSaver 类,它用于异步保存检查点到 SQLite 数据库
# pip install langgraph.checkpoint.sqlite
from langgraph.checkpoint.sqlite.aio import AsyncSqliteSaver

# 从 langgraph.graph 模块中导入 StateGraph 类,它用于构建状态图
from langgraph.graph import StateGraph


async def main():
    # 创建一个 StateGraph 对象,节点的值类型为 int
    builder = StateGraph(int)

    # 添加一个名为 "add_one" 的节点,该节点的功能是将输入值加 1
    builder.add_node("add_one", lambda x: x + 1)

    # 设置 "add_one" 节点为状态图的入口点
    builder.set_entry_point("add_one")

    # 设置 "add_one" 节点为状态图的结束点
    builder.set_finish_point("add_one")

    # 使用异步上下文管理器创建一个 AsyncSqliteSaver 对象,并连接到名为 "checkpoints.db" 的 SQLite 数据库
    async with AsyncSqliteSaver.from_conn_string("checkpoints.db") as memory:
        # 编译状态图,并使用 memory 作为检查点保存器
        graph = builder.compile(checkpointer=memory)

        # 创建一个异步调用状态图的协程,输入值为 1,并传入额外的配置参数
        result = await graph.ainvoke(1, {"configurable": {"thread_id": "thread-1"}})

        # 打印结果
        print(result)


# 使用 asyncio.run 运行 main() 协程
asyncio.run(main())

这适用于 StateGraph 及其所有子类,例如 MessageGraph。

二、send机制

默认情况下,Nodes和Edges是在提前定义的,并对同一个共享状态进行操作。但是,在某些情况下,确切的边可能无法提前知道,或者您可能希望同时存在State的不同版本。

一个常见的例子是map-reduce设计模式。在这种设计模式中,第一个节点可能会生成一个对象列表,并且您可能希望对所有这些对象应用另一个节点。对象的数量可能事先未知(这意味着边的数量可能未知),并且输入State到下游Node应该是不同的(每个生成的对象对应一个)。

为了支持这种设计模式,LangGraph 支持从条件边返回Send对象。

1.send接收的参数

Send接受两个参数:

  1. 第一个是节点的名称
  2. 第二个是要传递到该节点的状态。

官方文档地址:https://langchain-ai.github.io/langgraph/concepts/low_level/#send

中文文档地址:https://www.aidoczh.com/langgraph/concepts/low_level/#send

2. map-reduce 工作流程图

python 复制代码
# 导入operator模块,用于后续操作
import operator
from typing import Annotated
from typing import TypedDict
from langgraph.graph import StateGraph
from langgraph.constants import Send
from langgraph.graph import END, START


# 定义一个名为OverallState的TypedDict类
class OverallState(TypedDict):
    # subjects是一个字符串列表
    subjects: list[str]
    # jokes是一个带有operator.add注解的字符串列表
    jokes: Annotated[list[str], operator.add]


# 定义一个函数continue_to_jokes,接受一个OverallState类型的参数state
def continue_to_jokes(state: OverallState):
    # 返回一个Send对象的列表,每个对象包含一个"generate_joke"的命令和对应主题的字典
    return [Send("generate_joke", {"subject": s}) for s in state['subjects']]

# 创建一个StateGraph对象builder,传入OverallState类型
builder = StateGraph(OverallState)
# 添加一个名为"generate_joke"的节点,节点执行一个lambda函数,生成一个关于主题的笑话
builder.add_node("generate_joke", lambda state: {"jokes": [f"Joke about {state['subject']}"]})
# 添加一个条件边,从START节点到continue_to_jokes函数返回的节点
builder.add_conditional_edges(START, continue_to_jokes)
# 添加一条边,从"generate_joke"节点到END节点
builder.add_edge("generate_joke", END)
# 编译graph,生成最终的graph对象
graph = builder.compile()

# 调用graph对象,并传入包含两个主题的初始状态,结果是为每个主题生成一个笑话
result = graph.invoke({"subjects": ["cats", "dogs"]})
print(result)

# 将生成的图片保存到文件
graph_png = graph.get_graph().draw_mermaid_png()
with open("send_case.png", "wb") as f:
    f.write(graph_png)

总结

记得关注么么叽

相关推荐
今儿敲了吗2 小时前
计算机网络第四章笔记(六)
笔记·计算机网络
wypywyp2 小时前
7.stm32 江协科技笔记2
笔记·科技·stm32
近津薪荼2 小时前
递归专题(2)——合并链表
c++·学习·算法·链表
辞旧 lekkk2 小时前
【Linux】Linux进程控制(三)自主实现简易shell命令行解释器
linux·运维·服务器·学习·萌新
学历真的很重要2 小时前
【系统架构师】第一章 计算机系统基础知识(详解版)
学习·职场和发展·系统架构·系统架构师
日更嵌入式的打工仔2 小时前
嵌入式软件开发工具与方法
笔记
浅念-2 小时前
C语言——自定义类型:结构体、联合体、枚举
c语言·开发语言·数据结构·c++·笔记·学习·html
heartbeat..2 小时前
深入理解 JVM:从核心原理到实战应用
java·jvm·jdk·学习笔记
sayang_shao2 小时前
YOLOv8n 输入输出格式笔记
笔记·yolo