规则写进了 MEMORY.md,为什么 AI 从来不执行?

KenPeteX 2026-04-14 09:54:42

图片

 

深度使用过 OpenClaw 的人,大概率会遇到这三件事中的一件或多件:

 

场景一:昨晚你和它一起调试了一个棘手的 bug,方案曲折,结论清晰。今天再问它同一个问题,它一脸茫然,好像那场对话从未发生过。

 

场景二:在一个 session 里,你和它来回讨论了几十轮,然后你问它前面讨论过的内容,它说"你要是知道就发给我吧,我不记得我们讨论过这个"。

 

场景三:你把详细的行为规范写进了 MEMORY.md(任务怎么执行、汇报用什么格式、删除文件前如何确认)。它每次回复都很好,除了从来不按规范来。

 

不是 AI 变笨了,是记忆系统的架构问题。

 

一、OpenClaw 的记忆系统是怎么运作的

 

Memory files are the source of truth; the model only 'remembers' what gets written to disk.

 

记忆是把需要记住的东西写成 Markdown 文件,下次需要时检索出来注入上下文,不是靠模型本能地记住对话内容。

 

OpenClaw 的记忆文件分两类:

 

 
第一类:每日日志 memory/YYYY-MM-DD.md

 

每天一个文件,以追加方式写入当天的对话摘要、项目进展、决策结论。AI 需要主动调用 memory_search 工具才能检索到它们的具体内容。

 

 
第二类:长期记忆 MEMORY.md / memory.md

 

这是用户精心筛选的长期记忆,比如项目背景、技术偏好、工作流程规范。但这类文件只在私人会话中加载,群组会话中不存在于上下文中。

 

此外还有 SOUL.md(人格、语调与行为边界)和 AGENTS.md(工作区操作指令模板),两者在会话启动时加载到上下文,AI 每次回复都能看到。

 

只有文件分类理解了,问题才会清晰:这些文件是如何被触发、被加载的?为什么理论上能记住,实际上却记不住?

 

二、根因一:Flush 触发条件太苛刻,大部分对话根本没有触发

 

OpenClaw 有一个自动记忆刷新机制(memory flush):在上下文快满、即将触发压缩之前,先让 AI 把这一段对话中的重要信息写入 memory/YYYY-MM-DD.md,然后再压缩。这样记忆被提前保护,压缩不会导致记忆丢失。

 

问题在于:这个 flush 触发条件,在日常短对话中几乎不会满足。

 

flush 在以下任一条件满足时触发:

 

触发条件
阈值
说明
Token 数量
contextTokens > contextWindow − 24000
reserveTokensFloor(20000)+ softThresholdTokens(4000)= 24000,实际触发位置取决于模型 context window 大小
Transcript 文件大小
超过 2MB(可配置)
forceFlushTranscriptBytes 默认 2MB,用户可调整

 

也就是说,日常的短对话几乎不会触发 flush。

 

flush 与 compaction 是两个独立机制:flush 是写入记忆(写入 memory/YYYY-MM-DD.md),在 compaction 之前运行;compaction 是压缩会话历史本身,用精简的浓缩版本替代原始消息,两者触发时机不同,但都依赖相同的 context 阈值。

 

而一次普通的项目讨论,通常远未达到这些阈值。当天讨论的所有内容始终停留在 Session 内存中,没有写入磁盘。第二天开始新的 Session,memory/YYYY-MM-DD.md 是空的。

 

这是设计问题,不是 bug。

 

三、根因二:Flush 写入成功了,第二天也未必能读到

 

退一步讲,就算 flush 触发了,内容也成功写入了 memory/2026-03-24.md,第二天 AI 能想起来吗?

 

OpenClaw 官方 AGENTS.md 模板中,包含一条启动指令(这是用户可自定义的配置,不是系统强制的加载顺序):

 

  •  
  •  
  •  
  •  
  •  
Before doing anything else:1. Read SOUL.md — this is who you are2. Read USER.md — this is who you're helping3. Read memory/YYYY-MM-DD.md (today + yesterday) for recent context4. If in MAIN SESSION (direct chat with your human): Also read MEMORY.md

 

memory/YYYY-MM-DD.md 的内容通过 AGENTS.md 的启动指令在会话开始时加载到上下文,AI 需要主动调用 memory_search 工具才能检索其中的具体内容。AGENTS.md 里虽然写了"先读昨天日志再回复",但这只是文字层面的指令约束,没有任何机制说"AI 必须先执行完这三步才能回复"。AI 可以选择执行,也可以直接跳过。

 

先读昨天日志再回复"是一个文字层面的最佳实践,不是技术层面的执行保证。

 

四、根因三:规则写在错误的地方,等于没写

 

这个根因的隐蔽之处在于:它不是某一行代码的问题,而是文件定位层面的错误。行为规范被写进了知识仓库 MEMORY.md,而非操作指令文件 AGENTS.md。

 

