记忆系统总览 (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)、个人经历(情境记忆 Episodic)与技能规则(程序记忆 Procedural)。AI 智能体同样遵循此分类。
- 何时写入更新记忆? 记忆更新既可以在智能体核心推理链路中同步完成(热路径写入 Hot path),也可以通过异步 Worker 离线处理(后台异步写入 Background)。
| 记忆类型 | 存储内容 | 人类类比 | 智能体实例 |
|---|---|---|---|
| 语义记忆 (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)。
// 消费使用指令的节点
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 组织:
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: "用户代码偏好"
});