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。
六维评分权重
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
权重分布有一个清晰的逻辑:相关性 + 频率合计 54%,占绝对主导。Dreaming 最看重的不是”这句话说得好”,而是”这件事你在乎,而且反复在乎”。
用一个具体例子来理解:
场景:你在三次不同的对话里纠正了输出格式
对话 1(周一):你说”数字用中文单位,不用 K/M”
对话 2(周三):你改了它的报告,把 “300K” 改成了 “30万”
对话 3(周五):你再次提到”用万、亿,不用英文缩写”
Dreaming 看到的信号:
Frequency = 3次 ✅ | Query diversity = 3个不同语境 ✅
Recency = 昨天 ✅ | Relevance = 高(涉及你的核心偏好)✅
→ 这条信息很可能过关,写入 MEMORY.md
三道最低门槛
综合分只是第一关。就算分数够高,还必须同时通过三个硬性最低标准:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
这三道门槛合在一起,基本上意味着:一条信息要在你的真实使用中,反复、主动、从不同角度被用到,才会进入 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 捕捉到。🦐
夜雨聆风