Skip to content
📚 日常使用第 4 / 4 节

记忆系统:让 Claw 记住你 ​

上一课的命令都是「当场生效」;这一课讲怎么让效果留下来。OpenClaw 记忆系统的设计哲学一句话就能说完:没有隐藏状态——Claw 只记得写进磁盘的内容,而磁盘上写的是你用文本编辑器就能打开的纯 Markdown 文件(默认在 ~/.openclaw/workspace)。

这意味着两件事:想让 Claw 记住你,直说就行(「记住:我偏好 TypeScript」);想检查或修改它记了什么,打开文件看就行。本课把记忆的写入、召回、自动巩固、跨会话共享和迁移一次讲完,全部示例基于 OpenClaw v2026.10.9。

学完你能做什么 ​

  • 说一句「记住:……」让 Claw 把你的偏好和事实写进 USER.md / MEMORY.md
  • 用 /new 开新会话验证跨会话记忆还在,说得出会话上下文和长期记忆的分界线
  • 让 Claw 用 memory_search 从日记层找回老话题(中文 trigram 分词原生支持)
  • 打开 2.0 的跨会话召回:同一个 agent 的私聊之间互相记得(个人安装默认开)
  • 看懂 dreaming 自动巩固在做什么,并从 Claude Code / Codex / Hermes 导入旧记忆

你现在的困境 ​

  • 每次开新会话都要重新自我介绍一遍:「我用 TypeScript」「回答用中文」「别啰嗦」
  • 上周让它查过的资料、定过的方案,这周问起来它一脸无辜:「我们没有聊过这个」
  • 从 Claude Code 迁移过来,那边攒了几个月的记忆,难道要在这里从零重攒?

什么时候用这一招 ​

当你需要:

  • Claw 跨会话记住你的偏好、项目背景和做过的决定
  • 它能自己翻旧笔记回答「我们之前怎么定的」这类问题
  • 记忆可检查、可编辑——出了问题能打开文件亲手改

而且不想:

  • 每个新会话都把背景知识复述一遍
  • 把重要事实托付给看不见摸不着的「云端黑盒记忆」
  • 手动维护一份越写越长的提示词文档

🎒 开始前的准备 ​

  • 完成了 日常使用导读;聊天入口不熟先看 Control UI:浏览器里的控制台
  • Gateway 在跑:openclaw gateway status 能看到监听状态(记忆索引和检索都由 Gateway 侧的 memory-core 插件提供)
  • 至少配好一个模型 provider(没配好先去 连接模型总览)
  • 打开任意聊天入口:Control UI 聊天框、终端 openclaw 进 TUI,或已接入的聊天渠道
  • (可选)想用语义检索:有一个 embeddings 可用。默认走 OpenAI embeddings;也能换 Ollama 等本地方案或干脆只用关键词检索(第 3 步和进阶技巧里细说)

核心思路 ​

OpenClaw 记忆 = 磁盘上的 Markdown 文件 + 一个 SQLite 索引。 文件是本体,索引是为了检索。官方文档的原话:模型只记得保存到磁盘的内容,没有隐藏状态(there is no hidden state)。

四个记忆相关文件,各管一层:

文件放什么什么时候被加载
USER.md(可选)用户画像:稳定偏好、沟通风格、关系、在做的项目,写成指令式条目每次会话开始注入(有独立的小预算)
MEMORY.md长期记忆:非画像类的持久事实、决策、摘要每次会话开始注入
memory/YYYY-MM-DD.md日记层:当天的工作上下文、观察、会话摘要今天和昨天的日记在裸 /new、/reset 时自动加载;更早的只按需检索
DREAMS.md(可选)dreaming 的做梦报告,写给人看永不注入,纯审阅用

Claw 手里有三个记忆工具(由默认记忆插件 memory-core 提供):memory_search(语义检索,措辞不同也能命中)、memory_get(读具体文件或行范围)、intent(登记事件条件型提醒;时间型提醒走定时任务,不归记忆管)。

