Skip to content

记忆系统总览 (Memory overview) ​

深入解析 AI 智能体的短期会话记忆与跨线程长期记忆系统,探讨认知心理学模型在智能体架构中的工程落地。

记忆系统 (Memory) 是记录历史交互信息的机制。对于 AI 智能体而言,记忆系统不可或缺:它让智能体能够记住历史交互、从用户反馈中自我进化,并持续适应用户个性化偏好。随着智能体需要处理包含多轮频繁交互的高复杂度任务,记忆能力对于执行效率与用户体验都构成了核心基石。

根据召回范围(Recall scope),记忆系统划分为两大核心类型:

  • 短期记忆 (Short-term memory):即会话线程作用域记忆(Thread-scoped memory),通过维护单一会话内的消息历史来跟踪正在进行的对话。LangGraph 将短期记忆作为智能体全局状态 (State)的一部分进行管理。状态通过检查点持久化机制 (Checkpointer)自动持久化至数据库,以便会话随时能够断点恢复。短期记忆在图被调用或某一步骤完成时同步刷新,并在每个步骤开始前自动读取。
  • 长期记忆 (Long-term memory):跨越多个独立会话存储用户偏好或应用级数据,并在所有会话线程之间全局共享。它可以在任何时间、任何会话线程中被检索召回。记忆存储在自定义命名空间(Namespace)下,不再局限于单一 Thread ID。LangGraph 提供了存储引擎 (Stores) 来存取和语义召回长期记忆。

短期记忆 (Short-term memory) ​

短期记忆允许应用记住单个线程 (Thread)或会话内部的历史交互。会话线程将单次交互组织为一个整体,类似于电子邮件将往来信件汇聚为同一封主题会话。

LangGraph 将短期记忆作为智能体状态的一部分进行管理,并通过线程级检查点进行持久化。该状态通常包括对话消息流以及上传的文件、检索到的参考文档或执行生成的中间产物等。通过将其保存在图状态中,智能体既能获取当前对话的全部上下文,又能确保不同会话线程之间相互严格隔离。

短期记忆的治理 (Manage short-term memory) ​

对话历史是短期记忆最普遍的表现形式,而长程对话给当前大语言模型带来了严峻挑战。完整的历史记录可能会突破模型的上下文窗口,造成无法恢复的溢出错误;即便模型声称支持极长的上下文窗口,在过长的上下文中模型的推理召回率也会显著恶化(“迷失在中间”,Lost-in-the-middle 现象),同时伴随更长首字延迟与昂贵的 Token 成本。

因此,许多成熟的智能体应用都会引入上下文工程手段,主动修剪、压缩或遗忘陈旧无关的会话信息。

长期记忆 (Long-term memory) ​

长期记忆允许系统跨越不同的会话与独立线程沉淀知识。与严格绑定线程的短期记忆不同,长期记忆保存在自定义的“命名空间(Namespaces)”中。

长期记忆涉及复杂的架构权衡,没有万能解法。以下两个关键维度构成设计决策框架:

记忆类型存储内容人类类比智能体实例
语义记忆 (Semantic)事实与概念 (Facts)学校学到的书本知识用户属性档案、业务实体规则
情境记忆 (Episodic)经验与经历 (Experiences)过去的亲身经历历史成功排错任务的少样本轨迹
程序记忆 (Procedural)行为规则与直觉 (Instructions)骑自行车的动作记忆智能体系统提示词与执行策略迭代

语义记忆 (Semantic memory) ​

语义记忆涉及对特定事实与抽象概念的保留。在 AI 智能体中,语义记忆主要用于实现高度个性化的定制交互:

模式 A:单一实体画像 (Profile) ​

将记忆组织为一个持续更新的用户或组织画像(Profile),通常是一个包含关键字段的 JSON 文档。 更新此类记忆时,通常是将已有画像注入模型,要求模型生成增量 Patch 或全量合并后的新 JSON。随着画像体量增大,需要配合严谨的结构化校验(如 Zod / JSON Schema)避免字段格式漂移。

模式 B:文档集合碎片 (Collection) ​

将记忆组织为一个持续追加和扩充的文档集合。每条碎片记忆颗粒度更小、生成更精准,不易丢失细节信息,在检索阶段能提供更高的召回率。 此时的复杂度转移到了向量库的内容去重、局部废弃更新与相似度检索匹配(store.search 支持内容过滤与向量混合检索)。

情境记忆 (Episodic memory) ​

情境记忆侧重于回顾过去的具体经历与操作动作序列。在工程实践中,情境记忆通常以动态少样本提示词(Dynamic Few-shot Prompting)的形式落地:通过从历史成功执行的轨迹库中召回语义最相近的成功案例,作为上下文示例引导模型依样画葫芦完成复杂的工具调用。

程序记忆 (Procedural memory) ​

程序记忆指代执行任务时所遵循的底层规则。对于 AI 智能体而言,虽然模型权重通常是冻结不可变的,但智能体可以通过元提示词反思(Reflection / Meta-prompting)机制持续修正自身的系统提示词(System Prompt)。

typescript
// 消费使用指令的节点
const callModel = async (state: State, store: BaseStore) => {
    const namespace = ["agent_instructions"];
    const instructions = await store.get(namespace, "agent_a");
    const prompt = promptTemplate.format({
        instructions: instructions[0].value.instructions
    });
    // 调用模型...
};

// 持续反思并更新指令的节点
const updateInstructions = async (state: State, store: BaseStore) => {
    const namespace = ["instructions"];
    const currentInstructions = await store.search(namespace);
    const prompt = promptTemplate.format({
        instructions: currentInstructions[0].value.instructions,
        conversation: state.messages
    });
    const output = await llm.invoke(prompt);
    // 将自我迭代后的新系统提示词写回持久化存储
    await store.put(["agent_instructions"], "agent_a", {
        instructions: output.new_instructions
    });
};

记忆写入时机 (Writing memories) ​

热路径写入 (In the hot path) ​

在实时主对话链路中同步生成记忆。

  • 优势:更新立即可见,下一轮对话即可生效;用户能清晰感知记忆的形成过程。
  • 挑战:增加了主请求的响应延迟;模型需要一边回答用户一边研判是否记忆,分散了注意力。

后台异步写入 (In the background) ​

将记忆抽取放入后台任务或定时异步流水线。

  • 优势:用户端无任何延迟感知;主逻辑解耦;便于批处理清洗。
  • 挑战:存在时间窗口延迟,多线程并发时新上下文无法立刻对齐;需要维护定时任务调度机制。

记忆持久化存储 (Memory storage) ​

LangGraph 将长期记忆以 JSON 文档形式持久化在 BaseStore 中,通过分层命名空间(如 [userId, "preferences"])与唯一 Key 组织:

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

const store = new InMemoryStore({ index: { embed: myEmbedder, dims: 1536 } });
const namespace = ["user_123", "profile"];

// 写入记忆
await store.put(namespace, "language_pref", {
    rules: ["用户偏好简洁的技术语言", "仅使用 TypeScript 代码示例"],
});

// 语义向量检索记忆
const items = await store.search(namespace, {
    query: "用户代码偏好"
});

延伸阅读 (Learn more) ​