记忆写入文件只是第一步。本文解释:存好的记忆怎么被取出来放进 AI 的"眼睛"里, 以及为什么 AI 需要像人一样"做梦"才能让记忆真正有用。
记忆文件躺在磁盘上不会自动发挥作用。每次用户发起对话,OpenClaw 都要经历 "检索 → 过滤 → 注入"三个阶段,才能让记忆真正出现在 AI 的视野里。
例如:"帮我写一个 API 接口,使用我平时喜欢的代码风格"
这句话触发了 OpenClaw 的整个记忆检索管道。
系统把"API 接口""代码风格""喜欢"等关键词提取出来, 同时把这句话转换成一个向量,准备做语义搜索。
BM25(精确词):在倒排索引中找包含"代码风格"的文件,
结果:user.md
向量(语义近似):找和"编码习惯偏好"最相似的片段,
结果:project.md
session/2026-05-10.md
两路合并,按 70% 语义 + 30% 关键词 加权排序。
每条记忆有一个"鲜活度分数":越近期创建 / 越频繁访问的记忆,分数越高。 公式大致为:final = relevance × 0.95^天数 × log(访问次数+1)。 不活跃的记忆排名下降,但不删除。
如果 user.md 和 session/xxx.md 里都记录了"用 TypeScript", MMR 算法会对相似的结果扣分,让不同方向的记忆都能出现, 避免把有限的上下文空间全给"重复信息"占满。
系统把排名最高的 N 条记忆片段(通常 3~8 条)以 片段级方式嵌入 prompt 的专用区域, 不是整个文件,而是最相关的那几段话。AI 此时才真正"看见"这些记忆。
记忆被注入到一个专用的 <memory> 区块,
夹在系统提示词和用户消息之间:
每次记忆被检索并注入到 prompt,系统会自动更新该记忆的元数据:
记忆存下来、能检索到,听起来已经够用了——但有个隐藏问题: 随着时间推移,记忆碎片越来越多、越来越零散, 像一堆乱糟糟的便利贴,贴满了整面墙。 "梦境"就是 AI 定期对这些碎片做的一次整理、合并、升华。
白天接收大量信息碎片(场景、对话、感受),
夜晚睡眠时海马体把短期记忆转换为长期记忆,
相关的事件被关联压缩,不重要的被淡忘。
这个过程就是"睡梦"。
每次对话都产生记忆碎片(用户说了什么、做了什么决策、出现了什么错误),
定时离线批处理把这些碎片整合成结构化知识,
相似的合并,无用的降权。
这个过程就是 AI 的"梦境"。
想象你用了这个 AI 6 个月,每天对话 10 次,每次产生 5 条记忆碎片:
梦境是离线批处理——它不能在用户等待回复时运行(太慢), 而是在系统空闲时自动执行:
access_count +1把两个部分串起来,看一条记忆从诞生到被使用再到被"梦境升华"的全过程。
对话中 AI 触发 create_memory 工具,
把"用户喜欢 TypeScript"写入 .openclaw/memory/session/2026-05-18.md,
同时更新倒排索引和向量嵌入。
下次用户问"帮我写代码"时,
系统检索到这条记忆,注入到 prompt 的 <memory> 区块,
AI 据此自动选用 TypeScript。
同时:access_count: 0 → 1,last_accessed 更新。
如果长时间没被访问,decay_score 每天乘以 0.95,
检索时排名逐渐下滑。但文件本身不动,随时可以被重新找到。
夜间梦境任务发现 10 条关于 TypeScript 的碎片,
把它们合并为一条高质量的
memory/user.md 条目,
原始碎片被标记为"已归档",新向量重建入库。
合并后的记忆信息更丰富、向量更精准、被检索概率更高。 只要用户还在用 TypeScript,它就一直排在检索结果前列, 成为 AI 理解用户的"长期人格记忆"。