
在使用 Claude Code 这类 Agentic Coding 工具时很多开发者都会遇到一个奇怪的现象项目根目录下的CLAUDE.md文件越写越长从最初的一百行慢慢膨胀到几百行、上千行内容越来越冗余AI 却并没有因此变得更聪明反而开始频频“答非所问”。如果你也有这种感觉那你可能正经历一种被海外开发者称为Catastrophic Remembering灾难性记忆的问题。本文就从这个问题出发分析它的成因、代价并给出一套可落地的治理方案。1. 背景CLAUDE.md 与 Agentic Coding 的绑定关系1.1 CLAUDE.md 到底是什么CLAUDE.md是 Anthropic 旗下编程助手 Claude Code 使用的项目级说明文件。你可以把它理解成一份“给 AI 看的项目说明书”它通常放在项目根目录下用来记录项目背景、构建命令、编码规范、架构约束、常见坑点等信息。当 Claude Code 启动并进入一个项目时它会自动读取这份文件把它作为系统级上下文的一部分从而在回答问题和生成代码时“贴合”当前项目的实际情况。简单来说普通 ChatGPT 对话AI 对你的项目一无所知每次都要重新解释。使用 CLAUDE.md 的 Claude CodeAI 在进入项目时就能读懂“这是什么项目、用什么技术栈、约定是什么、哪些操作被禁止”。这就是 Agentic Coding 模式下 AI 能连续完成多步开发任务的关键前提之一。1.2 Agentic Coding 对项目记忆的依赖Agentic Coding智能体编码指的是 AI 不再只是“对话助手”而是能够独立完成需求分析、代码编写、命令执行、测试验证、Bug 修复等一系列任务的开发模式。在这种模式下AI 需要具备非常强的上下文记忆能力。它不能像普通聊天那样每次只根据当前一轮对话回答它必须记住项目的目录结构依赖管理方式数据库连接配置代码风格约定哪些目录不能改动之前已经完成过哪些任务CLAUDE.md就是承载这些长期记忆的核心载体。它本质上是一个“AI 的长期记忆文件”和代码本身存放在一起跟随项目走。1.3 灾难性记忆一个值得警惕的新问题在传统机器学习领域有一个知名概念叫Catastrophic Forgetting灾难性遗忘指的是模型在训练新任务时把之前学到的旧知识忘得一干二净。而Catastrophic Remembering灾难性记忆则是一个刚好相反的问题AI 的“记忆文件”在不断累积却从不遗忘。CLAUDE.md 记录了越来越多的信息但这些信息并不一定仍然正确、仍然有用。最终记忆变成了负担AI 的处理效果反而下降。这就像一个人把所有事情都记在笔记本上从不删除、从不整理到最后笔记本厚到翻不动真正需要的信息反而被淹没。2. 为什么 CLAUDE.md 会不断膨胀CLAUDE.md 的膨胀不是偶然的它几乎是 Agentic Coding 工作方式下的必然结果。我总结下来主要有以下四个原因。2.1 追加式写作习惯大多数开发者在维护 CLAUDE.md 时采用的是典型的“追加式写作”遇到问题、解决问题、把解决方案追加到文件末尾。# 项目常见问题 ## 问题Docker 构建时缺少依赖 解决方案在 Dockerfile 中加上 apt-get install libssl-dev ## 问题测试环境连不上数据库 解决方案先执行 ./scripts/init-db.sh这样的写法有它的合理性毕竟遇到问题时快速记录下来比临时整理更高效。但在几十次会话之后这种零散追加的信息会越来越多而且彼此之间没有优先级区分。新信息和旧信息混在一起重要信息和临时信息混在一起最终 CLAUDE.md 就变成了一本没有目录的流水账。2.2 AI 主动建议“写入记忆”这是最具迷惑性的元凶。在 Agentic Coding 工具中AI 经常会在对话结束时主动询问“这个注意事项需要记录到 CLAUDE.md 吗”或者直接帮你生成一段建议追加的内容。开发者往往抱着“既然 AI 都建议了那就写上吧”的心态直接确认而不会去判断这条信息是否真的值得进入长期记忆。结果就是很多本可以放在代码注释、Wiki、README 甚至聊天记录里的临时内容都被塞进了 CLAUDE.md。2.3 缺少梳理与删除机制代码有代码审查、有垃圾回收机制、有技术债管理但 CLAUDE.md 几乎没有对应的管理机制。在大多数团队中没有人会定期检查 CLAUDE.md 里的信息是否过时也没有人规定文件超过多少行就必须重构。文件一旦被创建就会只增不减。时间一长必然出现以下情况早期记录的旧版命令已经不能用了但文件里仍然写着“推荐这样执行”。后来发现某个方案是错误的但只追加了更正说明没有删除原有错误描述。同一件事被不同会话记录了三遍措辞不同含义接近AI 无法判断以哪个为准。2.4 多人与多会话叠加当多个开发者共同使用同一个 CLAUDE.md 时情况会更加严重。开发者 A 擅长前端他在文件里记录了 Vite 构建相关的注意事项开发者 B 负责后端又追加了 Spring Boot 的规范开发者 C 是 DevOps继续补充部署脚本的说明。每个人的出发点是好的但合在一起文件就变成了一个“大杂烩”。更糟糕的是不同开发者对同一问题可能有不同的解决方案。A 说方案甲B 后来追加方案乙两段内容同时存在于文件中。AI 读取时根本无法判断哪个方案才是当前项目的最终选择。3. 灾难性记忆的代价不是“多记一点”这么简单很多人认为 CLAUDE.md 大一点没关系反正 AI 能处理长文本。但实际并非如此灾难性记忆带来的代价是系统性的。3.1 Token 成本持续上升CLAUDE.md 作为项目上下文被 AI 读取时会占用模型的 Token 输入额度。文件越大每次调用的 Token 消耗就越高。假设一个团队每天调用 Claude Code 500 次CLAUDE.md 从 5KB 膨胀到 50KB那意味着每天额外消耗的 Token 数量是非常可观的。而且这是一笔纯浪费的开销因为其中大部分信息对当前任务没有任何帮助。3.2 上下文污染AI 模型的注意力机制决定了它在处理超长文本时并不总能精准抓住最重要的信息。当 CLAUDE.md 塞满了大量过时、重复、矛盾的内容后AI 对“当前项目真正重要的约束”的敏感度就会下降。这会造成一种很典型的现象你明明在 CLAUDE.md 里写了“禁止修改 src/core 目录下的文件”AI 却经常无视这条约束。你希望 AI 遵循某个编码规范它却采用了文件早期记录的另一套过时规范。原因是这些重要信息被大量噪音淹没了。AI 的上下文窗口是有限的信息密度一旦下降决策质量必然跟着下降。3.3 信息矛盾引发的错误操作当 CLAUDE.md 中同时存在新旧两套相互冲突的指令时AI 的行为会变得不可预测。例如文件在早期写着“构建命令使用 npm run build”后来项目迁移到 pnpm 后有人追加了一条“记住使用 pnpm build”。AI 读到两条指令后可能随机选择其中一条执行。在 Agentic Coding 模式下这种操作会直接影响构建结果导致本来应该顺利完成的自动化任务失败。3.4 维护成本转嫁给人类CLAUDE.md 的膨胀还会反过来增加人类的维护成本。开发者在修改 CLAUDE.md 时需要先阅读大量已有内容确认是否重复、是否冲突、应该追加还是修改。这个过程非常耗时而且极易出错。最终CLAUDE.md 从一个提升效率的工具变成了一个吞噬效率的黑洞。4. 如何诊断 CLAUDE.md 是否已经“膨胀”在给出治理方案之前我们先用一些具体指标来判断自己的 CLAUDE.md 是否已经进入灾难性记忆状态。4.1 文件体积与行数检查最直观的指标就是文件大小。你可以用一条命令快速查看wc -l -c CLAUDE.md输出示例324 15680 CLAUDE.md意思是这个文件有 324 行、15680 字节。一般来说如果一个 CLAUDE.md 文件超过 200 行或 15KB就需要开始警惕了。如果超过 500 行或 50KB基本可以确定已经处于灾难性记忆状态。我个人的经验阈值是文件状态行数参考体积参考建议动作健康50 - 150 行3 - 8 KB正常维护亚健康150 - 300 行8 - 20 KB安排一次整理膨胀300 - 500 行20 - 50 KB需要重构灾难500 行以上50 KB 以上必须立即治理以上数值仅供参考实际还要结合项目复杂度来评估。如果一个微服务项目的 CLAUDE.md 只有 50 行那可能说明记录得不充分而一个 500 行的单体项目说明文件通常就意味着信息冗余。4.2 内容重复检测除了看体积还要检测内容重复。你可以用自己的 IDE 搜索关键词看看同一类指令是否被记录了多遍。常见的重复模式有重复的构建命令例如npm run build出现了 3 次。重复的目录结构说明多个章节都在解释 src 目录的用途。重复的技术栈描述开头介绍过技术栈后面的章节又介绍了一次。检测重复的一个简单方法是按“出现次数”进行搜索。也可以写一个快速脚本统计高频短语#!/usr/bin/env python3 # 文件路径scripts/check_claude_md.py 检查 CLAUDE.md 中的高频重复内容 from pathlib import Path import re from collections import Counter path Path(CLAUDE.md) text path.read_text(encodingutf-8) # 提取所有行内的命令片段 commands re.findall(r(?:npm|pnpm|yarn|pip|python|docker|make|git)\s\S, text) counter Counter(commands) print(出现次数最多的命令片段) for cmd, count in counter.most_common(10): print(f {count:3d} 次 {cmd})运行后如果发现同一个命令出现超过 3 次说明 CLAUDE.md 里存在冗余信息需要清理合并。4.3 过时信息扫描过时信息检测相对复杂需要结合项目的实际状态来判断。你可以重点检查以下几类内容是否还有已删除目录的描述。是否还在记录已经更换的第三方库用法。是否还写着已经废弃的脚本命令。是否引用了已经迁移的服务器地址或数据库连接信息。这些信息往往藏在文件的深处很难一眼发现。一个实用的方法是把 CLAUDE.md 当作一份代码来审查每次提交时看 diff而不是只看最终结果。5. 治理方案从“无限记忆”转向“分层记忆”既然灾难性记忆的核心问题是“什么都记、永远不删”那么治理思路就很明确了让记忆分层让内容有时效让维护变成常态。5.1 核心原则CLAUDE.md 只写“稳定且必要”的内容在整理 CLAUDE.md 时先问自己三个问题这条信息 AI 能从代码本身推断出来吗如果能就不该写。这条信息在三个月后还有用吗如果只是临时操作不该写。这条信息是不是只对某个特定会话有用如果是应该放在当前对话上下文里而不是长期记忆文件。遵循这三个原则CLAUDE.md 的内容量会自然缩减到合理范围。5.2 分层记忆架构更推荐的做法是采用分层记忆。不要把所有信息都塞进 CLAUDE.md而是让不同类型的记忆各归其位。记忆层级承载位置典型内容更新频率长期稳定记忆CLAUDE.md技术栈、架构约定、编码规范极低中期项目文档docs/ 下的 markdown 文件模块设计、接口说明、部署方案低短期会话记忆当前对话上下文本次任务目标、临时命令记录高CLAUDE.md 的角色应该是“索引 核心约束”而不是“知识库全集”。它应该告诉 AI 有哪些重要文档存在、哪些约束必须遵守至于详细内容则通过引用文档的方式提供给 AI。例如不推荐在 CLAUDE.md 中写数据库迁移的完整步骤 1. 修改 schema.sql 2. 执行 npm run migrate 3. 修改 migration logs 4. 重启服务 5. 验证数据一致性更推荐只写一句数据库迁移流程见 docs/database-migration.md迁移前必须确认备份完成。这样 CLAUDE.md 就保持了精简而详细步骤依然存在于项目中AI 需要时可以通过文档读取来获取。5.3 定期压缩流程压缩不是一次性动作而应该成为定期维护流程。建议按如下节奏进行每周回顾查看本周新增的 CLAUDE.md 内容判断是否仍然需要。每月压缩对文件进行一次整体重构合并重复内容删除过时信息。版本切换时技术栈升级、目录重构、架构调整时必须同步更新 CLAUDE.md。压缩的核心动作包括合并同主题内容到同一章节。删除已经不再使用的命令和配置。把详细说明迁移到 docs/ 目录只在 CLAUDE.md 保留引用。统一命令风格避免同时出现 npm/pnpm/yarn 混用。5.4 用 AI 压缩 CLAUDE.md更有趣的是你可以直接让 Claude 来帮忙压缩它自己的记忆文件。给 AI 一段指令让它在保持信息完整的前提下进行精简。提示词可以参考下面这个模板请帮我压缩下面的 CLAUDE.md 文件。要求 1. 保留所有仍然有效的技术约束和构建命令。 2. 删除重复内容、临时操作记录、已过时的信息。 3. 合并同类章节保持结构清晰。 4. 如果某些内容应该迁移到 docs/ 目录请标出“建议迁移”。 5. 压缩后的文件尽量控制在 100 行以内。 原文件内容如下 【粘贴你的 CLAUDE.md 全文】压缩完成后人工再过一遍确认没有丢失关键信息即可。5.5 使用自动化脚本控制体积为了强制约束 CLAUDE.md 的体积可以在 CI 或本地 git hooks 中增加一个体积检查脚本。下面是一个简单的 Bash 脚本示例超过阈值时给出警告#!/usr/bin/env bash # 文件路径scripts/check_claude_md_size.sh # 用途检查 CLAUDE.md 是否超过设定大小 # 建议通过 git pre-commit hook 或 CI 流水线调用 LIMIT_KB15 FILECLAUDE.md if [ ! -f $FILE ]; then echo CLAUDE.md 不存在跳过检查 exit 0 fi SIZE_KB$(du -k $FILE | cut -f1) echo CLAUDE.md 当前大小${SIZE_KB}KB if [ $SIZE_KB -gt $LIMIT_KB ]; then echo 警告CLAUDE.md 已超过 ${LIMIT_KB}KB建议进行压缩整理 echo 运行以下命令查看最长的 20 行 echo awk { print length, NR, \$0 } CLAUDE.md | sort -rn | head -20 exit 1 fi echo CLAUDE.md 体积正常 exit 0把该脚本接入 Git pre-commit hook# 文件路径.git/hooks/pre-commit #!/usr/bin/env bash bash scripts/check_claude_md_size.sh这样每次提交时都会自动检查一旦 CLAUDE.md 超限就会提醒整理。6. 最佳实践写出一份“健康”的 CLAUDE.md治理灾难性记忆除了靠流程和工具更重要的是从一开始就养成正确的写作习惯。下面这些最佳实践值得长期坚持。6.1 明确章节结构禁止无序追加一份健康的 CLAUDE.md 应该有清晰且固定的结构而不是“流水账式”的追加记录。推荐按以下大纲组织# 项目说明 ## 项目概述 两句话说清楚项目是什么 ## 技术栈与环境 语言、框架、包管理器、运行时版本 ## 常用命令 启动、测试、构建、迁移、部署 ## 架构与目录结构 核心目录职责、关键模块位置 ## 编码规范与约束 必须遵守的规则和禁止事项 ## 常见问题 有代表性的高频问题和解决方案控制在 10 条以内 ## 参考文档 链接到 docs/ 目录下的详细文档固定结构的好处有很多AI 更容易定位信息开发者更容易判断新增内容应该放在哪个章节审查者也更容易发现重复内容。6.2 新增内容时先做“三查”每次准备向 CLAUDE.md 追加内容前建议先花 30 秒做三次检查查已有搜索关键词确认是否已经有类似记录。查必要性这条信息是否属于长期稳定信息。查位置应该放在哪个章节而不是直接追加到文件尾部。将“无脑追加”改成“定点插入”能大幅减缓文件的膨胀速度。6.3 对生成式内容保持警惕当 AI 主动建议“记入 CLAUDE.md”时不要直接确认。先判断这条信息是否值得作为长期记忆保留。以下内容通常不需要写入 CLAUDE.md某次会话中的临时调试命令。一次性迁移操作的步骤。AI 生成的、代码中已经能体现出来的重复描述。只对当前任务有关的中间决策。下面这些内容则值得写入项目级别的架构约束。所有成员都必须遵守的编码规范。高频出现的、会导致失败的错误解决方案。外部依赖的特殊坑点。6.4 保持版本一致随代码一起审查CLAUDE.md 应该放在 Git 仓库中管理并且应该像代码一样接受 Code Review。每次变更 CLAUDE.md 时都应该提交 PR让其他成员看到变更内容。这样既能保证信息透明也能让团队了解项目记忆文件的最新状态。6.5 为 CLAUDE.md 建立“内容生命周期”意识任何信息都有生命周期。CLAUDE.md 中的条目也一样。建议为每条重要信息打上“隐性时间戳”写清楚这条信息适用的前提条件。例如## 技术栈2025 年 Q3 起生效 - 前端Vue 3 Vite - 构建工具pnpm这样当技术栈变更时开发者就能快速识别出哪些条目已经过期。7. 常见问题与排查思路在治理 CLAUDE.md 的过程中你可能会遇到下面这些典型问题。整理成表格方便对照排查。问题现象常见原因解决思路AI 频繁忽略 CLAUDE.md 中的关键约束重要信息被大量冗余内容淹没压缩文件把核心约束放在文件最前面的独立章节多次记录同一命令AI 执行时冲突不同会话追加了不同版本搜索关键词合并为一条并标注当前生效版本CLAUDE.md 增长过快每周增加几十行开发者在会话中无脑确认 AI 的写入建议建立“三查”制度设置体积检查脚本文件中有大量过时命令技术升级后没有同步更新旧文档每月压缩时重点核查命令与依赖版本多人协作后文件内容混乱没有固定章节结构各自在不同位置追加统一章节模板把 CLAUDE.md 变更纳入 Code Review压缩后 AI 对项目了解变差压缩过度把必要的细节也删掉了将详细信息迁移到 docs/ 目录而非直接删除AI 仍然无法理解项目全貌CLAUDE.md 写得过于精简缺乏索引信息在“参考文档”章节补充 docs/ 目录下各文档的说明如果你觉得自己的 CLAUDE.md 已经“病入膏肓”不要试图一点一点修补直接重写往往是更高效的选择。重写的步骤可以参考把现有 CLAUDE.md 全部内容导出。让 Claude 帮你生成一份压缩版初稿。人工核对删除过时信息保留核心约束。按固定章节模板重新组织。把详细内容迁移到 docs/ 目录。提交 PR和团队确认后合并。8. 总结与工程落地建议CLAUDE.md 的无限膨胀本质上反映的是 Agentic Coding 模式下“长期记忆管理”尚未成熟的问题。Catastrophic Remembering 听起来像是一个新造的术语但它描述的现象在真实项目中每天都在发生记忆不加筛选地累积最终让 AI 从“越用越聪明”变成“越用越混乱”。想要避免这个问题核心原则只有一句话CLAUDE.md 应该是一个被管理的信息系统而不是一个无限增长的记事本。在具体工程实践中建议你至少做以下三件事给 CLAUDE.md 设定体积上限并通过 git hooks 或 CI 脚本强制检查。把内容分成“核心约束”和“详细文档”前者留在 CLAUDE.md后者放 docs/ 目录。把 CLAUDE.md 的变更纳入 Code Review 流程像审查代码一样审查记忆文件。如果你接下来想继续深入学习可以进一步研究这些方向Agentic Coding 工具的上下文管理机制理解模型如何读取和利用项目文件。如何通过外部文档索引让 Claude 在需要时按需获取详细知识而不是一次性加载全部内容。团队协作场景下如何设计多人共享的 CLAUDE.md 模板与权限约定。最后给你一个可以立刻上手的小练习打开你当前项目的 CLAUDE.md先跑一遍wc -l -c CLAUDE.md看一下行数和体积再做一次内容去重搜索。如果发现文件已经超过 200 行就按本文第 5 节的方案做一次压缩整理。一次整理只需半小时但它能让你后续的每次 AI 编码协作都更高效。千万别让 CLAUDE.md 变成那个“什么都记、什么都忘不掉”的沉重包袱。