两条设计底线,先知道少踩坑:

  1. 写入有门槛,不是什么都记。 每条记忆都带溯源标记:owner(你在受信渠道亲口说的)、agent(Claw 从你的内容推导的)、untrusted(网页、工具输出、群聊外部内容)、system(运行时指令)。后两类永远不会被提升进长期记忆——这是结构性拦截,不是「概率上更谨慎」。所以想让 Claw 记住什么,你自己说一遍最管用。
  2. 召回分两条车道。 便宜车道零模型调用:会话开始注入 USER.md/MEMORY.md、memory_search 排序检索、触发短语自动注入(每回合最多 3 条)。贵车道是 Active Memory 子代理,只在「你问起过去的事、且便宜车道没找到强命中」时才启动——日常聊天不为回忆多付延迟。

💡 记忆 ≠ 提醒

「周五下午提醒我看数据」这种时间型提醒不进记忆系统,Claw 会把它变成 cron 定时任务;「等 release 出来时提我一句」这种事件型提醒走 intent 工具进独立的 SQLite 表。记忆管「记住事实」,定时任务管「到点做事」——详见 定时任务 Automations。

跟我做 ​

第 1 步:让 Claw 记住你——直接说「记住」 ​

为什么:OpenClaw 记忆没有隐藏状态,想让 Claw 记住什么,不需要任何命令或配置——直接告诉它。官方文档的示例就是一句 "Remember that I prefer TypeScript."

在任意聊天入口发一条消息:

text
记住:我主用 TypeScript,代码示例默认用 TypeScript 写。

你应该看到:Claw 确认已记下,并把这条写进 ~/.openclaw/workspace 下的记忆文件——偏好这类稳定画像按约定写成指令式条目(Always / Never / Prefer 开头),落在 USER.md;非画像类的事实和决策落在 MEMORY.md。具体进哪个文件由 Claw 判断「合适的文件」。

眼见为实,去文件里看一眼:

bash
cat ~/.openclaw/workspace/USER.md

你应该看到:多了一条指令式条目,通常带观察日期。USER.md 本身是可选文件,之前不存在的话,这次写入会新建它。不想开终端的话,Control UI 的 Agents 页 → Memory 标签页也能看(那里还有 dreaming 状态开关和 Dream Diary 阅读器)。

💡 记错了就直说

偏好变了直接告诉它「我现在更多用 Python 了」。按官方约定,USER.md 里的偏好更新是原地取代旧条目,不是追加一条矛盾的——否则 Claw 会拿旧值回答你。

  • USER.md(或 MEMORY.md)里看到了刚写进去的条目

第 2 步:验证跨会话记忆——/new 之后它还记得 ​

为什么:「记住你」的检验标准是换一个会话还在。会话上下文会被清掉,记忆文件不会——这就是两者的分界线。

text
/new

你应该看到:新会话开启(上一课讲过:模型 pin 保留)。然后问它:

text
我偏好什么编程语言?

你应该看到:Claw 答出 TypeScript。因为 USER.md 和 MEMORY.md 在每次会话开始注入上下文——这就是「启动注入」,OpenClaw 跨会话记忆的第一层。

注意一个细节:今天和昨天的日记 memory/YYYY-MM-DD.md 也会在裸 /new、/reset 时自动加载。所以昨天的上下文它也「顺手记得」——这不是 bug,是日记层的设计(踩坑提醒里展开)。

  • /new 之后 Claw 仍答得出你的偏好

第 3 步:让 Claw 回忆——memory_search 语义检索 ​

为什么:日记层会越攒越多,不可能全塞进上下文。memory_search 用混合检索(语义向量 + 关键词)按需找出相关笔记——你换个措辞问,它也能命中。

方式 A(推荐):直接在聊天里问老话题。 上下文里没有答案时,Claw 自己会调 memory_search:

text
上周我们讨论过的部署方案,结论是什么?

你应该看到:Claw 给出结论,并(通常)注明来自哪天的笔记。哪怕你问的措辞和当时记的完全不同,语义检索也能对上。

方式 B:CLI 直接搜。 openclaw memory search 在 Gateway 运行时会直接通过 Gateway 路由,不用停服务:

bash
openclaw memory search "部署方案"

你应该看到:从可用索引里返回相关记忆片段。中文一样好使——内建引擎用 trigram(三字符组)分词,中文、日文、韩文原生支持,这是 memory-core 的内置能力,不用额外配置。

