AI 每次都”失忆”?把 CLAUDE.md 写成一份合格的交接文档

CLAUDE.md 不是越全越好。讲清楚 Claude Code 记忆系统的分层结构、200 行原则,和那些让指令被忽略的真实原因。

Claude Code
返回文章列表

上篇开篇文章里打过一个比方:CLAUDE.md 相当于新员工的入职手册。这一篇就把这本手册拆开来讲——它到底被谁在什么时候读、写多长合适、为什么你明明写了"必须遵守"它还是装没看见,以及现在 AI 是怎么开始自己记笔记的。

先从一个所有人都熟悉的场景开始。

"再说一遍,我们用的是 pnpm"

你让 Claude Code 装个依赖,它熟练地敲下 npm install。你提醒:我们项目用的是 pnpm。它道歉,改过来。第二天,新会话,它又是一句 npm install

你没法生气——它是真不记得。对它来说,每一次新对话都是第一天上班,之前所有沟通一张纸都没留下。重复得多了,你甚至会有种错觉:这 AI 是故意的。

解法其实早就有,就是那个一直躺在项目根目录、你可能从没认真写过的 CLAUDE.md。但多数人对它只有两种态度:要么空着,要么往死里堆——堆到几千行,再回头抱怨 AI 不看。

想写好它,得先想通一件事:AI 的记性不是一个筐,而是分层的。

AI 的记性,其实是分层的

Claude Code 的记忆系统不是一个文件,而是一套各管一段的层级结构。从大到小画出来是这样:

AI 的记性,分六层 范围从大到小,各管一段 全局 ~/.claude/CLAUDE.md 个人偏好与习惯,所有项目、所有会话都生效 项目 CLAUDE.md 团队共享,进 git,写项目本身的规矩 个人 CLAUDE.local.md 只属于你的那份,记得加进 .gitignore 子目录 frontend/CLAUDE.md 平时不加载,碰到这个目录才加载 规则抽屉 .claude/rules 按主题拆文件,可按路径懒加载 AI 的自留地 agent memory v2.1.33 起子代理自己记、自己翻 范围大的管习惯,范围小的管具体 就像公司里员工手册、部门规范和个人笔记,各管一段,互不打架

