内存持久性
持久化
在编译图时添加检查点来设置持久化其状态:
from langgraph.checkpoint.memory import MemorySaver
checkpointer = MemorySaver()
graph.compile(checkpointer=checkpointer)
维持一个上下文ID,实现多轮对话持久化
# 会话id
config = {"configurable": {"thread_id": "1"}}
input_message = {"role": "user", "content": "hi! I'm bob"}
for chunk in graph.stream({"messages": [input_message]}, config):
chunk["messages"][-1].pretty_print()
持久化理解:
同一个会话id的状态(state)数据,多轮会话持续保留
例子
- 定义一个chat消息图
from langchain_core.messages import HumanMessage
from my_openai.deepseekv3 import get_deepseek_v3_client
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import MessagesState
from langgraph.checkpoint.memory import MemorySaver
llm = get_deepseek_v3_client()
def chatbot(state: MessagesState):
return {
"messages": [llm.invoke(state["messages"])]
}
builder = StateGraph(MessagesState)
.add_node(chatbot)
.add_edge(START, "chatbot")
.add_edge("chatbot", END)
# 初始化内存以在图运行之间持久化状态
memory = MemorySaver()
# 设置检查点
graph = builder.compile(checkpointer=memory)
# 定义一个会话线程,通过 thread_id 实现同一个会话
config = {"configurable": {"thread_id": "1" } }
user_input = HumanMessage(content="你好,我叫小明!")
events = graph.stream(
{"messages": [user_input]},
config,
stream_mode="values"
)
for event in events:
event["messages"][-1].pretty_print()
user_input = HumanMessage(content="我叫什么名字?")
events = graph.stream(
{"messages": [user_input]},
config,
# 如果使用其他会话ID,则AI就不知道小明的名字了
# config = {"configurable": {"thread_id": "2" } }
stream_mode="values"
)
for event in events:
event["messages"][-1].pretty_print()
- 定义会话配置
# 定义一个会话线程,通过 thread_id 实现同一个会话
config = {"configurable": {"thread_id": "1" } }
- 结果1:同一轮对话
user_input = HumanMessage(content="你好,我叫小明!")
events = graph.stream(
{"messages": [user_input]},
# 同一个会话id
config,
stream_mode="values"
)
for event in events:
event["messages"][-1].pretty_print()
user_input = HumanMessage(content="我叫什么名字?")
events = graph.stream(
{"messages": [user_input]},
# 同一个会话id
config,
stream_mode="values"
)
for event in events:
event["messages"][-1].pretty_print()
================================ Human Message =================================
你好,我叫小明!
================================== Ai Message ==================================
你好,小明!很高兴认识你~😊 今天有什么想聊的,或者需要帮忙的吗?无论是学习、生活还是随便聊聊,我都在这里哦! (对了,你名字里的“小明”让我想起小时候数学题里的经典角色呢,哈哈~)
================================ Human Message =================================
我叫什么名字?
================================== Ai Message ==================================
哈哈,你刚刚说过啦!你叫**小明**~ 😄
(难道这是传说中的“小明失忆症”测试?还是想考考我的记忆力?放心,你的名字我已经刻在“数据小本本”上了!)
需要我帮你记住什么特别的事情吗?或者直接叫我喊你一百遍“小明”也行哦~ 👻
- 结果2:改变第二轮的会话id
user_input = HumanMessage(content="你好,我叫小明!")
events = graph.stream(
{"messages": [user_input]},
# 会话id--1
config = {"configurable": {"thread_id": "1" } },
stream_mode="values"
)
for event in events:
event["messages"][-1].pretty_print()
user_input = HumanMessage(content="我叫什么名字?")
events = graph.stream(
{"messages": [user_input]},
# 会话id--2
config = {"configurable": {"thread_id": "2" } },
stream_mode="values"
)
for event in events:
event["messages"][-1].pretty_print()
================================ Human Message =================================
你好,我叫小明!
================================== Ai Message ==================================
你好,小明!很高兴认识你~😊 今天有什么想聊的,或者需要帮忙的吗?无论是问题、趣事还是随便聊聊,我都在这里哦!
================================ Human Message =================================
我叫什么名字?
================================== Ai Message ==================================
目前我无法直接知道你的名字,因为我们之前的对话内容不会被保留。不过,你可以告诉我你的名字,我会在本次对话中用它来称呼你!😊
如果你愿意的话,现在就可以告诉我,比如:
“你可以叫我 [你的名字]。”
期待认识你!✨