高级功能

记忆管理

构建具备短期对话记忆和长期用户偏好记忆的智能应用

📚 学习目标

学完这篇文章后,你将能够:

  • 区分短期记忆(Short-term)和长期记忆(Long-term)的应用场景
  • 实现自动管理对话历史(History Management)
  • 使用 Store API 存储跨会话的用户偏好

前置知识

在开始学习之前,建议先阅读:


1️⃣ 短期记忆 vs 长期记忆

  • 短期记忆 (Short-term)

    • 范围:单个 Thread。
    • 生命周期:随会话结束(或 TTL)而失效。
    • 实现:Checkpointer (State 中的 messages 列表)。
    • 用途:多轮对话上下文。
  • 长期记忆 (Long-term)

    • 范围:跨 Thread,通常绑定到 User ID。
    • 生命周期:永久。
    • 实现:Store (Key-Value 数据库)。
    • 用途:用户偏好、个性化设置、Facts。

2️⃣ 管理短期记忆 (Window Buffer)

State 中的 messages 列表不能无限增长。我们需要定期修剪它。

方式 1:Message Window(窗口裁剪)

在 Checkpointer 保存前或 Model 调用前裁剪。

// 在节点内部处理
const modelNode = async (state) => {
  const allMessages = state.messages;
  // 只保留最近 10 条
  const context = allMessages.slice(-10); 
  const response = await model.invoke(context);
  // ...
};

方式 2:Summarization(摘要)

让 LLM 定期把历史对话压缩成一段 Summary。

const summarizeNode = async (state) => {
  const summary = await summarizationModel.invoke(state.messages);
  // 返回 newMessages,其中包含 Summary 和少量最近消息
  return { messages: [new SystemMessage(`Summary: ${summary}`), ...recent] };
};

3️⃣ 实现长期记忆 (Store)

LangGraph 提供了 Store 接口来处理跨线程数据。

import { InMemoryStore } from "@langchain/langgraph";

// 1. 初始化 Store
const store = new InMemoryStore();

// 2. 编译时传入
const app = graph.compile({ store });

// 3. 在节点中使用
const agentNode = async (state, config) => {
  const { store } = config;
  // 命名空间通常是 [scope, identifier, key_group]
  const userId = config.configurable.user_id;
  const namespace = ["users", userId, "prefs"];
  
  // 读取记忆
  const prefs = await store.get(namespace, "language");
  const lang = prefs?.value?.data || "English";
  
  // ... 生成回答 ...

  // 写入记忆 (例如用户说 "以后叫我 Lord")
  await store.put(namespace, "nickname", { data: "Lord" });
};

💡 练习题

  1. 设计题:设计一个“个性化新闻助手”。
    • 短期记忆:记住刚才讨论的时事新闻。
    • 长期记忆:记住用户关心的领域(如“科技”、“体育”)和语言偏好。
    • 请写出 Store 的 Namespace 设计和 Key 结构。

📚 参考资源

官方文档


✅ 总结

本章要点

  • 短期记忆靠 State + Checkpointer,重点是修剪 (Pruning)。
  • 长期记忆靠 Store,重点是 Namespace 设计。
  • Store 本质上是一个简单的 KV 数据库,支持 JSON 存储。

下一步:搞砸了怎么办?如何回到过去?学习时间旅行

登录以继续阅读

解锁完整文档、代码示例及更多高级功能。

立即登录

On this page