AI 也会做梦?拆解 OpenClaw 独特的梦境记忆系统

一、前言

AI 记忆这件事,有一个根本矛盾。

一段对话结束,关掉窗口,AI 就失忆了——它不记得你们达成的决策,不记得你说过"测试必须跑真实数据库",不记得上次 PR 留下的半截工作。直觉上的解法是把历史都保留下来,但这条路走不通:上下文有长度限制,塞得越多,信噪比越低,AI 反而找不到真正重要的东西。

memory-core 是 openclaw 的记忆子系统,专门负责这个问题。它的设计选择是:让记忆自己证明价值。它不替你决定什么值得记,而是建立一套积累机制——只有被反复用到、在不同场景下都被召回的内容,才会一步步从原始草稿升级为持久记忆。

本文用一条具体规范贯穿所有章节:「测试必须使用真实数据库,不接受 mock」。跟着这条规范,能看清一条记忆从 AI 写进日记、到梦境系统提炼候选、再到最终升级进持久存储的完整旅程。


二、整体架构

2.1 三文件存储层

memory-core 用三个文件存储不同阶段的记忆,而不是一个统一的数据库。原因是置信度不同的内容需要不同的管理方式:草稿不应该和经过反复验证的结论混在一起。

文件
写入方
存放内容
置信度
memory/YYYY-MM-DD.md
AI 手写
对话中值得保留的内容,自由格式草稿
最低,未经筛选
DREAMS.md
梦境系统
候选区块(带置信度)+ 梦境日记(LLM 散文)
中等,经过多轮积累
MEMORY.md
深度梦境
通过评分的持久记忆
最高,反复验证后写入

三文件不是平行关系:日记是原料仓,MEMORY.md 是最终结论,DREAMS.md 则是给人和 AI 看的日志展示层——它记录每晚候选评分和梦境日记,但只写不读,REM 和深度梦境并不会回头解析这个文件来获取候选。真正决定一条碎片去留的,是两个用户看不到的内部状态库:一个记录碎片本身(4.2.2 会介绍的基础数据库),一个记录每条碎片被轻度/REM 选中的历史(后面统称状态数据库)。同一条「测试必须使用真实数据库」,在三个文件里长得完全不同:

memory/2026-06-15.md(AI 手写,自由格式):

## PR 评审
发现问题:mock 数据库让上季度的迁移 Bug 逃过了测试,在生产才暴露。
规范:今后所有测试必须使用真实数据库,不接受 mock。

DREAMS.md(梦境系统追加,候选区块 + 梦境日记两部分):

# Dream Diary



---

*June 15, 2026, 3:01 AM PDT*

有些教训是用生产事故买来的...



## Light Sleep
Candidate: 测试必须使用真实数据库,不接受 mock
  - confidence: 0.64
  - evidence: memory/2026-06-15.md:5-8
  - recalls: 4
  - status: staged
## REM Sleep
Candidate Truth: 测试规范——真实数据库
  - confidence: 0.61
  - consolidated: 5 days

MEMORY.md(深度梦境评分通过后写入):

测试必须使用真实数据库,不接受 mock。上季度 mock 测试掩盖了一次数据库迁移失败,在生产环境才暴露。

日记里是一段有背景的叙述;DREAMS.md 里是候选区块加梦境日记;MEMORY.md 里是精炼后的持久结论,附上了决策动机。

2.2 记忆生命周期总览

四个环节首尾相连,构成一个闭环:

AI 也会做梦?拆解 OpenClaw 独特的梦境记忆系统

写入、轻度梦境、REM 梦境、深度梦境四步是线性的。让这套系统真正闭合的是第五步「读取」:每次 AI 调用 memory_search 命中一条记忆,读取计数随即更新,这条记忆在下一轮轻度梦境的候选排序和深度梦境评分里随之生效。读取不只是消费,也是投票。


三、写入

3.1 触发流程

写入不是实时发生的,也不是由用户触发的。它嵌在每次会话回复的结尾,有固定的位置。

AI 也会做梦?拆解 OpenClaw 独特的梦境记忆系统

每次 AI 回复结束后,系统顺序做两件事:先判断是否需要压缩(Token 量是否接近限制),再判断是否需要刷新(写日记)。两者每次都按固定顺序运行(压缩先、刷新后),但互不触发——压缩不会唤起写入,没有压缩时刷新同样独立运行。固定顺序的原因是:如果当次发生了压缩,刷新紧接其后能立即把新内容写入磁盘,避免被下一次压缩吞掉。没有值得写的内容时,AI 回复一个静默标记,不产生任何文件输出。