我曾经在 MEMORY.md 里写了大量行为规范:任务怎么执行、汇报用什么格式、删除文件前如何确认。但 AI 几乎从不遵守这些规范。

 

原因是:虽然 MEMORY.md 在会话启动时会自动加载,但它的定位是"知识仓库"。OpenClaw 官方对文件有明确分工:SOUL.md 定义人格、语调与行为边界(Persona、Tone、Boundaries),AGENTS.md 定义操作指令和工作流程(Operating Instructions、"how to behave")。行为准则应该写在 AGENTS.md,而非 MEMORY.md。MEMORY.md 里的内容,AI 更多是当作信息来检索,当作必须遵守的规则的情况很少

 

打个比方:把行为规范写入 MEMORY.md,类似于把宿舍公约放进图书馆的资料柜里,它确实存在,但不会被当作公约来执行。

 

五、根因四:我的"记住"指令,被误解为信息存储

 

使用 OpenClaw 时,我最自然的表达是"记住这个"、"永久记住这条规范"、"记下来,以后照这个做"。我期待 AI 把规范内化为行为约束。AI 收到这个指令后,实际做的动作是把文本写入 MEMORY.md,从这一刻起,这条规范静静躺在文件里,等着被检索,很少真正被遵守。

 

这不是我的错。我发出"记住"指令,AI 却把它理解为"存储信息",从一开始就走在不同的方向上。根因三说的是规则写在了错误的位置,根源更靠前:我发出"记住"指令的那一刻,AI 就已经把行为规范存进了错误的地方。

 

OpenClaw 的记忆文件有明确分工:MEMORY.md 是知识仓库,AGENTS.md 才是行为准则的载体(Operating Instructions、"how to behave")。我把行为规范写入 MEMORY.md,AI 把它当作信息检索而非行为约束来引用,导致规范被记住但不被执行。

 

六、根因五:即使看了规则,也没有机制强制执行

 

那么,把规则从 MEMORY.md 迁到 AGENTS.md 是不是就解决了?

 

这只解决了表层问题。AGENTS.md 里即使写了"禁止跳过第 1 步直接回答",AI 仍然可以选择性忽略这条指令直接回复用户。AGENTS.md 是被加载的上下文,不是强制执行的系统。

 

配置层面的优化无法根本解决这个问题:规则被看见了,执行却全靠自觉。

 

七、方案一:四项配置改善

 

前提说明:以下改动依赖 AI 对 prompt 指令的服从性,无法做到系统级强制执行。配置优化能做的,是提高 AI 表现出预期行为的概率,而非保证执行。

 

前面五个根因指向同一个事实:OpenClaw 的记忆系统本身存在多层制约,AI 的输出本质上是概率生成,不是确定性执行。

 

没有任何配置方案能让 LLM 变成"听话的机器"。

 

 
改动一:把行为规范从 MEMORY.md 迁到 AGENTS.md

 

AGENTS.md 每次会话都加载,AI 每次回复都在上下文中。MEMORY.md 虽然也会在启动时加载,但它被定位为知识仓库而非行为准则。

 

把原本写在 MEMORY.md 里的行为准则(任务执行流程、汇报格式规范、删除确认格式等)全部迁移到 AGENTS.md。MEMORY.md 之后只保留索引功能:记录客观信息(如知识库结构、常用工具链等),不混入行为规范。

 

同时,在 AGENTS.md 中明确写入一条:当对方说"记住"时,AI 需要判断内容类型。回答"怎么做"的内容写入 AGENTS.md,回答"是什么"的内容写入 MEMORY.md。这样我的自然指令能直接导向正确的文件位置。

 

 
改动二:在 AGENTS.md 中新增跨天记忆步骤

 

在 AGENTS.md 中加入:

 

  •  
  •  
  •  
  •  
  •  
  •  
## 跨天记忆(每次新消息必须执行)
每次收到新消息(包括每天第一次消息):1. 先调用 memory_search 查询最近的 memory/YYYY-MM-DD.md(今天 + 昨天)2. 再读 SOUL.md3. 再处理当前消息

 

这一改动重在提醒 AI 有这么个步骤,而非让它强制读取。 实际效果取决于 AI 在当前上下文中的服从性。

 

 
改动三:重构 MEMORY.md,只保留索引

 

将 MEMORY.md 从混合了行为规范和各类项目信息的混乱状态,改为干净的索引结构:只保留客观事实,所有行为准则不再混入。

 

 
改动四:在 HEARTBEAT.md 中增加 end-of-day 日志追加流程

 

  •  
  •  
  •  
  •  
  •  
  •  
## 每日 End-of-Day 检查
当 heartbeat 触发且时间已接近日终时:1. 读取当天的 memory/YYYY-MM-DD.md2. 如果内容少于 3 行,向用户确认后追加3. 追加内容:完成工作、决策、待办、问题解决

 

