龙虾AI · OpenClaw 智能体生态导航 龙虾AI(OpenClaw)中文资料与下载导航
OpenClaw 记忆概览页开头的截图:四类记忆文件的清单
USER.md、MEMORY.md、每日笔记、DREAMS.md 四类文件在官方记忆概览页上的原文,2026 年 10 月截图

配置 · 记忆

查看、删除和关闭 OpenClaw(龙虾)记忆的命令和文件位置

龙虾记下来的东西都在 agent 的工作区里,是一批普通的 Markdown 文件,工作区默认是 ~/.openclaw/workspace。相关的文件有四类:USER.md、MEMORY.md、memory/ 目录下按日期命名的每日笔记,以及 DREAMS.md。官方的记忆概览对它的定性是:模型只记得存到磁盘上的东西,没有隐藏状态。想知道它记了你什么,打开这几个文件就能看到。

下面的命令由内置的 memory-core 提供(默认就是它),参数见 memory 命令文档:openclaw memory status 看索引和 Dreaming 的状态,openclaw memory search 按内容搜;要删掉某次对话留下的记忆,用 openclaw memory forget,第一次执行带上 --dry-run。不想让它在后台自己往 MEMORY.md 里写东西,把配置里的 plugins.entries.memory-core.config.dreaming.enabled 设成 false,或者在聊天里发 /dreaming off。

OpenClaw 的记忆存在哪:四类文件和各自在工作区的位置

四类文件的路径都相对于工作区目录:

文件里面记什么什么时候被读进对话
USER.md(可选)稳定的偏好、沟通风格、人际关系、正在进行的项目背景,写成指令式的条目会话开始时加载,占一份单独的小额度
MEMORY.md长期记忆:个人画像以外的持久事实和决定会话开始时加载
memory/YYYY-MM-DD.md
memory/YYYY-MM-DD-<slug>.md
每日笔记:当天的上下文、观察、会话摘要今天和昨天的两份在不带参数的 /new 或 /reset 时自动加载;每日笔记不会每轮都注入,平时由 agent 用 memory_search、memory_get 去查
DREAMS.md(可选)Dream Diary 和后台整理各阶段的摘要给人审阅用的记录

同一个工作区里还有几处也存着和记忆有关的内容,翻的时候一起看:

  • memory/imports/codex/、memory/imports/claude-code/、memory/imports/hermes/:在 Control UI 里从 Codex、Claude Code、Hermes 导入过记忆的才有(入口之一是 Settings → Import Memory)。导入的文件单独放在这里,不并入 MEMORY.md,但能被 memory_search 搜到。
  • memory/dreaming/<phase>/YYYY-MM-DD.md:后台整理每个阶段的独立报告,默认会写。
  • memory/.dreams/:会话语料(从会话转录里读入、供 Dreaming 整理用的文本)。memory session-backfill --apply 把语料写在这里,和 Dreaming 共用同一套语料存储。

搜索用的索引不在这些文件里。默认的内置引擎基于 SQLite,索引在 agent 自己的数据库 ~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite 里。这个数据库同时装着会话和转录(会话的原始聊天记录),后面讲清空的时候还会提到它。

工作区不在默认位置的,执行 openclaw config get agents.defaults.workspace 查配置里写的是哪个目录。

配了多个 agent,记忆是分开的还是共用的

记忆文件跟着工作区走,索引库的路径里带着 agent 的 ID。每个 agent 用自己的工作区时,记忆各管各的;几个 agent 指向同一个工作区,文件就是共用的。forget 一次只处理一个 agent 的存储。在一个 agent 上 forget 过,另一个 agent 的索引要另外检查;对它再执行一次带 --agent 的 forget,命令会去查它自己的索引快照。

不带 --agent 时,命令的默认范围分两种:

  • memory status、memory index、memory reset 对 agents.entries 里的每个 agent 都执行;没配 agent 列表的,落到默认 agent 上。
  • memory search、memory forget 只管默认 agent。

