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 用定时任务模拟了这个过程:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
具体来说, OpenClaw 的每日记忆会先写入短期存储(memory/YYYY-MM-DD.md 文件)。系统会追踪每条记忆被召回了多少次、被多少个不同的问题触发过、在多少个不同的日子里被使用。
然后用一个六因子加权公式计算重要性分数:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
当一条记忆的分数超过 0.75 、被召回超过 3 次、且被至少 2 个不同的查询触发过,它就会被晋升到永久的 MEMORY.md 里。
“做梦”阶段会给边缘候选者加一点分数(最多 +0.06 到 +0.09 ),帮助那些差一点达标的记忆跨过晋升门槛。这和人类睡眠中记忆巩固的原理惊人地相似。
记忆的预算管理
永久记忆不能无限增长。 OpenClaw 设了一个 10,000 字符的上限。满了之后,最早的自动晋升记忆会被 FIFO (先进先出)淘汰——但用户手动写入的记忆永远不会被删。
这比 Claude Code 的方案精细很多。 Claude Code 的 auto-memory 没有预算概念,文件会一直增长,最终可能因为太大而影响性能。
每一轮对话都在自动召回
OpenClaw 的记忆不需要手动触发。每次用户发消息时,系统会在 before_prompt_build 钩子里:
Agent 也可以主动搜索记忆——通过 memory_search 工具发起更精确的查询。
Claude Code 的 auto-memory 只在会话启动时加载一次,不会每轮动态召回。
对比总结
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
一句话: Claude Code 的记忆像一个笔记本,你写什么它存什么,翻的时候靠你自己找。 OpenClaw 的记忆像人脑——会遗忘、会巩固、会在睡梦中整理,重要的自然浮上来,不重要的自然沉下去。
下一篇预告
记忆是单个 Agent 的能力。当多个 Agent 需要协作完成一个复杂任务时,又该怎么编排? Claude Code 和 OpenClaw 在多 Agent 协作上的设计差异,比记忆系统还要大。
夜雨聆风