💡 没配 embeddings 也能搜

语义检索默认用 OpenAI embeddings,但关键词检索(SQLite FTS5)开箱即用。把 memory.search.provider 设为 "none" 就是无向量的纯关键词模式;想全本地化,进阶技巧里有 Ollama 方案。

  • 问了一个老话题,Claw 从记忆里找回了答案

第 4 步:配置跨会话召回——rememberAcrossConversations ​

为什么:启动注入只覆盖 USER.md/MEMORY.md 和最近两天的日记。上周在另一个私聊里聊的细节呢?OpenClaw 2.0 的跨会话召回(v2026.8.1 引入)让同一个 agent 能从它其他私聊会话的记录里召回相关上下文——这是 2.0 记忆升级的核心(背景见 OpenClaw 2.0 新变化)。

个人安装(session.dmScope 未设置或为 "main"、且没有绑定覆盖它)默认开启;配置过 DM 隔离的安装默认关闭。显式开启或确认,在 openclaw.json 里加一行:

json5
{
  agents: {
    entries: {
      personal: {
        memory: {
          search: {
            rememberAcrossConversations: true,
          },
        },
      },
    },
  },
}

你应该看到:配置保存后,OpenClaw 会索引该 agent 的会话记录,并在符合条件的私聊回复前跑一次 Active Memory 检索——在 A 私聊里聊过的方案,B 私聊里问起,它能想起来。

隐私边界是写死的,记住三条:

  • 只有同一个 agent 的私聊互相可召回;群组和渠道既不做召回来源、也不做召回目的地
  • 别的 agent 的会话永远不参与
  • 元数据不足的未知/归档会话记录会被拒绝

⚠️ 跨会话召回走的是贵车道

这条召回由 Active Memory 子代理执行,只在「消息问起过去、且便宜车道没有强命中」时触发(默认 escalate 模式)。普通闲聊不会为它付出额外延迟,但深回忆的那一轮会慢一点——这是设计内的取舍。

  • 确认过自己的安装属于默认开启,或已显式配置该字段

第 5 步:交给 dreaming——OpenClaw 记忆的自动巩固 ​

为什么:日记层会一直膨胀,靠人手把有用条目搬进 MEMORY.md 不现实。dreaming 是默认开启的后台巩固系统:每天凌晨 3 点(cron 0 3 * * *)跑一遍三相位——light(整理短期材料)→ REM(反思、提炼主题)→ deep(把够格的条目提升进 MEMORY.md)。只有 deep 相位写 MEMORY.md。

用聊天命令看状态:

text
/dreaming status

你应该看到:回执显示 dreaming 当前开启状态。/dreaming on、/dreaming off 可以开关(需要 owner 或 admin 权限)。这个定时任务由 memory-core 自动管理,名字固定叫 Memory Dreaming Promotion,不需要你手动建 cron——想确认它在,跑 openclaw automations list --all。

人读的报告写在 DREAMS.md(Control UI 的 Memory 标签页有 Dream Diary 阅读器)。想手动触发一次提升预览:

bash
openclaw memory promote

你应该看到:从 memory/YYYY-MM-DD.md 里排出候选列表(默认门槛:加权分 ≥ 0.75、被召回 ≥ 3 次、查询多样性 ≥ 3)。这只是预览;加 --apply 才会把选中的条目追加进 MEMORY.md。注意这条命令要先停 Gateway(踩坑提醒里说为什么)。

💡 什么能被提升?只有你说的

提升门槛不只是分数:untrusted 和 system 溯源的候选在进入排名前就被结构性排除。网页上看到的、群友说的,召回频率再高也进不了长期记忆。

  • /dreaming status 显示 dreaming 已开启

第 6 步:把旧助手的记忆搬进来——Import Memory ​

为什么:从 Claude Code、Codex 或 Hermes 迁过来的用户,旧记忆不用重攒。Control UI 支持一键导入本地 Markdown 记忆。

操作路径:Control UI Settings → Import Memory,选目标 agent,预览检测到的文件,确认导入。默认 agent 还有个更轻的入口:Settings → Ask OpenClaw 里说一句 import memory。