从上往下,每一层管的事不一样:

  • 全局层 ~/.claude/CLAUDE.md——写你个人的习惯偏好,比如"回复用中文""commit 信息用英文"。放在这里,你机器上所有项目、所有会话都生效。
  • 项目层 CLAUDE.md——项目根目录的这份是主角。团队共享,提交进 git,写项目本身的规矩:用什么包管理器、测试怎么跑、目录怎么组织。
  • 个人层 CLAUDE.local.md——只属于你的那份项目笔记,不进 git,记得加 .gitignore。
  • 子目录层 frontend/CLAUDE.md——大项目里给每个模块配的小手册。它有个特点:平时不加载,碰到才加载(下面细说)。
  • 规则抽屉 .claude/rules/*.md——把指令拆成一个个主题文件,像抽屉一样分类存放,还支持"碰到某类文件才加载"。
  • AI 自己的笔记 agent memory——最新的变化:Claude Code 从 v2.1.33 开始,允许子代理拥有自己的持久记忆,它会在干活中自己记、自己翻。

分层的意义在哪?在于不同范围的信息放在不同层,互不打架。你的个人偏好不该污染同事的项目配置,项目的规矩也不该跟着你跑到别的项目里去。就像真实的公司:员工手册归员工手册,部门规范归部门规范,个人笔记本归你自己。

写它的正确姿势:当成交接文档,不是百科全书

确定了放哪层,下一个问题是写什么。

Claude Code 的作者 Boris Cherny 给过一个很具体的数字:CLAUDE.md 每个文件控制在 200 行以内。HumanLayer 的工程师更狠,他们建议 60 行。两个数字差得不小,方向却一致——文件的带宽是有限的,塞得越满,每条指令的权重就越低。

那什么才配占这 200 行?HumanLayer 的 Dex Horthy 给了一个特别朴素的检验标准:

任何一个新同事,打开 Claude Code 说一句"run the tests",第一次就能跑通——如果你的项目做不到,说明 CLAUDE.md 里缺了最要命的东西。

反过来说,最该写进去的就是这类"不做就转不动"的信息:构建和测试命令、代码风格的硬约定、目录结构的导览、以及那些一脚就踩进去的坑。

该写的 像交接文档,翻开就能干活 构建、测试、lint 怎么跑 代码风格的硬约定 目录结构导览,哪类活在哪干 项目里一眼就会踩的坑 检验标准:新同事不问你也能上手 AI 读一遍就知道怎么干活 别塞的 什么都往里堆,等于没写 一次性的任务安排 能自动化的规矩(交给配置) 大段背景资料和设计文档 密钥、地址等敏感信息 写的时候很省心 AI 要么装聋,要么被淹没 200 行以内,写的都是不写就转不动的信息

一个容易被忽略的点:那些一次性的任务说明不该进来。"本周三之前把登录页改版"——这种话写在 CLAUDE.md 里,三个月后它会变成污染上下文的陈年旧账。交接文档写的是"这个团队长期怎么做事",不是"这周要干嘛"。

写了它为什么还是不听话?

这可能是 CLAUDE.md 相关的最高频抱怨。Reddit 上有个经典帖子,标题大意是"我 CLAUDE.md 里写了 MUST,它 80% 的时候装没看见"。

要理解这件事,要回到上篇讲的那个模型:CLAUDE.md 只是模型推理时看到的一大摞上下文中的一小条。指令一多,注意力就被摊薄了——不是它叛逆,是你的声音在人群里不够大。几个被验证有效的对策:

第一,能自动化的规矩别写成文字。 "永远不要在 commit 里加 Co-Authored-By"这种话写在 CLAUDE.md 里是「建议」;在 settings.json 里配 attribution.commit: "" 是「制度」。前者的执行依赖模型每次都想起来,后者是程序保证的。社区里 davila7 把这个原则总结得很准:harness 能强制的事,就别劳烦提示词。

第二,长文档里给关键指令加"聚光灯"。 HumanLayer 还贡献了一个小技巧:在变长的 CLAUDE.md 里,用 <important if="..."> 标签把领域相关的指令圈起来,比如 <important if="正在修改支付模块">。它相当于告诉模型:这条规则不是背景音,是特定场景下的高优先级指令。

第三,接受它有覆盖不了的时候。 200 行是权重和覆盖面的平衡点,不是银弹。真有一堆无法精简的规矩,出路不是把一个文件撑爆,而是拆——这就要说到 rules 和多层级结构了。

大项目怎么管:一层管不住就多几层

如果你维护的是一个 monorepo——前端、后端、API 都在一个仓库里——把所有规矩写进根目录一个 CLAUDE.md,很快就会撞上 200 行红线。

Claude Code 的解法是多级文件,配合一套很聪明的加载时机:

  • 祖先层,启动即加载。 你在哪个目录启动 Claude Code,从那里往上走到仓库根,沿途所有 CLAUDE.md 立刻生效。
  • 后代层,碰到才加载。 子目录里的 CLAUDE.md 启动时不加载。当 Claude 在干活中读到 frontend/ 下面的文件时,frontend/CLAUDE.md 才会被拉进来。官方管这个叫懒加载(lazy loading)。
  • 兄弟层,永不加载。 你在 frontend 干活时,backend 和 api 的手册永远不会进来。

这套机制的价值,站在上下文的角度就明白了:monorepo 里各模块的指令加起来可能几十万字符,如果全部在启动时塞进上下文,绝大多数都是当下用不上的噪音。懒加载让"什么时候需要什么知识"变成自动的——你不用做任何配置,按目录结构放好文件就行。

.claude/rules:给说明书装个抽屉柜

多级 CLAUDE.md 解决的是"按目录分",还有一个正交的问题:同一个目录下,指令怎么按主题分?

这就是 .claude/rules/ 的用处。把指令拆成一个个主题文件——code-style.mdtesting.mdapi-conventions.md——它们默认和 CLAUDE.md 一样每次自动加载。真正好用的是给文件加上 paths 声明:

---
paths:
  - "src/api/**"
---

涉及 API 改动时:所有接口返回统一用 { code, data, message } 结构……

加了 paths 之后,这份规则只在 Claude 碰到匹配路径的文件时才加载。效果和子目录 CLAUDE.md 的懒加载一样,但组织维度从"目录"变成了"主题",两者可以叠加使用。

给新手的建议是循序渐进:先老老实实写好一份 200 行以内的 CLAUDE.md,等它真的装不下了,再拆 rules。一上来就搭一套精细的规则体系,维护成本会先于收益到来。

现在,AI 开始自己记笔记了

前面讲的都是"你写给 AI 看"。2026 年 2 月的 v2.1.33 版本加了个新东西,方向反过来:AI 自己写给自己看

在子代理定义里加一个 memory 字段,它就有了自己的持久记忆目录。工作流程是这样:启动时它先读自己的 MEMORY.md(前 200 行注入),干活途中随时读写,遇到MEMORY.md 装不下的细节,就自己归档成主题文件。用社区里流行的说法,你得在提示词里叮嘱它一句:“开工前先翻笔记,收工后把学到的记回去。”

存储位置也分三档,和配置文件的层级完全同构:user 存在用户目录下跨项目通用(推荐默认),project 进 git 团队共享,local 本地私有。

拿一个代码审查代理来说:没有记忆时,它每次审查都是从零开始的通才;有了记忆,它会记住”这个仓库的 PR 常漏空值检查”、“作者 X 的代码要重点看边界条件”——审得越多,越懂这个仓库的脾气。

收工前,过一遍这份清单

把这篇的内容压缩成 8 条,动手写或改 CLAUDE.md 时逐条对照:

  1. 写之前先问:这条信息是"长期有效"的吗?一次性的任务说明,放计划文档里去
  2. 目标 200 行以内;做不到就说明该拆了,不是该删了
  3. 构建、测试、lint 命令必须写——用"新人一句 run the tests 能跑通"来验收
  4. 团队共享的进根目录 CLAUDE.md,个人偏好进 ~/.claude/CLAUDE.md,私密配置进 CLAUDE.local.md 并加 gitignore
  5. 能在 settings.json 里配置的行为,别用文字写(比如 commit 归属、权限规则)
  6. 长文档里,场景相关的关键指令用 <important if="..."> 圈出来
  7. monorepo 按目录拆多级 CLAUDE.md,模块特有指令放模块里,别全堆在根上
  8. 装不下的时候优先拆 .claude/rules/,需要按文件路径触发加载的就加 paths

最后留一个诚实提醒:这 8 条能解决八成问题,但「AI 为什么忽略指令」至今还是社区里的开放问题——连 Claude Code 团队自己也没给出百分百的答案。记忆系统是这个工具迭代最快的部分之一,写这篇文章时依据的是 v2.1.278 前后的状态,等你读到时某些细节可能又变了。骨架大概率不变,细节以官方文档为准。

下一篇,我们回答一个更基础的选择题:Subagents、Commands、Skills 这三样东西名字看着都差不多,到底什么时候该用哪个?

系列导航