犀牛鸟 2026 研究笔记 estelledc.github.io

Ch14: MemOS——记忆操作系统与 Dream Pipeline

Part 3: 七大开源项目精读 前置章节:Ch13: supermemory——产品化记忆与多源捕获 后续章节:Ch15: Claude Code 记忆——索引驱动的实时学习


1. 一句话定位

MemOS 是上海交大/北大/浙大联合推出的记忆操作系统,把记忆类比为操作系统中的一级资源来管理——用 MemCube 做容器化(四种认知科学类型)、MemScheduler 做调度、Dream Pipeline 做后台巩固。抽象层次在七个项目中最高,也是唯一扩展到文本之外(支持 KV Cache 和 LoRA 适配器)的方案。


2. 设计哲学——操作系统类比

想象你面前有两台电脑。

第一台电脑没有操作系统。你想要运行程序,得自己管理内存——手动分配地址空间、手动处理并发冲突、手动回收不用的内存。每写一个新程序,都要重新做一遍这些底层管理。

第二台电脑有操作系统。操作系统把内存、文件、进程、设备都抽象为统一的资源,你只需要”申请”和”释放”,不需要关心底层细节。内存不够了?操作系统自动把不常用的页面换到硬盘。两个程序同时运行?操作系统自动处理并发冲突。

MemOS 就是第二台电脑。它不是在做一个记忆库——它是在做”管理记忆的基础设施”。

其他记忆系统像专用的笔记本——有的适合记事实(mem0),有的适合记关系(Graphiti),有的适合记流程(Letta)。每种笔记本只擅长一类内容。如果你同时需要记事实、记关系、记流程,你得用三种不同的笔记本。

MemOS 像一台电脑的操作系统——它不关心你要记什么类型的内容,它提供统一的”文件系统”来存取,统一的”任务管理器”来调度,统一的”后台服务”来整理。它管理的不是记忆本身,而是”管理记忆”这件事的基础设施。

这个类比有一条重要边界:操作系统的抽象(文件、进程、设备)是业界 50 年共识的产物,每个概念都有精确的定义。MemOS 的抽象(MemCube、MemScheduler、Dream Pipeline)是新的——概念还在演化,定义还在模糊。比如”情景记忆”和”语义记忆”的边界在实际使用中经常模糊——”小明昨天说他喜欢咖啡”是情景记忆(因为有”昨天”这个时间点),还是语义记忆(因为”喜欢咖啡”是一个稳定事实)?MemOS 目前的做法是让开发者自行判断,但这增加了使用门槛。

2.1 和 Letta 虚拟内存的关系

MemOS 和 Letta 都借用了操作系统的概念,但借用的是不同的层:

Letta 的虚拟内存类比是一个精巧的单点创新;MemOS 的操作系统类比是一个宏大的体系化设计。前者更容易理解和实现,后者野心更大但实现复杂度也更高。

MemOS 可以被看作 Letta 虚拟内存思想的学术延伸——Letta 提出了”Agent 记忆可以类比操作系统虚拟内存”这个洞察,MemOS 把这个洞察推到了极致:如果记忆是虚拟内存,那 Agent 需不需要完整的操作系统?


3. MemCube——四种记忆类型的统一容器

MemCube 是 MemOS 的核心抽象——一个统一的记忆容器,内部分为四种认知科学类型。

3.1 四种记忆类型

MemCube 的四种类型直接来自认知科学中的经典记忆分类:

Episodic(情景记忆):具体的事件和对话片段,有时间、地点、上下文。比如”昨天下午 3 点和小王讨论了微服务架构方案”、”上周五的代码 review 中被指出要处理边界情况”。情景记忆是原始的、具体的——它保留了事件的所有细节,但也因此占用最多空间。

Semantic(语义记忆):提炼后的事实和概念,不依赖具体场景。比如”用户偏好 TypeScript”、”项目使用 React + Redux 技术栈”、”团队代码规范要求 2 空格缩进”。语义记忆是抽象的、稳定的——它从多次情景记忆中提炼而来,不再需要具体的时间地点上下文。

Procedural(程序记忆):怎么做某事的步骤和方法。比如”部署流程:先跑测试 → 再构建 Docker 镜像 → 最后推送到 K8s 集群”、”调试数据库连接问题的步骤:检查配置 → 看日志 → 测试网络连通性”。程序记忆是操作性的——它不是”知道什么”,而是”知道怎么做”。

