每次重启会话,AI 就变成"第一次见面"的陌生人?这篇文章教你用 OpenClaw 的记忆系统,彻底解决这个让人崩溃的问题。
开篇:一个真实的崩溃现场
你跟 AI 聊了整整两个小时,教了它你的写作风格、技术偏好、工作流习惯……
然后第二天打开新会话。
它问你:"你是做什么工作的?"
你:……
这不是 bug,这是所有基于大模型的 AI 助手的"原罪"——上下文窗口是有限的,会话结束了,记忆就消失了。
但 OpenClaw 在这件事上,走了一条非常务实的路。
OpenClaw 记忆系统的核心哲学:文件就是真理
先说结论:OpenClaw 的记忆不在云端,不在数据库,就在你本地的 Markdown 文件里。
源码里有一句话说得特别直接:
"The files are the source of truth; the model only 'remembers' what gets written to disk."
翻译一下:文件是唯一的事实来源,模型只"记住"写入磁盘的内容。
这个设计思路让人拍案叫绝——简单、透明、可控。你随时可以打开文件看、改、删,完全掌握 AI 记住了什么。
记忆文件的两层架构
OpenClaw 把记忆分成两类,各司其职:
第一层:每日日志 memory/YYYY-MM-DD.md
- 存放路径:
~/.openclaw/workspace/memory/2026-03-16.md - 定位:流水账,今天发生了什么、讨论了什么、做了什么决定
- 特点:仅追加(append-only),会话开始时自动读取今天和昨天的内容
想象它是你的工作日报——不需要精炼,但要记录。
第二层:长期记忆 MEMORY.md
- 存放路径:
~/.openclaw/workspace/MEMORY.md - 定位:精华提炼,跨越时间都需要记住的偏好、习惯、重要结论
- 关键限制:只在主会话(私聊)中加载,群聊和共享上下文中不加载
为什么要这个限制?安全考虑。MEMORY.md 里可能有你的个人偏好、私人信息——这些内容不应该在群聊中"泄露"给其他人。
手把手:三分钟激活记忆系统
第一步:创建工作区目录和文件
mkdir -p ~/.openclaw/workspace/memory
touch ~/.openclaw/workspace/MEMORY.md
注意:MEMORY.md 默认不存在,需要你手动创建。这是有意为之的设计——系统不会替你做这个决定。
第二步:往 MEMORY.md 里写点什么
# 我的个人上下文
## 基本信息
- 工作角色:全栈开发工程师
- 技术栈偏好:TypeScript + React + Node.js
- 写作风格:简洁直接,不喜欢废话
## 工作习惯
- 代码注释用英文
- 提交信息遵循 Conventional Commits 规范
- 每天早上 9 点开始工作,专注时不要问太多问题
## 重要约定
- 帮我写代码时优先考虑可读性,不要过度优化
- 如果不确定,先问我,别自作主张
第三步:告诉 Agent 要读它
在你的 ~/.openclaw/workspace/AGENTS.md 里加上这段:
## 会话启动
1. 读取 SOUL.md
2. 读取 memory/YYYY-MM-DD.md(今天 + 昨天)
3. 如果是主会话(直接与用户对话):读取 MEMORY.md
好了,你的 AI 助手现在有长期记忆了。
进阶功能 1:语义搜索记忆
记忆文件多了之后,怎么找到相关内容?OpenClaw 提供了 向量语义搜索。
Agent 有两个工具:
memory_search:语义搜索,找"意思相近的"内容memory_get:精准读取,指定文件和行号
配置语义搜索,在 ~/.openclaw/config.json5 里:
{
agents: {
defaults: {
memorySearch: {
provider: "openai", // 也支持 gemini、voyage、mistral、local(离线)
remote: {
apiKey: "YOUR_OPENAI_API_KEY"
}
}
}
}
}
不想用 API 密钥? 用本地模式:
{
agents: {
defaults: {
memorySearch: {
provider: "local",
local: {
modelPath: "/path/to/your/gguf/model"
},
fallback: "none"
}
}
}
}
OpenClaw 会自动优先级尝试:local → openai → gemini → voyage → mistral,找到能用的就用。
进阶功能 2:自动记忆刷新(上下文压缩前的"遗嘱")
这是 OpenClaw 最有意思的机制之一,值得单独讲清楚。
问题:当一次会话聊得太长,上下文窗口快满了,系统会自动压缩(compaction)——把早期内容摘要成一段话。压缩之后,细节就永远消失了。
解决方案:在压缩发生之前,系统会悄悄触发一个"记忆刷新"——发一条无声的提示给 Agent,让它把重要内容写入 memory/YYYY-MM-DD.md。
用户完全感知不到这个过程(除非你开了 verbose 日志),但重要信息被安全地保存下来了。
配置它(其实默认就是开着的):
{
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.",
}
}
}
}
}
触发逻辑(从源码扒出来的):
触发条件 = 当前 token 数 >= (上下文窗口 - reserveTokensFloor - softThresholdTokens)
而且每次压缩周期只触发一次,不会重复骚扰你。
进阶功能 3:QMD 后端(实验性,强力玩家专属)
如果你有大量 Markdown 笔记(几百上千篇),普通的 SQLite 向量索引可能不够用。OpenClaw 支持接入 QMD——一个结合了 BM25 + 向量 + 重排序的本地搜索引擎。
{
memory: {
backend: "qmd",
qmd: {
includeDefaultMemory: true,
update: { interval: "5m" },
paths: [
{ name: "personal-notes", path: "~/Documents/notes", pattern: "**/*.md" }
]
}
}
}
QMD 完全本地运行,不需要联网,首次启动会自动下载 GGUF 模型。
踩坑提醒:macOS 上需要 brew install sqlite(brew 版,不是系统自带的),因为 QMD 需要支持扩展的 SQLite。
进阶功能 4:把笔记/图片/音频也纳入记忆
如果你想让 Agent 记住的不只是文字,还有截图、语音备忘录……OpenClaw 支持 多模态记忆索引(需要 Gemini Embedding 2):
{
agents: {
defaults: {
memorySearch: {
provider: "gemini",
model: "gemini-embedding-2-preview",
extraPaths: ["~/Desktop/screenshots", "~/voice-notes"],
multimodal: {
enabled: true,
modalities: ["image", "audio"]
},
remote: {
apiKey: "YOUR_GEMINI_API_KEY"
}
}
}
}
}
支持的图片格式:.jpg、.png、.webp、.gif、.heic 支持的音频格式:.mp3、.wav、.m4a、.flac
实用技巧速查
技巧 1:让 Agent 主动记东西
直接告诉它:"记住这个,我的 API key 前缀格式是 sk-xxx"。
好的 Agent 会自动把这句话写入 memory/今天.md。如果它没写,你可以说:"帮我写到 MEMORY.md 里。"
记住源码里的箴言: "如果你想记住什么,就写到文件里。心理笔记在会话重启后不存在,文件可以。"
技巧 2:检查记忆状态
openclaw memory status
会告诉你:记忆文件路径、文件数量、是否有问题。
技巧 3:额外索引团队文档
{
agents: {
defaults: {
memorySearch: {
extraPaths: [
"../team-wiki", // 团队 Wiki(工作区相对路径)
"/srv/shared-notes" // 共享笔记(绝对路径)
]
}
}
}
}
技巧 4:控制记忆搜索范围
默认只在私聊中触发记忆搜索(防止在群聊中泄露个人信息)。如果你想在特定频道也用,可以配置 scope:
{
memory: {
qmd: {
scope: {
default: "deny",
rules: [
{ action: "allow", match: { chatType: "direct" } }
]
}
}
}
}
常见问题 FAQ
Q:MEMORY.md 没有效果,Agent 好像没读它?
A:检查 AGENTS.md 里有没有明确指示读取它。另外确认你是在"主会话"(直接对话),不是群聊或 bot 频道。
Q:语义搜索没反应?
A:运行 openclaw memory status 看看哪里报错。最常见的问题是没有配置 API key,或者 memorySearch.provider 没有设置,而系统找不到可用的 embedding 服务。
Q:想完全关掉记忆功能?
A:
{
plugins: {
slots: {
memory: "none"
}
}
}
Q:记忆文件越来越大怎么办?
A:定期让 Agent 帮你"整理"——让它把一个月的日志提炼成几条要点,更新 MEMORY.md,然后归档旧日志。这本来就是 MEMORY.md 设计的初衷:提炼的精华,而非原始日志。
总结:记忆系统的使用哲学
OpenClaw 的记忆系统给了我一个全新的视角:AI 的"记忆"本质上是一个内容管理问题,而不是技术问题。
文件是事实,模型是消费者。你控制文件,你就控制记忆。
最后送上三条行动指南:
- 今天就创建
MEMORY.md,把你最重要的偏好和习惯写进去 - 养成习惯:重要决定和结论,主动让 Agent 写入记忆
- 定期维护:每个月回顾一次,把有用的内容精炼到 MEMORY.md
你的 AI 助手能有多强,很大程度上取决于你给它的"记忆"有多好。
文中所有技术细节均基于 OpenClaw 源码验证,包括 src/auto-reply/reply/memory-flush.ts、docs/concepts/memory.md、src/agents/tools/memory-tool.ts 等核心文件。欢迎对照源码自行探索。