
🧠折腾了几天,感觉总算把agent的失忆坑折腾出来了,在此做个总结,也方便我自己以后建新实例或者agent的记忆设置。
如果你也在纠结这个问题,不妨把整篇文档喂给你的龙虾,它应该自己能学会(我自己新建agent的时候也是这么做的,直接把经验总结甩给她,让她自己学)
---
📋 一、OpenClaw 的三层记忆体系
OpenClaw 有三层不同的记忆,它们各自独立、互相配合,构成一个完整的记忆系统。
第一层:大写 MEMORY.md —— 长期记忆
文件位置:~/.openclaw/workspace/MEMORY.md(每个 Agent 有自己独立的一份)
性质:人工维护的长期记忆文件,由 Agent 手动编写和更新。它是"金句本"和"核心数据库"——记录最重要、最值得留下来的信息。
典型内容:
用户的基本信息、偏好、禁忌 Agent 的身份设定(SOUL.md 的浓缩版) 重要的系统配置决策和教训 已完成的重要事项清单 工具使用经验(什么行、什么不行)
谁来写:Agent 自己在发现重要信息时主动写,或者从每日记忆(memory/)里提炼精华同步进来。没有自动写入机制,完全靠 Agent 自觉。
有什么用:每次新会话开始时,OpenClaw 会读取 MEMORY.md 作为系统上下文的一部分,让 Agent 在"失忆"重启后依然知道"我是谁、用户是谁、过去做过什么重要决定"。
第二层:小写 memory/YYYY-MM-DD.md —— 每日日记
文件位置:~/.openclaw/workspace/memory/YYYY-MM-DD.md
性质:Agent 每天的日记本,按日期命名。记录当天做了什么事、有什么进展、待跟进什么。
典型内容:
当天完成的任务清单 遇到的问题和解决方案 未完成的事项 对话中的关键上下文
谁来写:通过 Heartbeat(心跳任务)或 Cron(定时任务)自动生成。大多数 Agent 每天凌晨 0 点会自动生成前一天的日记。
第三层:LCM(lossless-claw)—— 对话全量记录
文件位置:~/.openclaw/lcm.db(SQLite 数据库)
性质:OpenClaw 的"会话录像机"。所有对话的原始消息全部存档,包括每一条用户消息和 Agent 回复,一字不漏。
技术细节:
由 lossless-claw插件提供配置项在 openclaw.json的plugins.entries."lossless-claw"下contextThreshold:上下文压缩阈值(默认 0.75) freshTailCount:保留最近多少条消息不被压缩
有什么用:
当 Agent 需要回顾"具体某句话是怎么说的"时,可以去查 LCMDB LCM 有"浓缩"机制,会把太长的历史对话压缩成摘要,只保留最近的细节 相当于"全量录像 + 智能压缩",既不丢重要信息,又不会让上下文无限膨胀
🔧 二、三层记忆的协同关系
用户发消息 ↓ OpenClaw 读取 LCMDB(最新消息 + 压缩后的历史摘要) ↓ 如果问了"用户之前说过什么" → 查 MEMORY.md(长期记忆) ↓ 如果需要了解"最近发生了什么" → 查 memory/2026-03-29.md(每日日记) ↓ Agent 综合三层记忆 + 当前输入 → 产出回复
实际例子:用户问:"Agent 3 上次整理云盘删了什么文件?" → 查 memory/ 的日记,找到相关记录。用户问:"Agent 1 的定位是什么?" → 查 MEMORY.md,找到 Agent 的身份设定。用户问:"上次和用户聊天的具体内容是什么?" → 查 LCMDB,直接读原始消息记录。
⚠️ 三、新建 Agent 时,三层记忆各缺什么
结论:刚创建的新 Agent,三层记忆全部不完整。
第一层 MEMORY.md —— 白纸一张
新 Agent 的 workspace 里可能有 MEMORY.md 文件,但内容是模板,没有真实记忆。表现:Agent 重启后不记得任何上下文,不知道用户是谁,不知道自己的职责。
第二层 memory/ —— 没有日记和定时任务
新 Agent 缺少:
- 1没有当天的 memory 文件:
memory/YYYY-MM-DD.md不存在 - 2没有每日记忆 Cron:没有定时任务自动生成每天的日记
⚠️ 教训(2026-03-30):不加 --session-key 的 isolated cron 会执行成功,但 workspace 里的文件是临时的——cron 结束后文件就消失了,看起来像"执行成功但没写入"。这个问题导致全部 5 个 Agent 的每日记忆都失效了整整一天才发现。
第三层 LCM —— 配置缺失或错误
新 Agent(或新的 OpenClaw 实例)通常在这一层最容易出问题:
- 1
plugins.slots.contextEngine没有设为"lossless-claw" - 2
plugins.entries."lossless-claw".config没有配
需要的配置:
"plugins": { "slots": { "contextEngine": "lossless-claw" }, "entries": { "lossless-claw": { "enabled": true, "config": { "freshTailCount": 32, "contextThreshold": 0.75 } } }}# 然后执行openclaw gateway restart🔍 四、Embedding 搜索:让 Agent 理解语义
在三层记忆之上,还有一套"搜索基础设施"——Embedding 搜索(向量嵌入搜索)。它不是独立的记忆层,而是让三层记忆都能被"语义理解"地查找到的能力。
什么是 Embedding(嵌入)?
Embedding 是把文字转换成"数字向量"的技术。两句话意思几乎一样,但文字不同时,向量嵌入后两句话的"数字向量"非常接近——所以语义搜索能找到它们。
Embedding 能做到的事:搜"用户的配置规则" → 能找到"改配置前必须先汇报"(文字不完全相同,但意思一样)。搜"OpenClaw 的对话记忆" → 能找到"LCM 数据库存档"。搜"每天写的日记" → 能找到"memory/ 日期文件"。
硅基流动 BAAI/bge-m3(推荐国内用户)
完全免费(free tier 足够日常使用) 国内访问,速度快 支持中文语义理解
"agents": { "defaults": { "memorySearch": { "provider": "openai", "model": "BAAI/bge-m3", "remote": { "baseUrl": "https://api.siliconflow.cn/v1/", "apiKey": "sk-你的硅基流动API密钥" } } }}混合搜索:向量 + 关键词
BAAI/bge-m3 配置好之后,OpenClaw 默认会使用混合搜索(Hybrid Search):
| 向量搜索 | ||
| 关键词搜索(BM25) |
📋 五、Heartbeat 和 Cron 在记忆系统里的角色
Heartbeat(心跳)—— 轻量定时检查
Heartbeat 是 OpenClaw 的"定期小检查"机制。每隔一定时间,Agent 会自动执行 HEARTBEAT.md 里规定的任务。
典型心跳任务:
检查今天的 memory/ 文件是否已写 检查 MEMORY.md 是否有重要内容需要更新 检查有没有遗漏的待办事项
Cron(定时任务)—— 每日记忆生成器
Cron 是"定时自动执行的任务",每天在指定时间运行一次。
⚠️ --session-key 参数是本配置最关键的地方!缺少此参数会导致 isolated session 的 workspace 文件变成临时文件,cron 执行完就消失,不会真正写入 memory/ 目录。
| 频率 | ||
| 时机 | ||
| 任务 | ||
| 独立性 |
🔧 六、新建 Agent 的完整记忆系统配置清单
第一步:检查基本文件
# 检查 workspace 里有哪些文件ls ~/.openclaw/workspace-/# 检查 memory/ 目录是否存在ls ~/.openclaw/workspace-/memory/ 第二步:配置 LCM(第三层记忆)
"plugins": { "slots": { "contextEngine": "lossless-claw" }, "entries": { "lossless-claw": { "enabled": true, "config": { "freshTailCount": 32, "contextThreshold": 0.75 } } }}# 然后执行openclaw gateway restart第三步:建每日记忆 Cron(第二层记忆)
⚠️ 必须预先创建 memory/ 目录!如果目录不存在,cron 执行时会因写文件失败而报错。这个坑在 2026-03-30 被发现——5 个 Agent 的 cron 全都因为 memory/ 目录缺失而没有真正写入文件。
openclaw cron add \ --agent <agentId> \ --name "每日记忆生成" \ --cron "0 0 * * *" \ --timezone "Asia/Shanghai" \ --task "请完成以下任务:1. 使用 lcm_expand_query 查询昨天的所有对话摘要2. 生成一份记忆文档,保存到 <workspace>/memory/YYYY-MM-DD.md3. 完成后只回复:「📝 昨日记忆已生成,文件:memory/YYYY-MM-DD.md」" \ --workspace ~/.openclaw/workspace-<agentId> \ --isolated \ --session-key "memory-<agentId>"第四步:创建 memory/ 目录
mkdir -p ~/.openclaw/workspace-<agentId>/memory/touch ~/.openclaw/workspace-<agentId>/memory/YYYY-MM-DD.md第五步:配置向量搜索
"agents": { "defaults": { "memorySearch": { "provider": "openai", "model": "BAAI/bge-m3", "remote": { "baseUrl": "https://api.siliconflow.cn/v1/", "apiKey": "sk-你的硅基流动API密钥" } } }}# 建向量索引openclaw memory index --agent <agentId>第六步:验证配置
# 检查是否有 sessionKey(非空才是正确的)openclaw cron list --json 2>/dev/null | grep sessionKey# 验证向量搜索openclaw memory search "测试query" --agent <agentId>✅ 正确的 cron 应该在 cron list 中显示 sessionKey: "memory-<agentId>"(非空);如果显示空,说明 isolated session 是临时的,文件不会真正写入。
✅ 七、常见问题
Q:LCM 的 contextThreshold 设多少合适?0.75 是默认值,意思是"当上下文超过 75% 的 token 上限时,开始压缩历史"。如果 Agent 经常聊长话题,可以适当调低(比如 0.6);如果对话普遍很短,可以调高(比如 0.85)。
Q:向量搜索和关键词搜索哪个更好?OpenClaw 默认是 hybrid 混合模式:向量占 70% 权重,关键词占 30%。两者结合效果最好,一般不需要改。
Q:每天的 memory 文件会无限积累吗?不会。每个 Agent 的 memory/ 目录下会有很多个 YYYY-MM-DD.md,但 LCM 有压缩机制,Agent 在读取历史时不会一次读进全部文件。建议每过一段时间(比如一个月),把同一个月的内容合并清理一次。
Q:Cron 跑的时候 Agent 在忙怎么办?Isolated cron 是在独立进程里跑的,不占用正常 Agent 的资源。即使 Agent 正在和人聊天,凌晨 0:00 的 Cron 也会准时执行。
Q:硅基流动的 API Key 怎么获取?访问 https://siliconflow.cn 注册账号,在个人中心 → API 密钥页面获取。BAAI/bge-m3 模型在免费额度内足够日常使用。
📚 三层记忆总结
MEMORY.md 是"金句本",memory/YYYY-MM-DD.md 是"日记本",lcm.db 是"录像机"。三层各司其职,Agent 才能真正记住"我是谁、用户是谁、过去发生了什么"。
夜雨聆风