多 agent 的机器上查和删,都把 --agent <id> 写明。工作区怎么按 agent 分开,见《一台龙虾跑多个 agent:工作和私人分开怎么配》。

怎么查看 OpenClaw(龙虾)现在记了我哪些内容

最直接的办法是用编辑器打开文件。USER.md 和 MEMORY.md 每次会话开头都会读进去,优先看这两份;每日笔记按文件名里的日期往回翻。

文件多了以后用命令搜。三条常用命令:

openclaw memory status
openclaw memory search "query"
openclaw memory index --force

status 显示索引状态和用的是哪家嵌入服务,输出里还会列出 memory.search.extraPaths 配的额外搜索路径。那些路径下的文件同样在检索范围内。search 在配了嵌入服务时走的是混合搜索,向量相似度加关键词匹配,换一种说法也可能搜得到。

搜不到不等于没记。自动索引失败过,或者索引和当前设置不兼容时,输出会带一条警告,说匹配结果可能不全;加了 --json 的,响应里会多出 stale: true,空结果只有不带 stale 时才能当真。看到这条警告,先按输出里给的处理办法做。原因是换过嵌入设置、索引对不上的,修法是三条命令:

openclaw memory status --deep --agent <id>
openclaw memory index --force --agent <id>
openclaw memory status --agent <id>

--force 是全量重建,带上 --agent 只动出问题的那个 agent。

建索引时笔记会不会发到云端

OpenClaw 默认的嵌入服务是 OpenAI。嵌入走云端接口时,被索引的笔记文本要发给那家服务才能算出向量。不想让建索引这一步把笔记发出去的,memory.search.provider 的可选项里有 local GGUF、Ollama 和 LM Studio。

某次对话里说了不该留的东西,怎么从记忆里删掉

用 openclaw memory forget。它按会话删:选中一场或几场会话,把能认出来源于这些会话的记忆条目清掉,并把这些会话登记为「已遗忘」。它不能按内容删,选择器匹配的是记录下来的标识符,不是消息里出现的名字或文字。

--session、--hook-source、--participant 三个之间是「或」的关系,至少给一个;--since 是加在选中结果上的时间限制:

  • --session <id-or-key>:会话 ID 或 key,可以重复写。ID 要完整,区分大小写,缩写选不中更长的 ID。
  • --hook-source <source>:按外部内容的来源选,Gmail 钩子写 gmail,IMAP 写 email,通用 webhook 写 webhook。
  • --participant <actor-id>:按参与者的 actor ID 选,选中的是整场会话,里面别人说的话也一起算。
  • --since <date>:只算这个日期及之后创建的会话。文档建议写带时区的 ISO 时间戳;它看的是会话的创建时间,不是单条消息的时间。

--hook-source 和 --participant 只能选中还在线的会话。已归档的会话没有保留这两项信息,要用完整的 ID 或 key 去选。

会话的 key 用 openclaw sessions --agent <id> 列出来;列表里太长的 key 只显示头尾,完整的 key 看 openclaw sessions --agent <id> --json 输出里每场会话的 key 字段。默认只列最近 100 场,更早的加 --limit all。拿到以后先预览:

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

这一步必须做。命令文档的警告是:不带 --dry-run 就立即删除,没有确认提示,也没有 --apply 之类的第二道开关。预览报告里看这几项:

报告字段看什么
sessionResolutions每个会话标成 live、archived 还是 unresolved。unresolved 表示没找到这场会话,只是把你给的值原样记下来供以后排除
mixedLineageEntryKeys同时还来源于别的会话的条目。它们会被整条删掉,不会改写成只留别处的部分
curatedWrites需要你自己打开检查的文件。列在这里不代表文件会被删
refusals需要人工复核的历史整合摘要。列表为空也不说明删干净了

看到 unresolved 先核对给的 ID 或 key,别急着去掉 --dry-run;mixedLineageEntryKeys 里有想留的条目,先把原文抄出来。预览不是锁,预览和真删各读一次当前状态;agent 自己的编辑和外部写入不和 forget 共用同一把锁,清理敏感内容期间先把它们停掉。

