夜雨聆风学习资料网

ARTICLE · 1231784

OpenClaw系列05-记忆系统(上):本地文件三层记忆与"做减法"纪律

OpenClaw系列05-记忆系统(上):本地文件三层记忆与"做减法"纪律

不接任何外部系统,只靠几个本地 markdown 文件,怎么让 Agent 跨会话记住事?本篇讲三层文件结构、"修一堵一"的写入纪律,以及"做减法"的运维哲学。

记忆系统(上):本地文件三层记忆与"做减法"纪律

前五篇解决了"为什么拆"(01)、"怎么落地"(02)、"怎么定行为"(03)、"能力怎么分"(04)。从这篇开始进入记忆系统。上篇只讲最朴素的一层:不接任何外部系统,仅靠本地文件,Agent 怎么跨会话记住事。 下篇(06)再讲接入外部四层记忆的进阶方案。

先说结论:

Agent 的记忆,本质就是文件。文件即状态。

我前 5 个月,6 个 Agent 的记忆全部跑在这三个文件类型上:MEMORY.md(长期)、memory/YYYY-MM-DD-*.md(当天上下文)、BOOTSTRAP.md(启动注入)。没有一个外部数据库。这套"轻量范式"撑到 9 月才暴露短板。


一、三层结构:各自记什么,为什么这样分

层
文件
记什么
生命周期
长期
每个 Agent 工作区根目录的 MEMORY.md
事实、决策、配置映射、经验教训
永久,做减法时人工瘦身
短期memory/YYYY-MM-DD-*.md
当天的上下文、待办快照、临时结论
天级,定期归档
启动BOOTSTRAP.md
每次会话启动时注入的最小上下文
常驻,只放"不读就会错"的东西

1.1 长期层:MEMORY.md 的四分区

我的每个 MEMORY.md 不是流水账,固定四个分区:

  1. 关键背景:跨会话必须记住的事实(比如我这套系统的 6 个 Agent 各对应哪个记忆库标识,表格写死)
  2. 关键配置映射:某条链路的组件、端点、坑位(写"怎么接的"和"哪里最容易坏")
  3. 经验教训:踩过的坑,一条一行,"现象 → 根因 → 修复"
  4. 已移除配置:做过减法删掉的东西,留痕

第 4 个分区是"做减法"纪律的产物——删了也要留痕,防止"忘了自己删过什么",把删掉的东西又加回来。

1.2 短期层:memory/ 目录

当天发生了什么、哪些待办在推进、临时结论,落到 memory/YYYY-MM-DD-*.md。它和长期层的分工很清晰:

  • 短期层是"工作记忆",过段时间就归档,不占注入预算
  • 只有值得跨天记住的,才由 Agent 自己(或我)提炼进 MEMORY.md 长期层

这一步"提炼"本身就是纪律:不是所有当天的事都值得进长期记忆,进不了长期层的东西留在短期层自然过期。

1.3 启动层:BOOTSTRAP.md 是最容易被忽视、也最值钱的一层

BOOTSTRAP.md 是每个 Agent 每次会话启动时注入的最小上下文。我只放"不读就会做错"的内容,把启动注入做到极小,比把所有东西都塞进 prompt 高明得多——这正是"做减法"在启动层的体现。


二、写入纪律:"修一堵一"

记忆系统最大的敌人不是"记不住",而是"记了但没在关键时刻写"。我定了一条纪律,叫 "修一堵一":

每次发生一次重要的决策或故障修复,当场把它写进 MEMORY.md 的经验教训区,不许"回头再补"。

"回头再补"在 99% 的情况下不会发生。而当场写,成本极低——就在你排障的上下文里,根因和修复方法都是热的。

记忆的价值不在"存了多少",而在"下次能不能被调出来"。存了却调不出来,等于没存。所以经验教训区强制"现象 → 根因 → 修复"三行式,为的是可检索,不是可阅读。


三、做减法:我这套体系最核心的运维哲学

我这套体系里,比"加东西"更重要的是"删东西"。做减法时有两条强制动作,缺一不可:

  1. 删除前强制备份:主配置文件(openclaw.json 一族)保留带时间戳的备份链,实测积累 30+ 份 *.bak-*。删任何东西,先把对应配置备份一份。
  2. 按来源/owner 精准圈定:不"整层删除",而是圈定"这批东西属于哪个 Agent/哪个功能",逐个确认再删,避免误伤还在用的部分。

删完之后,在 MEMORY.md 的"已移除配置"区留一行痕迹(什么时候删的、删了什么、为什么)。没有痕迹,你三个月后会忘记自己删过什么,某次"感觉好像应该有这个功能"时又把它加回来,前功尽弃。

做减法的标志产物,就是那个"已移除配置"区。有痕迹,减法的成果才守得住。


四、最终结论与教训

5 个月跑下来,本地文件记忆这套"轻量范式",最终沉淀为五条:

  1. 文件即状态,比黑盒更值钱。我不用重型监控去"猜" Agent 记了什么——它的记忆就是那几个文件,cat 出来就是它现在的全部认知。想知道它怎么想,读 MEMORY.md;想回滚一条错误记忆,改文件重启即生效;想审计某个决定,查经验教训区哪条被引用了。状态是明写的、可 diff、可回滚的——这不是"功能更强",而是更可被理解。
  2. 记忆的两种死法方向相反,都要防:不写(同坑反复踩)和写太多(文件膨胀)。文件膨胀是记忆的另一种死法——长期层越滚越大,注入越来越重,模型开始把过时的配置当现在的来用。判断标准只有一条:一条经验教训近一个月没被任何排障/决策引用过,它就是候选删除项——"没被用过"比"看起来有用"更可信。
  3. "修一堵一"比"修"更关键:故障本身会自愈,不自愈的是"同一个坑踩第二遍"。当场写三行式,下次十几分钟收工;不写,下次从头查起。
  4. 删除必须留痕:做减法删掉的东西,写进"已移除配置"区。留痕成本一行字,代价是防止三个月后的"反复横跳"。
  5. 这套范式有明确的天花板:跨会话做"3 个月前那个 bug 到底怎么修的"这种事实级检索时,靠 grep 翻文件不可行。这个短板,就是下篇(06)接入外部四层记忆的动因。

下一篇预告:《06|记忆系统(下):接入 TDAI 四层记忆与"静默停写 40 小时"排查实录》——本地文件不够之后怎么接外部长期记忆,以及我这套链路最痛的一次故障:记忆静默停写 40 小时,表面完全正常、零报错,最后靠配置备份对比才定位。

互动:你的 Agent 记忆是写在文件里还是接了外部库?长期层膨胀过吗?评论区聊聊。

相关学习资料