Profile(画像记忆):用户或 Agent 的持久属性。比如”用户叫小明”、”用户是后端工程师”、”用户对花生过敏”。画像记忆是最稳定的——它描述的是”这个人/Agent 是什么样的”,而不是”发生了什么事”或”知道什么知识”。

3.2 和 DB-Agent-Memory 四层金字塔的对比

MemCube 的四种类型和 DB-Agent-Memory 的 L0-L3 四层金字塔都是”四种分类”,但分类逻辑完全不同:

维度 MemCube 四类型 DB-Agent-Memory 四层
分类依据 认知科学类型(是什么) 提炼程度(压缩到什么程度)
类型关系 平行(四种不同类型) 层级(L0→L1→L2→L3 逐层提炼)
转换方向 情景 → 语义(巩固) L0 → L3(提炼)
判断难度 高(情景 vs 语义边界模糊) 低(提炼程度是连续的)
理论基础 认知科学 工程实用主义

关键区别在于:MemCube 的四种类型是”分类”——一条信息属于四种之一,需要判断它属于哪种。DB-Agent-Memory 的四层是”提炼”——同一条信息在不同层有不同的表示形式,从 L0(原始对话)到 L3(用户画像)是逐层压缩的过程。

判断一条信息是”情景记忆”还是”语义记忆”是模糊的——”小明昨天说他喜欢咖啡”是情景(因为有”昨天”)还是语义(因为”喜欢咖啡”是稳定事实)?但判断一条信息在 L0-L3 的哪一层是明确的——L0 是原始对话文本,L1 是从中提取的原子事实,L2 是事实的聚合,L3 是整体画像。提炼程度是连续的、可度量的,记忆类型是离散的、需要主观判断的。

这就是为什么 MemCube 的使用门槛比金字塔高——开发者需要为每条信息做”类型判断”,而金字塔只需要做”提炼处理”(由系统自动完成)。

3.3 MemCube 的容器化

每个 Agent(或每个用户)拥有一个独立的 MemCube。MemCube 是记忆的容器——它封装了四种类型的存储,对外提供统一的读写接口。

容器化的好处是隔离——不同 Agent 的记忆不会互相干扰。一个 Coding Agent 的程序记忆(”部署流程”)和一个写作 Agent 的程序记忆(”文章结构模板”)存储在各自的 MemCube 中,互不影响。

这和 DB-Agent-Memory 的 containerTag 逻辑隔离、MemOS 的 MemCube 物理隔离形成了对比:


4. MemScheduler——记忆操作调度

MemScheduler 是 MemOS 的调度层,负责协调记忆的读写操作。

4.1 调度什么

MemScheduler 调度三类操作:

读取调度:当 Agent 需要访问记忆时,MemScheduler 决定返回哪些记忆、以什么优先级排序。这类似于操作系统的进程调度——不是所有记忆都同等重要,当前上下文最相关的记忆应该优先被读取。

写入调度:当新的记忆需要写入时,MemScheduler 决定写入哪个类型(情景/语义/程序/画像)、是否需要等待正在进行的巩固操作完成。这类似于操作系统的写入缓冲——不是所有写入都需要立即完成,可以批量处理。

巩固调度:Dream Pipeline 的运行时机和优先级由 MemScheduler 控制。当 Agent 空闲时,MemScheduler 启动 Dream Pipeline 整理记忆;当 Agent 需要访问记忆时,MemScheduler 可以暂停巩固操作以避免冲突。

4.2 优先级策略

MemScheduler 为每条记忆维护一个优先级分数,基于以下因素:

这个优先级策略和操作系统的页面置换算法(LRU、LFU)有相似的思路——频繁使用的资源优先保留,不常用的可以换出或衰减。

4.3 并发控制

当多个 Agent 或多个操作同时访问同一个 MemCube 时,MemScheduler 负责并发控制——防止写入冲突和读取不一致。

这是其他开源记忆项目很少关注的问题。mem0 的并发控制依赖底层向量数据库(Qdrant/Chroma 有各自的并发机制),DB-Agent-Memory 用 SQLite 的文件锁做最基础的并发控制。MemOS 是唯一在架构层面显式设计并发控制的方案。

