年后我在一台独立的 Mac mini 上重新开始养一只龙虾——我的 AI 助手 OpenClaw。 “养”这个字很有趣:我不指望它一上来就是完美的数字员工,而更像玻璃缸里的一只小虾。所以,我最常用的不是飞书、Discord,而是给 Mac mini 配了一块屏幕,方便我透过透明的缸壁,精细地观察它每天的变化。看它忙忙碌碌、移来搬去,搭建和改造自己的地盘,偶尔也会伸手拨弄它的窝,看看它藏了什么“脑洞大开”的东西。有时敲敲缸壁,提醒它别把自己折腾死。这个过程充满“养”的趣味。
在近距离观察中,我发现一开始小虾的记忆力堪比金鱼——有,但不多。于是,我决定动手拯救它的记忆。这是一条循序渐进的主线: Markdown 记忆文件分层分类 → 从主动记录到心跳补漏 → 夜间反思知识整理 → QMD 增强记忆搜索 → Context Engineering 适配 → 利用 SQLite 回顾一天摘要 → Memory deep search 混合检索。
本篇先讲第一环:如何构建内部记忆的分层结构,让龙虾告别“金鱼记忆”。
1. 最初的问题:一个巨大的 MEMORY.md
默认情况下,龙虾记东西只分“重要”与“不重要”。
-
重要的就塞进
MEMORY.md里。 -
不重要的就看心情往
memory/YYYY-MM-DD.md当天文件里写。
当我对它说“记住……”时,它会将重点记到 MEMORY.md。这个文件很快就膨胀到 50KB,每次执行任务都要加载全部内容,token 消耗高达 15K,效率极低。
隔几天我主动问龙虾:“你都记了什么?”让它把 MEMORY.md 晒出来,一起增删改查,短期记忆确实有改善。但问题在于:我们真正需要的是轻重缓急的区分,而不仅仅是“重要”。
2. 第一步拆分:重要与紧急 → 引入 NOW.md
我意识到,“重要”之外还有“紧急”——那些近期需要盯着做的事。 于是,我把 MEMORY.md 中并不那么重要、但必须近期完成的任务,移到新的 NOW.md 文件里:
# NOW.md — 当前事项
### 2026-03-13 10:00 更新
**当前优先级:**
1. 完成 TTS 服务迁移测试
2. 整理 lessons 分类
3. 优化 memlog.sh 脚本
**待办:**
- [ ] 检查 mlx-audio 端口占用
- [ ] 更新 INDEX.md 健康度
- [ ] 与 Obsidian 同步本周复盘
这样一来,MEMORY.md 里只剩下真正的“重要且长期有效”的内容(如核心原则、全局配置)。而 NOW.md 记录了近期优先级,龙虾每次任务前加载 MEMORY.md + NOW.md,体积大大减小。但 MEMORY.md 依然会慢慢变胖——需要进一步归类。
3. 第二步归类:重要内容按类型拆分
重要事项里,有的是经验教训(lessons),有的是重大决策(decisions),有的是项目状态(projects),还有用户偏好(preferences)。把它们拆到独立的文件夹,一个文件只说一件事,文件名一目了然:
memory/ ├── lessons/ # 踩坑 + 解决方法 ├── decisions/ # 重大决策记录 ├── projects/ # 项目状态追踪 └── preferences/ # 用户偏好配置
例如 memory/decisions/TTS 服务迁移至 mlx-audio.md:
## 2026-03-13 — TTS 服务迁移至 mlx-audio
**决策**:从 Qwen3-TTS HTTP wrapper 迁移到 mlx-audio
**原因**:
- omlx TTS 支持延期(等待成本过高)
- mlx-audio 已验证可用(eric 音色测试通过)
**执行**:
- 编写自定义 HTTP 服务(兼容 OpenAI 接口)
- 配置 launchd 自启动
- 回收 12.6GB 闲置模型缓存
**状态**:✅ 已完成
每个分类下文件越来越多,如果每次任务都加载全部,又回到原点。这时需要渐进式披露——就像 Skills 机制:先只加载功能描述和触发场景,需要时再加载完整技能。 于是,我们引入 INDEX.md,作为所有分类的索引。
4. 索引文件 INDEX.md:渐进式披露的钥匙
INDEX.md 记录每个分类下的文件列表、最后修改时间、健康度概览。例如:
## 健康度概览
- 🔴 重要知识:18 个 ✅
- ⚠️ 过时 (>30 天): 0 个
**知识库总计:18 文件**
- lessons: 10 个
1. ACP Codex 配置陷阱.md
2. TTS 服务迁移流程.md
3. 飞书语音消息修复.md
...
- decisions: 6 个
1. TTS 服务迁移至 mlx-audio.md
2. 模型路由策略.md
...
- projects: 2 个
...
龙虾每次任务只加载 MEMORY.md + NOW.md + INDEX.md,体积很小。当它需要某个具体知识时,根据索引去读取对应的 .md 文件。这样既保证了上下文精简,又保留了完整知识的可访问性。
5. 拆分前后的效果对比
| 指标 | 拆分前 | 拆分后 |
|---|---|---|
| MEMORY.md 大小 | ~50KB | ~5KB |
| 单次加载 token | ~15K | ~3K |
| 知识文件检索 | 全量扫描 | INDEX 定向 |
| 记忆整理方式 | 人工整理 | 自动路由 |
| 记忆加载成本 | 高 | 低(渐进式披露) |
6. 每日流水账:照常记,但有规范
重要事项交给分类文件夹,日常流水账依然保留在 memory/YYYY-MM-DD.md。但强化两点规则:
-
状态变化必记:切换任务、阶段性完成、需要用户帮助等,都要主动记。
-
只追加不覆盖:按时间线顺序追加,每次记录前检查是否已存在。
为了方便,我写了一个小脚本 memlog.sh:
# memlog.sh "标题" "内容"
date_str=$(date "+%Y-%m-%d")
time_str=$(date "+%H:%M")
log_file="memory/$date_str.md"
echo "### $time_str — $1" >> "$log_file"
echo "$2" >> "$log_file"
echo "" >> "$log_file"
执行效果:
memlog.sh "TTS 服务迁移完成" "新服务运行在 port 8765,回收 12.6GB 空间"
输出到 memory/2026-03-14.md:
### 14:16 — TTS 服务迁移完成
新服务运行在 port 8765,回收 12.6GB 空间
7. 记忆路由规则:新内容去哪儿?
当新内容产生时,龙虾按以下流程判断归属:
新内容产生 ↓ 是踩坑 + 解决方法吗?(下次能直接用) ├─ 是 → memory/lessons/ └─ 否 → 继续判断 ↓ 是重大决策吗?(影响后续方向) ├─ 是 → memory/decisions/ └─ 否 → 继续判断 ↓ 是项目状态变化吗? ├─ 是 → memory/projects/ └─ 否 → 继续判断 ↓ 是用户偏好吗? ├─ 是 → memory/preferences/ └─ 否 → 继续判断 ↓ 是日常流水账吗? ├─ 是 → memory/YYYY-MM-DD.md └─ 否 → 可能是 Obsidian 内容(见后文)
这些规则写在 AGENTS.md 里,同时包含更详细的写入规则:
### Memory Rules
#### Write Rules
- ✅ 完成任务/决策后立即写入每日日志
- ✅ 使用 `memlog.sh "标题" "内容"`(自动加时间戳)
- ✅ 格式:`### HH:MM — 标题`
- ✅ 写入知识文件前先 CRUD 验证(先读后写)
- ✅ 使用脚本自动获取时间戳(如 `memlog.sh`、`date`)
- ✅ `memory/` 下文件使用追加模式;只有 `memory/NOW.md` 可覆盖
- ✅ 写入实质内容(含决策/经验)
#### Routing Rules
> 所有路径相对于 `memory/` 目录,实际文件在 `memory/xxx/` 下
- 重大决策 → `memory/decisions/YYYY-MM-DD-slug.md`
- 可复用经验 → `memory/lessons/TOPIC.md`
- 人物信息 → `memory/people/NAME.md`
- 项目状态 → `memory/projects/PROJECT.md`
- 用户偏好 → `memory/preferences/user-preferences.md`
- 其他值得记录 → `memory/YYYY-MM-DD.md`
8. 外置笔记:Obsidian 的分工
内部记忆解决了“执行上下文”的问题,但遇到调研报告、长篇复盘、教程文章,几千字的内容塞进 memory/ 就太臃肿了。因此,我在本地建了一个 Obsidian 知识库,与 OpenClaw 形成明确分工:
| 维度 | OpenClaw | Obsidian Vault |
|---|---|---|
| 用途 | 龙虾执行上下文 | 人类深度思考 |
| 内容 | 决策/教训/项目状态 | 教程/分析/复盘 |
| 长度 | 单文件 <10KB | 单篇 1K-50K 字 |
| 写入 | 自动记录 | 要求写作 |
| 读取 | 每次任务加载 | 按需查阅 |
| 结构 | 严格分类 | 灵活标签 |
目录结构示例:
~/Documents/ObsidianVault/
├── 🧠 龙喵思考 # 深度思考、分析文章、复盘
│ ├── 记忆系统架构分析.md
│ ├── TTS 迁移决策复盘.md
│ └── Agent 定位思考.md
└── 👨 彬子归档 # 教程、项目文档、文章草稿
├── 02-项目/
│ └── 教程/
└── 03-文章/
写入规则进一步细化:
-
执行中产生的决策、踩坑经验、项目状态、用户偏好 → OpenClaw
memory/ -
几千字的调研报告、教程文章、周度复盘、技术对比、草稿灵感 → Obsidian
AGENTS.md 中补充了经验提取标准:
#### Lesson Extraction Standards
`memory/lessons/` 只包含实际遇到的经验教训:
✅ 应放入 lessons/
- 工作中实际遇到的问题
- 解决方式(具体命令/配置)
- 最终结果(已验证成功)
- 关键经验(下次可复用)
➡️ 应移入 Obsidian
- 调研总结、技术分析
- 完整文章、实现记录
- 学习计划、对比分析
- 报告草稿、成果总结
决策标准:
- 内容是用于解决问题还是分享知识?
- 去除修辞后还剩什么?
- 将来会直接引用这个文件吗?
例如 TTS 迁移任务完成后,龙虾写了一篇 3000 字的复盘,放在 Obsidian 的 🧠 龙喵思考/TTS 迁移决策复盘.md,而 memory/decisions/
9. 最终记忆结构一览
经过以上步骤,龙虾的记忆系统变成这样:
. ├── MEMORY.md # 重要且长期有效的事项 └── memory/ ├── NOW.md # 当前待办/优先级 ├── INDEX.md # 分类索引及健康度 ├── YYYY-MM-DD.md # 每日流水日志 ├── lessons/ # 经验教训(可复用) ├── decisions/ # 重大决策(影响方向) ├── projects/ # 项目状态追踪 └── preferences/ # 用户偏好配置
Obsidian 作为外部知识库,存放深度内容。
总结
从简单的 MEMORY.md 到分层结构,核心思路是渐进式披露:
-
用
NOW.md分离紧急事项 -
用分类文件夹隔离不同类型的重要知识
-
用
INDEX.md作为轻量级入口 -
用每日日志记录流水账
-
用 Obsidian 托管长文思考
这样,龙虾每次加载的上下文只有 3K 左右,却能通过索引随时调取完整知识。同时,明确的写入规则和路由逻辑,让记忆管理变得自动、有序。
下一篇,我会讲如何通过“心跳补漏”和“夜间反思”进一步丰富记忆细节,让龙虾不仅记性好,还能自我迭代。敬请期待。
