乐于分享
好东西不私藏

OpenClaw记忆系统浅析

OpenClaw记忆系统浅析

记忆为什么重要

用 AI 助手最崩溃的体验是什么?聊了半小时,它突然忘了你前面说的所有东西。

这不是模型的问题,是工程的问题。模型的 context window 有上限,对话超过这个长度,系统就必须做取舍——保留什么、丢弃什么、怎么在下次对话里回忆起来。

这件事上, Claude Code 和 OpenClaw 走了两条完全不同的路。一个用文本文件,一个用向量数据库。听起来是技术选型差异,实际上是两种截然不同的记忆哲学。

Claude Code 的记忆: markdown 文件 + 关键词匹配

Claude Code 的记忆机制朴素得令人意外。核心就三样东西:

CLAUDE.md 文件:项目级别的永久记忆。你可以手动写”这个项目用 pnpm ,测试跑 vitest”,每次新会话 Claude Code 都会读取它。

auto-memory: Claude Code 会自动把重要信息保存到 ~/.claude/ 目录下的 markdown 文件里。比如你说”我喜欢简洁的代码风格”,它会存一条文件记住这件事。

session memory:上下文压缩时,关键信息会被写到磁盘。下次压缩后,系统会尝试从磁盘恢复。

整个体系的底层就是读写文本文件。查找方式是关键词匹配——如果记忆文件里写了”用户喜欢 TypeScript”,你得问到 TypeScript 相关的问题,系统才会把这条记忆加载进来。

优点是简单、可读、用户可以直接编辑。缺点也很明显:记不住太多东西,也找不到语义相关但关键词不同的记忆

OpenClaw 的记忆:向量数据库 + 语义搜索

OpenClaw 的记忆系统是一个三层插件架构:

模块
职责
编排层
memory-core
决定什么时候存、什么时候取
存储层
memory-lancedb
向量数据库,负责存取和相似度搜索
知识层
memory-wiki
结构化知识库,带置信度和来源追踪

每条记忆在存储时会被转换成一个向量(一组数字),用的是 OpenAI 的 text-embedding-3-small 模型生成 1536 维的嵌入向量。

type MemoryEntry = {  id: string;  text: string;        // 记忆内容  vector: number[];    // 1536维嵌入向量  importance: number;  // 0-1 重要性分数  category: "preference" | "fact" | "decision" | "entity" | "other";  createdAt: number;};

搜索记忆时不需要精确匹配关键词。你昨天聊了”想优化数据库查询性能”,今天问”SQL 慢怎么办”,系统通过语义相似度就能把昨天的对话调出来——因为这两句话在向量空间里距离很近。

而且搜索不是纯向量的,是混合搜索:向量相似度占 70% 权重,文本匹配占 30%,再加上 MMR (最大边际相关性)排序去掉重复结果,还有时间衰减让新记忆排更前面。

最有意思的部分:记忆会”做梦”

OpenClaw 有一个直接借鉴人类睡眠机制的设计——Memory Dreaming

人睡觉时大脑在做什么?整理白天的记忆,重要的从短期记忆转入长期记忆,不重要的逐渐遗忘。 OpenClaw 用定时任务模拟了这个过程:

阶段
频率
做什么
浅睡( Light )
每 6 小时
去重、清理噪声
深睡( Deep )
每天凌晨 3 点
把高频召回的记忆晋升到长期存储
REM
每周一次
发现跨记忆的模式和关联

具体来说, OpenClaw 的每日记忆会先写入短期存储(memory/YYYY-MM-DD.md 文件)。系统会追踪每条记忆被召回了多少次、被多少个不同的问题触发过、在多少个不同的日子里被使用。

然后用一个六因子加权公式计算重要性分数:

因子
权重
说明
相关性
30%
平均召回匹配分数
频率
24%
被调用的次数
多样性
15%
被不同类型问题触发的比率
新近度
15%
指数衰减, 14 天半衰期
巩固度
10%
跨天被召回(间隔重复效应)
概念覆盖
6%
涉及的概念标签数

当一条记忆的分数超过 0.75 、被召回超过 3 次、且被至少 2 个不同的查询触发过,它就会被晋升到永久的 MEMORY.md 里。

“做梦”阶段会给边缘候选者加一点分数(最多 +0.06 到 +0.09 ),帮助那些差一点达标的记忆跨过晋升门槛。这和人类睡眠中记忆巩固的原理惊人地相似。

记忆的预算管理

永久记忆不能无限增长。 OpenClaw 设了一个 10,000 字符的上限。满了之后,最早的自动晋升记忆会被 FIFO (先进先出)淘汰——但用户手动写入的记忆永远不会被删。

这比 Claude Code 的方案精细很多。 Claude Code 的 auto-memory 没有预算概念,文件会一直增长,最终可能因为太大而影响性能。

每一轮对话都在自动召回

OpenClaw 的记忆不需要手动触发。每次用户发消息时,系统会在 before_prompt_build 钩子里:

1.把用户的最新输入转成嵌入向量
2.在向量数据库里搜索最相关的 10 条记忆
3.取前 3 条注入到系统提示里

Agent 也可以主动搜索记忆——通过 memory_search 工具发起更精确的查询。

Claude Code 的 auto-memory 只在会话启动时加载一次,不会每轮动态召回。

对比总结

维度
Claude Code
OpenClaw
存储方式
文本文件
向量数据库 + SQLite
检索方式
关键词匹配
语义相似度搜索
重要性评估
无,所有记忆平等
六因子加权评分
记忆生命周期
平坦——存了就在
短期→晋升→长期→淘汰
动态召回
会话启动时加载
每轮自动召回 top 3
遗忘机制
手动删除
时间衰减 + 预算淘汰
“做梦”巩固
三阶段定时巩固

一句话: Claude Code 的记忆像一个笔记本,你写什么它存什么,翻的时候靠你自己找。 OpenClaw 的记忆像人脑——会遗忘、会巩固、会在睡梦中整理,重要的自然浮上来,不重要的自然沉下去

下一篇预告

记忆是单个 Agent 的能力。当多个 Agent 需要协作完成一个复杂任务时,又该怎么编排? Claude Code 和 OpenClaw 在多 Agent 协作上的设计差异,比记忆系统还要大。