但在实际使用中,大多数场景只有一个 Agent 访问记忆——并发控制的价值在多 Agent 协作场景中才会体现,而这目前还不是主流使用模式。


5. Dream Pipeline——认知科学启发的后台巩固

Dream Pipeline 是 MemOS 最有趣也最有启发性的设计。它在 Agent 空闲时自动执行记忆整理,直接对标人类睡眠中的记忆巩固过程。

5.1 认知科学背景

人类的大脑在睡眠时会做一件重要的事——记忆巩固(memory consolidation)。白天经历的事件先以短期记忆的形式存储在海马体中,睡眠时大脑会”重放”这些经历,把重要的短期记忆转化为长期记忆存储在新皮层中。不重要的记忆被遗忘,相关的记忆被关联,重复的经历被提炼为一般性的知识。

这个过程有几个关键特征:

5.2 Dream Pipeline 的实现

MemOS 的 Dream Pipeline 在 Agent 空闲时自动运行,执行以下操作:

去重:扫描情景记忆,检测重复或高度相似的记忆条目。如果多条情景记忆描述的是同一件事(比如三次对话中都提到了”喜欢咖啡”),保留最完整的版本,其他标记为”已去重”。

关联发现:在记忆之间建立新的关联。比如发现”用户在学习 Rust”和”用户在问内存安全”有关联——通过 LLM 推理或语义相似度计算建立关联边。这些新关联丰富了 Memory Graph,让后续检索能发现更多相关信息。

衰减过期:长时间未被检索的情景记忆优先级降低。MemScheduler 维护的优先级分数会随时间衰减——比如每天乘以 0.95 的衰减系数。优先级低于阈值的记忆进入”冷存储”——不再参与常规检索,但仍可通过精确搜索找到。Profile 类型永不过期,Semantic 衰减极慢,Episodic 衰减最快。

情景 → 语义提炼:将多次类似的情景记忆提炼为语义记忆。比如三次情景记忆分别是”1 月 15 日用户问 Rust 和 Go 的区别”、”2 月 3 日用户又在问 Rust 的优势”、”3 月 10 日用户决定用 Rust 重写后端”——Dream Pipeline 可以从这三条情景记忆中提炼出一条语义记忆:”用户对 Rust 有持续兴趣,最终选择用 Rust 重写后端”。

5.3 和 OpenClaw Dreaming 的异同

OpenClaw 是腾讯 tPRC-Agent-Go 的 Coding Agent,它也有一个 Dreaming 机制——在 Pre-compaction Flush 之后做异步整合。对比两者:

维度 MemOS Dream Pipeline OpenClaw Dreaming
触发时机 Agent 空闲时自动触发 Flush 之后异步触发
核心操作 去重 + 关联 + 衰减 + 情景→语义 去重 + 合并 + 更新 MEMORY.md
记忆类型 四种类型(认知科学分类) 两层(日记 + 长期记忆)
调度策略 MemScheduler 控制(优先级 + 并发) 简单的异步任务
理论基础 认知科学(记忆巩固) 工程实用主义

MemOS 的 Dream Pipeline 更系统化——有明确的调度策略(什么时候跑、跑多久、优先整理什么),而 OpenClaw 的 Dreaming 是简单的后台定时任务。MemOS 的四种记忆类型让巩固过程更精细——不同类型的记忆有不同的衰减和提炼策略。OpenClaw 只有日记和长期记忆两层,巩固只是”把日记中的重要内容搬到长期记忆里”。

5.4 和 Codex Phase2 Consolidation 的异同

Codex 的 Phase2 consolidation 是 OpenAI Codex 的记忆整合机制——获取全局锁后由 consolidation agent 在隔离沙箱中合并记忆。对比:

维度 MemOS Dream Pipeline Codex Phase2
触发时机 Agent 空闲时 6 小时冷却期后
并发控制 MemScheduler 全局锁(同时只有一个 Phase2 运行)
整合范围 单个 MemCube 全部 rollout 历史
执行环境 进程内 隔离沙箱
反馈循环 优先级分数 citation 正反馈(usage_count)

