置顶

河内机器人 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 实现高性能的多轮对话记忆存储吗?便于你在生产环境中支撑高并发场景。