苦 CLAUDE.md 久矣?Claude Code 刚上的“自动记忆”,终于不用每次都手动“喂”上下文了

71 阅读9分钟

最近一年 AI 编程工具更新很多。

模型更强了。
上下文更长了。
写代码更快了。
终端 Agent、IDE Agent、自动修 Bug、自动补测试,一个接一个地上。

但如果你真的连续用了几周,你会发现一个很现实的问题:

大多数 AI 编程工具最难受的地方,不是能力不够,而是它总“断片”。

你今天刚告诉它:

  • 这个项目用 Maven,不用 Gradle
  • 前端包管理必须是 pnpm
  • 提交前一定要跑测试
  • 某个接口不能随便改,因为要兼容老版本
  • 某个异常上周已经定位过一次

结果你关掉终端,第二天再开,它又像第一次进组。

所以我最近看到 Claude Code 上线 Auto Memory 这件事,第一反应不是“又多了个功能”,而是:

它终于开始补 AI 编程最关键的一块基础能力了。

不是更会写代码。
而是更会延续项目上下文。

为什么我觉得这个功能比很多“模型升级”都更重要

很多人看 AI 工具,先看的是排行榜、推理能力、基准测试。

这些当然重要。

但落到日常开发里,真正决定体验上限的,往往不是“它能不能解一道多难的题”,而是:

它能不能在下一次会话里继续接住你上一次的工作。

这一点如果做不到,模型再强,也还是会不断出现这些低效瞬间:

  • 新开会话先花几分钟补背景
  • 同样的项目约束要反复说
  • 上次已经确认过的结论还要再走一遍
  • AI 给出“标准正确但项目错误”的建议

这类问题不会像报错一样立刻炸给你看,
但它会持续吞掉你的注意力。

久了你就会发现,自己不是在和 AI 协作,
而是在反复培训一个短期记忆只有几小时的同事。

Claude Code 之前是怎么解决这个问题的

在 Auto Memory 出来之前,Claude Code 更主要的做法是靠 CLAUDE.md

也就是在项目根目录放一份说明文档,把规则写进去,让每次新会话启动时自动加载。

比如:

# Build

- Use Maven wrapper
- Run mvnw verify before commit

# Stack

- Java 17
- Spring Boot 3.x

# Conventions

- Service uses interface + impl
- Controller returns R<T>
- Use global exception handler

这个机制本身没有问题,而且到现在依然重要。

因为它解决的是“规则输入”:

  • 团队约定能被反复读取
  • 规则可以跟仓库一起版本管理
  • 新会话不至于完全裸奔

但它也有很明显的边界。

CLAUDE.md 最大的局限,不是麻烦,而是它装不下“经验”

规则文件很适合写这种内容:

  • 技术栈是什么
  • 构建命令是什么
  • 提交流程是什么
  • 哪些模式禁止使用

但它不太适合承载另外一类东西:

项目经验。

比如:

  • 某个测试在本地失败,多半是 Redis 没启动
  • 某个模块不要先改接口,先看适配层
  • 某段代码虽然丑,但还背着历史兼容,不能直接删
  • 某个问题不是代码错,而是环境变量缺了

这些东西你很难全部手工维护进 CLAUDE.md

写少了没用。
写多了会臃肿。
过一阵还可能过期。

所以过去 Claude Code 有“规则层”,但没有真正意义上的“经验层”。

Auto Memory 补上的,恰恰就是这一层。

Auto Memory 到底是什么

简单说,Auto Memory 就是 Claude Code 开始自动把一部分“值得保留的项目信息”写进本地记忆文件。

这些信息不是放进 Git 仓库,而是放进你本机的 Claude 目录里。

按你给的资料,项目级记忆目录大致长这样:

~/.claude/projects/<项目路径>/memory/
├── MEMORY.md
├── debugging.md
├── api-conventions.md
└── ...

这里可以把它理解成两层:

  • CLAUDE.md:你和团队维护的规则
  • memory/:Claude 自动沉淀的经验

一个偏静态。
一个偏动态。

一个适合共享。
一个更适合本地持续积累。

这就是为什么我更愿意把它理解成:

Claude Code 的记忆系统终于从“只读规则”,升级成了“规则 + 经验”双层结构。

它会记住哪些东西

从工程角度看,Auto Memory 记住的并不是“通识知识”,而是“你这个项目反复要用到的背景信息”。

典型会包括四类:

1. 项目工作流

  • 用什么构建
  • 测试怎么跑
  • 目录大致怎么分
  • 常用命令是什么

2. 环境前置条件

  • 调试 API 前要不要先起 Redis
  • 本地联调是否依赖 Docker Compose
  • 某个 profile 下才能复现什么问题

3. 结构性经验

  • 哪个目录不要手改
  • 哪个模块边界比较脆
  • 哪个类是关键入口
  • 哪些历史包袱短期别碰

4. 个人协作偏好

  • 你更喜欢先给方案再改代码
  • 你习惯提交前先跑测试
  • 你对命名、输出格式、工作流有什么明确倾向

注意,这些信息单独看都不算“宏大知识”。
但真正影响日常体验的,往往就是这些细碎但高频的背景。