Codex 的 Phase2 更谨慎——用全局锁防止并发冲突,用隔离沙箱防止整合过程影响主流程,用 6 小时冷却期避免频繁整合。MemOS 的 Dream Pipeline 更积极——Agent 空闲就可以跑,不需要冷却期,但并发控制更复杂。

Codex 的 citation 正反馈循环是一个有趣的设计——被引用的记忆 usage_count 递增,影响下次是否保留。这比 MemOS 的优先级衰减更直接——”记忆好不好”不是靠时间衰减来判断,而是靠”有没有被用过”来判断。

5.5 Dream Pipeline 的局限

Dream Pipeline 面临几个实际挑战:

“空闲”的定义模糊:什么时候算 Agent 空闲?两次对话之间?用户关闭窗口后?还是一个定时触发器?如果 Agent 在 Dream Pipeline 运行期间突然收到请求,需要能立即暂停巩固操作——这增加了实现的复杂度。

巩固质量难以评估:去重是否正确?新关联是否有意义?情景→语义的提炼是否准确?目前没有自动化的评估方法——只能通过下游任务的效果间接评估。

资源消耗:Dream Pipeline 的去重、关联发现、提炼操作都需要 LLM 调用。对于一个有大量记忆的 MemCube,一轮完整的巩固可能消耗大量 token。如果没有预算限制,Dream Pipeline 可能在后台跑一整天——这在成本敏感的场景下不可接受。


6. 跨模态记忆——超越文本的独特扩展

MemOS 最独特的设计是把记忆扩展到了文本之外,支持三种记忆层:

6.1 Plaintext Memory(文本记忆)

最常见的记忆形式——文本形式的事实、事件、偏好等。其他六个项目的记忆都是 Plaintext Memory。

6.2 Activation Memory(激活记忆)

Activation Memory 存储的是 LLM 推理过程中的 KV Cache——模型在处理某个输入时产生的中间状态。

为什么要把 KV Cache 当作”记忆”?因为 KV Cache 包含了模型对输入的”理解”——它记住了输入中的每个 token 的上下文表示。如果你下次需要处理类似的输入,可以直接复用 KV Cache,而不需要重新计算——这大大减少了推理延迟和成本。

这和 DB-Agent-Memory 的 MMD 注入优化有相似的思路——MMD 把稳定区的记忆放在 prompt 前部以利用 KV Cache 命中,MemOS 直接把 KV Cache 当作一种记忆类型来管理。但 MemOS 赋予了 KV Cache 更高的地位——它不只是优化的手段,而是”记忆”本身。

6.3 Parametric Memory(参数记忆)

Parametric Memory 存储的是模型参数的增量更新——最典型的是 LoRA(Low-Rank Adaptation)适配器。LoRA 是一种轻量级的模型微调方法——在冻结原始模型参数的情况下,训练少量增量参数来适配特定任务或用户。

为什么要把 LoRA 当作”记忆”?因为 LoRA 适配器包含了模型对特定用户的”理解”——经过微调后,模型会更符合用户的语言风格、知识偏好、推理习惯。这种”理解”不是通过 prompt 注入实现的,而是直接编码在了模型参数中。

类比:Plaintext Memory 像给模型看书(通过 prompt 告诉它信息),Parametric Memory 像送模型去上学(通过训练改变它的知识)。看书是临时的(书合上就忘了),上学是持久的(学到了就变了)。

6.4 三层记忆的协同

MemOS 设想了一个三层记忆协同工作的场景:

  1. Agent 和用户进行多次对话,积累了大量 Plaintext Memory
  2. Dream Pipeline 在后台整理这些文本记忆,提炼出高频使用的模式
  3. 对于特别重要的用户偏好和知识,MemOS 训练一个 LoRA 适配器作为 Parametric Memory
  4. 常用的对话前缀(system prompt + 用户画像)对应的 KV Cache 被保存为 Activation Memory
  5. 下次对话时,Agent 加载 LoRA 适配器(改变模型行为)+ 恢复 KV Cache(减少推理延迟)+ 注入相关文本记忆(提供上下文)

这个三层协同的愿景是雄心勃勃的,但实现难度也极大——目前没有其他项目做到这一点。每个层次都有自己的工程挑战:

6.5 其他项目为什么没有做跨模态

其他六个项目的记忆都是文本(或文本的向量表示),没有做跨模态扩展。原因有两个:

