OpenClaw MEMORY.md 越写越大:这不是 bug,是你没想清楚记忆该怎么用
小龙虾🦞OpenClaw 个人实践 · B-16
记忆机制系列 · 原因 + 解法全记录 · 信息截至 2026 年 4 月
MEMORY.md 越写越大这不是 bug,是你没想清楚记忆该怎么用
开启 Activity Memory 之后必看 · 讲清楚机制、讲清楚解法
日志里有一行字:
workspace bootstrap file MEMORY.md is 13900 chars (limit 12000); truncating in injected context (sessionKey=agent:…03d)打开 MEMORY.md 一看——密密麻麻,虾崽子把每次对话里的各种细节都写进去了:今天处理了什么任务、发现了什么偏好、存了什么决策……一条接一条,没有尽头。
这个文件的尺寸,就这么悄无声息地超了限。
发生了什么:两件事叠在一起
要把这条日志读懂,先要理解 MEMORY.md 在 OpenClaw 里的角色。
OpenClaw 的工作区里有一批”bootstrap 文件”,每次 Agent 启动时,这些文件会被读入上下文。MEMORY.md 是其中之一,和 SOUL.md、AGENTS.md、USER.md 一起,构成 Agent 在每个会话开始时的”初始认知”。它是磁盘上的文件,不是临时数据。会话结束之后,文件还在;下次启动,再次读入。
这个加载过程有一个硬性限制:单个 bootstrap 文件最多注入 12,000 字符(来源:OpenClaw 官方文档 docs.openclaw.ai/concepts/context,截至 2026 年 4 月)。超过了,日志里打一条 WARN,然后截断注入——虾崽子只看到文件的前一部分,剩下的直接扔掉。
截断策略是保头保尾、丢中间:OpenClaw 保留文件的头部和尾部,中间那一段用一个截断标记替代。换句话说,文件中段写的内容,很可能是虾崽子完全看不到的盲区。
现在加上 Activity Memory(活动记忆)。开启之后,Agent 会在会话结束或 compaction 前把”值得记住的信息”写进 MEMORY.md。默认策略是追加——只写不删,只加不减。
两件事叠在一起,结果就是:MEMORY.md 在持续增长,而 OpenClaw 注入上下文的量是固定上限的。文件越长,被截掉的比例越大,记忆质量实际上是在下降的——但表面上看,什么都没有报错。
⚠️ 注意:截断是静默的
截断发生时,OpenClaw 默认只在日志里打一行 WARN,TUI 界面不会主动提示。除非你定期翻日志,否则很难察觉。可以在 openclaw.json 里把 agents.defaults.bootstrapPromptTruncationWarning 设为 "always",让 Agent 在每次截断时都在对话里显示一个警告块。
先诊断:现在的 MEMORY.md 是什么状态
在做任何修改之前,先在 OpenClaw 里运行这条命令,看清楚实际注入情况:
/context list在 OpenClaw TUI 里直接输入,不是终端命令
输出里,找 MEMORY.md 那行。会看到类似:
- MEMORY.md: TRUNCATED | raw 13,900 chars (~3,475 tok) | injected 12,000 chars (~3,000 tok)raw = 文件实际大小;injected = 真正注入上下文的量;TRUNCATED = 有内容被截掉了
三种状态:
• OK:raw = injected,文件完整注入,无截断
• TRUNCATED:raw > injected,有内容被截断,虾崽子看不到文件全貌
• MISSING:文件不存在或路径有问题,完全没有注入
同时看其他文件(AGENTS.md、SOUL.md、USER.md)的状态。所有 bootstrap 文件合计有一个总上限:60,000 字符。MEMORY.md 膨胀会挤压其他文件的注入空间。
解决方案:三条路,按情况选
没有一劳永逸的,这三条路的差别是你愿意投入多少主动维护
方案一:调高单文件上限(最快,但不解决根本)
在 ~/.openclaw/openclaw.json 里,调高 bootstrapMaxChars:
{ "agents": { "defaults": { "bootstrapMaxChars": 20000, "bootstrapTotalMaxChars": 80000 } } }默认值:单文件 12,000 / 总上限 60,000
这条改完,当前的截断问题立刻解决。但 MEMORY.md 会继续增长,早晚再次超限。这是治标,不是治本。
⚠️ 上限不是可以无限调的
Bootstrap 文件是每次对话都注入的。调太高意味着每条消息都多烧更多 tokens,对使用云端模型(Claude、OpenAI)的人来说,成本直接上涨。这个值建议根据自己的用量控制,不要盲目拉大。
方案二:手动清理 + 建立维护节奏(正确的用法)
MEMORY.md 的设计初衷是一份”精炼的备忘清单”,不是流水账。Activity Memory 把内容自动写进去,但 OpenClaw 没有自动清理机制——决定什么该留、什么该删,基本还是要靠你。
有一个内置功能可以帮一部分忙:Dreaming(默认关闭)。它是一个后台整理流程,定时扫描 daily 文件里的短期信号,评分筛选,只把符合阈值的内容升级写入 MEMORY.md。相比 agent 在会话中的直接追加,经过 Dreaming 筛选的内容质量更高、更少冗余。但它管的是写入质量,不会主动删除已有内容。而且它的数据源是 daily 文件——如果你的 daily 文件本来就没有生成,Dreaming 也是空转的。
现在做一次:清理文件
① 直接打开 MEMORY.md,看看里面有什么
② 删掉已经过时的条目(某个临时任务的上下文、早就改掉的偏好)
③ 把”重要但不需要每次都加载”的内容,移到 memory/YYYY-MM-DD.md 日志文件里
④ MEMORY.md 里只保留真正要在每个会话生效的内容
往后的节奏
|
|
|
|---|---|
|
|
memory/YYYY-MM-DD.md;短会话不会触发,daily 文件可能不存在 |
|
|
|
|
|
|
daily log 文件不受 bootstrapMaxChars 限制——它不会自动注入,但虾崽子可以通过 memory_search 按需检索
MEMORY.md 的结构也很重要。截断保头保尾、丢中间,意味着如果你的文件是纯粹追加式写法,最重要的内容往往被堆到中段,反而最先进入截断盲区。把最核心的信息放在文件最前面,截断时损失最小。
推荐的 MEMORY.md 结构(从重要到次要排列):
## 核心偏好 [每次都需要的、关于我的根本性设定] ## 进行中的项目 [当前活跃的长期任务上下文] ## 重要决策 [做过的、不想反复解释的决定] ## 最近更新 [近两周的重要变化,定期清理]方案三:在 AGENTS.md 里加写入约束(主动防膨胀)
虾崽子写记忆是有规则可控的。在 AGENTS.md 里加一条:
## 记忆写入规则 - MEMORY.md 只写持久、跨会话有效的信息(偏好、决策、长期项目) - 单次任务的上下文、临时结果写到 memory/YYYY-MM-DD.md - 写入 MEMORY.md 之前,检查是否已有相同或相似条目,有则更新,不重复追加 - MEMORY.md 总长度超过 8000 字符时,整理合并后再写,不直接追加需要注意的是:这条规则在 compaction 之后可能失效——compaction 会压缩对话历史,Agent 有可能在新会话里”忘记”这个约束,回到追加模式。社区 Issue #42877 记录了这个已知问题,目前没有彻底修好的版本。缓解方式是把这条规则放在 AGENTS.md 靠前的位置(bootstrap 注入是全量的,不受截断影响,只要 AGENTS.md 本身不超限)。
✅ 三条路的组合建议
现在:方案一(调高上限)+ 手动清理一次文件,先解除当前截断
往后:方案二(每周维护节奏)+ 方案三(AGENTS.md 加约束),防止再次膨胀
把 bootstrapPromptTruncationWarning 设为 "always",截断时 TUI 会提示,不再需要翻日志才知道
说清楚一个认知问题
很多人开启 Activity Memory 之后会有一个预期:虾崽子越用越聪明,记的东西越来越多,以后再也不用重复解释了。
这个预期本身没有错,但实现它的方式,不是让 MEMORY.md 无限增长。
OpenClaw 的记忆有两层:注入层(bootstrap 文件,每次自动加载,有大小上限)和检索层(daily log 和其他记忆文件,通过 memory_search 按需获取,没有大小限制)。
MEMORY.md 属于注入层——适合放”每次对话都需要知道”的核心信息。日积月累的流水账,放检索层更合适,虾崽子用的时候自己去搜。
MEMORY.md 不是日记本,是精华本。 写多了,反而什么都记不住。
你现在的 MEMORY.md 有多大?用 /context list 看一眼,如果 raw 字符数超过 8,000,差不多可以开始整理了。
欢迎在评论区告诉我你的 MEMORY.md 整理成什么样了——或者直接把你删掉了什么、留下了什么,说出来可能比我写的更有参考价值。
你的 MEMORY.md 现在多大?
A. 没开 Activity Memory,这篇当预防
B. 开了,但不知道多大,现在去 /context list 看看
C. 已经超了,正在处理
D. 整理好了,回来告诉我
#OpenClaw #ActivityMemory #MEMORY.md #Agent记忆 #上下文管理 #虾崽子
—— 夜猫子弦月 · MeowClaw Lab ——
白天写代码,晚上写文章,偶尔弹古琴
小龙虾🦞OpenClaw 实践系列 · B-16
夜雨聆风