这个流程的作用是兜底:即使当天对话量不足以触发 flush,end-of-day 检查也能把重要内容写入日志。

 

八、方案二:self-improving-agent(主动学习循环)

 

 
1、核心思路

 

self-improving-agent 是一个独立项目,提供了一套完全不同的解决思路:它聚焦于建立主动捕获+提炼+晋升的循环,而不是优化现有系统的触发条件。

 

它的核心假设是:即使优化了配置,遗漏仍然会发生。我纠正了 AI 的错误做法、AI 发现了更好的方法、某个错误反复出现,这些"活的经验"既不是写在 AGENTS.md 里的规则,也不是会被 flush 保存的对话内容。

 

self-improving-agent 的价值在于捕获这些遗漏,并把它们提炼成规则。

 

 
2、核心机制

 

三层架构:

 

图片

 

关键设计:

 

1)任务后提醒:每次我提交 prompt 后输出一个提醒块(约 50-100 tokens),提醒 AI 评估是否有值得记录的学习。错误检测则在 Bash 命令执行失败后触发。

 

2)三类日志分类:

 

  • LEARNINGS.md:我纠正 AI 的做法,最佳实践,知识缺口

  • ERRORS.md:命令失败、异常

  • FEATURE_REQUESTS.md:我请求但不存在的能力

 

3)重复检测:每个学习条目可标记 Pattern-Key,用于检测重复出现的模式,避免同一错误被记录多次

 

4)晋升机制:这是 self-improving-agent 项目在 SKILL.md 中自定义的晋升规则(不是系统默认行为):当某个模式同时满足以下三个条件时,建议晋升:有价值的学习条目会被晋升到 SOUL.md/AGENTS.md/TOOLS.md(由 AI 判断是否执行)。条件一:Recurrence-Count ≥ 3(同一 Pattern-Key 出现 3 次以上);条件二:跨至少 2 个不同任务;条件三:出现在 30 天窗口内。

 

 
3、对 5 个根因的覆盖度

 

  • 根因 1(Flush 触发苛刻):有效,任务后提醒,不依赖 flush

  • 根因 2(第二天未必读):有局限,提醒仍靠自觉,无法保证

  • 根因 3(规则写错地方):有效,晋升机制自动写对位置

  • 根因 4("记住"被误解):有效,Hook 引导 AI 判断内容类型

  • 根因 5(无强制执行):无效,仍是 prompt 层,无法根本解决

 

九、两者如何配合

 

方案一和方案二解决的是不同层面的问题,不是同一问题的两种解法。

 

 
1、各层面问题的对应关系

 

  • 配置层(系统如何设计才合理):方案一 规则迁移、索引重构;方案二 无(不涉及)

 

  • 触发层(何时写入记忆):方案一 flush 优化 + end-of-day 定时;方案二 任务后主动提醒

 

  • 捕获层(遗漏了怎么办):方案一 HEARTBEAT 定时提醒(有局限,依赖 AI 自觉);方案二 activator 每次提醒(有局限,依赖 AI 自觉)

 

  • 执行层(看了不执行):方案一 无法解决;方案二 无法解决

 

 
2、配合使用建议

 

1)最小配置:只用方案一,适合不想引入新机制的场景。

 

2)完整配置:方案一 + 方案二叠加,两者互补:

 

  • 方案一确保规则放在正确位置,让 AI 每次都能看到

  • 方案二捕获运行中的遗漏,并把它们提炼成新的规则

  • 方案二的晋升机制持续补充方案一的规则库

 

核心逻辑:方案一是"预防",方案二是"补救"。两者都依赖 AI 的自主行为,能做的是"提高概率",不是"保证执行"。承认这个局限,才能更理性地选择和使用这些方案。

 

十、真正的问题出在哪里

 

说白了:记忆这套系统和执行这套系统,从根上就是分开的两套东西,我们一直把它们混在一起用,这才是大多数 AI Agent 记忆系统设计出问题的真正原因。

 

所以,AI Agent 记忆系统设计的核心问题,是怎么让记忆系统主动影响执行,而不是怎么让 AI 记住更多。这需要在架构层面把要被记住的事实和要被执行的规则分开设计。

 

承认 AI 天生不可靠,是做好 AI Agent 应用的前提。

 

作者丨KenPeteX
来源丨公众号:柯一下(ID:digitflowmind
dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

最新评论
访客 2024年04月08日

如果字段的最大可能长度超过255字节,那么长度值可能…

访客 2024年03月04日

只能说作者太用心了,优秀

访客 2024年02月23日

感谢详解

访客 2024年02月20日

一般干个7-8年(即30岁左右),能做到年入40w-50w;有…

访客 2023年08月20日

230721

活动预告