养了10天AI智能体,记忆丢失率从40%降到5%,我做了什么

6 阅读7分钟

我用 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
      }
    }
  }
}

心跳做两件事:

  1. 日志兜底(每次):检查是否有未记录的重要内容,有就补写
  2. 记忆蒸馏(每周):从 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 ⭐