很多人用OpenClaw都遇到过同一个崩溃时刻,你跟AI聊了半天,建立了一堆规则和偏好,第二天再开对话,它像失忆了一样,什么都不记得了。这不是bug,这是你没搞懂它的记忆机制。
OpenClaw的记忆系统本质上只有一句话:写进文件的才算记住,只在对话里说的,迟早会消失。 理解了这一点,后面所有配置都是顺水推舟。
先搞清楚:记忆到底有几层?
OpenClaw 的记忆不是一个东西,而是四个完全不同的层,它们的寿命和失效方式各不相同。
层级 | 是什么 | 能活多久 |
启动文件(SOUL.md、AGENTS.md 等) | 每次会话开始时从磁盘加载 | 永久,重启不丢 |
会话记录(JSONL 文件) | 对话历史,保存在磁盘 | 半永久,上下文满了会被压缩 |
LLM 上下文窗口 | 模型当前看到的内容 | 临时,大小固定,满了就溢出 |
检索索引(memory_search) | 可搜索的向量索引 | 永久,从文件重建 |
最常见的AI失忆,根本原因是:你把规则说在了对话里,而不是写进文件。对话历史一旦被压缩,那些指令就永远消失了。
核心文件体系:8 个自动加载的文件
OpenClaw 在每次会话启动时,只会自动加载特定的8个文件,文件名必须完全一致:
SOUL.md AGENTS.md USER.md TOOLS.md
IDENTITY.md HEARTBEAT.md BOOTSTRAP.md MEMORY.md
重点来了:任何其他名字的文件,比如 health-profile.md、notes.md、knowledge-base.md,一律不会自动加载,AI压根看不到它们。
这是一个超级隐蔽的坑:你精心写了一份my-rules.md,以为AI会遵守,结果它完全不知道这个文件存在。关键知识必须放进这8个文件之一。
每个文件该放什么?
这8个文件各有分工,搞清楚谁管什么才能配置得干净利落。
SOUL.md — AI的灵魂,定义它是谁、有什么性格、说话风格是什么。这是它的人设说明书,每次对话都会读取。
AGENTS.md — 操作手册,告诉 AI 每次对话该怎么干活:先读什么文件、遇到什么情况执行什么步骤、有哪些行为规范。这是最重要的行为约束文件。
USER.md — 关于你的一切:你的偏好、背景、常用工具、不喜欢什么风格。这里没有大小限制,是存放用户专属知识的最佳位置。
MEMORY.md — 长期记忆的核心文件,存放跨会话需要保留的重要事实、决策、偏好。这是 AI 的长期记忆硬盘。
TOOLS.md — 告诉 AI 有哪些工具可用,以及使用规范。
IDENTITY.md — 身份标识,防止 AI 用系统 ID 自我介绍而不是用你给它起的名字。
HEARTBEAT.md — 定时任务的心跳配置,用于周期性自检和状态维护。
BOOTSTRAP.md — 启动时执行的初始化指令,类似开机脚本。
两种记忆文件的日常用法
除了上面8个启动文件,OpenClaw还有一套日常记忆文件机制,专门处理今天发生了什么。
日志型记忆:memory/YYYY-MM-DD.md
每天一个文件,只追加不覆盖。会话开始时自动读取今天和昨天的日志。适合记录当天的任务进展、临时决策、运行上下文。
长期精华记忆:MEMORY.md
存放那些需要跨越很多天都记住的内容——你的核心偏好、重要决定、固定规则。如果两个文件同时存在,OpenClaw会同时加载(自动去重)。
什么时候写哪个?官方给了一个很清晰的原则:
决策、偏好、持久事实→ 写进MEMORY.md
今天的流水账、运行上下文→ 写进memory/YYYY-MM-DD.md
有人说记住这个→ 立刻写文件,不要只存在脑子里
两个记忆工具:怎么让 AI 主动回忆
光把内容写进文件还不够,还要让AI知道主动去检索。OpenClaw提供两个工具:
memory_search — 语义检索,用自然语言查找相关记忆片段。即使你当时记录的措辞和现在问的不一样,它也能找到。背后支持向量检索(OpenAI、Gemini、Ollama 等多种 Embedding 提供商)+ BM25 关键词混合搜索。
memory_get — 精准读取,直接读取某个Markdown文件的指定内容。适合你明确知道信息在哪个文件的情况。
关键配置:在AGENTS.md里加一条规则——行动前先搜索记忆。没有这条规则,AI 会直接凭印象猜,而不是去查它的笔记。
# AGENTS.md 示例规则- 在执行任何任务前,先用 memory_search 检索相关记忆
- 重要决策完成后,立即将结果写入 MEMORY.md
- 用户偏好变更时,更新 USER.md 对应条目
上下文压缩前的记忆抢救机制
这是OpenClaw一个非常精妙的设计,很多人不知道。当会话上下文快要满了,在触发压缩之前,OpenClaw会自动触发一个静默的记忆保存动作,提醒AI把重要内容写进文件,然后再压缩。
这个机制叫Memory Flush(记忆冲洗),配置在 openclaw.json 里:
{agents: {defaults: {compaction: {reserveTokensFloor: 20000,memoryFlush: {enabled: true,softThresholdTokens: 4000,systemPrompt: Session nearing compaction. Store durable memories now.,prompt: Write any lasting notes to memory/YYYY-MM-DD.md; reply with NO_REPLY if nothing to store.}}}}}
注意:这个 flush 动作是静默的,用户看不到,AI 自己悄悄执行。但有个前提——工作空间必须可写,如果你把工作空间设成只读模式,这个保护机制就自动跳过了。
进阶:向量记忆搜索插件
如果你的 MEMORY.md 越来越大,靠关键词搜索已经不够精准,可以开启向量索引,让 AI 用语义理解来检索记忆。
社区里测试最多的几个方案:
方案 | 特点 | 适合谁 |
QMD(默认) | 免费、本地、精准,只取需要的片段 | 大多数用户首选 |
ByteRover Memory Skill | 准确率 92%,省 50-70% Token | 追求效率的用户 |
Mem0 + Ollama | 自动化强,本地 Embedding | 完全本地化部署 |
LanceDB | 速度快、完全私有 | 隐私敏感场景 |
QMD还能和Obsidian配合使用,Obsidian作为人类可读的知识库,QMD负责搜索,SQLite存结构化数据,三层结合是目前社区公认最强的记忆架构。
三个最容易踩的坑
坑一:文件用了符号链接(symlink)
如果你的工作空间文件是指向工作空间外部的符号链接,OpenClaw 的路径安全检查会静默拒绝加载,没有任何报错,文件就像不存在一样。解决方案:用真实文件副本,不要用 symlink。
坑二:AI 把 MEMORY.md 整个覆盖重写
这是最心碎的坑。你精心积累了几十条记忆,AI 一次写操作直接清空重写,只剩一行。原因是没有明确告诉 AI只能追加,不能覆盖。解决方案:在 MEMORY.md 文件头部加声明,同时在 AGENTS.md 和 SOUL.md 里都写上禁止覆盖记忆文件,只能追加。一个地方说不够,要多处强化。
坑三:把规则只说在对话里
这是最普遍的错误。你说记住,我不喜欢用表格,AI当时记住了,但上下文一压缩,这条规则就消失了。所有需要持久生效的规则,必须写进文件。 对话里说的话,寿命和上下文窗口一样短。
一套可以直接用的最佳实践
把上面所有内容浓缩成三条,照着做就能解决 95%的记忆问题:
第一条:持久规则写文件,不说在对话里。MEMORY.md 和AGENTS.md 是你的两块永久磁盘。
第二条:检查Memory Flush是否开启,并且给它留足触发空间(softThresholdTokens 建议 4000 以上)。
第三条:在 AGENTS.md 里强制要求AI动前先搜索记忆,让检索成为它的本能,而不是偶尔为之。
记忆系统配置好了,OpenClaw才真正从每次都要重新认识你的陌生人,变成了解你、记得你、越用越顺手的数字伙伴。
夜雨聆风