第一,定位不同。其他项目定位为”记忆库”——存储和检索文本信息。MemOS 定位为”记忆操作系统”——管理所有形式的”记忆”,包括文本、激活状态和模型参数。前者的边界清晰,后者的边界模糊但覆盖面更广。

第二,工程复杂度。KV Cache 的管理需要和 LLM 推理引擎深度集成——你需要知道模型内部的状态,需要在正确的时机保存和恢复。LoRA 的训练需要 GPU 资源和训练管线。这些都远远超出了”记忆库”的范畴,进入了”AI 基础设施”的领域。


7. 代码结构精读

MemOS 的代码量约 1796 文件,组织结构如下:

MemOS/
  memos/
    memory/
      memory_cube.py           # MemCube 核心,四种记忆类型的统一容器
      episodic_memory.py       # 情景记忆实现
      semantic_memory.py       # 语义记忆实现
      procedural_memory.py     # 程序记忆实现
      profile_memory.py        # 画像记忆实现
    scheduler/
      mem_scheduler.py         # MemScheduler,记忆操作调度
      priority_calculator.py   # 优先级计算(访问频率、衰减系数等)
    dream/
      dream_pipeline.py        # Dream Pipeline,后台记忆巩固
      consolidation.py         # 巩固操作(去重、关联、提炼)
      decay.py                 # 衰减策略(时间衰减、类型差异化衰减)
    mos/
      mos.py                   # MOS 主入口,记忆增强推理系统
    storage/
      graph_backend.py         # 图存储后端(Neo4j 等)
      vector_backend.py        # 向量存储后端
      activation_store.py      # Activation Memory 存储(KV Cache)
      parametric_store.py      # Parametric Memory 存储(LoRA 适配器)
    configs/                   # 配置管理(衰减系数、调度策略等)
  tests/
  examples/
  docs/

值得注意的几个关键文件:

memory/memory_cube.py——MemCube 的核心实现。它维护四种记忆类型的存储,提供统一的读写接口。写入时需要指定记忆类型(Episodic/Semantic/Procedural/Profile),读取时可以跨类型检索。

dream/dream_pipeline.py——Dream Pipeline 的入口。它编排了完整的巩固流程:扫描情景记忆 → 去重 → 关联发现 → 衰减计算 → 情景→语义提炼。每个步骤都是一个独立的方法,可以单独测试和配置。

scheduler/mem_scheduler.py——MemScheduler 的实现。它管理读写操作的优先级排序和并发控制,以及 Dream Pipeline 的触发和暂停。

storage/activation_store.pystorage/parametric_store.py——这两个文件是 MemOS 独有的跨模态记忆存储。activation_store.py 管理 KV Cache 的保存和恢复,parametric_store.py 管理 LoRA 适配器的训练和加载。


8. 局限性——过度抽象的风险

MemOS 的抽象层次在七个项目中最高,这也带来了最高的使用门槛。

8.1 概念体系过于庞大

使用 MemOS 之前,开发者需要理解以下概念:

相比之下,使用 mem0 只需要理解三个 API:add()search()update()。使用 DB-Agent-Memory 需要理解四层金字塔和 Host-Adapter 架构。MemOS 的概念体系比它们大了至少一个数量级。

对于大多数简单的记忆需求(”让 Agent 记住用户的偏好”),开发者不应该需要理解”情景记忆和语义记忆的区别”或”KV Cache 怎么管理”。MemOS 的过度抽象让简单的事情变复杂了。

8.2 四种类型判断的模糊性

如前所述,”情景记忆”和”语义记忆”的边界在实际使用中经常模糊。开发者需要为每条信息做类型判断——这个判断本身就需要对认知科学分类有一定理解。

更糟糕的是,错误的类型判断会导致错误的行为。如果一条情景记忆被错误地标记为语义记忆,它会获得更高的稳定性和更慢的衰减——这意味着过时的信息会在记忆库中停留更久。如果一条语义记忆被错误地标记为情景记忆,它会获得更快的衰减——这意味着稳定的事实可能很快被遗忘。

DB-Agent-Memory 的金字塔没有这个问题——层级之间是提炼关系,不是分类关系。系统自动完成提炼,不需要开发者做类型判断。

8.3 代码量与维护成本

约 1796 文件的代码量意味着:

