LangGraph的运行时:编译、执行与持久化(三)

一、编译

StateGraph 只是一张"蓝图",compile() 会把它变成一个可执行的 Runnable。

复制代码
builder = StateGraph(MyState)
# ... 添加节点和边 ...
graph = builder.compile()   # 编译

编译时 LangGraph 会做几件事:

编译时做的事 说明
校验图结构 检查是否有孤立节点、是否有入口
绑定持久化 如果传了 checkpointer,会绑定到图上
生成执行计划 把节点和边转换成可调度的执行流程
返回 Runnable 编译后的图支持 invoke、stream、batch 等方法

2. 编译参数

复制代码
graph = builder.compile(
    checkpointer=memory,      # 持久化
    store=store,              # 长期记忆
    interrupt_before=["node_a"],  # 在某节点前中断
    interrupt_after=["node_b"],   # 在某节点后中断
)

二、执行:四种调用方式

编译后的图是一个 Runnable,支持标准调用方法。

方法 用途 是否阻塞
invoke 执行一次,返回最终 State 阻塞
stream 流式执行,逐个输出 非阻塞迭代
batch 批量执行多个输入 阻塞
ainvoke / astream 异步版本 异步

1. invoke:最简单的执行

复制代码
result = graph.invoke({"messages": [], "count": 0})
print(result)

2. stream:流式执行(推荐)

stream 可以实时看到每个节点的输出,而不是等全部跑完。

复制代码
for chunk in graph.stream({"messages": []}):
    print(chunk)

stream_mode 决定了输出的粒度:

stream_mode 输出内容
"values" 每个节点执行后的完整 State
"updates" 每个节点返回的更新字典
"messages" LLM 生成的 token 流
"custom" 节点内通过 writer 自定义的输出
复制代码
# 只看每个节点的更新
for chunk in graph.stream(input, stream_mode="updates"):
    print(chunk)
    # 输出:{'node_a': {'count': 1}}

3. batch:批量执行

复制代码
results = graph.batch([
    {"messages": [], "count": 0},
    {"messages": [], "count": 100}
])

4. 执行时的 config

复制代码
config = {
    "configurable": {
        "thread_id": "user_123"   # 会话 ID
    },
    "recursion_limit": 25          # 最大迭代次数
}
result = graph.invoke(input, config)

三、持久化:Checkpointer

没有持久化时,每次调用都是独立 的,图不记得上次说了什么。Checkpointer 让图能记住历史,实现多轮对话。

使用方式

复制代码
from langgraph.checkpoint.memory import MemorySaver

memory = MemorySaver()
graph = builder.compile(checkpointer=memory)

# 第一次调用
config = {"configurable": {"thread_id": "user_1"}}
graph.invoke({"messages": ["你好"]}, config)

# 第二次调用(自动恢复上下文)
graph.invoke({"messages": ["继续"]}, config)

常用 Checkpointer

Checkpointer 存储位置 适用场景
MemorySaver 内存 开发测试
SqliteSaver SQLite 文件 本地生产
PostgresSaver PostgreSQL 生产环境
RedisSaver Redis 高并发

查看历史状态

复制代码
# 获取当前状态
state = graph.get_state(config)

# 获取历史状态列表
history = list(graph.get_state_history(config))

四、长期记忆:Store

1. Checkpointer vs Store

特性 Checkpointer Store
作用范围 单个会话(thread_id) 跨会话
存储内容 图的完整状态 键值对数据
典型用途 多轮对话 用户偏好、长期知识

2. 使用方式

复制代码
from langgraph.store.memory import InMemoryStore

store = InMemoryStore()
graph = builder.compile(store=store)

# 在节点中访问 store
def my_node(state, runtime: Runtime):
    # 写入
    runtime.store.put(("users", "user_1"), "preference", {"theme": "dark"})
    # 读取
    pref = runtime.store.get(("users", "user_1"), "preference")
    return {"result": pref}

五、中断与恢复(人机协同)

1. 中断的两种方式

复制代码
# 方式一:编译时指定
graph = builder.compile(
    interrupt_before=["approve_node"],  # 在节点前中断
    interrupt_after=["review_node"]     # 在节点后中断
)

# 方式二:节点内调用 interrupt
from langgraph.types import interrupt

def approve_node(state):
    user_input = interrupt("是否批准?")
    return {"approved": user_input == "yes"}

2. 恢复执行

复制代码
from langgraph.types import Command

# 用 Command 恢复
graph.invoke(Command(resume="yes"), config)

3. 中断流程图

六、示例

复制代码
from typing import TypedDict, Annotated
from operator import add
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import MemorySaver

class ChatState(TypedDict):
    messages: Annotated[list, add]

def chatbot(state: ChatState) -> dict:
    # 模拟 LLM 回复
    user_msg = state["messages"][-1]
    return {"messages": [f"回复:{user_msg}"]}

builder = StateGraph(ChatState)
builder.add_node("chatbot", chatbot)
builder.add_edge(START, "chatbot")
builder.add_edge("chatbot", END)

# 编译时绑定 checkpointer
memory = MemorySaver()
graph = builder.compile(checkpointer=memory)

# 多轮对话
config = {"configurable": {"thread_id": "user_1"}}

graph.invoke({"messages": ["你好"]}, config)
graph.invoke({"messages": ["再见"]}, config)

# 查看完整历史
state = graph.get_state(config)
print(state.values["messages"])
# ['你好', '回复:你好', '再见', '回复:再见']
相关推荐
莽夫搞战术2 小时前
【量化实战】单卡3090部署Hy-SimulMT-30B-A3B-Interleave同传大模型
大模型·量化·混元·语音翻译·simulmt·ai同传
东姬AI6 小时前
迪士尼联手Adobe自训“片场专用“AI模型:当内容工业按下生产线开关,角色“开口“这道工序还没自动化
大模型·数字人·多模态·ai视频生成·内容生产
承渊政道1 天前
LangChainAI应用开发框架【LangChain与LangGraph介绍】
langchain·大模型·langgraph·ai应用开发
Flynn Liang1 天前
LangChain4j 1.23 架构全景:Java 大模型应用的 6 层抽象
java·langchain·大模型·rag·ai agent·langchain4j
武雄(小星Ai)1 天前
Ollama报llama-server binary not found排坑实录:服务活着引擎没了
人工智能·windows·大模型·ollama·排坑
小田学Python2 天前
工具调用:让 Agent 从“说”到“做”
大数据·大模型·agent·ai工具·deepseek
小田学Python3 天前
DeepSeek Harness 完整上手指南:安装部署 + 必装插件 + 用一周就回不去的功能
大数据·大模型·agent·ai工具·deepseek
aicat_cn3 天前
json-render 接入 Chat SDK:Agent 在 Slack 和 Teams 里直接回表格和按钮
ai·大模型
神奇的代码在哪里3 天前
Agent 记忆的组成部分:Anthropic The components of agent memory 文章的简要解读
大模型·claude·ai agent·上下文工程·agent记忆
神奇的代码在哪里3 天前
ERNIE-5.5-Flash-Base 开源速览:280B-A14B MoE 基座,微调与推理支持 1M 上下文
大模型·模型部署·文心大模型·moe·ernie5.5