工程化记忆:大模型短期记忆与长期记忆的驾驭之道
记忆不是存储问题,而是时机问题。
引言:AI 的"金鱼困境"
你把一个需求拆成五步告诉 AI。第一步它理解得很好,第二步它开始调用工具,第三步它停下来问你要一个——已经在第一轮对话里告诉过它的信息。
这不是模型不够聪明。GPT-4o、Claude 4.6、Gemini 3.1 Pro,任何一个前沿模型在单轮推理能力上都已经足够出色。问题是:它们记不住。或者说,它们记不住"该记住的东西"。
这个困境有一个形象的类比——金鱼困境。金鱼的记忆只有七秒,而大模型的"记忆"取决于上下文窗口能塞进多少 Token。但 Token 有成本,窗口有上限,信息会稀释。即便上下文窗口从 4K 扩展到 128K 再到 1M Token,“记住"这件事远没有变得简单。
为什么?因为记忆不是存储问题,而是时机问题。
一个 AI 系统需要知道:
- 什么时候该把信息写进记忆?
- 该写什么?该忘什么?
- 什么时候该从记忆中召回信息?
- 召回后怎么注入当前对话而不破坏上下文?
这些问题没有标准答案。不同场景有不同的选择,不同选择构成不同的架构。本文的目标是把这个决策空间清晰地画出来,让你在设计自己的 AI 系统时,能像工程师一样思考"记忆"这件事。
一、记忆系统的分层架构
1.1 双存储模型的工程启示
在认知科学中,有一个经典的双存储模型(Dual-Store Model):信息先进入短期记忆(工作台),经过编码和巩固后转入长期记忆(仓库)。工程化 AI 记忆的架构,几乎就是对这个模型的直接映射。
把这张图画出来可能更直观:
┌──────────────────────┐
│ 外部输入 │
└──────────┬───────────┘
▼
┌─────────────────────────────────────────────────┐
│ 短期记忆(上下文窗 │
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ System │ │ Message │ │ Agent State │ │
│ │ Prompt │ │ History │ │ (Tool Calls) │ │
│ └──────────┘ └──────────┘ └──────────────┘ │
└──────────────────────┬──────────────────────────┘
│ 写入编码(Write)
▼
┌─────────────────────────────────────────────────┐
│ 长期记忆(跨会话存储) │
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ 向量记忆 │ │ 结构化记忆 │ │ 图记忆 / 关系 │ │
│ │ (RAG) │ │ │ │(Graph Memory)│ │
│ └──────────┘ └──────────┘ └──────────────┘ │
│ ↑ 召回检索(Read) │
└─────────────────────────────────────────────────┘
1.2 短期记忆(STM):上下文窗口内的"工作台”
短期记忆是 AI 当前正在"思考"的内容。在技术层面,它就是 LLM 的上下文窗口(Context Window)——输入给模型的所有 token 总和。
它的特性:
- 高带宽:一次推理可以"看到"窗口内的全部信息
- 低延迟:不需要外部检索,模型直接在上下文中操作
- 易挥发:会话结束后即丢失,除非显式写入长期记忆
- 容量受限:即便 1M token 也有上限,且成本随长度线性增长
1.3 长期记忆(LTM):跨越会话的"数据库"
长期记忆是 AI 在多轮会话之间、甚至在多次任务之间持续保留的信息。它不是存储在模型参数中的(那是训练阶段学到的知识),而是存储在外部系统中的结构化数据。
它的特性:
- 大容量:理论上只受存储系统限制(向量数据库、图数据库、KV 存储)
- 持久化:跨会话、跨任务、跨重启
- 检索延迟:每次访问都需要经过检索流程
- 精度折损:检索质量取决于 embedding 质量和召回策略
1.4 层级划分的本质:时效 × 容量 × 召回的三角权衡
选择短期记忆还是长期记忆,本质是在三个维度上做权衡:
| 维度 | 短期记忆 | 长期记忆 |
|---|---|---|
| 时效性 | 即时(毫秒级) | 需要检索(10-500ms) |
| 容量 | 受限(4K-1M token) | 近乎无限 |
| 精度 | 100%(直接可见) | 取决于检索质量 |
| 成本 | O(n) 随长度增长 | 存储 + 检索固定成本 |
这个权衡决定了架构选择:高频、短期、对延迟敏感的信息留在上下文窗口;低频、持久、对容量敏感的信息放入长期存储。
二、短期记忆:窗口内的精耕细作
2.1 应用场景
短期记忆不是"不需要设计"的东西——恰恰相反,它是最容易被忽视、但影响最大的工程环节。
多步推理链的状态维持
当一个 Agent 需要完成一个复杂的多步骤任务(比如"研究一个开源项目,写一份评估报告,然后根据反馈修改"),每一步的中间状态都需要在上下文中维持。如果上下文被截断或污染,推理链就会断裂。
实践中,这要求系统设计清晰的上下文状态机:
Step 1: 加载任务描述 → 设置上下文
Step 2: 执行研究 → 追加研究发现到上下文
Step 3: 生成初稿 → 保留研究结果 + 初稿在上下文
Step 4: 接收反馈 → 保留初稿 + 追加反馈
Step 5: 修改迭代 → 保留所有历史上下文
每一步都依赖于上一步的输出仍在上下文中。一旦上下文超过窗口限制,系统需要决定:是丢弃最早的历史,还是用摘要压缩历史。
多轮交互中的指令跟随与上下文粘性
用户在对话中可能不断调整需求:“不对,上一步的方案用图数据库而不是关系数据库。” AI 需要理解"上一步"指的是什么——这依赖短期记忆维持对话历史。
一个常见的工程失误是:提前将对话历史移出上下文(为了节省 token),导致 AI 丢失上下文粘性。好的短期记忆管理不是尽量省 token,而是在有限的窗口内尽量保留高价值信息。
Agent 任务编排中的临时变量与中间结果
在 Function Calling / Tool Use 的架构中,工具调用的中间结果——API 返回的数据、文件读取的内容、代码执行的结果——都存储在短期记忆中。这些数据通常不需要持久化到长期记忆(用完即弃),但必须在下一次推理时可访问。
这引出一个设计原则:只将"未来可能再次需要"的信息写入长期记忆;“用完即弃"的信息只保留在当前上下文。
2.2 工程挑战
窗口预算管理:Token 即成本
上下文窗口里的每个 token 都有成本,一个实用的窗口预算模型:
总窗口大小 = System Prompt + 对话历史 + 检索结果 + 当前输入 + 预留输出
预算分配策略示例:
128K 窗口的预算分配(总:128K token)
├── System Prompt: 2K (1.6%)
├── 对话历史: 40K (31%)
│ ├── 最近的 10 轮: 20K
│ └── 早期的摘要: 20K
├── 检索结果: 50K (39%)
│ ├── Top-3 RAG chunks: 30K
│ └── 工具调用结果: 20K
├── 当前输入: 6K (4.7%)
└── 预留输出: 30K (23%)
这个分配不是固定的——检索结果多时压缩对话历史,需要长输出时压缩检索结果。关键在于:有意识地管理预算,而不是任由上下文自然膨胀。
注意力稀释:长上下文中的"迷失在中间”
2023 年 Liu et al. 的经典实验已经证明:LLM 对上下文中间部分的注意力显著低于开头和结尾。这种现象称为"迷失在中间"(Lost in the Middle)。
这意味着,即使你把 100K token 的历史全部塞进上下文,模型可能根本不看中间部分。工程应对策略:
- 关键信息前置或后置:用户偏好、核心指令放在 System Prompt 末尾(靠近开头)或用户消息末尾(靠近结尾)
- 结构化标记:使用 XML 标签或 Markdown 标题标记不同信息区域,让模型更容易定位
- 分层摘要:对中间的历史做分层摘要,而不是直接堆砌原始对话
滑动窗口 vs 压缩 vs 摘要回溯
当对话超过窗口限制时,有三种常见的处理策略:
| 策略 | 原理 | 特点 | 适用场景 |
|---|---|---|---|
| 滑动窗口 | 丢弃最早的消息,保留最近的 N 轮 | 简单,但丢失早期信息 | 闲聊、短期任务 |
| 压缩 | 用更少的 token 表示信息(如提取关键点) | 信息密度高,但可能失真 | 技术细节密集的对话 |
| 摘要回溯 | 定期对历史做摘要,将摘要保留在窗口中 | 保留全景,但摘要成本高 | 长周期项目、研究任务 |
实践中,大多数成熟的系统采用混合策略:最近的对话用滑动窗口保留完整内容,早期的用摘要回溯压缩。
2.3 实践经验
Prompt 结构设计
一种经过验证的短期记忆上下文结构:
System:
[你是谁,你的能力边界,你的行为约束]
[用户的核心偏好 / 个性画像] ← 关键信息放在这里
User:
[当前的任务 / 问题]
Assistant:
[回复]
History Summary: ← 历史摘要,定期更新
[过去 50 轮对话的核心事实和结论]
Recent Messages: ← 最近 3-5 轮完整保留
[User: ...]
[Assistant: ...]
这个结构的好处是:关键信息(System + History Summary + Recent Messages)分布在窗口的开头和结尾,避免了"迷失在中间"的问题。
结构化上下文
用结构化的方式组织上下文,而不是用自然语言堆砌:
{
"user_profile": {
"name": "张三",
"role": "后端工程师",
"preferences": {
"language": "Go",
"db": "PostgreSQL"
}
},
"session_context": {
"started_at": "2026-06-22T10:00:00Z",
"current_project": "api-gateway",
"completed_tasks": ["设计数据库 schema", "编写接口文档"],
"pending_tasks": ["实现认证中间件"]
},
"history": [
{"role": "user", "content": "..."},
{"role": "assistant", "content": "..."}
]
}
结构化上下文的好处:
- 模型可以精确定位信息(从 JSON 路径中按需读取)
- 易于程序化处理(裁剪、压缩、提取都更方便)
- 减少歧义(JSON 结构比自然语言段落更明确)
三、长期记忆:跨越会话的"第二大脑"
3.1 应用场景
长期记忆解决的是短期记忆无法覆盖的问题:跨会话的知识留存。
用户画像与个性化记忆
一个 AI 助手如果每次对话都是一张白纸,用户每次都要重新告诉它自己的偏好、背景、历史——这种体验是断裂的。
个性化记忆需要存储:
- 事实信息:用户的名字、职位、公司、技术栈偏好
- 行为模式:用户通常怎么提问?喜欢详细回答还是简短回答?
- 历史决策:用户过去做了哪些选择?为什么?
- 关系图谱:用户和他人的关系、用户和项目的关系
知识库与 RAG 的向量化存储
RAG(Retrieval-Augmented Generation)是目前最成熟的长期记忆方案。它将外部知识文档向量化存储,在需要时检索相关片段注入上下文。
RAG 的核心流程:
文档 → 切分 → Embedding → 向量数据库
↓
用户提问 → Query Embedding → 相似度检索 → Top-K chunks
↓
+ 原始上下文 → LLM → 回复
RAG 的成熟度使其成为企业知识库场景的首选。但它的局限性也很明显:向量相似度不等于语义相关性。两个语义截然相反的句子,在向量空间中的距离可能很近。
Agent 技能图谱的持续积累
当一个 Agent 反复完成同类任务时,它会积累"经验"。比如一个代码审查 Agent,每次审查后都可以把"常见错误模式"存入长期记忆中。下次遇到类似代码时,它能更快地发现问题。
这种技能图谱的积累是 Agent 从"新手"成长为"专家"的关键机制。
多 Agent 协作中的共享记忆池
在多 Agent 系统中,不同的 Agent 可能需要共享信息。一个 Agent 发现的安全漏洞,另一个 Agent 在编写代码时应该能感知到。
共享记忆池的设计要点:
- 写权限控制:谁可以写入?写入后如何通知其他 Agent?
- 读权限控制:哪些 Agent 能读取哪些记忆?
- 一致性保证:多个 Agent 同时写入时如何避免冲突?
- 过期机制:过时的共享信息如何标记或删除?
3.2 工程实现流派
长期记忆的工程实现在过去两年里快速发展,形成了几个主要流派:
RAG(检索增强生成)——经典范式
RAG 是最早也是最成熟的方案。它的核心思路是:不修改模型,而是通过外挂知识库来扩展模型的知识边界。
优点:
- 技术成熟,生态完善(LangChain、LlamaIndex、Chroma、Pinecone、Weaviate…)
- 无需训练,即插即用
- 知识可更新(换文档即换知识)
局限:
- 检索质量是关键瓶颈
- 依赖 embedding 模型的质量
- 难以处理复杂关系推理(GraphRAG 是对此的补充)
MemGPT / Letta —— 虚拟上下文管理
MemGPT(现在改名为 Letta)提出了一个重要的概念:让 LLM 自己管理自己的记忆。它给模型提供了"管理记忆的工具"——core_memory_insert、core_memory_replace、archival_memory_search 等函数,让模型在推理时自主决定何时写入、何时检索。
这个思路的突破性在于:将记忆管理从系统层面的被动策略,变成了 Agent 层面的主动能力。
Letta 的架构:
┌──────────────┐ ┌──────────────────┐
│ LLM 推理循环 │ <──> │ 记忆工具(Tools) │
│ │ │• core_memory_* │
│ System Prompt│ │ │
│WorkingContext│ └────────┬─────────┘
└──────────────┘ │
▼
┌──────────────────┐
│ 核心记忆 │
│ │
├──────────────────┤
│ 归档记忆 │
│ (需要检索访问) │
└──────────────────┘
优点:
- 模型自主管理记忆,适应性强
- 核心记忆始终在上下文中,减少检索延迟
- 适合需要长期自主运行的 Agent
局限:
- 模型需要具备"管理记忆的能力"(不一定所有模型都适合)
- 记忆工具的调用会增加 token 消耗
- 自主决策可能导致记忆策略的不可预测性
Graph Memory —— 知识图谱 + 记忆网络
Graph Memory 用图结构来存储记忆。节点代表实体(人、事、物、概念),边代表关系(属于、参与、导致、引用)。
为什么用图?
- 关系的距离和类型本身携带信息(“张三的同事的上级"比"张三的同事"更远)
- 多跳推理更自然(图遍历 vs 多次向量检索)
- 长尾关系的表达力更强
代表项目:Microsoft 的 GraphRAG、Memgraph、Neo4j + LLM 集成。
优点:
- 关系推理能力强
- 适合复杂的实体关联场景(企业知识图谱、社交网络分析)
- 可解释性好(图路径可追溯)
局限:
- 构建和维护图的成本高
- 非结构化文本到结构化图的转化有精度损失
- 大规模图的检索延迟较高
Agentic Memory —— 记忆即决策
Agentic Memory 是目前最前沿的方向。它的核心观点是:记忆管理本身就是一个决策问题,应当由专门的"记忆 Agent"来处理。
在这种架构下,记忆不再是存储在某个数据库中的静态数据,而是一个动态的、自管理的系统:记忆 Agent 负责判断写入时机、选择存储格式、优化检索策略、甚至主动发起记忆巩固(如定期总结、去重、关联)。
优点:
- 极高的灵活性,能适应复杂场景
- 可以集成多种存储后端(向量 + 图 + KV)
- 记忆质量可以通过反馈持续优化
局限:
- 系统复杂度高
- 多个 Agent 之间的协调成本
- 调试和可观测性困难
3.3 关键设计决策
无论选择哪个流派,有几个设计决策是共通的:
结构化 vs 非结构化存储
| 存储类型 | 示例 | 适合场景 |
|---|---|---|
| 纯文本/向量 | Embedding + Chunks | 通用知识、文档库 |
| KV 对 | {key: user_name, value: 张三} | 用户偏好、配置信息 |
| 结构化记录 | JSON / Table | 交易记录、事件日志 |
| 图结构 | Node + Edge | 关系推理、知识图谱 |
实践中,混合存储是最常见的:向量用于语义检索,KV 用于精确值查询,图用于关系推理。
嵌入模型的选择与更新策略
Embedding 模型的质量直接决定检索质量。关键选择点:
- 模型规模:小模型(text-embedding-3-small)速度快但精度低,大模型(text-embedding-3-large)精度高但成本高
- 领域适配:通用 embedding vs 领域特定 embedding(如 code-embedding)
- 更新策略:增量更新(新文档直接 embedding 后插入)vs 批量重算(所有文档重新 embedding)
实践中推荐的做法:用通用 embedding 做初筛,用重排序模型(Cross-encoder / Reranker)做精排。
存储规模 vs 检索延迟的权衡
| 存储规模 | 典型检索延迟 | 优化策略 |
|---|---|---|
| < 10K chunks | < 10ms | 简单向量检索即可 |
| 10K - 100K | 10-50ms | IVF / HNSW 索引 |
| 100K - 1M | 50-200ms | 分片 + 预过滤 |
| > 1M | 200ms+ | 层级检索 + 粗排 + 精排 |
四、记忆的写入:什么时候该"记下来”?
如果说记忆架构是骨架,写入策略就是肌肉——它决定了记忆系统能否真正动起来。
4.1 写入时机的四种模式
按需写入(On-Demand)
用户显式要求 AI 记住某些东西。
用户:"记住,我更喜欢用 PostgreSQL 而不是 MySQL。"
AI:"好的,我已记住:你更偏好 PostgreSQL。"
特点:
- 精准:用户明确知道什么值得记
- 低误报:不会写入不相关信息
- 但依赖用户主动性——用户不记得说"记住",信息就丢了
适用场景:用户偏好配置、关键信息标记
事件驱动写入(Event-Driven)
系统预定义了一系列"关键事件",当事件发生时自动触发写入。
事件定义:
├── 用户提供了个人信息(姓名、邮箱、公司)→ 写入个人档案
├── 用户做了一个技术决策("我们用 Go 重构")→ 写入项目决策记录
├── 用户表达了强烈的偏好或反对 → 写入偏好记录
└── 任务完成 → 写入任务结果摘要
特点:
- 自动化程度高
- 依赖事件识别规则的完备性
- 规则太宽则写入过多噪音,太窄则遗漏有价值信息
适用场景:客服系统(自动记录客户信息)、项目管理(自动记录决策)
周期性写入(Periodic)
每隔一定时间或在会话结束时,系统批量总结并写入记忆。
会话结束时的自动总结:
"本次会话覆盖了 3 个主题:
1. API 网关的选型讨论 → 结论:使用 Kong
2. 数据库迁移策略 → 待定,需要下周二的架构会议决定
3. 团队人员变动 → 小张加入后端团队"
→ 将总结写入长期记忆
特点:
- 覆盖全面,不会遗漏
- 写入内容经过汇总提炼,质量较高
- 时效性差(只能在周期结束后写入)
适用场景:研究助手、长周期项目、咨询对话
反思性写入(Reflective)
AI 在完成任务后,对自身的表现进行"反思",将学到的经验存入长期记忆。这是最接近人类学习方式的写入模式。
任务:编写一个 Python 脚本处理 CSV 文件
反思输出:
"我在处理 CSV 时,用户期望我使用 pandas 而不是 csv 模块。
下次遇到类似任务时,我应当优先考虑使用 pandas。"
→ 写入长期记忆作为"经验教训"
特点:
- 能发现规则无法覆盖的隐性模式
- 自我迭代能力,Agent 越用越好
- 依赖模型的元认知能力(不是所有模型都擅长反思)
适用场景:个人 AI 助手、代码 Agent、学习型系统
4.2 写入什么?
识别了"何时写",接下来是"写什么"。这是记忆质量的分水岭。
事实抽取 vs 印象提炼 vs 关系关联
记忆内容可以分为三个层级:
| 层级 | 定义 | 示例 | 用途 |
|---|---|---|---|
| 事实抽取 | 精确的、可验证的信息 | “用户叫张三,在 ABC 公司工作” | 精准查询 |
| 印象提炼 | 模糊的、但有用的判断 | “用户对安全话题特别敏感” | 行为适配 |
| 关系关联 | 连接不同实体的关系 | “张三参与了 API 网关项目,该项目使用 Kong” | 知识图谱 |
一个好的记忆系统应当同时包含这三个层级。只有事实没有印象,AI 会显得机械;只有印象没有事实,AI 会显得不确定。
去重与冲突消解
同一个信息可能在多个会话中被多次写入。如果没有去重机制,长期记忆会充满冗余甚至矛盾的内容。
常见的冲突场景及其消解策略:
| 冲突类型 | 示例 | 消解策略 |
|---|---|---|
| 直接矛盾 | Session A: “用 Go”,Session B: “改用 Rust” | 以最新为准 + 保留变更记录 |
| 精度差异 | Session A: “30 岁”,Session B: “31 岁” | 以最具体的为准 |
| 表述差异 | “PostgreSQL 偏好” vs “喜欢 PG” | 标准化后再比较 |
| 上下文矛盾 | 工作场景 vs 个人场景偏好不同 | 增加上下文标签,场景化存储 |
推荐做法:不直接覆盖,而是建立版本化的记忆记录,保留每次写入的时间戳和来源。AI 在召回时可以看到完整的时间线。
隐私边界的工程实现
当 AI 系统存储用户信息时,隐私是不可回避的问题。
工程层面的实践建议:
- 最小化原则:只存储任务所需的必要信息
- 分级存储:敏感信息(如姓名、邮箱)加密存储,非敏感信息(技术偏好)明文存储
- 遗忘机制:支持用户要求删除特定记忆
- 隔离机制:不同用户的记忆严格隔离(逻辑隔离或物理隔离)
- 审计日志:记录每次记忆写入和读取的操作,用于合规审计
4.3 质量控制
记忆不是越多越好。低质量的记忆比没有记忆更糟糕——它会污染检索结果,降低 AI 的回复质量。
重要性评分机制
每条写入的记忆应当附带一个重要性分数(0-1),用于后续的检索排序和遗忘决策。
评分因素:
- 来源权威性:用户直接说的 > AI 推断的 > 默认值
- 确认次数:反复被确认的信息 > 一次性提及
- 时效性:最近的信息 > 过时的信息
- 上下文相关性:在当前任务中提及的信息 > 无关信息
记忆压缩 / 遗忘策略
Ebbinghaus 遗忘曲线揭示了一个规律:信息在习得后迅速衰减,但在关键复习点后进入长期保持。
在工程侧,这个规律可以转化为遗忘策略:
初始化:每段记忆获得一个"活性分值"(activity score)
每次成功召回:活性分值增加
每次未被召回的检索:活性分值衰减
当活性分值低于阈值:标记为"可遗忘"(cold storage)
定期清理:归档或删除 cold storage 中的记忆
这确保:频繁使用的记忆保持活跃,长期不用的记忆自然淡出,不需要人工干预。
五、记忆的召回:什么时候该"想起来"?
写入再完善,如果召不回,等于没有写。
5.1 召回的触发条件
显式召回
用户主动查询的记忆:
用户:"我之前说过的关于数据库选择的结论是什么?"
→ 触发显式检索 → 返回"使用 PostgreSQL + TimescaleDB"
这是最精准的召回方式——但也是最依赖用户记忆力的。
隐式召回(语义触发)
系统根据当前对话的语义,自动判断是否需要检索相关历史记忆。
用户:"我想开始一个新项目,做一个微服务架构的电商后台。"
→ 自动检索:
• 用户的技术栈偏好(Go + PostgreSQL)
• 用户过去关于微服务的讨论
• 用户过去相关的项目经验
→ 这些信息在 AI 生成回复时自动注入上下文
隐式召回是记忆系统的"核心技术亮点"——用户不需要记得自己说过什么,系统自动把相关信息带到对话中。
工程实现:将当前对话的最后 N 条消息拼接成查询向量,在记忆库中搜索 Top-K 相关内容。
任务上下文关联召回
当 AI Agent 在执行一个具体任务时,根据任务的上下文(项目名称、仓库地址、任务类型等)召回相关记忆。
任务:review PR #1234(go-api-gateway 仓库)
→ 自动召回:
• 该项目的技术决策记录
• 该用户之前的代码审查偏好
• 该模块的历史问题和修复方案
这种召回方式适合工作场景中的 AI 助手、代码 Agent 等。
5.2 召回质量的关键因子
检索策略
| 策略 | 原理 | 适合场景 |
|---|---|---|
| Top-K | 取相似度最高的 K 条 | 通用场景,简单有效 |
| MMR(最大边际相关性) | 同时考虑相关性和多样性 | 需要覆盖多个角度的场景 |
| HyDE(假设性文档嵌入) | 先生成假设答案,再用假设答案检索 | 查询与文档表述风格差异大 |
| 重排序(Reranking) | 先用轻量级检索取 Top-100,再用重排序模型精排 Top-K | 精度优先的场景 |
实践中,Top-K + 重排序的组合是最推荐的工程方案:阶段一快速筛选,阶段二精确定位。
时效性与排序衰减
同样的知识,六个月前的和昨天的,价值不同。
一个简单的时效性加权公式:
最终分数 = 语义相似度 × 时效性权重
时效性权重 = 1 / (1 + α × 天数)
其中 α 是衰减系数,可配置:
- α = 0: 无衰减(所有记忆同等重要)
- α = 0.01: 缓慢衰减(一年衰减约 78%)
- α = 0.1: 快速衰减(一个月衰减约 95%)
多模态混合检索
当记忆包含多种类型的数据(文本、代码、结构化 JSON、甚至图片描述),单一检索方式不够用。
混合检索的思路:
查询 → 并行检索
├── 向量检索(文本/代码相似度)
├── KV 查询(精确匹配:用户名、项目名)
└── 图遍历(关系路径:A 的同事的上级)
→ 融合排序 → Top-K 结果
5.3 召回后的注入策略
召回只是手段,注入上下文、影响生成才是目的。但注入方式直接影响生成质量。
直接注入 vs 精炼后注入
| 方案 | 做法 | 特点 |
|---|---|---|
| 直接注入 | 将原始记忆片段追加到上下文 | 信息无损失,但可能包含噪音 |
| 精炼后注入 | 用 LLM 将记忆提炼为一句话摘要后再注入 | token 节省,但信息可能失真 |
推荐:如果记忆本身质量高(结构清晰、内容准确),直接注入;如果记忆质量参差不齐,精炼后注入。
动态优先级排序
当召回结果超过上下文预算时,需要决定哪些记忆优先注入。
优先级计算:
Priority = Relevance × Recency × Importance × Confidence
其中:
- Relevance: 与当前查询的语义相似度(0-1)
- Recency: 时效性分数(0-1)
- Importance: 写入时的重要性评分(0-1)
- Confidence: 来源可信度(用户直接说的 = 1.0,AI 推断 = 0.7)
取 Top-N 条注入,直到达到上下文预算上限。
“适时沉默”:不相关即不召回
这是最容易忽视、但最重要的一条原则:如果检索结果与当前上下文不相关,就不要注入。
不相关记忆的注入会:
- 浪费 token 预算
- 引入噪音,干扰模型理解
- 可能导致"幻觉式关联"——模型强行将不相关的记忆融入回答
工程实现上,可以为召回结果设置相关度阈值(如 cosine similarity > 0.8 才注入),低于阈值的直接丢弃。
六、写与召的协同:“记忆闭环"的工程实现
写和召不是两个孤立的动作。它们构成一个闭环:写好才能召好,召好才能写好。
6.1 记忆生命周期管理
一段记忆从诞生到消亡,经历完整的生命周期:
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 创建 │ → │ 活跃期 │ → │ 巩固期 │ → │ 归档期 │ → │ 删除 │
│ (写入) │ │(高频召回) │ │(中频召回) │ │(低频召回) │ │ (遗忘) │
└──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘
- 创建:首次写入,附带重要性评分和时效标签
- 活跃期:频繁被召回,活性分值高,存储在快速访问层
- 巩固期:召回频率下降,活性分值中等,可迁移到冷存储层
- 归档期:召回频率极低,活性分值低,支持手动唤醒
- 删除:超过遗忘阈值或用户要求删除
6.2 反馈驱动的记忆质量评估
记忆系统需要知道自己的表现好不好。反馈信号来源:
| 信号类型 | 获取方式 | 用途 |
|---|---|---|
| 用户反馈 | 用户点赞/点踩、删除记忆 | 直接评估 |
| 行为信号 | 用户是否引用了召回的信息、是否纠正了 AI 的回答 | 间接评估 |
| 任务成功率 | 有记忆辅助时 vs 没有时,任务成功率是否有提升 | 量化评估 |
| 召回准确率 | 召回的 Top-K 中有多少是真正相关的 | 系统评估 |
反馈信号不仅用于评估,还应当反向影响记忆系统:被点赞的记忆活性分值增加,被点踩的记忆重要性下降或标记为低质量。
6.3 典型架构示例:记忆管道(Memory Pipeline)
综合以上所有设计原则,一个完整的记忆系统架构如下:
┌──────────────────────────┐
│ 用户 / 环境输入 │
└────────────┬─────────────┘
▼
┌──────────────────────────────────────────────────┐
│ 记忆写入管道(Memory Write Pipeline) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌─────────────────┐ │
│ │事件识别 │→ │重要性评分 │→ │ 格式转换 & 去重 │ │
│ │(何时写) │ │(是否值写) │ │(写什么) │ │
│ └──────────┘ └──────────┘ └────────┬────────┘ │
│ ▼ │
│ ┌──────────────────────────────────────────────┐│
│ │ 存储后端(Storage Backend ││
│ │ ┌──────────┐ ┌──────────┐ ┌────────────┐ ││
│ │ │向量数据库 │ │ KV 存储 │ │ 图数据库 │ ││
│ │ │(语义检索) │ │(精确查询) │ │(关系检索) │ ││
│ │ └──────────┘ └──────────┘ └────────────┘ ││
│ └──────────────────────────────────────────────┘│
│ │
│ 记忆召回管道(Memory Read Pipeline) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌─────────────────┐ │
│ │ 触发检测 │→ │ 多路检索 │→ │融合排序 & 重排序 │ │
│ │(何时召) │ │(怎么召) │ │(召哪些) │ │
│ └──────────┘ └──────────┘ └────────┬────────┘ │
│ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌─────────────────┐ │
│ │ 注入决策 │→ │上下文注入 │→ │ LLM 推理 & 回复 │ │
│ │(是否注入) │ │(怎么注入) │ │ │ │
│ └──────────┘ └──────────┘ └─────────────────┘ │
│ │
│ 反馈循环(Feedback Loop) │
│ ┌──────────┐ ┌──────────┐ ┌─────────────────┐ │
│ │ 质量评估 │→ │ 活性更新 │→ │ 遗忘 / 巩固决策 │ │
│ │(好不好) │ │(调整权重) │ │(删或留) │ │
│ └──────────┘ └──────────┘ └─────────────────┘ │
└──────────────────────────────────────────────────┘
这个架构的核心思想是:记忆不是一个静态的数据库,而是一个动态的、自适应的系统。它不断从用户交互中学习,调整自己的写和召策略,并在反馈循环中持续优化。
七、主流记忆方案横向对比
7.1 方案全景图:从 RAG 到 Agentic Memory
过去两年,AI 记忆方案的演进大致遵循了这条路径:
RAG (2023) → 简单文档检索
↓
GraphRAG (2024) → 引入图结构增强关系推理
↓
MemGPT / Letta (2024) → 模型自主管理记忆
↓
Memory Bank (2024) → Code Agent 场景的会话记忆
↓
Mem0 (2025) → 个性化记忆即服务
↓
Supermemory (2025) → 轻量级长期记忆存储与检索
↓
Agentic Memory (2025+) → 记忆即决策,记忆 Agent 自治管理
7.2 主流方案逐一拆解
MemGPT / Letta:虚拟上下文管理 + 分层存储
- 定位:让 LLM 自己管理自己的记忆
- 核心能力:记忆工具函数(core_memory / archival_memory),分层存储
- 写策略:模型自主驱动 + 系统定期总结
- 召策略:核心记忆始终在上下文(低延迟),归档记忆按需检索
- 适合场景:需要长期自主运行的 Agent(研究助手、个人助理)
- 部署成本:中等,需要维护一个后台服务管理记忆状态
- GitHub:github.com/letta-ai/letta
RAG 范式族(Naive / GraphRAG / Corrective RAG)
- 定位:外挂知识库扩展模型知识边界
- 核心能力:文档向量化存储 + 语义检索
- 写策略:文档入库时批量 Embedding
- 召策略:Query → Embedding → 向量检索 → Top-K
- 适合场景:企业知识库、文档问答、客服系统
- 部署成本:低到中,取决于文档规模
- 代表项目:LlamaIndex、LangChain + Chroma/Pinecone、Microsoft GraphRAG
Memory Bank:Code Agent 的会话记忆池
- 定位:专为代码 Agent 设计的会话间记忆系统
- 核心能力:结构化记录 Agent 的认知状态、环境配置、任务上下文
- 写策略:Agent 显式写入 + 工具调用自动记录
- 召策略:任务启动时自动加载
- 适合场景:代码编写 Agent、IDE 插件
- 部署成本:低,轻量级文件或内存存储
Mem0:个性化记忆即服务
- 定位:面向 AI 应用的个性化记忆中间件
- 核心能力:自动抽取用户偏好、事实、印象
- 写策略:事件驱动(用户交互中自动提取)
- 召策略:语义检索 + 上下文注入
- 适合场景:聊天机器人、个性化推荐、用户画像
- 部署成本:中,需要接入 Mem0 云端或自托管服务
- GitHub:github.com/mem0ai/mem0
Supermemory:轻量级长期记忆存储与检索
- 定位:开发者友好的轻量级长期记忆方案
- 核心能力:简洁的 API 接口,支持文本记忆的存储和语义检索
- 写策略:按需写入 + 自动摘要
- 召策略:语义相似度检索 + 关键词匹配
- 适合场景:中小型 AI 应用、个人项目、快速原型
- 部署成本:低,轻量部署,API 简洁
- GitHub:github.com/supermemory-ai/supermemory
LangMem / CrewAI Memory:框架内置记忆模块
- 定位:嵌入 AI 框架(LangChain、CrewAI)的记忆模块
- 核心能力:与框架的 Agent、Tool、Chain 深度集成
- 写策略:框架事件钩子自动触发
- 召策略:框架运行时自动检索
- 适合场景:使用 LangChain / CrewAI 搭建的 AI 应用
- 部署成本:低(框架已有),无需额外服务
- 代表项目:LangChain LangMem、CrewAI Memory
7.3 对比维度
| 方案 | 存储方式 | 写策略 | 召策略 | 适用场景 | 部署成本 |
|---|---|---|---|---|---|
| RAG | 向量数据库 | 批量 Embedding | 语义检索 | 企业知识库、文档问答 | 低-中 |
| GraphRAG | 图 + 向量 | 实体关系提取 | 图遍历 + 语义检索 | 复杂关系推理 | 中-高 |
| MemGPT/Letta | 分层(核心+归档) | 模型自驱 + 系统总结 | 核心常驻 + 归档检索 | 长期 Agent | 中 |
| Memory Bank | 结构化文件 | Agent 显式写入 | 任务启动加载 | 代码 Agent | 低 |
| Mem0 | 云端/自托管向量 | 事件驱动自动提取 | 语义检索 | 个性化对话 | 中 |
| Supermemory | 轻量向量存储 | 按需写入 + 自动摘要 | 语义 + 关键词 | 中小型应用、原型 | 低 |
| LangMem | 与 LangChain 集成 | 框架事件钩子 | 框架自动检索 | LangChain 应用 | 低 |
| CrewAI Memory | 与 CrewAI 集成 | Agent 生命周期钩子 | 实体记忆 + 短期记忆 | 多 Agent 系统 | 低 |
7.4 选型建议:不同场景下该选谁?
你正在构建什么?
├── 企业知识库 / 文档问答系统
│ └── → RAG(简单场景)或 GraphRAG(复杂关系)
│
├── 需要长期自主运行的 Agent(个人助理、研究助手)
│ └── → MemGPT / Letta
│
├── 代码 Agent(IDE 插件、自动化编程)
│ └── → Memory Bank + 用 RAG 外挂知识库
│
├── 个性化聊天 / 用户画像系统
│ └── → Mem0 或 Supermemory(轻量级)
│
├── 已经在用 LangChain / CrewAI 框架
│ └── → 优先使用框架内置的 LangMem / CrewAI Memory
│
└── 原型 / 个人项目 / MVP
└── → Supermemory(最快速上手)
八、前沿趋势与挑战
8.1 记忆即服务 / 记忆中间件层的兴起
记忆正在从"每个应用自己实现的功能"变成"一个独立的基础设施层”。就像十年前数据库从嵌入式走向托管服务一样,记忆系统也在经历同样的变化。
趋势信号:
- Mem0 提供云端记忆托管
- 向量数据库(Pinecone、Weaviate、Qdrant)推出记忆管理功能
- 创业公司开始专注于"AI 记忆"这个垂直赛道
这意味着什么? 未来构建 AI 应用时,记忆模块可能像 PostgreSQL 一样是一个标准组件——你不需要从头实现,只需要配置好接入。
8.2 混合记忆:神经 + 符号
纯向量的记忆系统在关系推理上有天然短板。纯符号(规则/图)的系统在灵活性上不足。混合记忆试图结合两者的优势:
- 神经部分:处理非结构化信息、模糊匹配、语义理解
- 符号部分:处理精确规则、关系推导、逻辑约束
示例:一个混合记忆系统可能用向量存储"用户说了什么",用图数据库存储"用户和项目、同事之间的关系",用规则引擎处理"谁的权限可以访问什么信息"。
8.3 记忆的个性化与联邦学习
当记忆系统为每个用户维护独立的记忆空间时,一个自然的扩展是:在不同用户之间安全地共享"模式"而非"数据"。
联邦学习框架下的记忆系统:
- 每个用户的记忆存储在本地
- 模型定期学习"什么样的记忆策略最有效"(而非学习用户的私有数据)
- 全局优化记忆的写入和召回策略
这意味着:AI 助手可以越来越懂"人"(通用模式),同时不需要看到任何人的隐私数据。
8.4 长期记忆的"灾难性遗忘"在工程侧的解
在神经网络训练中,“灾难性遗忘"指模型学习新知识时遗忘旧知识。在工程化的记忆系统中,类似的问题表现为:
- 存储侧:新的记忆覆盖或扭曲旧的记忆结构
- 检索侧:新的高频记忆"压倒"旧的但仍有价值的记忆
- 注入侧:模型被近期记忆主导,忽略远期但更相关的记忆
工程层面的缓解策略:
- 分层存储:热数据(近期高频)和冷数据(远期低频)分开索引
- 多维度排序:不是单纯按相似度排序,而是按 “相似度 × 时效性 × 重要性” 的复合分数排序
- 定期审计:系统定期检查"有多少记忆从未被召回”,主动调整失效策略
九、总结
记忆工程的核心三问
贯穿全文,我们一直在回答三个问题:
| 问题 | 工程实质 | 关键决策 |
|---|---|---|
| 记什么? | 记忆内容的质量控制 | 事实 vs 印象 vs 关系;去重与冲突消解 |
| 何时记? | 写入时机的策略选择 | 按需 vs 事件驱动 vs 周期性 vs 反思性 |
| 如何召? | 召回质量和注入策略 | 检索策略;时效性加权;不相关即不召回 |
这三个问题没有标准答案——场景决定策略。一个客服系统和一个代码 Agent,对这三个问题的回答完全不同。
从"能记住"到"该记住"
最初的 AI 系统面临的问题是"怎么让模型记住更多东西"。RAG、长上下文窗口、MemGPT——都在回答这个问题。
但下一代系统的挑战已经变成了:怎么让 AI 记住"该记住"的东西?
“该记住"意味着:
- 选择性:不是所有信息都值得写,也不是写了的都值得召
- 时机性:在正确的时间写,在正确的时间召
- 动态性:记忆不是固定的,它随着时间衰减、随着反馈调整
- 元认知:AI 需要知道自己知道什么、不知道什么——这就是"元记忆”
记忆的下一站,是从存储工程走向认知工程。就像今天的推荐系统不再是简单的"找相似",而是理解了用户意图的深层模式——明天的记忆系统也不会再是简单的"存和取",而是理解对话、任务和关系的智能中间件。
这也是 Harness Engineering 的核心命题:模型是那匹马,记忆就是它的缰绳。缰绳掌握得越好,马就越知道该往哪儿跑。