选中了会话的真删,还会清空这个 agent 的整份嵌入缓存,并清掉 Dreaming 叙述、cron、heartbeat 这类内部会话的过期索引记录;被改动的记忆文件可能要整份重新索引。预览报告里有整份缓存的清除数量。

核对完,把同一条命令去掉 --dry-run 再执行一次。删除不是一个覆盖所有文件和存储的事务,中途失败的话,先解决报出来的存储或文件系统错误,用同样的选择器重跑同一条命令,不要手工去删它的语料和来源记录。成功以后再带 --dry-run 跑一遍,看还剩什么。

删完以后,这些会话 ID 会留在 agent 的数据库里。后台整理的自动读入、memory session-backfill、转录索引(包括 memory index --force)都会查这份名单,同一场会话不会被重新读回记忆。重复执行不会解除排除;以后新开的会话 ID 不同,不受影响。

forget 删不到哪些地方

下面这些 forget 不会动,要另外处理:

  • 会话的原始转录保留。删除会话通常也会留一份已删除转录的归档,那不等于抹掉了这场对话的所有副本。
  • 没有来源标记的转述留着。DREAMS.md 和 memory/dreaming/**/*.md 里逐字引用语料的行可以整行删掉,换了说法的认不出来。
  • 来源追踪功能出现之前暂存的条目,可能没有来源记录,会留下来。
  • 其它 agent 的索引、导出文件、外部备份,都要另外检查。

执行完 forget,我建议用 openclaw memory search 搜那段内容里的关键词,再打开 curatedWrites 列出的文件看一遍。

只想去掉 MEMORY.md 里的某一句

forget 的粒度是整场会话,做不到只删一句。记忆文件是普通 Markdown,我的建议是直接打开文件把那一行删掉,再到每日笔记和 DREAMS.md 里搜一下同样的内容。写入 MEMORY.md 之前会重新读一遍每日笔记当前的内容,排序之后你在笔记里改掉、删掉的片段按改后的算,不拿旧快照去写。

改完执行 openclaw memory index --agent <id>,让索引按文件现在的样子更新。改的时候别让 agent 同时在写这个文件。

怎么清空 OpenClaw 的全部记忆,memory reset 能不能做到

openclaw memory reset 清空的是内置的记忆索引和嵌入缓存,会话、转录和记忆文件都不删。它不是隐私清除:要去掉来源于某些会话的记忆并防止重新读入,用 memory forget。

openclaw memory reset --agent main --yes
openclaw memory index --agent main

第一条清索引,第二条从留下来的文件重建。main 换成你的 agent ID;不带 --agent 时对所有已配置的 agent 执行。命令会要求确认,--yes 跳过确认,在非交互终端里必须带,想看到确认提示就去掉它。文档对两条命令的分工是:重建用 memory index --force,清空派生索引和嵌入缓存用 memory reset。换了嵌入设置之后索引对不上的,修法是前面那三条命令。

不要去删 openclaw-agent.sqlite。文档的警告是:这个数据库里还有会话、转录和其它持久的 agent 状态,绝不要为了重置记忆索引删掉它,或者删它旁边 -wal、-shm、-journal 结尾的文件。

reset 清不到记忆的正文。正文是工作区里的 Markdown 文件,想让它不带旧内容开场,只能动文件本身。下面是我的建议,不是文档里的流程:先按《OpenClaw 升级、回滚与彻底卸载》做一份整体备份,再把 MEMORY.md、USER.md 和 memory/ 目录移到工作区外面留着,不直接删,然后执行上面的 reset 和 index。移走以后,会话和转录还在 openclaw-agent.sqlite 里;Dreaming 没关的话,之后还会往新的 MEMORY.md 里写。

关闭 OpenClaw 的记忆要关哪几处开关

Dreaming 和压缩前的自动保存默认都是开的,各有一个关闭键。

Dreaming:把每日笔记提炼进 MEMORY.md 的后台整理

Dreaming 默认的计划是 0 3 * * *(cron 写法,每天 3 点跑一次),这条定时任务由 memory-core 插件自己管理。