各来源读的是这些文件(只拷 Markdown,源文件不动):

来源导入内容
Claude Code~/.claude/projects/*/memory 下各项目的 auto-memory Markdown(含你配置过的 autoMemoryDirectory)
Codex~/.codex/memories 下整合好的 MEMORY.md 和 memory_summary.md
Hermes检测到的 Hermes 主目录下的 MEMORY.md 与 USER.md

你应该看到:导入的文件分门别类放在目标 agent 工作区的 memory/imports/claude-code/、memory/imports/codex/、memory/imports/hermes/ 下,随即被 memory_search 索引、memory_get 可读。注意它们不会被合并进启动注入的 MEMORY.md——旧记忆作为可检索的素材存在,Claw 的长期记忆仍由它自己(和 dreaming)维护。

  • 导入完成后,memory/imports/ 下出现了来源子目录

检查点 ✅ ​

  • 说「记住:……」后,在 ~/.openclaw/workspace 的文件里看到了新条目
  • /new 开新会话后,Claw 仍答得出你的偏好
  • 问过一个老话题,Claw 用记忆检索找回了答案(中文也能搜)
  • 知道自己的安装跨会话召回是默认开还是需要显式配置
  • /dreaming status 看过一次状态,说得出三相位里谁写 MEMORY.md

踩坑提醒 ​

❌ 「/new 之后怎么还记得昨天的事?」 ​

原因:/new 清的是会话上下文,不是记忆。启动注入的 USER.md/MEMORY.md 每次会话开始都会加载;今天和昨天的日记也会在裸 /new、/reset 时自动加载。三层各管各的:会话上下文(会被清)、日记层(最近两天自动加载)、长期记忆(一直在)。

正确做法:想让它「忘掉」某条记忆,直接跟它说,或打开文件删掉那一行(Markdown 随便改);要按会话溯源批量删除,用 openclaw memory forget(进阶技巧里有)。想要真正干净的会话,别指望 /new 清记忆——那不是它的活。

❌ Gateway 开着,openclaw memory status / index / promote 被拒绝 ​

原因:除 search 和普通 session-backfill 会通过运行中的 Gateway 路由外,其余 memory 子命令需要独占记忆存储——Gateway 拥有状态目录时,这些命令会在打开存储前直接拒绝。

正确做法:

bash
openclaw gateway stop &&
openclaw memory status &&
openclaw gateway start

❌ MEMORY.md 越写越大,Claw 开始「忘」早期的条目 ​

原因:MEMORY.md 超出启动注入预算时,磁盘文件原样保留,但注入上下文的副本会被截断——文件还在,Claw 却「看不见」后半截。

正确做法:用 /context list、/context detail 或 openclaw doctor 看原始大小 vs 注入大小和截断状态;把细节移到 memory/*.md 日记层,MEMORY.md 只留持久摘要;预算实在不够用,再考虑调大启动限额(拿 prompt 预算换)。

❌ 期望 Claw 把网页内容、群聊消息记成长期记忆 ​

原因:溯源分级在写入时就拦住了——网页、工具输出、群内外部内容派生的记忆标为 untrusted,运行时指令标为 system,这两类候选在 dreaming 巩固前就被结构性排除,「召回频率再高也提拔不进核心记忆」。cron、心跳、子代理会话同样不产生持久记忆候选。

正确做法:重要事实你自己在私聊里说一遍(owner 溯源);群聊里看到值得记的东西,转述给它。这既是安全设计,也帮你过滤噪音。

进阶技巧(可选) ​

换 embeddings 供应商,或全本地化。 语义检索默认用 OpenAI embeddings;memory.search.provider 可切 gemini、voyage、mistral、bedrock、deepinfra、ollama、lmstudio、github-copilot、openai-compatible 等。不想用任何 API key:装官方 llama.cpp provider(openclaw plugins install @openclaw/llama-cpp-provider)后设 provider: "local",或直接用 Ollama 的本地 embeddings。中文用户提醒一句:语义检索质量取决于 embedding 模型,关键词检索(trigram)则始终可用。

手动微调某条记忆的召回权重。 记忆条目支持行尾注释,写入时带上触发短语和重要度(1–10):

markdown
- Keep the gateway on loopback. <!-- trigger: gateway setup, network safety --> <!-- importance: 9 -->

触发短语命中(分数 ≥ 0.65)的条目会作为隐藏上下文自动注入(只限 MEMORY.md / USER.md 里的条目,日记层不参与),每回合最多 3 条;重要度参与检索排序。不写注释的条目保持中性,不会吃亏。

按会话删除记忆。 openclaw memory forget 做溯源删除——先预览再执行:

bash
openclaw memory forget --agent <agent-id> --session <id-or-key> --dry-run --json

确认报告后去掉 --dry-run 真删(立即删除、没有二次确认,源会话记录保留)。只想重建索引不删文件:openclaw memory reset 之后 openclaw memory index。

换记忆引擎。 内建 memory-core(SQLite,默认)之外还有插件可选:Honcho(AI 原生跨会话记忆,带用户建模)、LanceDB(向量库后端,支持本地 Ollama embeddings);memory-wiki 插件还能在旁边加一层带证据链的知识库。日常个人使用,默认引擎够用。

压缩前自动抢救。 会话上下文要被压缩(compaction)前,OpenClaw 会先跑一轮静默的记忆冲刷,提醒 Claw 把重要上下文存进记忆文件——默认开启(agents.defaults.compaction.memoryFlush.enabled)。所以长会话聊到一半被压缩,关键事实通常已经被写进日记层了。

本课小结 ​

✅ OpenClaw 记忆没有隐藏状态:全是 ~/.openclaw/workspace 下的 Markdown 文件 + SQLite 索引,要它记住就直说,想检查就打开文件。

✅ 四个文件分层:USER.md(用户画像,指令式条目)、MEMORY.md(长期事实与决策)、memory/YYYY-MM-DD.md(日记层,今天昨天自动加载)、DREAMS.md(做梦报告,永不注入)。

✅ 跨会话记忆两道保险:启动注入(每次会话加载 USER.md/MEMORY.md)+ memory_search 语义检索(中文 trigram 原生支持)。

✅ 2.0 跨会话召回:同一个 agent 的私聊互相可召回(个人安装默认开),群聊和别的 agent 永远不参与。

✅ dreaming 默认开启:每天凌晨 3 点三相位巩固(light → REM → deep),只有 deep 写 MEMORY.md;untrusted/system 溯源结构性排除。

✅ 旧记忆可迁移:Settings → Import Memory 从 Claude Code / Codex / Hermes 导入,落在 memory/imports/,可检索、不合并。

配置字段推荐值说明
agents.entries.<id>.memory.search.rememberAcrossConversationstrue(个人安装默认开)同 agent 私聊间跨会话召回
plugins.entries.memory-core.config.dreaming.enabledtrue(默认)后台自动巩固开关
plugins.entries.memory-core.config.dreaming.frequency0 3 * * *(默认)dreaming 扫描频率,memory-core 自动管理 cron
memory.search.provideropenai(默认)/ ollama / none语义检索的 embeddings 来源
agents.defaults.compaction.memoryFlush.enabledtrue(默认)压缩前自动把重要上下文刷进记忆文件

CLI 速查:openclaw memory status(查索引状态,需停 Gateway)、openclaw memory search "query"(可趁 Gateway 运行时跑)、openclaw memory promote(预览提升候选)、openclaw memory forget(溯源删除,先 --dry-run)。完整命令表见 CLI 命令与配置速查。

下一课预告 ​

记忆解决「记得住」;下一课 高效工作流:自动化、浏览器与 MCP 解决「自动跑」——Claw 不用你开口就能按计划干活。

你会学到:

  • 定时任务 Automations:cron、提醒与 Webhook 触发(把「周五提醒我」变成真正的定时任务)
  • 浏览器自动化:让 Claw 替你操作网页
  • MCP:给 Claw 接入外部工具和数据源
  • 面对一件事,怎么在技能、定时任务、记忆之间选对机制

相关教程 ​

搞懂AI关于我们怎么写隐私说明

独立的第三方教程,与文中提到的任何产品及其公司没有隶属或合作关系;产品名称和商标归各自所有者。价格和政策以官方页面为准。