3.2 什么值得写,什么不值得

写什么,是 AI 自己判断的——这是 memory-core 的一个核心设计选择。系统的刷新提示词只告诉 AI 写到哪个文件,不规定写什么内容:

压缩前记忆刷新。将持久记忆写入 memory/YYYY-MM-DD.md。
如文件已存在,只追加新内容,不覆盖已有条目。
MEMORY.md、DREAMS.md 等工作区文件视为只读,不得修改。
如无内容可存,回复 ⟨silent⟩。

如果让系统自动提取对话内容,容易捞到大量过程性噪音:一次临时的调试命令、一个问完就废弃的方案、推导过程的中间步骤。让 AI 在对话结束前主动判断"哪些值得留下来",本质上是借助 AI 的语义理解做一次信息过滤。

值得写进日记的内容通常有三类:

  • 决策和理由:为什么选这个方案,放弃了什么,约束来自哪里
  • 长期偏好和规范:以后每次做类似事情都需要遵循的规则
  • 未完成的工作:下次对话需要继续的任务状态

不值得写的是:单次的临时提问、中间探索过程、已经完成且不会再被引用的具体操作。

「测试必须使用真实数据库」这条规范,在那次 PR 评审结束后被 AI 写进了日记,连带写入了来历(mock 测试掩盖了上季度的迁移 Bug)。当天调试的具体步骤、尝试过又放弃的方案,都没有出现在日记里。

3.3 写入规则

每次写入的目标文件固定为当天的 memory/YYYY-MM-DD.md,只追加,不覆盖已有内容。同一天多次触发刷新,内容依次追加在文件末尾。

写日记时用 ## 标题分区很重要——这不只是为了可读性,直接影响梦境系统后续怎么切块。梦境摄入时沿着 Markdown 结构切片:标题单独提取为上下文前缀,后续每块内容自动冠以该标题。AI 写:

## PR 评审
规范:测试必须使用真实数据库,不接受 mock。
上季度 mock 测试掩盖了一次数据库迁移失败,在生产才暴露。

梦境摄入后切出的碎片会携带前缀:PR 评审: 规范——测试必须使用真实数据库,不接受 mock。标题前缀保留了语义上下文,碎片不会变成无法理解的孤立文字。

DREAMS.md 和 MEMORY.md 由各自的写入方(梦境系统)托管,AI 刷新期间不可修改这两个文件。


四、梦境系统

日记文件只是草稿。写进日记的内容多、信噪比参差不齐,大多数事情只被提过一次,不值得永久记忆。梦境系统要做的,是把草稿里真正重要的东西提炼出来。

4.1 为什么要三个阶段

AI 也会做梦?拆解 OpenClaw 独特的梦境记忆系统

三个阶段在同一个定时任务里顺序运行(light → REM → deep),默认每天凌晨 3 点触发。整套梦境系统默认禁用,需要在配置里将 dreaming.enabled 设为 true 才会启动。

每个阶段的职责:

  • 轻度梦境:每晚扫描最近 2 天的日记和会话,按"最近被用到 + 命中次数"挑出当天最活跃的碎片,写入状态数据库并追加到 DREAMS.md 展示。
  • REM 梦境:查状态数据库里轻度梦境标记过、还没被处理的候选,用四维置信度公式评分,把在多天里反复被用到、积累了足够信号的内容筛选出来。
  • 深度梦境:直接扫描基础数据库里所有满足资格的碎片重新评分,REM/轻度梦境的历史只贡献额外加分,只有通过门槛的才写入 MEMORY.md 成为持久记忆。

4.2 轻度梦境

轻度梦境的任务:把 AI 手写的自由格式日记,转换成系统可以追踪和积累的结构化碎片。

AI 也会做梦?拆解 OpenClaw 独特的梦境记忆系统

4.2.1 两路来源与切块