写进 MEMORY.md 之前要过三道门槛:默认值是分数不低于 0.75、被召回至少 3 次、来自至少 3 个不同的查询;只有来源是 owner 或 agent 自己的条目才有资格,不受信任的和系统产生的候选不会进入长期记忆。每个阶段的摘要写进 DREAMS.md,可以拿它来对照 MEMORY.md 里多了什么。

下面两段都是要并进现有配置的片段。文件里已经有 plugins 或 agents 这一层的,把里面的键加到已有的那一层,不要另写一个同名的顶层键,也不要拿片段覆盖整个文件。配置校验是严格的,键写错 Gateway 会拒绝启动;改完执行 openclaw doctor 看有没有报错。

关掉 Dreaming,在 ~/.openclaw/openclaw.json 里写:

{
  "plugins": {
    "entries": {
      "memory-core": {
        "config": {
          "dreaming": {
            "enabled": false
          }
        }
      }
    }
  }
}

也可以在聊天里切换:/dreaming off 关,/dreaming on 开,/dreaming status 看状态。开和关要求你是这个渠道的 owner,或者有网关的 operator.admin 权限;看状态没有这个限制。改完用 openclaw memory status 核对输出里 Dreaming 那一行。

压缩前的自动保存(memory flush)

对话太长需要压缩时,OpenClaw 会在压缩之前插一轮你看不到的对话,提醒 agent 把重要的上下文存进持久记忆。Memory Core 的做法是写进工作区的记忆文件。关掉它的键是 agents.defaults.compaction.memoryFlush.enabled:

{
  "agents": {
    "defaults": {
      "compaction": {
        "memoryFlush": {
          "enabled": false
        }
      }
    }
  }
}

这两处都关了,还有哪些地方会往记忆里写

内置的 session-memory 钩子启用时也会写:它把对话摘录存进工作区的 memory/ 目录,带 slug 的每日笔记有的就是它写的。停用它的命令是:

openclaw hooks disable session-memory

agent 自己也会动手写。OpenClaw 生成的那份工作区说明仍然鼓励 agent 边干活边把持久的事实记下来;你对它说一句「记住我偏好 TypeScript」,它也会把这条写进合适的文件。记忆配置参考对这一类的说法是:某个会话完全不该写记忆文件的,用工具权限和钩子配置去限制。

配置参考里没有一个把这几处一起关掉的总开关。后台的自动写入要分别关:dreaming.enabled 和 memoryFlush.enabled 设成 false,停掉 session-memory 钩子。这三处都关了,agent 在对话里照样可以自己往记忆文件里写,要连这一类也拦住,用上面说的工具权限去限制。

记忆搜索另有一个开关:配置里 memory.search 下的 enabled,默认是 true。配置参考对它只写了「开启或关闭记忆搜索」一句,管的是检索,没有说关掉以后上面几处还写不写;要停写入,按各自的开关关。

常见问题

memory forget 之后,那次对话的聊天记录还在吗?
那场会话的原始转录会保留。forget 删的是能认出来源于所选会话的记忆条目和转录索引块,同时清空这个 agent 的整份嵌入缓存。删除会话通常也会留一份已删除转录的归档,其它 agent 的索引、导出文件和外部备份都要另外检查。
从 Codex、Claude Code 导入的记忆存在哪个目录?
放在所选 agent 工作区的 memory/imports/codex/、memory/imports/claude-code/ 或 memory/imports/hermes/ 下,和 MEMORY.md 分开。这些文件能被 memory_search 搜到、用 memory_get 读取,但不并入 MEMORY.md。导入只复制 Markdown 记忆文件,源文件保持不变。
memory forget 删错了,还能恢复吗?
命令文档写明的几条都指向不能撤销:不带 --dry-run 立即删除,没有确认提示;被遗忘的会话记在 agent 的数据库里,重复执行不会解除排除,session-backfill --rollback 也不会把它们放回来。那场会话的原始转录不受影响。真删之前先跑 --dry-run --json。