乐于分享
好东西不私藏

OpenClaw Dreaming 深度解析:让虾崽子在你睡觉时越来越聪明

OpenClaw Dreaming 深度解析:让虾崽子在你睡觉时越来越聪明

小龙虾🦞OpenClaw 个人实践 · B-20

记忆深度篇 · Dreaming 机制全解析 · 截至 2026 年 4 月

虾崽子在你睡觉时学到了什么

OpenClaw Dreaming 机制·设计思想·执行策略·完整配置指南

周一早上打开 OpenClaw,跟虾崽子聊到一半,它突然记起了你上周纠正过的格式偏好。

你明明没有把那条纠正写进 MEMORY.md。

它是怎么记住的?

如果你开启了 Dreaming,答案是:它在你睡觉的时候,自己复习了一遍。

Dreaming 是 OpenClaw 的后台记忆整合系统。它在凌晨 3 点悄悄跑一遍,把这段时间积累的对话信号过滤、评分、沉淀——真正值得长期记住的,才写进 MEMORY.md。

它解决的不是”如何让 AI 记住更多”,

而是”如何让 AI 记住对的东西”。

这是一个更难的问题,也是 Dreaming 的核心价值。

这篇从设计思想讲起,把三阶段执行机制、评分逻辑、配置方法、适用场景全部说清楚。读完之后,你会知道 Dreaming 该不该开、怎么开、开了之后能期待什么。


一、设计思想:为什么要模仿人的睡眠

在 Dreaming 之前,OpenClaw 的记忆是被动的。

你明确说”记住这个”,它才写进 MEMORY.md。你不说,它就不记。偶尔它也会在 compaction(上下文压缩)时顺手把一些信息存下来,但那是应急操作,不是主动学习。

这个机制有两个方向的问题:

📉 存得太少

你纠正了它三次同一个习惯,但因为没有显式地说”记住”,下次会话它又忘了。每次都要重新解释,对话成本不断累积。

📈 存得太多

一旦你对 MEMORY.md 失去管理意愿,它就会越来越臃肿——临时的情况、一次性的任务背景、早已过期的信息,全都堆在里面。MEMORY.md 超过 3000 tokens 之后,每次会话的基础费用都在悄悄上涨。

Dreaming 的设计借鉴了人类大脑在睡眠时的记忆整合机制。

人的大脑不会把白天发生的所有事情都保存到长期记忆里。睡眠中,大脑会重放白天的体验,提取其中反复出现的模式、有情绪权重的事件、与已有知识能产生连接的信息——其他的,就衰减掉了。

OpenClaw 在做同样的事:

Dreaming 的核心设计原则

① 信号而非命令——不依赖你的主动写入,从对话的自然流动中提取记忆候选

② 评分而非过滤——每个候选条目都要经过多维度打分,分数不够就不写入

③ 可见而非黑盒——每次运行都写 DREAMS.md 日记,你能看到它”想到了什么”

④ 可逆而非永久——有 dry-run 预览,有 rollback,写入之前可以检查

默认情况下,Dreaming 是关闭的。这个设计是刻意的——它涉及对 MEMORY.md 的自动写入,OpenClaw 不想在你没有意识到的情况下修改这个最重要的配置文件。你必须主动开启,才会生效。


二、三阶段执行机制

每次 Dreaming 启动时,它按照固定顺序依次执行三个阶段:Light → REM → Deep。三个阶段串行,不跳过,不乱序。

理解这三个阶段,你才能判断某个信息”有没有可能被记住”,以及”为什么没被记住”。

① Light Phase — 浅睡:摄入与暂存

类比:相当于你睡前脑子里”过电影”的阶段——今天发生了什么,大概梳理一遍。

输入来源

• 主要来源:近期 daily memory 文件(memory/YYYY-MM-DD.md),这是它每天自动生成的原始日志

• 次要来源:session transcript,即对话的完整记录文件。摄入前会自动脱敏,私人信息和敏感内容被过滤掉再进入语料库

这个阶段做什么

• 把 daily notes 和 transcript 切片成片段(snippet chunk)

• 用 Jaccard 相似度去重,阈值 0.9——基本一样的内容只保留一份

