我用 OpenClaw在本地跑了一只 AI 助手,每天跟它高强度协作。10天下来,最大的感受是:记忆系统是第一基建。没有它,AI 就是金鱼——每次见面都是初次见面。
本文是我个人的实战记录,不是教程。记录了从零搭建记忆系统的完整过程,包括架构设计、具体配置、踩过的坑,以及最终把记忆丢失率从 20-40% 降到 5-10% 的方法。
虽然基于 OpenClaw,但核心思路(三层记忆架构、语义触发写日志、三层防御机制)适用于任何有 workspace 文件系统的 AI 智能体框架。
为什么记忆是第一基建
我从部署完成就开始让 AI 干活(教研相关的专项任务),一周后发现一个问题:应该先把"智能"搭好,再灌业务逻辑。
原因很简单:如果 AI 记不住之前的决策、踩过的坑、你的偏好,那你每次对话都在重复教它同样的事。效率极低,而且它会反复犯同样的错。
记忆系统不是可选的增强功能,而是让 AI 从"工具"变成"助手"的基础设施。
架构:三层记忆
┌─────────────────────────────────────────┐
│ Session Context(热) │
│ 当前对话的上下文窗口,自动管理 │
│ 生命周期:单次 session │
├─────────────────────────────────────────┤
│ Daily Log(温) │
│ memory/YYYY-MM-DD.md │
│ 当天发生的事,原始记录 │
│ 生命周期:日 │
├─────────────────────────────────────────┤
│ Long-term Memory(冷) │
│ MEMORY.md │
│ 蒸馏后的长期记忆,精简有效 │
│ 生命周期:月-永久 │
└─────────────────────────────────────────┘
数据流:Session → 写入 Daily Log → 定期蒸馏到 MEMORY.md
每次新 session 启动时,AI 读取 MEMORY.md + 最近的 Daily Log,重建上下文。这就是"醒来"的过程。
搭建步骤
第一步:创建文件结构
在 workspace 目录下:
mkdir -p memory
touch MEMORY.md
echo '{}' > memory/heartbeat-state.json
第二步:在 AGENTS.md 中写入记忆规则
AGENTS.md 是 AI 的行为规范文件(OpenClaw 中定义 AI 行为的核心配置)。以下是记忆相关的核心规则,根据你的使用习惯调整措辞即可。
Session 启动时读取记忆:
## Every Session
Before doing anything else:
1. Read MEMORY.md — your long-term memory
2. Read memory/YYYY-MM-DD.md (today + yesterday) for recent context
如果是新 session 的第一条用户消息,读完日志后主动告知:
"已读取记录,上次到:[最近日志的关键内容摘要]"
为什么读今天+昨天:跨午夜的工作会分散在两个文件里。只读今天会丢失昨晚的上下文。
语义触发写日志(最关键的规则):
### 🔴 语义触发写日志
以下情况立即追加写入 memory/YYYY-MM-DD.md:
- 确认了某件事("好"、"ok"、"那我们去做X")
- 完成了一个实质性操作(配置修改、文件更新、测试通过)
- 话题明显切换到新方向
写日志标准:宁少勿多,只写已确定的事。
- 已完成:标注"已完成,结论:X"
- 进行中:同一条目里必须写明"已知约束:X"(无约束也显式写"无约束")
- 修正了之前结论:写一条"修正:之前X有误,正确是Y"
这里有一个血泪教训:如果只记"做了什么"不记"不能做什么"(约束),当 session 压缩或重启后恢复任务时,AI 会忘记约束,可能执行危险操作。
❌ 错误写法:
## 14:30 修改配置
进行中,正在修改配置文件
✅ 正确写法:
## 14:30 修改配置
进行中。已知约束:不能改数据库连接串(生产环境在用)
"心理笔记"不存在:
AI 说"我记住了"只是当前对话里知道,session 结束就全忘。必须写到文件里才算数。在 AGENTS.md 中写明:要记就写文件,"心理笔记"不存在。
第三步:配置心跳做自动维护
语义触发是主要的写日志方式,但不是 100% 可靠——AI 可能忘记写。心跳(定时触发机制)是安全网。
在 openclaw.json 中启用:
{
"agents": {
"main": {
"heartbeat": {
"intervalMinutes": 60
}
}
}
}
心跳做两件事:
- 日志兜底(每次):检查是否有未记录的重要内容,有就补写
- 记忆蒸馏(每周):从 Daily Log 中提炼值得长期保留的信息到 MEMORY.md,同时清理过期条目
心跳间隔建议 30-60 分钟。太短浪费 token,太长兜底不及时。
第四步:三层防御防止记忆丢失
这是整个指南最重要的部分。记忆丢失不是"会不会发生"的问题,而是"什么时候发生"的问题。
为什么会丢失? AI 智能体在对话太长时会压缩历史(compaction)。压缩摘要保留"做了什么",但容易丢掉"不能做什么"。AI 从摘要恢复任务时,如果约束丢了,可能执行本该被禁止的操作。
第1层 预防 ──→ 写日志时,状态和约束写在同一条目
第2层 侦测 ──→ 恢复高风险任务时,先搜记忆找约束
第3层 兜底 ──→ 执行不可逆操作前,当场确认
设计哲学:任意一层失效,下一层接住。 不追求单层完美,追求系统可靠。
第五步:语义搜索(可选)
接入 embedding 模型后,AI 可以用自然语言搜索历史记录。但即使没有语义搜索,前四步已经构成完整的记忆系统。语义搜索是锦上添花,不是必需品。
踩坑记录
坑1:MEMORY.md 膨胀
什么都往里写,几周后变得很长,每次 session 启动消耗大量 token。
解决:写入门槛——只写3个月后仍有效的内容。每周蒸馏时顺便清理。膨胀不只是量的问题,质更重要:每一条低质量内容都在消耗未来每次 session 的上下文预算。
坑2:AI 的自我诊断不可信
问 AI "你为什么忘了这件事",它会说"注意力被分散了"、"当时觉得不重要"。听着很合理,但 AI 根本没有"注意力"这回事——它用人类心理学概念解释了一个完全不同的运行机制。按这些解释去优化,方向可能完全错。
解决:少问 AI "为什么",多看数据。日志覆盖率、丢失次数、触发记录——这些比 AI 的"反思"靠谱。
坑3:进程崩溃导致日志丢失
AI 还没来得及写日志就退出了。
解决:心跳兜底 + Session 原始记录文件(框架自动记录所有对话到磁盘,是最后的兜底)。
坑4:搜到记忆直接当事实用
AI 搜到一个月前的记录,直接按照它执行,但情况已经变了。
解决:搜到内容后必须标注来源、向用户确认。过期了就更新或删除。
量化效果
我对过去一周的对话内容和日志做了交叉对比,统计每天丢失了多少重要信息:
| 阶段 | 丢失率 | 状态 |
|---|---|---|
| 搭建前(纯靠 session 上下文) | 20-40% | 高频遗忘 |
| 搭建后(语义触发 + 心跳兜底 + 三层防御) | 5-10% | 基本可控 |
你也可以让你的 AI 做同样的统计:
"帮我做一个记忆丢失率统计:把你最近一周每天的对话内容和你实际写入日志的内容做交叉对比,算出每天大概丢失了多少比例的重要信息,用表格列出来(日期、丢失率、丢失了什么)。"
一个认知
MEMORY.md 不只存事实和偏好,还应存认知——从经验中提炼出的理解和判断。
Daily Log 记事实,MEMORY.md 记智慧。把它当作大脑皮层,不是文件索引。写"我理解了什么",而不是"这个链接在哪"。
下一步
以上解决的是"记下来"。记忆系统还有另一半:"想起来"——当 AI 需要某条记忆时能不能快速找到。
记忆量小的阶段,基础语义搜索够用。量大了可以逐步引入混合检索(向量 + BM25)、Rerank、时间衰减等。判断标准:当你发现 AI 经常搜不到它应该知道的东西时,就是升级的时候。 在那之前,把精力放在"记下来"上——写入质量永远比检索算法重要。
完整代码和配置模板见 GitHub 仓库:ai-agent-practice
这是"养虾经验"系列的第二篇,第一篇是安全篇。如果对你有帮助,欢迎 Star ⭐