【LangGraph入门 4】持久化与记忆
·
文章目录
一、基本运用:线程隔离的持久化层
先定义一个基本的图结构
import operator
from pathlib import Path
import sys
from typing import Annotated, TypedDict, Sequence
from langchain_core.messages import BaseMessage, HumanMessage
from langchain_core.runnables.config import RunnableConfig
from langgraph.graph import START, END, MessagesState, StateGraph
from langgraph.types import Send
from pydantic import BaseModel, Field
# Ensure project root is importable when running this file in IDLE.
PROJECT_ROOT = Path(__file__).resolve().parent.parent
if str(PROJECT_ROOT) not in sys.path:
sys.path.insert(0, str(PROJECT_ROOT))
from llm.llm import get_deepseek_llm, get_mega_llm, get_qwen_llm
from IPython.display import display, Image
# mega_llm = get_mega_llm()
llm = get_qwen_llm()
def call_model(state: MessagesState) -> MessagesState:
response = llm.invoke(state["messages"])
return {"messages": response}
graph = StateGraph(MessagesState)
graph.add_node("call_model", call_model)
graph.add_edge(START, "call_model")
graph.add_edge("call_model", END)
1.1 没有激活持久化层,无法实现多轮对话
每次对话,模型都不记得上一轮
## 2.1 如果没有激活持久化层,无法实现多轮对话的
graph_build = graph.compile()
graph_image = graph_build.get_graph().draw_mermaid_png()
im = Image(graph_image)
with open('持久化与记忆.png', 'wb') as f:
f.write(im.data)
input_message = {"role":"user", "content":"你好,我是张三"}
for chunk in graph_build.stream({"messages": [input_message]}, stream_mode="values"):
chunk["messages"][-1].pretty_print()
input_message = {"role":"user", "content":"你好,我叫什么名字"}
for chunk in graph_build.stream({"messages": [input_message]}, stream_mode="values"):
chunk["messages"][-1].pretty_print()
llm一点都记不住问答记录
1.2 引入MemorySaver激活持久性层
简单来说,MemorySaver 是 LangGraph 中 BaseCheckpointSaver 接口的一个内存实现。它就像一个内置的自动“存档”工具。当 Agent 执行时,它会在后台悄悄地为每一步的执行状态拍一张“快照”(即Checkpoint),并按“线程ID”(thread_id)归档。当你再次调用 Agent 并传入相同的 thread_id,MemorySaver 会自动找到并恢复上次的“存档”,让 Agent 能接着之前的对话继续
## 2.2 激活持久化层
from langgraph.checkpoint.memory import MemorySaver
# 创建一个内存保存器, 使用MemorySaver,保存中间状态
memory = MemorySaver()
# 创建一个图,并激活持久化层
graph_build = graph.compile(checkpointer=memory)
# 创建一个图,并激活持久化层
# 这里启动第二个参数,config,配置了一个线程Id,
# 注意 thread_id的输入,如果是不同的线程,则没有记忆。 也就是线程隔离
config = {"configurable": {"thread_id": "1"}}
input_message = {"role":"user", "content":"你好,我是张三"}
for chunk in graph_build.stream({"messages": [input_message]}, config, stream_mode="values"):
chunk["messages"][-1].pretty_print()
input_message = {"role":"user", "content":"你好,我叫什么名字"}
for chunk in graph_build.stream({"messages": [input_message]}, config, stream_mode="values"):
chunk["messages"][-1].pretty_print()
如果thread_id不同,则互相之间没有记忆。这个就是线程隔离的概念。
二、基本运用:跨线程持久化调用
2.1 引入InMemoryStore用于长期记忆
InMemoryStore 是 LangGraph 中专用于长期记忆(Long-term Memory) 的纯内存存储组件,旨在实现跨线程、跨对话会话的数据持久化。它实现了 BaseStore 接口,以命名空间+唯一键的组织形式来存储 JSON 文档,并支持向量语义搜索
三、记忆:短期记忆的实现
四、记忆:长期以及实现
五、记忆:使用总结技术优化记忆
更多推荐




所有评论(0)