11.4 记忆系统深入
想象一下这个场景:
你问 OpenClaw:"上周客户张三说的那个关键需求是什么来着?"
OpenClaw 回复:"抱歉,我没有找到相关记录。"
你:"不可能啊,我明明跟你说过的!"
翻开 memory/ 目录,发现那条记录在上周的日志里——但已经被 Compaction 压缩掉了。
记忆丢失了。
这就是理解记忆系统的重要性——知道它怎么工作,才能防止记忆丢失,才能让 AI 真正"记住"你想要它记住的事。
这一节,我们用 25 分钟,深入理解 OpenClaw 的记忆系统原理。
准备工作
开始前,确认你有:
- [x] OpenClaw 已运行过一段时间(有记忆记录)
- [x] Obsidian 已打开工作区
- [x] 约 25 分钟时间
第一步:理解两层记忆架构
OpenClaw 有两层记忆,就像你有一个"日记本"和一个"档案柜"。
1.1 日记本(memory/ 目录)
特点:
| 属性 | 说明 |
|---|---|
| 位置 | memory/YYYY-MM-DD.md |
| 格式 | 每天一个文件 |
| 写入方式 | 仅追加,不修改 |
| 生命周期 | 短期(默认 30 天) |
| 用途 | 记录当天对话、临时信息 |
示例内容:
# 2026-03-10
## 今日对话
- 用户让我帮忙写周报
- 确认了客户张三的需求变更
- 讨论了新项目的排期
## 新学到的
- 用户喜欢更简洁的列表格式
- 客户张三的项目延期到3月底
- 王五的联系方式是 wangwu@example.com在 Obsidian 中查看:
打开 memory/ 目录,可以看到每天的日志。最新的是今天,往下翻是之前的记录。
1.2 档案柜(MEMORY.md)
特点:
| 属性 | 说明 |
|---|---|
| 位置 | MEMORY.md (工作区根目录) |
| 格式 | 单个文件,手动整理 |
| 写入方式 | 精心编辑,结构化 |
| 生命周期 | 长期有效 |
| 用途 | 存储重要信息、用户偏好、持久规则 |
示例内容:
# 长期记忆
## 用户偏好
- 喜欢简洁的回复,不要废话
- 用中文交流
- 代码块要加语法高亮
## 重要客户
- [[客户张三]] - 电商项目,偏好周报形式
- [[客户李四]] - 咨询项目,需要详细文档
## 项目信息
- #项目/电商 - 预计3月上线
- #项目/官网 - 已完成设计阶段
## 持久规则
- 每次回复结尾问"还有其他需要吗?"
- 代码块必须加语法高亮1.3 两者的协作关系
对话发生 → AI 判断重要性 →
├── 临时信息 → 写入 memory/YYYY-MM-DD.md (日记本)
└── 重要信息 → 写入 MEMORY.md (档案柜)
定期整理 → 日记本中的重要内容 → 归档到 MEMORY.md第二步:记忆搜索机制
2.1 关键词搜索(BM25)
默认启用。AI 用关键词匹配搜索记忆:
查询:"客户张三"
匹配:包含"客户"、"张三"的记录优点: 快速,精确 缺点: 语义相似但用词不同时可能漏掉
2.2 向量搜索(语义搜索)
OpenClaw 支持向量嵌入,实现语义搜索:
查询:"那个电商项目的联系人"
匹配:即使没有"联系人"这个词,也能找到客户张三的记录2.3 配置向量搜索
编辑 ~/.openclaw/openclaw.json:
{
agents:{
defaults:{
memorySearch:{
provider:"openai", // 或 "local" 使用本地模型
model:"text-embedding-3-small",
remote:{
apiKey:"YOUR_API_KEY"
}
}
}
}
}2.4 混合搜索(推荐)
结合语义搜索和关键词搜索,效果最好:
{
agents:{
defaults:{
memorySearch:{
query:{
hybrid:{
enabled:true,
vectorWeight:0.7, // 语义权重
textWeight:0.3 // 关键词权重
}
}
}
}
}
}效果对比:
| 查询 | 纯关键词 | 混合搜索 |
|---|---|---|
| "Mac Studio gateway host" | 可能漏掉"运行 gateway 的机器" | 能找到语义相似的记录 |
| "a828e60" | 精确匹配 | 精确匹配 |
| "上周那个客户说的需求" | 可能找不到 | 能找到相关记录 |
2.5 测试搜索效果
在 Obsidian 中打开 memory/ 目录,找一个记录。
然后问 OpenClaw:
搜索记忆,找到关于 [你找的内容] 的记录。
看看 AI 能不能找到。
第三步:理解 Compaction 和记忆丢失
3.1 什么是 Compaction?
OpenClaw 的会话有 token 限制。当接近上限时,会触发压缩(Compaction):
会话开始 ──────────────────────────────> 接近上限
↓
Compaction 触发
↓
早期对话被归档/丢弃风险: 压缩前的内容如果没有写入记忆文件,就会丢失。
3.2 Compaction 的触发条件
| 配置 | 默认值 | 说明 |
|---|---|---|
softThresholdTokens | 4000 | 开始警告的 token 数 |
hardThresholdTokens | 8000 | 强制压缩的 token 数 |
3.3 自动记忆刷新
OpenClaw 会在压缩前自动触发一轮静默写入:
{
agents:{
defaults:{
compaction:{
memoryFlush:{
enabled:true,
softThresholdTokens:4000,
systemPrompt:"Session nearing compaction. Store durable memories now."
}
}
}
}
}这意味着: 即使你不说,AI 也会在会话即将压缩前尝试保存重要记忆。
3.4 你的保护措施
规则 1: 重要内容立即固化
记住:客户张三的项目延期到3月底。 把这个信息写入 MEMORY.md 的长期记忆部分。
规则 2: 定期整理日记本
每周花 5 分钟,在 Obsidian 里: 1。 打开 memory/ 目录 2。 浏览最近一周的日志 3。 把重要信息复制到 MEMORY.md
规则 3: 使用 Obsidian 检查
打开 Obsidian,看看 MEMORY.md 是否包含你认为重要的信息。
第四步:记忆最佳实践
4.1 什么值得记住
| 类型 | 是否写入 MEMORY.md | 示例 |
|---|---|---|
| 用户偏好 | ✅ 是 | "我喜欢简洁格式" |
| 客户信息 | ✅ 是 | "张三的邮箱是 xxx" |
| 项目状态 | ✅ 是 | "电商项目延期到3月" |
| 持久规则 | ✅ 是 | "每次回复加 emoji" |
| 临时对话 | ❌ 否 | 日常问答 |
| 一次性任务 | ❌ 否 | "帮我写个周报" |
4.2 让 AI 知道什么重要
在 SOUL.md 中添加:
## 记忆规则
### 必须写入长期记忆的信息
- 用户明确说"记住这个"的内容
- 客户的联系方式、偏好
- 项目的重要节点和状态变更
- 用户的持久偏好
### 只需临时记录的信息
- 日常问答
- 一次性任务
- 已经完成的待办事项4.3 记忆格式规范
推荐格式:
# 长期记忆
## 用户偏好
- [偏好描述] #标签
## 重要人物
- [[姓名]] - [关系/角色] - [关键信息]
## 项目状态
- #项目/[项目名] #状态/[状态] - [描述]
## 待办事项
- [ ] [待办内容] #优先级/[级别]4.4 记忆清理
定期(每月)在 Obsidian 中:
1。 打开 MEMORY.md 2。 检查是否有:
- 过期的信息(项目已完成)
- 重复的信息(同一客户多处记录)
- 冲突的信息(前后矛盾) 3。 整理、合并、删除
第五步:记忆对账自动化
5.1 什么是记忆对账?
确认 AI 记住的内容 = 你想让它记住的内容。
5.2 手动对账
定期问 OpenClaw:
查看你的 MEMORY.md,告诉我你记住了哪些关于我的重要信息。 有没有你认为重要但我没有记下来的?
5.3 创建对账清单
在 memory/audit-checklist.md:
# 记忆对账清单
## 每周检查
- [ ] 用户偏好是否准确
- [ ] 客户信息是否完整
- [ ] 项目状态是否最新
- [ ] 是否有重复或冲突的记忆
## 检查命令
发送给 AI:"帮我检查并整理 MEMORY.md,删除过期的,合并重复的"5.4 用 HEARTBEAT 自动对账
在 HEARTBEAT.md 中添加:
## 每周记忆检查(周日 21:00 执行)
- [ ] 检查 memory/ 目录,整理重要信息到 MEMORY.md
- [ ] 删除已确认过期的记忆
- [ ] git commit 记忆变更第六步:高级记忆配置
6.1 记忆保留时间
{
agents:{
defaults:{
memory:{
retentionDays:30 // 日记本保留天数
}
}
}
}6.2 记忆索引
OpenClaw 使用 SQLite + FTS5 建立记忆索引,支持:
- 全文搜索
- 向量搜索(如果配置)
- 混合搜索
索引文件位于:~/.openclaw/memory.db
6.3 多 Agent 记忆隔离
每个 Agent 有独立的工作区,记忆也是隔离的:
~/.openclaw/
├── workspace/ # 默认 Agent 的记忆
│ ├── MEMORY.md
│ └── memory/
├── workspace-lead/ # lead Agent 的记忆
│ ├── MEMORY.md
│ └── memory/
└── workspace-dev/ # dev Agent 的记忆
├── MEMORY.md
└── memory/故障排查
| 问题 | 检查步骤 |
|---|---|
| AI 找不到记忆 | 确认记忆文件存在;检查搜索配置 |
| 记忆没有更新 | 确认 AI 有写入权限;检查文件是否被锁定 |
| 向量搜索不工作 | 检查 API key 是否正确;确认 provider 配置 |
| Compaction 太频繁 | 调整 threshold 值;减少单次对话长度 |
| 记忆文件损坏 | 从 Git 恢复;检查文件编码 |
试一试
练习 1: 查看记忆结构
1。 在 Obsidian 打开 memory/ 目录 2。 看最近一周的日记本内容 3。 对比 MEMORY.md,看看哪些该整理过去
练习 2: 测试向量搜索
1。 配置向量搜索 2。 问 OpenClaw:
搜索记忆,找到关于"我喜欢什么格式"的内容。
3。 看看它能否找到相关记录,即使措辞不同
练习 3: 记忆对账
1。 问 OpenClaw:
查看你的 MEMORY.md,列出你记住了哪些关于我的信息。
2。 检查是否有遗漏或错误
练习 4: 配置混合搜索
编辑 ~/.openclaw/openclaw.json,启用混合搜索,测试效果。
记忆系统最佳实践总结
| 实践 | 说明 |
|---|---|
| 重要信息立即固化 | 说"记住这个",并要求写入 MEMORY.md |
| 每周整理 | 把日记本里的重要内容归档到 MEMORY.md |
| 定期对账 | 每月检查一次 MEMORY.md 的准确性 |
| Git 备份 | 每次重要变更后 commit |
| Obsidian 可视化 | 用 Obsidian 定期浏览和整理 |
| 配置混合搜索 | 结合语义和关键词搜索 |
这一节,你了解了
| 学了什么 | 核心理解 |
|---|---|
| 两层记忆 | 日记本(memory/ 临时)+ 档案柜(MEMORY.md 长期) |
| 搜索机制 | BM25 关键词 + 向量语义 + 混合搜索 |
| Compaction | 会话压缩前的自动刷新机制 |
| 防止丢失 | 重要信息立即固化,定期整理 |
| 最佳实践 | 对账、备份、可视化三件套 |
下一节
记忆系统搞懂了,但 OpenClaw 和 Obsidian 还能更深一步结合。
下一节,我们讲:软链接与多 Agent 知识共享 —— 让多个 Agent 共用同一个 Obsidian 知识库。