它为什么不直接全量加载,而是做成主索引 + 主题文件

这个设计我觉得很关键。

按你给的内容,MEMORY.md 会作为主索引,在会话启动时优先读取,而且只加载前 200 行。
超出的内容会拆到 debugging.mdapi-conventions.md 之类的主题文件中,按需再读。

这其实说明 Claude Code 在记忆机制上有一个很清楚的取舍:

它要的是“有用的延续”,不是“无差别灌入一堆旧上下文”。

如果所有记忆都在每次启动时全量加载,会有两个问题:

  • 上下文成本变高
  • 噪音越来越多

所以它做成“启动索引 + 分主题扩展”是合理的。
这和很多工程系统里“热路径先加载、冷数据按需取”的思路很像。

这项能力实际怎么用

如果你的 Claude Code 版本足够新,按你给的资料,至少需要 v2.1.59 及以上。

可以先确认一下:

claude update
claude --version

然后进入项目,在 Claude Code 会话里执行:

/memory

你应该会看到类似这样的面板:

Memory
  Auto-memory: on
  1. User memory              Saved in ~/.claude/CLAUDE.md
  2. Project memory           Checked in at ./CLAUDE.md
  3. Open auto-memory folder

这三个入口分别对应三种不同来源:

  • 用户级记忆:跨项目的个人偏好
  • 项目规则:仓库中的 CLAUDE.md
  • 自动记忆目录:Claude 自己整理出来的项目经验

如果要主动告诉它一件事值得长期保留,也可以直接说:

记住这个项目用 pnpm,不用 npm
记住 API 测试前先启动本地 Redis
记住这个仓库提交前必须跑 mvn verify

这种说法本质上是在告诉 Claude:

“这不是一次性聊天内容,这是长期约束。”

怎么验证它是不是已经真正生效

最简单的方法不是去翻目录,而是看它在下一次会话里是不是少问废话。

你可以这样测:

  1. 先在项目里做一轮真实任务
    例如让它写一个接口、补一组测试、排一次失败

  2. 观察终端提示
    如果出现 Recalled X memories (ctrl+o to expand),说明它加载了已有记忆

  3. 展开看一下
    通过 Ctrl + O 看具体召回了哪些内容

  4. 关掉会话重新打开
    再问一个依赖历史背景的问题

例如:

这个项目用什么构建工具?
跑测试前要不要先启动依赖服务?
上次这个模块为什么没继续重构?

如果这些问题它能直接接住,而不是重新让你解释一遍,记忆机制就真的开始起作用了。

什么时候该交给 CLAUDE.md,什么时候该交给 Auto Memory

这是这套机制里最值得实践的一点。

我的建议很简单:

放进 CLAUDE.md

  • 技术栈
  • 目录职责
  • 构建命令
  • 测试流程
  • 提交流程
  • 明确禁止事项
  • 团队统一规范

更适合 Auto Memory 的

  • 最近排障结论
  • 本地环境注意事项
  • 某些模块的历史包袱
  • 反复提到的协作偏好
  • 阶段性但高频复用的背景

前者是制度。
后者是经验。

前者要稳定。
后者可以动态演化。

如果你把所有东西都硬塞进一个规则文件,最后只会得到一个越来越长、越来越没人维护的 CLAUDE.md

可以关闭吗

可以,而且应该知道怎么关。

并不是所有场景都适合记忆。

比如:

  • 临时探索性修改
  • 一次性实验
  • CI/CD 环境
  • 你不希望把本次会话污染长期记忆

按你给的资料,可以这样关闭:

当前项目关闭

// .claude/settings.json
{
  "autoMemoryEnabled": false
}

全局关闭

// ~/.claude/settings.json
{
  "autoMemoryEnabled": false
}

环境变量强制关闭

export CLAUDE_CODE_DISABLE_AUTO_MEMORY=1

环境变量优先级最高。
这点对 CI 很重要,因为 CI 追求的是确定性,不是长期记忆。

一定要说的边界:它不是团队知识库的替代品

我觉得这个点必须单独拿出来讲。

Auto Memory 再方便,也不应该替代正式文档:

  • README
  • 架构文档
  • ADR
  • 团队开发规范
  • 运维手册

它更像 Claude Code 的本地经验层,而不是组织级知识中枢。

还有一条更重要:

不要把敏感信息、密钥、隐私数据、生产环境凭据之类的东西,当作“下次还要用”随手丢进记忆里。

会记,不代表什么都该记。

总结

如果只把 Auto Memory 看成“Claude Code 会自己记笔记了”,其实低估了它的意义。

更准确地说,它补上的是 AI 编程工具里非常核心的一层能力:

让项目上下文可以跨会话延续。

这件事看上去不像模型升级那么显眼,
但对真正高频使用 AI 写代码的人来说,体感影响会非常直接:

  • 冷启动更快
  • 重复沟通更少
  • 项目约束更稳定
  • 排障上下文更容易接续

从产品形态上看,这也意味着 Claude Code 正在从“只会响应当前输入”,走向“能持续积累项目经验”。

以前比的是谁更会生成。
接下来比的,很可能是谁更会协作。