• 把通过去重的候选条目暂存到短期记忆存储(memory/.dreams/

• 记录强化信号(reinforcement signal),供后续阶段排名用

💡 Light 阶段不写 MEMORY.md,只是在准备候选材料。它把信息从原始日志的”噪声海洋”里捞出来,做第一轮过滤。

② REM Phase — 快速眼动:模式提取与反思

类比:人在 REM 睡眠阶段会做梦,大脑在这时把各种零散的记忆片段重新组合,发现之前没意识到的连接。

• 读取近 7 天(默认)内的所有短期记忆条目

• 通过分析 concept tag 的出现频率,提取反复出现的主题

• 识别”候选真相”(candidate truth)——在多次对话中以高置信度重复出现的事实

• 生成主题摘要和反思摘要,写入 DREAMS.md 的 ## REM Sleep 区块

• 记录 REM 强化信号,供 Deep 阶段最终打分

💡 REM 阶段同样不写 MEMORY.md。它的输出是对”这段时间里什么事情反复出现”的结构化判断,是 Deep 阶段决策的依据之一。

③ Deep Phase — 深睡:沉淀与写入

类比:深度睡眠是人类记忆真正被固化的阶段,短期记忆转化为长期记忆发生在这里。

这是整个 Dreaming 流程中唯一会修改 MEMORY.md 的阶段

• 对所有候选条目运行六维评分(详见下一节)

• 通过三道门槛过滤(详见下一节)

• 通过门槛的条目,追加写入 MEMORY.md

• 向 DREAMS.md 写入 ## Deep Sleep 摘要,可选生成 memory/dreaming/deep/YYYY-MM-DD.md

💡 Deep 阶段是有门槛的,不是”候选了就能写入”。这个门槛设计得刻意保守——它宁可漏掉一些有价值的东西,也不想在 MEMORY.md 里写进噪声。

三阶段流程概览

Daily notes + Transcripts        ↓Light Phase — 摄入、去重、暂存候选        ↓REM Phase   — 提取模式、识别反复主题        ↓Deep Phase  — 评分 → 三道门槛 → 写入 MEMORY.md        ↓DREAMS.md 日记 + memory/.dreams/ 状态文件


三、评分机制:哪些信息能过关

Deep 阶段对每个候选条目打一个综合分,再用三道最低门槛过滤。两关都要过,才能写入 MEMORY.md。

六维评分权重

信号维度
权重
含义
Relevance 相关性
0.30
与你真实使用场景的匹配程度
Frequency 出现频率
0.24
这个信息在近期对话中出现的次数
Query diversity 查询多样性
0.15
从几个不同的问题方向被召回过
Recency 新近度
0.15
最近一次出现距今多久
Consolidation 整合度
0.10
与已有长期记忆的连接程度
Conceptual richness 概念丰富度
0.06
这条信息本身的语义密度

权重分布有一个清晰的逻辑:相关性 + 频率合计 54%,占绝对主导。Dreaming 最看重的不是”这句话说得好”,而是”这件事你在乎,而且反复在乎”。

用一个具体例子来理解:

场景:你在三次不同的对话里纠正了输出格式

对话 1(周一):你说”数字用中文单位,不用 K/M”

对话 2(周三):你改了它的报告,把 “300K” 改成了 “30万”

对话 3(周五):你再次提到”用万、亿,不用英文缩写”

Dreaming 看到的信号:

Frequency = 3次 ✅ | Query diversity = 3个不同语境 ✅

Recency = 昨天 ✅ | Relevance = 高(涉及你的核心偏好)✅

→ 这条信息很可能过关,写入 MEMORY.md

三道最低门槛

综合分只是第一关。就算分数够高,还必须同时通过三个硬性最低标准:

门槛项
默认值
含义
minScore
≥ 0.8
综合评分不低于 0.8(满分 1.0)
minRecallCount
≥ 3
至少被召回过 3 次(不是出现 3 次,是被 memory_search 搜到 3 次)
minUniqueQueries
≥ 3
来自至少 3 个不同查询(防止同一条对话反复强化导致假高分)

这三道门槛合在一起,基本上意味着:一条信息要在你的真实使用中,反复、主动、从不同角度被用到,才会进入 MEMORY.md

⚠️ 一个关键细节

minRecallCount 统计的是被 memory_search 主动召回的次数,不是这条信息在对话里出现的次数。如果你的使用方式很少触发记忆搜索(比如每次都开新话题,从不让 Agent 回顾历史),Dreaming 的效果会大打折扣——它没有足够的召回信号来判断什么是真正有价值的。


四、Dreaming 写了什么文件

Dreaming 的输出分两类:给人看的,和给机器用的。

给人看的:DREAMS.md

每次 Dreaming 运行结束,都会向 DREAMS.md 写入记录。它是混合格式,同一个文件里两种内容并存:散文叙述和结构化条目。

散文部分:第一人称,叙述当天的操作过程,有时接近日记,有时接近诗。它不是给机器读的,是给你看的——让你知道 Agent 在”经历”什么。比如:

DREAMS.md · 散文片段(真实)

今天我把一枚小小的 run 塞进 openclaw.json 的 plugins.allow,像把一颗玻璃弹珠放进旧机器的心口,听它叮地一声,亮一下,又若无其事。后来重启 gateway,风扇轻轻转,像猫在窗边甩尾巴,结果屏幕却礼貌地提醒我:这位来客查无此人,算作陈旧配置,暂不接待。倒也不算坏消息,至少迷路这件事终于有了门牌号。有时排障也像写诗:门开了,来的人没找到,风先通过。

结构化部分:候选条目的机器可读状态,带着评分字段、证据来源、召回次数和当前状态。比如:

DREAMS.md · 结构化条目(真实)

– 已把本机 ~/.openclaw/openclaw.json 配置到企微账号:  channels.wecom.accounts.ayin 使用 ws 模式,  绑定 botId/secret,增加 bindings 路由confidence: 0.45evidence: memory/2026-04-01.md:1-9recalls: 1status: staged

这几个字段直接对应前面说的评分机制:

• confidence: 0.45 — 综合评分,离 minScore 0.8 的门槛还差得远

• evidence: memory/2026-04-01.md:1-9 — 来源定位到具体文件的具体行

• recalls: 1 — 只被召回过 1 次,未达到 minRecallCount 3 的要求

• status: staged — 暂存在候选池,尚未写入 MEMORY.md,等待后续召回信号积累

这条企微配置明明是真实发生的操作,却卡在了 staged——因为它只出现过一次,召回次数不够。这正是三道门槛设计的本意:一次性操作不值得进长期记忆,反复被用到的才值得。

如果你希望某条 staged 条目被提前晋升,可以手动运行 openclaw memory promote --apply,绕过自动门槛直接写入。

给机器用的:memory/.dreams/

这个目录是 Dreaming 的机器状态存储,存放以下内容:

• recall store:每次召回的日志,供 Deep 阶段统计 minRecallCount

• phase signals:Light 和 REM 阶段的中间结果

• ingestion checkpoints:记录哪些文件已经被摄入,避免重复处理

• locks:防止多个 Dreaming 进程并发运行导致冲突

正常使用不需要手动操作这个目录。但如果你的 Dreaming 出现异常(比如卡住不跑、召回计数错误),检查 memory/.dreams/ 里的 lock 文件是否残留是第一步。


五、开启配置与实操工具

基础开启

在 openclaw.json(或 openclaw.config.ts)里加入以下配置:

{  “plugins”: {    “entries”: {      “memory-core”: {        “config”: {          “dreaming”: {“enabled”: true,// 默认凌晨 3 点,可自定义 cron 表达式            “cron”: “0 3 * * *”,// REM 回溯窗口(天),默认 7            “remLookbackDays”: 7,// 召回衰减半衰期(天),影响 Recency 信号            “recencyHalfLifeDays”: 14,// 超过这个天数的记忆不参与排名            “maxAgeDays”: 90          }        }      }    }  }}

配置改完后需要重启 gateway 生效。改完立刻验证:openclaw memory status,看是否显示 dreaming: enabled。

也可以用 slash 命令临时控制

# 查看当前状态(运行中/下次执行时间/本次计数)/dreaming status# 为当前会话开启/dreaming on# 关闭(不清除已积累的信号)/dreaming off

正式开启前,先跑一次 dry-run

强烈建议:不要直接开启 Dreaming 写入,先预览

# 预览模式:显示什么会被写入,但不真的写openclaw memory promote# 针对某个话题查看打分逻辑openclaw memory promote-explain “数字格式偏好”# 查看 Deep 阶段的详细状态openclaw memory status –deep# 确认无误后,真正写入openclaw memory promote –apply

dry-run 不会修改任何文件。它只是让你在写入发生之前,看清楚 Dreaming 想写什么、打分多少、理由是什么。这是 Dreaming 透明设计的核心体现。


六、进阶:历史回填(让旧记录也能被学习)

如果你已经用了好几个月,memory/ 目录下积了一堆 daily note 文件,Dreaming 开启之后只会处理新产生的记录,之前的全部跳过。

历史回填解决的就是这个问题:把过去几个月的日志也喂进 Dreaming 管道,让虾崽子能从历史里学习。

历史回填完整流程

# Step 1:预览 — 看历史文件会产生什么结果(不写入)openclaw memory rem-harness –path ./memory# Step 2:暂存 — 把历史候选放进短期召回池(可撤销)openclaw memory rem-backfill –path ./memory –stage-short-term# Step 3:在 Dreams UI 检查暂存结果是否合理# Ctrl+I 打开 Dreams 界面,查看 grounded lane 时间线# Step 4:如果满意,提交(历史候选正式进入打分流程)openclaw memory rem-backfill –path ./memory# Step 4(如果不满意,回滚)openclaw memory rem-backfill –rollbackopenclaw memory rem-backfill –rollback-short-term

⚠️ 历史回填的注意事项

• 历史候选不会直接写入 MEMORY.md,它们进入短期召回池后,还是要经过正常的六维评分和三道门槛

• 回填前先跑 rem-harness 预览,不要直接提交

• 如果 daily notes 里有大量过期信息(离职的项目、已关闭的客户),建议回填前先清理这些文件,否则这些历史噪声也会进入候选池


七、真实使用中的踩坑

坑 1:开了 Dreaming,MEMORY.md 还是没变化

原因:门槛保守,需要一定时间积累信号。刚开启的头 3-7 天,Dreaming 通常什么都不写——它在等候选条目被召回够 3 次。

应对:用 openclaw memory status --deep 查看当前候选条目的计数,确认信号在积累中,耐心等待。

坑 2:Dreaming 在 Heartbeat 时重复运行

原因:4.12 版本之前的 Bug,已修复。如果你在 4.12 以前的版本上,scheduled run 执行完之后,后续 Heartbeat 会重复触发 Dreaming,导致同一批数据被处理多次。

应对:升级到 4.12+,openclaw update

坑 3:daily notes 停止生成,Dreaming 无料可用

原因:Dreaming 的原料是 daily notes。如果 memory/YYYY-MM-DD.md 停止生成(比如 workspaceAccess 被设为只读、或 memoryFlush 被关掉),Dreaming 就没有东西可以摄入。

应对:参考上一篇排查流程(workspace 写权限、memoryFlush.enabled 是否为 true)。

坑 4:历史噪声被回填进候选池,拉低了整体质量

原因:daily notes 里的早期记录往往包含大量已过期的临时信息,回填时这些内容会进入候选池并参与打分。

应对:回填前清理 30 天以前的旧文件,或者只回填最近 3 个月的记录。rem-harness 的预览步骤很重要,不要省。


八、适合开启的情况 vs. 不需要开启的情况

✅ 这些情况下,Dreaming 值得开

• 你每天都在用 OpenClaw,对话频繁,daily notes 持续积累

• 你发现自己经常在不同会话里重复纠正同样的偏好

• 你不想手动维护 MEMORY.md,但又想它能越用越懂你

• 你积累了几个月的 daily notes,想让历史数据也发挥价值

• 你愿意花时间做初始配置,并且定期检查 DREAMS.md 日记

❌ 这些情况下,先别开

• 你已经在手动精细管理 MEMORY.md,不想引入自动写入的不确定性

• 你的使用频率很低(每周 1-2 次),信号积累太慢,Dreaming 没有足够材料

• 你的 daily notes 里有大量敏感或私密信息,不确定脱敏效果是否足够

• 你刚部署 OpenClaw,MEMORY.md 还是空的,暂时先手动建立基础结构

• 你的 workspaceAccess 或 sandbox 配置还没理清,先解决基础问题


最后说一句

Dreaming 是我用过的记忆工具里,最接近”我希望 AI 应该怎么学习”的设计。

不是让你说一次它记一次,那只是复制粘贴。

而是让它在你们真实的交互里,自己判断什么值得记,反复被验证之后,才悄悄写下来。

它还不完美。门槛有时太保守,有价值的东西可能就这样默默衰减了。信号来源依赖 memory_search 的调用频率,用法不对就没有反馈回路。

但它的方向是对的。

大多数 AI 记忆问题,不是”存不下”,

而是”存了一堆没用的,忘了真正该记的”。

Dreaming 在试图解决后者。这比解决前者难得多。

你有没有在用 OpenClaw 的过程中,发现它”记对了”某件你没有明确告诉它的事情?欢迎评论区分享,我想知道哪类信息最容易被 Dreaming 捕捉到。🦐

#OpenClaw #AI记忆机制 #Dreaming #记忆整合 #独立开发者工具 #一人公司