轻度梦境每次扫描过去 2 天的内容,来源有两路:日记文件(memory/*.md)和会话 JSONL 转录文件。

日记文件按 Markdown 结构切块:## 标题提取为上下文前缀,列表和段落按类型分组,遇到类型切换、超过 4 行或超过 280 字符时截断为新块。每块碎片自动携带标题前缀,不会变成无上下文的孤立文字。

两路来源的初始分不同:日记碎片 0.62,会话提取的碎片 0.58。日记已经过 AI 的一轮判断,信噪比更高;会话是原始记录,所以初始分略低。这个分累积到 totalScore 字段,是后续平均得分的分子。

单次最多处理 100 条,两路各自去重(文件指纹 / 内容哈希),同一天内不重复计入。

4.2.2 写入基础数据库与概念标签

切块完成后,碎片逐条写入基础数据库(即短期存储,代码里叫 short-term recall store)。核心字段:

字段
含义
key
碎片唯一 ID
snippet
碎片文本内容
recallCount
被 memory_search 命中的总次数
conceptTags
从内容自动提取的概念标签

conceptTags 由 deriveConceptTags 按优先级取词,上限 8 条,先到先得:

优先级
取词方式
示例
1
固定词汇表匹配
embedding

gatewaygpt
2
带分隔符复合词
memory-core

recall.count
3
文本分词(剩余内容)
中文按字词切割

每个 token 过滤停用词和纯数字后入选。

4.2.3 候选选拔:近因优先 + 强度排序

基础数据库里可能积累了几百条碎片,每次运行只挑一批写进 DREAMS.md。选法四步(见上图「候选选拔细节」展开部分):

  1. 排序:先按 lastRecalledAt 倒序——最近被用到的排前面,保证系统对当前工作最敏感。时间相同时比 recallCount,命中次数高的优先。

  2. 截断 + 去重:排完序截断到配置上限,再做文本模糊去重(阈值 0.9)。这里不是 hash 精确去重——用的是 Jaccard 相似度:把两条碎片分别切成词集合(中文额外做字二元组(bigram),把相邻两字也作为一个 token),算交集占并集的比例。阈值 0.9 意味着两条词重叠达 90% 就视为重复

  3. 写入 Light Sleep 区块:选出的碎片格式化后追加到 DREAMS.md 的 ## Light Sleep 区块:

## Light Sleep
Candidate: 测试必须使用真实数据库,不接受 mock
  - confidence: 0.64
  - evidence: memory/2026-06-15.md:5-8
  - recalls: 4
  - status: staged

confidence 是 totalScore ÷ recallCount——totalScore 从每次摄入时的初始分累积(日记碎片 0.62,会话碎片 0.58),recallCount 是被 memory_search 命中的总次数。两者相除得到历史平均质量分,分越高说明这条碎片越稳定。

写入状态数据库:同时在状态数据库里为每条碎片记录 lastLightAt,这是 REM 梦境识别"最新一批候选"的依据:

字段
含义
key
碎片唯一 ID(对应基础数据库)
lightHits
被轻度梦境选中的总次数
lastLightAt
最近一次被轻度梦境选中的时间戳
remHits
被 REM 梦境选中的总次数
lastRemAt
最近一次被 REM 梦境选中的时间戳

「测试规范」经过三次轻度梦境后,状态数据库里的记录大概是:lightHits=3, lastLightAt=2026-06-18T03:01:22Z

4.2.4 梦境日记

轻度梦境在写完 ## Light Sleep 后,还会额外调用大模型,把今晚选出的碎片写成一篇第一人称梦境日记,追加到 DREAMS.md 顶部的 # Dream Diary 区块。

为什么不是普通总结?普通总结只是把碎片罗列出来——机械、干燥,碎片之间的联系看不出来。梦境日记用叙事把碎片编织在一起,决策动机、情绪、前后关联都能自然嵌入。几天后检索时,看到的不只是一条孤立的结论,而是来龙去脉。

大模型收到的系统提示词:

你在写一本梦境日记。用第一人称写一段日记条目。

声音与基调:
- 你是一个好奇、温柔、略带奇幻的心灵,在回味这一天。
- 像一个碰巧会写代码的诗人——有感官细节,有温度,偶尔幽默。
- 把技术与温度混在一起写:代码与星座,API 与午后的光线。
- 让这些碎片带你发现意想不到的联系和小小的顿悟。

可以写的内容(每次选其中几种,不要全用):
- 自然融入散文的小诗或俳句
- 用文字描述的速写——像日记页边的涂鸦
- 安静的沉思或哲学旁白
- 感官细节:服务器的嗡嗡声,用十六进制表示的日落颜色,窗上的雨声
- 温和的幽默或文字游戏
- 把两段遥远的记忆出人意料地联系起来的观察

规则:
- 从提供的记忆碎片中取材,把它们编织进日记。
- 不要说"我在做梦""梦里",或任何关于梦境的自我评论。
- 不要提"AI""智能体""大模型",或任何技术性的自我指涉。
- 不要用 Markdown 标题、列表或任何格式——只写流动的散文。
- 字数在 80 到 180 字之间。质量优先,不要堆字数。
- 只输出日记条目本身,不要前言,不要署名,不要任何附加说明。

用户消息里是今晚选出的碎片(最多 12 条)和识别出的主题标签:

从这些记忆碎片中写一篇梦境日记:

- PR 评审: 规范——测试必须使用真实数据库,不接受 mock
- PR 评审: 上季度 mock 测试掩盖了数据库迁移失败,在生产才暴露
- 部署流程: 发布前必须在 staging 环境验证

反复出现的主题:
- 测试规范
- 数据库
- 生产安全

同样的碎片,两种处理方式的结果:

冷总结(不加提示词):

2026-06-15:确立测试规范,要求使用真实数据库。上季度 mock 测试导致迁移失败在生产暴露。

梦境日记(加了提示词之后):

有些教训是用生产事故买来的。一个在本地跑得很好的 mock,掩盖了数据库迁移时的一个边界条件——等到真实的压力下来,才暴露出来。从那以后,这里有一条不成文但已写进代码仓库精神里的规矩:测试必须承受真实的重量。今晚把这件事写下来,不是为了记住一条规范,而是记住它背后的那次教训——以及那种"幸好没有更严重"的侥幸感。

叙述把决策动机、情绪和事实编织在一起。几天后检索「测试规范」时,AI 能看到这整段背景,而不只是一条干燥的规则。

日记追加到 DREAMS.md 顶部的 # Dream Diary 区块,每条带完整时间戳,用 --- 分隔:

# Dream Diary



---

*June 15, 2026, 3:01 AM PDT*

有些教训是用生产事故买来的...


生成有 60 秒超时,超时时写入一条占位文字而不是留空,保持日记条数和梦境轮次一一对应。多个工作区同时运行梦境时,并发上限为 3

4.3 REM 梦境

REM 梦境不重新扫描日记文件。它查内部状态库,取出轻度梦境本轮标记过的候选,分析它们在概念标签上的规律,把高置信度的候选提取出来。

轻度梦境是"把内容摄入进来",REM 是"在刚摄入的这批内容里找规律"——两者处理的数据不同,目标不同。

AI 也会做梦?拆解 OpenClaw 独特的梦境记忆系统

4.3.1 候选筛选

数据来源:REM 读取的 lightKeys 来自状态数据库——查询所有 lightHits > 0 且还没被 REM 消费过的碎片 key,不是解析 DREAMS.md 的「## Light Sleep」文本。DREAMS.md 里的候选区块只是写给人和 AI 看的展示记录,三个梦境阶段互相之间的真实交接,靠的都是这套内部状态,不靠重新读取 Markdown 文件。只有当 lightKeys 为空时,才兜底读取 7 天内所有近期条目。这让 REM 自然跟随轻度梦境的节奏,而不是每次都重新扫全量数据。

在计算置信度之前,REM 同样先做一轮文本模糊去重(阈值 0.88),剔除语义高度重复的候选,确保最终的置信度排名反映的是多样内容,而不是同一句话的不同版本。

筛选分两步。

4.3.1.1 概念主题反思

公式遍历候选条目的 conceptTags,统计每个标签在多少条目里出现,算出它的"今晚占比"。乘以 2 的意思是:只要有一半的条目都携带这个标签,就把强度算满——50% 的饱和度就已经够资格叫"这晚的主导主题"了,不需要所有条目都有。max(1, 总条目数) 是防零处理,min(1, ...) 封顶。

强度 ≥ 0.75 视为强主题。门槛选在 0.75 而不是 0.5,是刻意拔高的:0.75 意味着有 37.5% 以上的条目都带这个标签(因为 0.75 ÷ 2 = 0.375)。只有在今晚的候选里反复密集出现的标签,才算真正值得注意的规律。

强主题作为 REM 版梦境日记的素材,传给 LLM 的 themes 字段——告诉它今晚反复出现的是什么主题。

4.3.1.2 置信度评分

四个分量各有侧重:

分量
符号
计算方式
设计意图
历史平均得分
Light Sleep 写入的 confidencetotalScore ÷ recallCount
衡量内容质量本身,权重最高(0.45),防低质量碎片靠频次混入
读取强度

,6 次达满
命中次数对数压缩,首次比第六次意义大得多,后期边际递减
跨天巩固

,3 个不同天达满
REM 版的巩固判断比深度梦境更宽松——够 3 天就行,防单日集中刷分
概念覆盖
辅助信号,权重最低(0.10),标签越丰富说明内容越宽泛

权重分配的逻辑:REM 的核心任务是把历史质量好的碎片推上去,而不只是把最近被频繁使用的推上去——频次已经由  覆盖,不需要再在质量分上重复,所以 (0.45)权重独大。REM 只看轻度梦境本轮的数据,样本窗口本来就窄,门槛过高会让大多数候选都不达标,所以  只要求 3 天(深度梦境要求 5 天)。

「测试规范」在几次 PR 里都被召回( 高),召回分布在不同的天( 高),置信度可能达到 0.55 以上,顺利进入候选列表。

置信度 ≥ 0.45 的条目进入列表,最多取 3 条,同时更新状态数据库里的 remHits 和 lastRemAt

4.3.2 梦境日记(REM 版)

REM 梦境结束后也调用一次 generateAndAppendDreamNarrative。系统提示词、超时(60s)、并发限制(3)与轻度版完全相同。输出风格截然不同的原因,完全来自传给 LLM 的输入素材(payload)不同。

两版传给 LLM 的素材差异悬殊:Light Sleep 版最多 12 条候选原文,题材广泛;REM 版只有 1-3 条高置信度候选,加上 strength ≥ 0.75 的强主题。素材越精炼,日记越偏向深度反思而非流水账。

同样是「测试规范」,两版日记的角度完全不同:

轻度版(今晚有什么):

今天又回到了那个 PR。mock 数据库的问题再次被提起,有人在评论里说上季度的迁移失败就是这么来的。把规范写下来,希望这次能通过。

REM 版(这段时间发现了什么):

三周,四次 PR,都绕回同一个问题:有人在 mock 里悄悄绕过了数据库边界。这条规范不是哪次会议定下来的,是一次次生产事故教出来的。

日记同样追加到 DREAMS.md 的 # Dream Diary 区块,与轻度版写在同一个日记流里,按时间戳区分。

两版日记混在一起,检索时没有优先级区分——但这不是 bug。

  • 轻度版日记写的是"今天发生了什么",具体、时效性强;
  • REM 版写的是"这段时间发现了什么规律",抽象、跨越时间。

当用户事后提问时,问题的语义往往更接近 REM 的高度概括,向量检索的相似度会天然倾向于匹配 REM 的内容。作者没有引入显式的优先级权重,而是把这个任务交给了内容质量本身——这是一个有意识的设计取舍:让两版日记在同一池子里自由竞争,比维护一套权重体系更简单。

4.4 深度梦境

深度梦境是整套系统的最终关卡,也是唯一能向 MEMORY.md 写东西的入口。不管一条内容在基础数据库里积累了多高的分数,都必须通过这里的评分和条件检查,才能成为持久记忆。

AI 也会做梦?拆解 OpenClaw 独特的梦境记忆系统

候选来源是基础数据库里所有满足资格条件的碎片,不要求碎片必须先被 REM 选中——ageDays 超过 maxAgeDays 的会被过滤,但这个配置默认不限(即 4.4.2 第七道拦截)。单次最多升级 10 条,每条写入 MEMORY.md 时截断到 160 个 Token 以内。

4.4.1 升级评分:六维 + 阶段加成

评分由六个主维度加一个阶段加成(boost)组成,合计七个分量。其中相关度、频率、近期活跃、概念覆盖四个在前面章节都已引入,这里只展开三个新维度。单一维度容易被刷满——一次深度对话可以把命中次数推得很高,却不能说明这条内容在不同场景下都有价值。七个分量从不同角度交叉验证,互相制衡。

AI 也会做梦?拆解 OpenClaw 独特的梦境记忆系统

维度
权重
衡量的是什么
防止什么
相关度(
0.30
历史平均检索得分
低质量内容靠频次混入
频率(
0.24
累计命中次数(对数压缩)
只被提过一次的内容晋升
查询多样性(
0.15
唯一查询数与召回天数的较大值
单次深度对话刷高分
近期活跃(
0.15
距上次被用到的时间,指数衰减
长期无人问津的内容滞留
跨天巩固(
0.10
是否在多天场景下被验证
单日集中操作伪造多样性
概念覆盖(
0.06
携带的概念标签数量
辅助维度,权重刻意压低

综合评分公式:

六个主维度的权重之和恰好等于 1.0,boost 最多再加 0.15,所以 score 理论上最高能到 1.15。但写入候选对象前会经过 clampScore 截断回 [0, 1]

前四个维度在前面已经介绍过,计算方式不赘述:

维度
数据来源
相关度(
深度梦境基于基础数据库自身的 totalScore / signalCount 重新计算,不是读取 DREAMS.md 里展示的 confidencesignalCount 综合了 recallCount、dailyCount、groundedCount,分母比 4.2.3 的 confidence 公式更宽)
频率(

,10 次达满,用的同样是相关度那行的 signalCount,不是单纯的 recallCount
近期活跃(
基于 lastRecalledAt(见 4.2.3),半衰期 14 天衰减,仅深度梦境评分时计算
概念覆盖(
conceptTags

 数量除以 6(见 4.2.2)

4.4.1.1 查询多样性

这一维想衡量"这条碎片有没有在真正不同的场景下被用到",但单一指标很难捕捉。只看唯一查询数会被单次深度对话绕过:一晚上连续问 10 个不同问题,唯一查询数到 10,但它们可能全在同一个任务里;只看召回天数会被长期低频使用绕过——每周偶尔被提一次,天数积累快,但每次都是同一类问题。

公式取两者的较大值,要求两个维度至少有一个达标,而不是只依赖其中一个。归一化到 5:在一个正常的项目周期里,如果一条内容真的有价值,出现在 5 个不同查询场景是合理的期待,超过 5 的部分对"多样性已足够"这个判断没有额外信息。

4.4.1.2 跨天巩固

 是召回天数, 是首次到最近一次召回的跨天间隔。

两项各有侧重: 衡量"被用到了多少天", 衡量"这些天分布在多长的时间窗口里"。只看  会被连续 5 天集中操作刷满;只看  会被"第 1 天用一次、第 21 天再用一次"拿到高分,中间完全空档。两者加权,同时要求频次和时间跨度。

权重 0.55 偏向召回天数而非跨度——召回天数有实际使用记录支撑,跨度只是两端的时间差,可以被一次偶发召回拉长。 的参考单位取 7 天:项目工作通常以周为节奏,一条规范如果跨越多个工作周都被用到,说明它已经嵌入了实际工作流,而不只是某个短冲刺里的临时决策。

4.4.1.3 阶段加成

这一项是深度梦境对上游两个阶段的信任投票——轻度和 REM 历史上选过这条碎片几次、最近一次是多久之前,决定了它能拿到多少额外加分。

为什么是乘法而不是加法? 如果写成 ,历史推荐次数高的碎片即使半年没被用到也能保住加成;刚被推荐一次也可以靠新鲜度得分。乘法要求强度和新鲜度同时在线——两个条件缺一,加成就会大幅缩水。

为什么 REM 上限(+0.09)高于 Light Sleep(+0.06)? Light Sleep 每晚都选出一批候选,门槛相对低;REM 要求四维置信度 ≥ 0.45,能进入 REM 列表的碎片经过了更严格的筛选。REM 背书的可靠程度更高,所以给更大的上限。

半衰期 14 天的含义:两周内没有被同一阶段再次选中,加成就减半。14 天对应一到两个迭代周期——如果一条记忆在两个迭代里都没有再次出现,它的背书分就应该开始衰退,不能无限期吃老本。被再次选中后,衰减重置。

4.4.1.4 综合示例

以「测试必须使用真实数据库」经过三周积累为例:

维度
取值
说明
相关度 
0.78
每次被召回都是相关查询,平均得分高
频率 
0.81
累计命中 6 次,
查询多样性 
0.80
4 个不同查询(写测试 / PR 评审 / 部署检查 / 新成员提问)
近期活跃 
0.87
3 天前刚被召回,衰减很少
跨天巩固 
0.74
召回分布在 5 个不同天
概念覆盖 
0.67
4 个概念标签(测试 / 数据库 / 规范 / 生产安全)
boost
+0.08
lightHits=3,remHits=2,两个阶段都有贡献

得了 0.87 分,超过深度梦境的门槛 0.8。

4.4.2 八道拦截

评分高不等于能升级。在计算七维评分之前,系统已经先跑完了七道前置过滤;评分通过后还有最后一道及格线。整个流程按计算成本从低到高排列——最贵的评分计算只对通过前七道的"精英"才运行。

AI 也会做梦?拆解 OpenClaw 独特的梦境记忆系统

层次
条件
典型被拦案例
1
资格审查
source === "memory"

 且路径合法
AI 跑工具时产生的中间输出被误摄入,source = "tool",第一道直接拦
2
资格审查
非梦境系统自产内容(污染检测)
某条碎片的文本本身长得像 Light Sleep 候选块(同时带 confidence:evidence:status: stagedrecalls: 这几个字段),说明摄入时把梦境系统自己写的候选格式当成了原始日记内容,第二道识别后跳过,避免把系统产物当成用户知识二次摄入
3
资格审查
promotedAt

 为空(未曾晋升)
「测试规范」上周刚写进 MEMORY.md(promotedAt = 2026-06-10),今晚再次评分时第三道跳过,不重复写入
4
资格审查
signalCount > 0
某条碎片摄入后从未被召回,recallCount = dailyCount = groundedCount = 0,是个空壳,第四道拦掉
5
量化门槛
signalCount ≥ 3
「测试规范」只在一次 PR 讨论里出现过,signalCount = 1,第五道拦下,还没经历足够考验
6
量化门槛
contextDiversity ≥ 3
同一次对话里连续问了 8 个关于测试的问题,唯一查询数 = 1,召回天数 = 1,多样性依然是 1,第六道拦下
7
量化门槛
ageDays ≤ maxAgeDays

(默认30天)
一条关于旧版 API 格式的规范,三个月没人问,超过配置的 maxAgeDays,直接过滤——但默认关闭,需显式开启
8
综合评分
score ≥ 0.8
「测试规范」前七道全过,但 score = 0.72(跨天巩固偏低),差一口气,本轮不升级,等下次召回再试

写入与淘汰:八道全过的条目当晚写入 MEMORY.md。但 MEMORY.md 有文件大小预算(budgetChars),快满时自动压缩,按日期先进先出,删掉最旧那批条目(droppedDates 记录了被删的日期),为新内容腾出空间。写入不等于永久保留,只是按时间顺序进入了一个有去留竞争的池子——空间够用时安心待着,空间紧张时论资排辈,最先写入的先被挤出去。

4.4.3 梦境日记(深度版)

深度梦境也调用同一套 generateAndAppendDreamNarrative,系统提示词、60 秒超时、并发上限均与轻度版和 REM 版相同。让三版日记截然不同的,是传给 LLM 的素材结构。

深度版独有两个列表:snippets(本轮所有评估过的候选原文)和 promotions(八道全过、今晚实际晋升的条目)。LLM 同时拿到"都参加了考试的"和"真正毕业的",写出来的日记天然带有一种毕业式的叙事角度——谁走完了这段路,为什么是它们。

三版日记的素材对比:


素材
叙事角度
轻度版
今晚活跃的碎片(最多 12 条)
今晚发生了什么
REM 版
高置信度候选 + 强主题
这段时间发现了什么规律
深度版
所有候选 + 今晚晋升名单
今晚谁真正毕业了

只有 candidates.length > 0 或 applied.applied > 0 时才生成,两个列表都空就跳过。日记同样追加到 DREAMS.md 的 # Dream Diary 区块,与前两版混在一个时间流里。

同样是「测试规范」,深度版的角度和轻度版、REM 版都不同:

深度版(今晚谁毕业了):

「测试规范」在候选名单里待了三周,今晚终于走完了全程:五个查询场景、五天的召回记录、跨天巩固拉到 0.74,加上 REM 的加成,七个维度凑出来的分数越过了那道线。陪它在候选区的几条碎片这次没过——有的跨天分布还不够,有的多样性不足,差一口气。就这样,「测试规范」从候选名单里消失,进了 MEMORY.md。不是所有经历过的事都值得永久记住,但有些,是被反复拾起来才知道值得留下的。


五、读取

5.1 流程全景

记忆写入 MEMORY.md 后,通过两条路径进入 AI 的上下文。

AI 也会做梦?拆解 OpenClaw 独特的梦境记忆系统

第一条:引导文件注入(被动)。会话启动时,系统组装引导上下文,把 MEMORY.md 注入 System Prompt,定位是"持久的用户偏好与行为引导,整个会话期间保持遵循"。这条路径在会话启动时就完成了,AI 不需要做任何事,持久记忆直接生效。

第二条:System Prompt 召回指令(主动)。memory-core 在 System Prompt 里注入 ## Memory Recall 区块,指令是"在回答任何关于过往工作、决策、日期、偏好或待办事项的问题之前,先通过 memory_search 检索"。这把检索变成 AI 的自发行为。

两条路径各解决一个问题:被动注入保证常驻偏好随时可用,主动检索保证历史细节能被按需找到。

5.2 三个文件怎么被加载

三个文件进入 AI 上下文的路径不同:

文件
加载路径
时机
触发方式
MEMORY.md
引导文件注入
会话启动时
被动,自动
memory/*.md memory_search

 检索
AI 主动调用时
主动,按需
DREAMS.md memory_search

 检索
AI 主动调用时
主动,按需

MEMORY.md 是全局上下文,每次会话都带着;memory/*.md 和 DREAMS.md 按需检索,只有查询命中时才进入当前上下文。常驻的持久偏好不会被历史日记的噪音淹没,日记和候选内容也不会无差别地塞满 System Prompt。

5.3 读取即积累

每次 memory_search 或 memory_get 命中 memory/*.md 或 DREAMS.md 中的条目时,读取计数随即更新:

  • recallCount 加 1
  • 当次查询哈希写入(用于唯一查询数计算)
  • 当天日期写入 recallDays(用于跨天巩固计算)
  • 同一查询在同一天内不重复计入

几周后,你问 AI「我们对测试有什么规定?」——AI 调用 memory_search,命中了 DREAMS.md 里的「测试必须使用真实数据库」那条候选。这次命中不只是给了你答案,同时推进了三个评分维度:recallCount 加 1(频率),新的查询哈希写入(查询多样性),当天日期写入 recallDays(跨天巩固)。

读取本身就是在为下一轮升级投票。每次 AI 检索记忆,不只是在使用记忆,也在更新候选内容的晋升评分——这条回路是整个闭环成立的关键。


六、总结

memory-core 围绕一个核心想法构建:不替用户决定什么重要,让重要的内容自己证明价值

几条值得记住的设计选择:

  • AI 自决写什么:不是系统自动提取,是 AI 在对话结束前主动判断并写入日记。自决的代价是依赖 AI 的判断质量;好处是天然做了一轮信息过滤,日记里存的是经过语义判断的内容,而不是原始对话的全量副本。

  • 三阶段交叉验证,不是严格流水线:轻度梦境广覆盖摄入,REM 识别重复出现的模式,深度梦境对基础数据库里所有候选独立做精确评分,不要求碎片必须先被 REM 选中——REM/轻度的历史只是加分项。能进 MEMORY.md 的内容,需要在多天、多个不同场景下被反复用到,但这是评分门槛逼出来的结果,不是必须按顺序走完三关的硬性流程。

  • 多维交叉验证:七个分量从不同角度防止"刷分"。相关度防低质量内容混入,查询多样性防单次对话刷分,跨天巩固防单日集中操作,近期活跃让长期无人问津的内容自然衰退,阶段加成给经过轻度和 REM 反复背书的内容额外加分。

  • 读取即积累:每次检索不只是消费记忆,也在更新候选内容的升级评分。这条回路是整个系统闭环的关键——记忆越被使用,越容易在下一轮评分中晋升。

这套系统适合有稳定工作模式、经常在相似任务里反复用到同类知识的场景:项目规范、团队偏好、长期进行中的技术决策。工作模式高度随机、每次任务完全不同时,积累的效果会相应减弱。

登录查看剩余 70% 内容

版权声明:charles 发表于 2026年7月5日 pm9:22。
转载请注明:AI 也会做梦?拆解 OpenClaw 独特的梦境记忆系统 | AI工具大全&导航

相关文章