这对学术研究不是问题——论文只需要展示核心概念的可行性。但对实际使用和开源贡献来说,代码量是实实在在的门槛。


9. 和 DB-Agent-Memory 的对比

9.1 抽象层次

维度 MemOS DB-Agent-Memory
最高抽象 记忆操作系统 记忆引擎
核心概念数 6+(MemCube/MemScheduler/Dream Pipeline/三种记忆层/四种类型/衰减策略) 3(四层金字塔/Host-Adapter/MMD)
学习曲线 陡峭 平缓
灵活性 最高(可自定义几乎所有参数) 中等(层级固定,参数有限)

MemOS 的抽象层次更高,覆盖面更广,但使用门槛也更高。DB-Agent-Memory 的抽象层次更务实——只做了”够用”的抽象,不过度设计。

9.2 后台巩固能力

维度 MemOS Dream Pipeline DB-Agent-Memory
后台整理 有(Dream Pipeline) 无(提炼在写入时同步完成)
去重 有(批量去重扫描)
关联发现 有(LLM 推理)
衰减过期 有(类型差异化衰减)
情景→语义提炼 类似(L1→L2→L3 提炼)

MemOS 的 Dream Pipeline 提供了 DB-Agent-Memory 缺失的几个能力:关联发现、衰减过期、后台异步整理。这些能力可以移植到 DB-Agent-Memory 中——不需要照搬 MemOS 的”操作系统”架构,只需要借鉴 Dream Pipeline 的核心思想。

9.3 跨模态 vs 文本

维度 MemOS DB-Agent-Memory
记忆模态 文本 + KV Cache + LoRA 仅文本
和 LLM 推理引擎的耦合 高(需要直接操作 KV Cache 和模型参数) 低(通过 prompt 注入交互)
部署要求 高(需要 GPU 做 LoRA 训练) 低(只需 SQLite)

MemOS 的跨模态记忆是独特且前瞻性的设计,但目前的工程实现可能还不成熟——KV Cache 的保存/恢复需要和推理引擎深度耦合,LoRA 的训练需要 GPU 资源。对于大多数应用场景,文本记忆已经够用,跨模态记忆是”nice to have”而不是”must have”。


10. 竞赛启发——Dream Pipeline 思想的移植

MemOS 对 DB-Agent-Memory 最有价值的启发是 Dream Pipeline 的思想。不需要照搬 MemOS 的完整架构,只需要把 Dream Pipeline 的核心思想移植到 DB-Agent-Memory 的四层金字塔中。

10.1 四层金字塔的自动晋升

DB-Agent-Memory 目前的 L1→L2→L3 提炼是在写入时同步完成的——对话结束后,系统立刻运行提炼管道。这意味着提炼是”一次性的”——第一次提炼的结果就是最终结果,没有后续的优化空间。

借鉴 Dream Pipeline 的”后台巩固”思想,可以在 Agent 空闲时做”二次提炼”:

这个”二次提炼”可以在后台异步运行,不阻塞主对话流程。运行结果通过 MMD 的稳定区在下一次对话中生效——稳定区的画像和场景块更新了,但更新过程对用户透明。

10.2 实现路径

当前流程:
  对话 → L0→L1 提取 → L1→L2 聚合 → L2→L3 提炼 → MMD 注入

改进后流程:
  对话 → L0→L1 提取 → L1→L2 聚合 → L2→L3 提炼 → MMD 注入
                                                          ↑
  Agent 空闲 → Dream 任务 → L1 去重/关联/衰减 → L2/L3 二次提炼 → 更新 MMD 稳定区

Dream 任务的触发可以基于以下条件:

这个改进和 MMD 的 prompt cache 优化有协同效应:后台整理让 Stable Partition(L3 画像 + L2 场景块)更稳定、更精炼,进一步提升了 KV Cache 命中率。

10.3 不需要移植的部分

MemOS 的以下设计对 DB-Agent-Memory 来说不需要移植:


11. 本章小结

回顾本章的核心要点:

下一章我们从开源项目转向生产级系统——看 Claude Code 的记忆是怎么做的。


导读目录:README.md 上一章:Ch13: supermemory——产品化记忆与多源捕获 下一章:Ch15: Claude Code 记忆——索引驱动的实时学习