工程化记忆:大模型短期记忆与长期记忆的驾驭之道

Posted on Jun 22, 2026 · 9 min read

记忆不是存储问题,而是时机问题。

引言: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 的历史全部塞进上下文,模型可能根本不看中间部分。工程应对策略:

  1. 关键信息前置或后置:用户偏好、核心指令放在 System Prompt 末尾(靠近开头)或用户消息末尾(靠近结尾)
  2. 结构化标记:使用 XML 标签或 Markdown 标题标记不同信息区域,让模型更容易定位
  3. 分层摘要:对中间的历史做分层摘要,而不是直接堆砌原始对话

滑动窗口 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": "..."}
  ]
}

结构化上下文的好处:

  1. 模型可以精确定位信息(从 JSON 路径中按需读取)
  2. 易于程序化处理(裁剪、压缩、提取都更方便)
  3. 减少歧义(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_insertcore_memory_replacearchival_memory_search 等函数,让模型在推理时自主决定何时写入、何时检索。

这个思路的突破性在于:将记忆管理从系统层面的被动策略,变成了 Agent 层面的主动能力

Letta 的架构:

┌──────────────┐      ┌──────────────────┐
│ LLM 推理循环  │ <──> │ 记忆工具(Tools)  │
│              │      │• core_memory_*   │
│ System Prompt│      │                  │
│WorkingContext│      └────────┬─────────┘
└──────────────┘               │
                               ▼
                    ┌──────────────────┐
                    │    核心记忆       │
                    │                  │
                    ├──────────────────┤
                    │    归档记忆       │
                    │ (需要检索访问)    │
                    └──────────────────┘

优点

  • 模型自主管理记忆,适应性强
  • 核心记忆始终在上下文中,减少检索延迟
  • 适合需要长期自主运行的 Agent

局限

  • 模型需要具备"管理记忆的能力"(不一定所有模型都适合)
  • 记忆工具的调用会增加 token 消耗
  • 自主决策可能导致记忆策略的不可预测性

Graph Memory —— 知识图谱 + 记忆网络

Graph Memory 用图结构来存储记忆。节点代表实体(人、事、物、概念),边代表关系(属于、参与、导致、引用)。

为什么用图?

  • 关系的距离和类型本身携带信息(“张三的同事的上级"比"张三的同事"更远)
  • 多跳推理更自然(图遍历 vs 多次向量检索)
  • 长尾关系的表达力更强

代表项目:Microsoft 的 GraphRAGMemgraphNeo4j + 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 模型的质量直接决定检索质量。关键选择点:

  1. 模型规模:小模型(text-embedding-3-small)速度快但精度低,大模型(text-embedding-3-large)精度高但成本高
  2. 领域适配:通用 embedding vs 领域特定 embedding(如 code-embedding)
  3. 更新策略:增量更新(新文档直接 embedding 后插入)vs 批量重算(所有文档重新 embedding)

实践中推荐的做法:用通用 embedding 做初筛,用重排序模型(Cross-encoder / Reranker)做精排

存储规模 vs 检索延迟的权衡

存储规模典型检索延迟优化策略
< 10K chunks< 10ms简单向量检索即可
10K - 100K10-50msIVF / HNSW 索引
100K - 1M50-200ms分片 + 预过滤
> 1M200ms+层级检索 + 粗排 + 精排

四、记忆的写入:什么时候该"记下来”?

如果说记忆架构是骨架,写入策略就是肌肉——它决定了记忆系统能否真正动起来。

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 系统存储用户信息时,隐私是不可回避的问题。

工程层面的实践建议:

  1. 最小化原则:只存储任务所需的必要信息
  2. 分级存储:敏感信息(如姓名、邮箱)加密存储,非敏感信息(技术偏好)明文存储
  3. 遗忘机制:支持用户要求删除特定记忆
  4. 隔离机制:不同用户的记忆严格隔离(逻辑隔离或物理隔离)
  5. 审计日志:记录每次记忆写入和读取的操作,用于合规审计

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 条注入,直到达到上下文预算上限。

“适时沉默”:不相关即不召回

这是最容易忽视、但最重要的一条原则:如果检索结果与当前上下文不相关,就不要注入

不相关记忆的注入会:

  1. 浪费 token 预算
  2. 引入噪音,干扰模型理解
  3. 可能导致"幻觉式关联"——模型强行将不相关的记忆融入回答

工程实现上,可以为召回结果设置相关度阈值(如 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 长期记忆的"灾难性遗忘"在工程侧的解

在神经网络训练中,“灾难性遗忘"指模型学习新知识时遗忘旧知识。在工程化的记忆系统中,类似的问题表现为:

  • 存储侧:新的记忆覆盖或扭曲旧的记忆结构
  • 检索侧:新的高频记忆"压倒"旧的但仍有价值的记忆
  • 注入侧:模型被近期记忆主导,忽略远期但更相关的记忆

工程层面的缓解策略:

  1. 分层存储:热数据(近期高频)和冷数据(远期低频)分开索引
  2. 多维度排序:不是单纯按相似度排序,而是按 “相似度 × 时效性 × 重要性” 的复合分数排序
  3. 定期审计:系统定期检查"有多少记忆从未被召回”,主动调整失效策略

九、总结

记忆工程的核心三问

贯穿全文,我们一直在回答三个问题:

问题工程实质关键决策
记什么?记忆内容的质量控制事实 vs 印象 vs 关系;去重与冲突消解
何时记?写入时机的策略选择按需 vs 事件驱动 vs 周期性 vs 反思性
如何召?召回质量和注入策略检索策略;时效性加权;不相关即不召回

这三个问题没有标准答案——场景决定策略。一个客服系统和一个代码 Agent,对这三个问题的回答完全不同。

从"能记住"到"该记住"

最初的 AI 系统面临的问题是"怎么让模型记住更多东西"。RAG、长上下文窗口、MemGPT——都在回答这个问题。

但下一代系统的挑战已经变成了:怎么让 AI 记住"该记住"的东西?

“该记住"意味着:

  • 选择性:不是所有信息都值得写,也不是写了的都值得召
  • 时机性:在正确的时间写,在正确的时间召
  • 动态性:记忆不是固定的,它随着时间衰减、随着反馈调整
  • 元认知:AI 需要知道自己知道什么、不知道什么——这就是"元记忆”

记忆的下一站,是从存储工程走向认知工程。就像今天的推荐系统不再是简单的"找相似",而是理解了用户意图的深层模式——明天的记忆系统也不会再是简单的"存和取",而是理解对话、任务和关系的智能中间件。

这也是 Harness Engineering 的核心命题:模型是那匹马,记忆就是它的缰绳。缰绳掌握得越好,马就越知道该往哪儿跑。