乐于分享
好东西不私藏

OpenClaw 的记忆,不只是记事本,Dreaming 和 Active Memory 才是关键

OpenClaw 的记忆,不只是记事本,Dreaming 和 Active Memory 才是关键

很多人第一次看 OpenClaw 的记忆系统,第一反应都很朴素:不就是把东西记下来,等需要的时候再搜出来吗?

这个理解不能说错,但只说到了一半。真正有意思的地方在于,OpenClaw 不是只做了一个“会检索的笔记本”,它还补上了 短期记忆、夜间整理、主动召回 这三层能力。

说白了,前台是“记”,后台是“理”,回复前还有个“小秘书”先帮你翻档案。这样一套链路跑起来,智能体才会从“会查资料”慢慢变成“越来越懂你”。

先别急着谈 AI,先把“记忆”这件事讲清楚

如果只用一句话解释 OpenClaw 的记忆,我会这么说:

记忆 = 被保存下来的内容 + 在需要时能被准确召回的能力。

前半句像做笔记,后半句像查目录找书。

你把一本书放进书架,不代表你下次就一定能在 30 秒 内翻到想要的那一页。真正有价值的,不只是“存过”,而是“找得到,而且找得准”。OpenClaw 的记忆系统,本质上就在解决这个问题。

它通常分成两层:

  • 短期记忆memory/*.md,更像日记式、主题式的工作台账
  • 长期记忆MEMORY.md,沉淀跨会话依然值得保留的事实、偏好和稳定背景

这个设计背后的逻辑很实在:不是所有信息都值得升格为长期记忆。

今天临时记录的一条报错、一个待测试命令、一次随口提到的想法,可能只适合留在短期区;真正会被反复用到、能持续影响回复质量的内容,才值得进入 MEMORY.md

Dreaming 不是玄学,它更像夜间记忆整理员

很多人看到 “Dreaming” 这个名字会下意识觉得有点抽象,但它做的事其实非常具体。

白天,智能体一边聊天,一边产生很多零散材料;晚上,Dreaming 像整理员一样把这些材料拿出来复盘,决定哪些该留在暂存区,哪些值得升级。

它分成 3 个阶段

  • Light:整理和暂存短期材料,不写 MEMORY.md
  • REM:提炼主题和反思,不写 MEMORY.md
  • Deep:真正评分,并决定是否写入 MEMORY.md

这套分层设计很关键,因为它避免了一个很常见的问题:AI 什么都记,最后把记忆库记成垃圾堆。

如果没有 Light 和 REM 这两层缓冲,系统很容易把大量噪音、临时上下文、偶发情绪全都直接塞进长期记忆。短期看像“记得很全”,长期看就是“越记越乱”。

从用户视角看,Dreaming 的价值不是“帮你生成了多少睡眠报告”,而是它在替你做一次筛选:

  • 什么只是当天临时有用
  • 什么是反复出现的高价值信息
  • 什么真的值得跨会话保留下来

这个判断过程,才是记忆系统能不能越用越聪明的分水岭。

真正决定记忆好不好用的,是检索,不只是存储

很多人对记忆系统的误解,卡在“有没有存下来”。

但从工程角度看,决定体验的往往不是写入,而是召回。因为你真正感受到“它懂我”,通常不是在它写文件的那一刻,而是在你发出一句话后,它能不能把对的东西找回来。

OpenClaw 在查询时通常会走两路并行:

1. 向量检索

先把 query 做 embedding,再去向量库里找语义相近的片段。

这一路特别适合处理“意思接近,但措辞不一样”的情况。比如你今天说“我想看 AI 产品日报”,和你上周写的是“每天追踪 AI 工具更新”,字面不一样,但语义上其实是近的。

2. 关键词检索

对 query 分词,然后去全文索引里找关键词命中。

这一路更适合找精确项,比如:

  • 某个 message_id
  • 某个配置 key
  • 某条报错
  • 某个参数名

如果只靠向量检索,像配置字段、ID、版本号这种特别“硬”的词,效果往往不稳定;如果只靠关键词检索,又容易漏掉语义接近但表述不同的内容。

所以 OpenClaw 选择的是 混合检索

两路结果拉回来后,再做加权合并和排序。增强项里还会有:

  • temporal decay:最近的记忆更容易排前面
  • MMR:去重,避免一堆相似结果霸榜

这背后的逻辑很像一个成熟编辑在整理资料:既要看“相关不相关”,也要看“是不是重复”,还要看“是不是最近刚发生”。

这些被检索到的痕迹,反过来还会影响长期记忆晋升

这里是很多人第一次看 OpenClaw 时容易忽略,但其实非常妙的一层。

Dreaming 在做长期记忆晋升判断时,不是只看“这段话写没写进文件”,还会参考它有没有被系统反复召回。

比如 Deep ranking 里常见的几个信号:

  • frequency:某条候选内容被反复命中的次数
  • relevance:每次被检索到时,相关性质量高不高
  • query diversity:是不是被不同问题、不同上下文多次打到

这就像人脑的一个朴素规律:

你不是因为“见过一次”就永远记住,而是因为它反复被提取、反复被使用,才慢慢从短期印象变成稳定记忆。

所以 Dreaming 不是简单的日志汇总器,它更像一个“记忆晋升评审器”。它会看这条信息到底有没有长期价值,而不是看到内容就机械入库。

想把检索能力跑起来,先别一上来就追求大而全

如果你什么都不配,OpenClaw 在自动探测一圈后,如果发现没有可用的大模型 embedding 服务,就会直接放弃向量化能力,退回到 纯文本关键词搜索 模式。

这不一定是坏事。

因为关键词模式虽然朴素,但至少可用、稳定、零额外成本。对于刚开始搭环境的人来说,这个降级策略反而很友好,不会让整套系统因为“缺一把 API Key”直接瘫掉。

但如果你想让中文召回更自然,还是建议把向量检索补上。

一个相对省心的最小接入方案是:Ollama + 中文 embedding 模型

第一步,先把 Ollama 跑起来

ollama serve

如果你装的是桌面版 Ollama,通常后台已经启动,这一步可能都不用你手动敲。

确认是否启动成功:

curl http://127.0.0.1:11434/api/tags

第二步,准备 embedding 模型

官方默认常见的是 nomic-embed-text,但如果你的主要语料是中文,建议直接选更合适的中文 embedding 模型。

例如:

ollama pull qwen3-embedding:0.6b
ollama pull qwen3-embedding:4b
ollama pull qwen3-embedding:8b

然后用下面这条确认是否拉取完成:

ollama list

这里的分析逻辑很简单:

  • 0.6b:更轻,适合先跑通
  • 4b:质量和资源消耗更均衡,通常是比较合适的主力档
  • 8b:效果更强,但机器资源要求也更高

对大多数本地中文环境来说,qwen3-embedding:4b 往往是一个比较稳的平衡点。

配置 Memory Search 时,有个版本坑值得提前说清楚

如果 Ollama 不在默认端口,你需要显式配置 provider,而且要注意:

**baseUrl 不能带 /v1**。

正确示例:

{
"models": {
"providers": {
"ollama": {
"apiKey""ollama-local",
"baseUrl""http://127.0.0.1:11434",
"api""ollama"
      }
    }
  }
}

但如果你刚好在 4.12 这个版本附近,还会遇到一个现实问题:有些环境里直接走 Ollama provider 可能不够顺手,这时可以临时把 Ollama 的 embedding 接口伪装成 lmstudio provider 来用。

示例配置:

{
"models": {
"providers": {
"lmstudio": {
"apiKey""lmstudio-local",
"baseUrl""http://127.0.0.1:11434/v1",
"models": []
      }
    }
  },
"agents": {
"defaults": {
"memorySearch": {
"enabled"true,
"provider""lmstudio",
"model""qwen3-embedding:4b",
"query": {
"hybrid": {
"enabled"true,
"vectorWeight"0.7,
"textWeight"0.3,
"mmr": { "enabled"true"lambda"0.7 },
"temporalDecay": { "enabled"true"halfLifeDays"30 }
          }
        },
"extraPaths": [],
"experimental": {
"sessionMemory"false
        }
      }
    }
  }
}

为什么推荐这一组参数?

因为它在“能搜到”和“别搜得太飘”之间比较平衡:

  • vectorWeight: 0.7,让语义召回占主导
  • textWeight: 0.3,保证精确关键词别丢
  • mmr,降低重复片段扎堆出现的概率
  • temporalDecay,让最近的记忆更容易浮上来

你可以把它理解成一套很实用的默认编辑策略,而不是玄学调参。

配完后,记得验证

openclaw memory status --deep
openclaw memory search --query "AI产品项目日报"

能查到状态、能搜到结果,这套链路基本就算跑通了。

如果说 Dreaming 是夜间整理员,那 Active Memory 就像隐身小秘书

Dreaming 处理的是“睡前整理”,而 Active Memory 处理的是“回复前预习”。

它是 OpenClaw 里的一个可选插件,本质上是一个在主回复前运行的阻塞型记忆子智能体。说人话就是:在主模型正式回答你之前,它先帮忙去记忆库里翻一遍,看有没有相关背景。

这个流程之所以好用,不是因为它多复杂,而是因为它 够早

以前很多系统的记忆调用是被动的,你得先明确说“去查查我的偏好”,它才会动;而 Active Memory 是你消息刚发出去,它就先一步去搜,然后把浓缩后的摘要悄悄递给主模型。

于是最后你看到的不是“它去搜完了再回复”,而是“它怎么好像天然就记得”。

Active Memory 状态示意

这也是为什么它常被形容成一个“隐身小秘书”:

  • 先翻档案
  • 再递纸条
  • 主模型据此自然回答

更重要的是,它默认会控制使用边界,比如只允许在 direct 私聊 里生效,避免在群聊里突然把你的私密偏好抖出来。这一点其实很加分,因为“会记”不是最难的,“知道什么时候别乱记、别乱说”才是更成熟的系统设计。

推荐配置示例:

{
"plugins": {
"entries": {
"active-memory": {
"enabled"true,
"config": {
"agents": ["main"],
"allowedChatTypes": ["direct"],
"queryMode""recent",
"promptStyle""balanced",
"timeoutMs"15000,
"maxSummaryChars"220,
"persistTranscripts"false,
"logging"true
        }
      }
    }
  }
}

这里面最值得关注的几个参数是:

  • allowedChatTypes:限制只在私聊生效,保护边界
  • queryMode: "recent":速度和上下文连贯性更平衡
  • maxSummaryChars: 220:防止给主模型塞太长的小纸条
  • timeoutMs:限制这一轮主动记忆最多跑多久

如果你问我这套配置的核心思想是什么,那就是四个字:有用,但克制。

从入口到开关,整条路径其实并不复杂

实际操作时,很多人最怕的是“概念听懂了,但不知道去哪儿点”。

这部分反而是最不玄学的。

首先,进入本地 OpenClaw 控制台:

http://127.0.0.1:18789/

然后在菜单栏里找到 Dreaming 入口,进入后可以看到状态面板、已晋升内容和相关操作区。

验证 Dreaming 可以直接在聊天窗口里用斜杠命令:

/dreaming status
/dreaming on

验证 Active Memory 则可以用:

/active-memory status

所以你会发现,这整套机制虽然听起来像“记忆进化系统”,但真正落地时并没有那么重。它不是要你先搭一套夸张的 AI 基础设施,而是先把几个关键环节串起来:

  • 记忆文件是否在收集
  • 检索是否能召回
  • Dreaming 是否在整理
  • Active Memory 是否能在回复前主动补背景

只要这四步跑通,体验就会明显上一个台阶。

最后把整条链路压成一句人话

如果一定要用一句最接地气的话总结 OpenClaw 的记忆体系,我会说:

白天先记,查询时会找,晚上再整理,回复前还能主动提醒。

对应的数据流其实很清晰:

私信消息 → Active Memory 子智能体 memory_search → 注入隐藏摘要 → 主回复;

夜间则由 Dreaming 做 sweep,生成 DREAMS.md 之类的梦境记录,并在满足条件时把真正值得长期保留的内容升格进 MEMORY.md

这也是为什么我会说,OpenClaw 的记忆系统,真正厉害的地方从来不是“它会写个文件”,而是它把 存储、召回、筛选、前置辅助 这几件事连成了闭环。

闭环一旦形成,智能体就不只是“知道你说过什么”,而是开始具备一点“知道什么该留下、什么时候该想起来”的味道了。

至于这套机制接下来会不会继续往更强的长期个性化方向进化,我觉得答案大概率是会。只不过真正有价值的方向,应该不是“记得越来越多”,而是“记得越来越准”。

参考链接

  • OpenClaw 本地控制台:http://127.0.0.1:18789/
  • Ollama 下载:https://ollama.com/download