河内机器人 LangGraph记忆机制、Agent Runtime外部学习闭环及持久化存储落地
作者:admin | 分类:河内机器人 | 浏览:3 | 日期:2026年08月08日结合你此前关注LangGraph记忆机制、Agent Runtime外部学习闭环及持久化存储落地的背景,
LangGraph 实现多轮对话记忆的核心在于利用 StateGraph 的状态持久化(Checkpointers) 和
状态管理(State Management),而非仅仅依赖简单的变量传递。
以下是基于 LangGraph 实现多轮对话记忆的两种主流方案:
一、方案 A:基于 Checkpointer 的自动状态持久化(推荐)
这是 LangGraph 最原生的多轮记忆实现方式。通过配置 checkpointer,LangGraph 会自动将每
次对话的 State(包含消息历史)保存到后端存储(如 SQLite、Postgres、Redis),并在下一轮
对话时自动恢复上下文。
1. 核心优势
零代码维护上下文:无需手动拼接历史消息,LangGraph 内部自动处理状态加载与保存。
支持中断与恢复:即使服务重启,只要 thread_id 不变,即可从断点继续对话。
天然支持多租户:通过不同的 thread_id 隔离不同用户的对话记忆。
2. 代码实现
python
from langgraph.graph import StateGraph, MessagesState, START, END
from langgraph.checkpoint.sqlite import SqliteSaver
from langchain_core.messages import HumanMessage, AIMessage
import sqlite3
# 1. 定义状态:使用内置的 MessagesState,它自动管理消息列表
# MessagesState 包含 'messages' 字段,类型为 list[BaseMessage]
# 2. 定义节点逻辑
def chatbot_node(state: MessagesState):
# 这里可以接入真实的 LLM
# last_message = state['messages'][-1]
# response = llm.invoke(state['messages'])
return {"messages": [AIMessage(content="我是基于LangGraph的记忆助手")]}
# 3. 构建图并配置 Checkpointer
memory = SqliteSaver.from_conn_string(":memory:") # 生产环境建议用 Postgres/Redis
workflow = StateGraph(MessagesState)
workflow.add_node("chatbot", chatbot_node)
workflow.add_edge(START, "chatbot")
workflow.add_edge("chatbot", END)
# 编译时传入 checkpointer
app = workflow.compile(checkpointer=memory)
# 4. 调用示例:通过 config 指定 thread_id 实现多轮记忆关联
config = {"configurable": {"thread_id": "user_001"}}
# 第一轮
input_msg = {"messages": [HumanMessage(content="我叫张三")]}
result1 = app.invoke(input_msg, config=config)
print(result1['messages'][-1].content)
# 第二轮:LangGraph 自动从 SQLite 加载第一轮的历史消息
input_msg2 = {"messages": [HumanMessage(content="我叫什么名字?")]}
result2 = app.invoke(input_msg2, config=config)
print(result2['messages'][-1].content)
# 输出应能识别出"张三",因为历史消息已在 State 中
二、方案 B:基于自定义 State 的手动记忆注入(灵活控制)
如果你需要对记忆进行更细粒度的控制(如只保留最近N轮、提取关键事实存入向量库),可以自定义 State 并结合你之前关注的 MemoryStore 逻辑。
1. 核心逻辑
自定义 State:除了 messages,增加 summary 或 key_facts 字段。
中间件节点:在 LLM 节点前增加一个 memory_loader 节点,从外部存储加载长期记忆;在 LLM 节点后增加 memory_saver 节点,提取新记忆并更新外部存储。
2. 代码片段示意
python
from typing import TypedDict, List
from langgraph.graph import StateGraph
class CustomState(TypedDict):
messages: List[HumanMessage | AIMessage]
long_term_memory: str # 从外部加载的长期记忆摘要
def load_memory(state: CustomState):
# 从你之前实现的 MemoryStore 或向量库中检索相关记忆
memory = get_relevant_memory(state['messages'][-1].content)
return {"long_term_memory": memory}
def generate_response(state: CustomState):
# 将 long_term_memory 注入 Prompt
prompt = f"背景记忆: {state['long_term_memory']}\n当前对话: {state['messages']}"
# response = llm.invoke(prompt)
return {"messages": [AIMessage(content="...")]}
def save_memory(state: CustomState):
# 提取新的事实并保存到外部存储
extract_and_save_facts(state['messages'])
return {}
workflow = StateGraph(CustomState)
workflow.add_node("load", load_memory)
workflow.add_node("chat", generate_response)
workflow.add_node("save", save_memory)
workflow.set_entry_point("load")
workflow.add_edge("load", "chat")
workflow.add_edge("chat", "save")
workflow.add_edge("save", END)
三、方案对比与选型建议
表格
维度 方案 A (Checkpointer) 方案 B (自定义 State + 外部存储)
实现难度 极低,原生支持 中等,需自行管理外部存储交互
记忆类型 短期会话记忆(完整历史) 长期记忆 + 短期记忆混合
性能开销 低(仅序列化 State) 高(涉及向量检索/DB读写)
适用场景 大多数常规多轮对话机器人 需要“记住用户偏好”、“跨会话知识复用”的复杂 Agent
四、关键注意事项
Token 限制:方案 A 会将所有历史消息放入 Context,长对话易超出 LLM 窗口。建议结合 Message Trimming(消息裁剪)或 Summary Chain(生成摘要)优化。
线程隔离:务必为每个用户或会话生成唯一的 thread_id,否则不同用户的记忆会混淆。
存储选型:开发测试可用 SqliteSaver 或 MemorySaver,生产环境强烈建议使用 PostgresSaver 或 RedisSaver 以保证高可用和数据持久性。
这套实现完全契合你之前研究的 Agent Runtime 架构,方案 A 适合快速落地基础多轮对话,方案 B 则能支撑你提到的“外部学习”和“User Profile”沉淀需求。
需要我为你展示如何结合 Redis 实现高性能的多轮对话记忆存储吗?便于你在生产环境中支撑高并发场景。