记忆系统
OpenClaw 的记忆系统赋予 Agent 跨会话的持久记忆能力,使其能够记住用户偏好、历史决策和对话上下文,提供真正个性化的交互体验。
四层记忆架构
OpenClaw 采用 SOUL → TOOLS → USER → Session 的四层分层架构,每一层拥有不同的生命周期和加载策略。
| 层级 | 存储位置 | 生命周期 | 说明 |
|---|---|---|---|
| SOUL | SOUL.md | 永久不可变 | Agent 的人格、价值观、核心身份定义 |
| TOOLS | Skills + Extensions | 按需加载 | 当前可用工具和技能列表 |
| USER | MEMORY.md + 向量数据库 | 持久化 | 用户偏好、决策、历史事实 |
| Session | 内存 + sessions.json | 会话级 | 当前对话实时上下文 |
设计意图
分层架构确保了不可变身份(SOUL)与动态知识(USER / Session)的清晰分离。SOUL 层定义 Agent「是谁」,创建后不应被修改;而 USER 和 Session 层则随着交互持续演进。
Daily Logs(每日日志)
每天的交互记录以 append-only 方式写入 memory/YYYY-MM-DD.md 文件。
workspace/
└── memory/
├── 2026-03-08.md
├── 2026-03-09.md
└── 2026-03-10.md ← 今天的日志加载策略:Session 启动时,Agent 自动读取今天和昨天的日志,以获取近期上下文。更早的日志不会主动加载,但可通过向量记忆搜索检索。
日志格式
Daily Log 是纯 Markdown 文件,Agent 在交互过程中以追加方式写入关键事件、决策和用户请求摘要。文件只增不删,保证完整的审计轨迹。
Long-term Memory(长期记忆)
MEMORY.md 是持久化的长期记忆文件,用于存储跨会话需要保留的重要信息:
- 决策记录 — 用户做出的重要选择和偏好设定
- 用户偏好 — 沟通风格、技术栈、常用工具等
- 历史事实 — 需要长期记住的关键信息
加载限制
MEMORY.md 仅在 main / private session 中加载。群组会话(group session)不会加载长期记忆,以保护用户隐私。详见会话管理。
Agent 可以在对话过程中主动写入 MEMORY.md,但更常见的触发时机是 Pre-Compaction(自动压缩)流程。
Pre-Compaction(自动记忆保存)
当 Session 接近 token 上限时,OpenClaw 会触发自动的记忆保存与上下文压缩流程,避免关键信息丢失。
触发流程
Session token 接近阈值(约 4000 tokens 剩余)
│
▼
┌─────────────────────────┐
│ 1. 检测阈值 │
│ 监控当前 token 用量 │
└────────┬────────────────┘
│
▼
┌─────────────────────────┐
│ 2. 静默保存 │
│ 写入 MEMORY.md │
│ 写入 Daily Log │
└────────┬────────────────┘
│
▼
┌─────────────────────────┐
│ 3. 压缩上下文 │
│ 旧消息被压缩摘要 │
│ 返回 NO_REPLY │
└─────────────────────────┘对用户透明
Pre-Compaction 是一次 silent agentic turn(静默代理回合),用户不会看到任何提示。Agent 在后台自动完成保存和压缩,然后继续正常对话。返回的 NO_REPLY 标记表示这次回合不需要向用户发送消息。
压缩策略
- 较旧的消息被压缩为摘要,保留关键信息
- 最近的消息保持原样,确保对话连贯性
- 重要的决策和偏好被写入
MEMORY.md,不会因压缩而丢失
向量记忆搜索
OpenClaw 结合两种检索策略实现高质量的记忆搜索:
| 策略 | 方式 | 适用场景 |
|---|---|---|
| Embedding 向量搜索 | 语义相似度匹配 | 模糊回忆、概念关联查询 |
| BM25 关键词搜索 | 精确关键词匹配 | 精确名称、特定术语检索 |
底层存储使用 SQLite-vec,兼顾轻量部署和向量检索性能。
搜索工具
Agent 可使用两个内置工具访问记忆:
memory_search — 语义搜索
基于语义相似度检索相关记忆片段,返回约 400 token 的 chunks。
memory_search("用户上次提到的部署方案")
→ 返回语义最相关的记忆片段适用场景
当你不确定具体细节但记得大致内容时,使用 memory_search 进行模糊检索。它会综合 Embedding 和 BM25 两种策略返回最相关的结果。
memory_get — 精确读取
读取特定记忆文件的全部内容,适用于已知文件路径的场景。
memory_get("memory/2026-03-09.md")
→ 返回该文件完整内容三层记忆模型
OpenClaw 的记忆管理借鉴人类认知分层思路,将信息按提炼程度分为三层:
| 层级 | 类比 | Agent 对应 | 存储位置 |
|---|---|---|---|
| Tier 1 信息层 | 你看过的所有书 | 学习笔记、原始资料、完整对话 | memory/learning/ |
| Tier 2 知识层 | 你的读书笔记 | 每日工作日志、提炼后的知识点 | memory/YYYY-MM-DD.md |
| Tier 3 智慧层 | 你的世界观 | 跨领域洞察、底层规律、核心方法论 | MEMORY.md |
不分层的后果:所有信息堆在一起,MEMORY.md 膨胀到 500+ 行,找不到历史信息,token 消耗越来越大,记忆混乱没有结构。分层后 MEMORY.md 精简到 <100 行,查找成功率从 ~60% 提升到 ~95%,token 消耗降低 30-40%。
七个核心文件
OpenClaw 工作区中有 7 个核心文件,各司其职。核心原则:一个信息只存一个地方,不在多个文件中重复。
| 文件 | 职责 | 内容 | 更新频率 |
|---|---|---|---|
AGENTS.md | 怎么工作 | 工作流程、操作规范、任务管理规则 | 流程变更时 |
SOUL.md | 我是谁 | 人格特质、核心原则、价值观 | 很少变 |
USER.md | 我服务谁 | 用户的偏好、习惯、决策模式 | 发现新偏好时 |
TOOLS.md | 怎么操作 | 工具使用手册、命令格式、配置说明 | 配置变更时 |
MEMORY.md | 我记得什么 | 长期记忆、方法论、核心认知 | 提炼智慧时(需用户同意) |
ERRORS.md | 我在哪里失败过 | 错误记录、教训、避坑指南 | 犯错时 |
SHARED.md | 团队共识 | 多 Agent 共享的信息 | 团队决策时 |
文件大小参考
| 文件 | 典型大小 | 判断标准 |
|---|---|---|
MEMORY.md | <100 行 | 只保留跨领域洞察和核心原则 |
AGENTS.md | 300-800 行 | 只保留核心工作规则和决策流程 |
ERRORS.md | <200 行 | 保留最近 6 个月 + 经常重复的错误 |
SHARED.md | 200-500 行 | 团队共识,所有 Agent 都需要的信息 |
USER.md | <100 行 | 用户偏好和习惯 |
TOOLS.md | 视工具数量 | 工具使用说明 |
SOUL.md | <50 行 | 人格特质,很少变化 |
记忆写入的 7 种分类
不同类型的信息应写入不同文件。核心原则:不等 Heartbeat,用户做出决策时立即写入。
| 信息类型 | 写到哪里 | 触发条件 | 举例 |
|---|---|---|---|
| 用户的决策/指令 | MEMORY.md + Daily Log | 用户确认或下达指令时立即写入 | "TOOLS.md 不用启动加载" |
| 用户的偏好/习惯 | USER.md | 发现新偏好时立即写入 | "别让我来回折腾" |
| 我犯的错 | ERRORS.md + Daily Log | 犯错被纠正时立即写入 | "write 覆盖了文件" |
| 工作流程变更 | AGENTS.md + 检查 SOUL.md/MEMORY.md 同步 | 流程确认时立即写入 | "MEMORY.md 每次都读" |
| 工具/配置变更 | TOOLS.md | 配置变更确认后写入 | "飞书新增了一个权限" |
| 业务认知 | MEMORY.md + Daily Log | 需求讨论产出结论时写入 | "profile 改版核心是数据中心" |
| 闲聊/临时讨论 | 不记 | — | "你在吗" |
Heartbeat 记忆整理
Heartbeat 每 30 分钟触发一次,但记忆整理每 6 小时一次(太频繁浪费 token,太久容易遗漏,6 小时一天 4 次刚好覆盖工作时段)。
整理流程:
- 检查
memory/heartbeat-state.json中的lastMemoryReview时间戳 - 如果距离上次整理 < 6 小时 → 跳过整理,发送"一切正常"
- 如果需要整理 → 读取最近的
memory/YYYY-MM-DD.md(自上次整理后的新内容) - 提炼到对应文件:经验教训/业务认知 →
MEMORY.md,用户偏好/习惯 →USER.md,犯的错误 →ERRORS.md - 清理过时信息:已完成的待办事项、被新决策覆盖的旧决策
- 同步更新相关文件(如有流程变化)
- 更新
heartbeat-state.json时间戳 - 生成记忆整理报告
Dreaming 记忆机制(2026.4.5+)
Dreaming(做梦) 是 2026.4.5 引入的实验性长期记忆机制,它让 OpenClaw 像人类一样通过后台"睡眠"把零散的 Daily Log 片段提炼为可持久召回的知识。
三个协作阶段
Dreaming 不再是单一循环,而是三个独立调度、独立恢复的协作阶段:
| 阶段 | 类比 | 主要工作 |
|---|---|---|
| Light(浅睡) | 小憩 | 短期记忆快速整理、热点内容加权 |
| Deep(深睡) | 深度睡眠 | 把 Daily Log 分块后送入持久化候选,重复运行是 replay-safe 的,不会在 MEMORY.md 里产生重复条目 |
| REM(快速眼动) | 做梦 | 扫描阶段性真相、生成概念标签,多语言可用;输出写入顶层 dreams.md |
每个阶段都可以单独开停或按自己的节拍运行;doctor / status 提供恢复支持。
/dreaming 命令与 Dreams UI
/dreaming命令 —— 聊天中查看/触发 dreaming 状态- Dreams 面板 —— Control UI 里直接查看被提炼的"梦境"
- Dream Diary —— 列出按日期聚合的 dreaming 产物,龙虾 Logo 动画一直浮在内容之上
配置与调试
用户层面的配置保持极简:
{
"memory": {
"dreaming": {
"enabled": true,
"frequency": "normal",
"recencyHalfLifeDays": 7,
"maxAgeDays": 90
}
}
}recencyHalfLifeDays/maxAgeDays控制召回衰减曲线- 开启 verbose 日志可审阅每一次晋升决策
- 新增调试工具:
openclaw memory rem-harness—— 试跑 REM 阶段openclaw memory promote-explain—— 解释某条记忆为什么被晋升
dreams.md 与日常记忆的关系
Dreaming 的 trail 内容写入顶层 dreams.md,不会被拉入默认召回,但可以显式读取。这是为了把 dreaming 的"推测性产物"与 Daily Log / MEMORY.md 的"确认事实"清楚分开。
Bedrock Embeddings 向量后端(2026.4.5+)
除了默认的 SQLite-vec,2026.4.5 起你可以把向量记忆挂到 Amazon Bedrock 上,使用 Titan、Cohere、Nova、TwelveLabs 等 Embedding 模型:
{
"memory": {
"embeddings": {
"provider": "auto",
"bedrock": { "model": "amazon.titan-embed-text-v2" }
}
}
}provider: "auto" 会自动走 AWS 凭证链(环境变量 / IAM 角色 / SSO),向量维度按具体模型自动设定。
记忆系统最佳实践
给 Agent 配置者的建议
- SOUL.md 写好就不要改 — 它定义了 Agent 的核心身份,频繁修改会导致人格不一致
- 善用 MEMORY.md — 重要的用户偏好和决策应该被记录,而不是依赖 Session 上下文
- Daily Log 自动管理 — 无需手动维护,Agent 会自行追加
- 信任 Pre-Compaction — 长对话中不必担心信息丢失,自动压缩会保留关键内容
- 文件写入铁律 — 写入已有文件永远用 edit 追加,绝不用 write 覆盖。write 会覆盖整个文件,导致已有内容全部丢失。只有创建全新文件时才用 write。