“我们昨天不是已经决定这个了吗?”
我正在将我的邮件从 Google 迁移出来。已经用 Claude Code 工作了两个会话:Linear 中的 issues、做出的决策、执行的脚本。我开始第三个会话,问它"degoogle 还剩什么待办事项?"
沉默。完全失忆。
这就像和一个聪明的同事一起工作,但他每天早上来办公室都完全不记得你们前一天做了什么。不记得决策,不记得错误,不记得发现。每个会话都是一张白纸。
结果有一个文件恰好解决了这个问题。它已经在那里几个月了。而且几乎没人知道。
CLAUDE.md vs MEMORY.md:手册和笔记本
如果你使用 Claude Code,可能已经了解 CLAUDE.md。这是你告诉 AI 如何工作的文件:使用什么语言、你有什么工具、你的代码约定。
CLAUDE.md 是你的指令手册。你编写它,你维护它。
MEMORY.md 是另一回事。它是 AI 自己编写的工作笔记本。它记录在与你合作时学到的东西:犯过的错误、做出的决策、项目模式、尝试过但没有成功的东西。
简单来说:
| CLAUDE.md | MEMORY.md | |
|---|---|---|
| 谁编写 | 你 | AI |
| 包含什么 | 指令 | 学习内容 |
| 何时更改 | 当你想要时 | 每次会话后 |
| 类比 | 规章制度 | 工作笔记本 |
如果 CLAUDE.md 是你第一天给实习生的合同,MEMORY.md 就是实习生工作时在笔记本中记录的笔记。
它在哪里
~/.claude/projects/<目录哈希>/memory/MEMORY.md
每个项目目录都有自己的内存文件。如果你在 ~/code/项目-a 工作,它有一个 MEMORY.md。如果你在 ~/code/项目-b 中打开 Claude Code,它有另一个不同的。它们不会混合。
文件在每个会话开始时自动加载到上下文中。你不需要做任何事情。
没有全局的 MEMORY.md 吗?
没有。只按项目分类。这是个问题。
今天我创建了一个 op(1Password CLI)的包装器,缓存密钥一小时。这在我所有项目中都有用,不只是我正在工作的那个。但 MEMORY.md 只在那个目录的内存中记录了它。
CLAUDE.md 确实有全局版本(~/.claude/CLAUDE.md),会在所有会话中加载。MEMORY.md 没有对应功能。如果 AI 学到了适用于你整个环境的东西(别名、系统特性、偏好),它必须在每个项目中分别记录。或者不记录。
在实践中,我手动将这类跨项目知识放入我的全局 CLAUDE.md。不理想,但有效。
如果我删除项目,内存也会被删除吗?
不会。内存存在于 ~/.claude/projects/ 中,不在你的代码目录中。如果你删除 ~/code/我的项目/,MEMORY.md 仍然在那里,孤立地占用空间,没人读取。
有人做清理吗?看起来没有。没有垃圾回收器检测被删除的项目目录。随着时间推移,~/.claude/projects/ 会积累已不存在项目的内存。
如果你经常删除项目,偶尔检查一下是有好处的:
| |
删除你不再认识的目录。不会发生什么坏事——最坏的情况是 AI 下次重新开始。
它长什么样
这是一个真实例子。今天,在将我的邮件从 Google Workspace 迁移的会话后,我的 MEMORY.md 变成了这样:
| |
没有哲学。具体事实。下次我在这里打开会话时,Claude 已经知道 degoogle 完成了,我有一个 op 包装器,以及 stat 在我的 Mac 上是 GNU 版本。
它解决的真正问题
不只是"记住东西"。是避免 AI 重复错误。
今天,我第一次编写 op 包装器时,使用了 stat -f %m(BSD 语法)。失败了,因为我的 Mac 通过 Homebrew 有 GNU coreutils。我用 stat -c %Y 修复了它。
没有 MEMORY.md,下次我在这个项目中需要 stat 时,它会再次尝试 stat -f %m。有了 MEMORY.md,它已经知道不应该这样做。
这是记笔记的同事和依赖记忆的同事之间的区别。记笔记的不会重复错误。
如何避免它变成垃圾场
这里来了明显的问题:如果 AI 写它想要的,不会最终变成无关笔记的垃圾场吗?
有几个保护措施:
1. 200 行限制。 超过第 200 行的所有内容在加载时都会被截断。这强制要简洁。
2. 按主题组织。 可以创建单独的文件(debugging.md、patterns.md)并从 MEMORY.md 链接它们。主文件是索引,不是杂物抽屉。
3. 你有最终决定权。 这是你磁盘上的文本文件。你可以编辑、删除它,或告诉 Claude"清理 MEMORY.md,这已经不相关了"。
4. AI 自我纠正。 系统指令告诉它更新或删除被证明错误或过时的记忆。
在实践中,效果出奇地好。AI 倾向于比许多人类在记笔记时更有纪律——可能因为它没有自尊心或对自己想法的执着。
为什么没人知道它
好问题。它在 Claude Code 中已经几个月了,默认工作,我不记得在 Anthropic 的任何变更日志或博客文章中看到它被突出显示。
我的理论:这是一个诞生为内部基础设施的功能,用于改善会话间体验,不是面向用户的特性。它没有 UI,没有开关,没有配置面板。它是隐藏目录中的文本文件。
这就是问题所在。最有用的功能通常是最不可见的,因为如果人们不知道它们存在,就不会寻找它们。
第四层记忆
如果你读过我关于 Linear、Beads 和 Tasks 的文章,MEMORY.md 作为补充其他层的第四层很合适:
| 层 | 时间范围 | 谁编写 | 包含什么 | 例子 |
|---|---|---|---|---|
| Linear | 周/月 | 人类 | 你想要什么 | “3月发布 v2” |
| Beads | 天/会话 | 人类 + AI | 需要做什么 | “修复缓存中的 bug” |
| Tasks | 小时 | AI | 我在做什么 | “执行测试” |
| MEMORY.md | 永久 | AI | 我学到了什么 | “stat 在这里是 GNU” |
前三个是关于工作:做什么、按什么顺序、谁来做。MEMORY.md 是关于知识:我们在做的过程中学到了什么。
这就是关键。Beads 和 Tasks 在设计上是临时的:任务完成并关闭,issue 解决并归档。MEMORY.md 是保留下来的。教训,不是作业。
一个具体例子,说明它们如何互补:今天我使用 Linear 跟踪 degoogle 的 issues(PER-16 到 PER-28)。Tasks 跟踪每个 issue 内的步骤。MEMORY.md 记录 Linear API 需要团队的 UUID,不是 key。Issues 关闭了。Tasks 消失了。UUID 的教训为下次保留在那里。
如何开始使用
不需要激活任何东西。它已经在工作了。
你唯一需要做的是当发生值得记住的事情时告诉 Claude"在你的记忆中记录这个":
- 技术决策(“我们为邮件选择了 iCloud+")
- 错误和解决方案("
stat是 GNU,使用-c不是-f") - 项目上下文(“degoogle 已完成”)
- 发现的偏好(“用户更喜欢 X 而不是 Y”)
偶尔检查 ~/.claude/projects/*/memory/MEMORY.md 看看它记录了什么,修剪多余的内容。
好学徒的笔记本
费曼有句话很贴切:“第一个原则是你不能欺骗自己——而你是最容易欺骗的人。”
LLM 不会欺骗自己,因为它没有自尊心。它不会想"我会记住的"或"这太明显了不用记录”。如果你告诉它记录某事,它就记录。如果它发现笔记不正确,它会更正。
在某种意义上,它在记笔记方面比我们大多数人永远能做到的都要好。它只是缺少一个保存笔记的地方。
现在它有了。