☰
Claude Code 记忆系统详解:Auto Memory 与 CLAUDE.md 的协作机制
2026/10/1 20:04:08 网站建设 项目流程

1. 为什么你的 Claude Code 总是“失忆”:从一次 Sub-agent 翻车说起

如果你正在用 Claude Code 跑 Sub-agents,大概率遇到过这种场景:主会话里明明交代过“这个项目用 pnpm,测试前先起本地 Redis”,结果切到一个负责写 API 测试的 Sub-agent,它张口就是npm install,还问你 Redis 端口是多少。你不得不把同样的上下文再喂一遍,喂完发现另一个 Sub-agent 又忘了。

这不是模型笨,而是 Claude Code 的记忆系统本身是分层的,而 Sub-agents 的记忆和主会话的记忆在物理上是隔离的。很多人只听说过CLAUDE.md,却不知道 Claude Code 还有一套 Auto Memory 机制——AI 自己给自己记笔记。两者一个是你写给 Claude 的确定性指令,一个是 Claude 在工作过程中自己积累的经验,协作起来才能让 Sub-agents 真正“记住事”。

这篇内容聚焦 Claude Code 的 Auto Memory 与 CLAUDE.md 如何协同工作,面向已经在用 Sub-agents 的开发者。我会给出 CLAUDE.md 的分层配置示例、Auto Memory 的触发条件与验证步骤,把记忆写入与读取的完整链路拆开讲清楚。读完你能做到:知道每条记忆存在哪、什么时候被加载、Sub-agent 怎么拿到属于自己的记忆,以及怎么用配置和命令去控制它。

先说结论性的认知:Claude Code 的记忆不是“越多越好”。每次启动,这些内容都会被塞进 system prompt,占的是你的上下文窗口。写得精准、组织得清楚,比写得多重要得多。下面从记忆类型讲起,一路讲到 Sub-agents 的独立记忆目录。

2. 两种记忆类型与六层结构:CLAUDE.md 和 Auto Memory 到底谁管什么

Claude Code 的记忆机制不只有 Auto Memory 一个功能,它是一整套分层体系。理解这套体系的关键,是先分清两种记忆类型。

CLAUDE.md是你写给 Claude 的指令,由用户手动维护,放在项目目录或用户目录。你可以把它类比成项目的.editorconfig或.eslintrc——用自然语言写的确定性规则。Auto Memory 则是 Claude 自己写给自己的笔记,由 AI 自动维护,存放在~/.claude/projects/<project>/memory/下。它记录的是工作过程中发现的项目模式、踩过的坑、你的偏好。

这两者的分工可以用一句话概括:CLAUDE.md 是“你必须这样做”,Auto Memory 是“我观察到事情是这样的”。

再往上看,Claude Code 实际有六层记忆结构,从全局到局部优先级递增:

层级位置谁维护共享范围优先级
组织策略/Library/Application Support/ClaudeCode/CLAUDE.mdIT/DevOps组织内所有人最低
项目记忆./CLAUDE.md或./.claude/CLAUDE.md团队通过 Git 共享↑
项目规则./.claude/rules/*.md团队通过 Git 共享↑
用户记忆~/.claude/CLAUDE.md个人所有项目↑
项目本地./CLAUDE.local.md个人仅当前项目↑
Auto Memory~/.claude/projects/<project>/memory/Claude 自己仅你自己最高

核心原则是:越具体的层级优先级越高。项目规则覆盖用户偏好,本地配置覆盖项目配置。这跟 Git 的配置层级--system → --global → --local是一个思路。

这里有个容易被忽略的点:Auto Memory 的优先级是最高的。也就是说,如果 Claude 自己在笔记里记了“这个项目测试要连本地 Redis”,而你的CLAUDE.md里没写,那 Auto Memory 的内容会生效。反过来,如果两者冲突,具体层级更高的 Auto Memory 可能压过你的项目指令——这也是为什么后面要强调“定期检查 MEMORY.md 有没有记错”。

对于用 Sub-agents 的开发者,理解这六层尤其重要:主会话加载的是工作目录往上的所有 CLAUDE.md、CLAUDE.local.md、~/.claude/rules/*.md,以及 Auto Memory 的 MEMORY.md 前 200 行。而 Sub-agent 有自己的记忆作用域,不会自动继承主会话的全部上下文。这个差异,就是“主会话记得、Sub-agent 不记得”的根因。

3. 可复制配置:CLAUDE.md 分层写法与 Auto Memory 开关

这一节给可直接抄的配置。先讲 CLAUDE.md 的写法,再讲 Auto Memory 的开关,最后给 Sub-agent 的记忆目录配置。

3.1 CLAUDE.md 基本格式与模块化拆分

一个能用的项目CLAUDE.md长这样:

# 项目约定 - 使用 pnpm,不要用 npm - 测试命令:pnpm test - 提交前必须跑 lint # 代码风格 - TypeScript 严格模式 - 组件用 PascalCase,工具函数用 camelCase - 不要自动加注释和 docstring

写 CLAUDE.md 有几个实用建议。把常用命令写进去,Claude Code 就不用每次都翻package.json。写具体的约定,不写模糊的要求——“函数不超过 30 行”比“代码要简洁”更有约束力。还可以用/init自动生成,Claude Code 会扫描项目结构生成基础 CLAUDE.md。

当项目变大,一个 CLAUDE.md 会变得又长又杂。这时用.claude/rules/目录按主题拆分:

.claude/rules/ ├── frontend/ │ ├── react.md │ └── styles.md ├── backend/ │ ├── api.md │ └── database.md └── testing.md

条件规则用 YAML frontmatter 限定只在处理特定文件时生效:

--- paths: - "src/api/**/*.ts" --- # API 开发规则 - 所有端点必须做输入校验 - 使用标准错误响应格式

这样处理src/api/下的文件时规则才加载,不占用其他场景的上下文。

3.2 Auto Memory 的开关控制

Auto Memory 默认是开的,但你可以从多个层级关掉它。优先级从低到高:

对话命令用/memory打开编辑器管理记忆。用户设置改~/.claude/settings.json:

{ "autoMemoryEnabled": false }

项目设置改.claude/settings.json,字段一样:

{ "autoMemoryEnabled": false }

环境变量优先级最高,适合 CI 场景:

export CLAUDE_CODE_DISABLE_AUTO_MEMORY=1

在 CI 里跑 Claude Code 时,我建议直接用环境变量关掉 Auto Memory,避免构建过程写入不确定的笔记。

3.3 Sub-agent 记忆目录配置

Sub-agents 可以拥有独立的持久化记忆,与主会话的 Auto Memory 物理隔离。作用域分三种:

作用域存储路径用途
user~/.claude/agent-memory/<name>/跨项目保留,适用于通用编码风格
project.claude/agent-memory/<name>/项目相关,可通过 Git 共享
local.claude/agent-memory-local/<name>/本地私有,不提交到版本控制

启用后,Claude Code 会自动在子智能体的 System Prompt 中加入读写记忆目录的指令,自动加载 MEMORY.md 前 200 行,并自动启用 Read、Write、Edit 工具。你不需要手动写这些指令,只要把目录建好、把 Sub-agent 的 name 对上即可。

如果你要把 Claude Code 接到自己的模型服务上跑这些配置,Base URL、Key、Model ID 三件套要写全。Base URL 用https://taotoken.net/api,Key 在控制台生成,Model ID 按你选的模型填。这三样缺一个,Sub-agent 启动时就会报鉴权或模型找不到的错。

4. 验证请求:Auto Memory 触发条件与完整读写链路

配置写完,得验证它真的在工作。这一节给可执行的验证步骤,把记忆写入和读取的链路走一遍。

4.1 触发 Auto Memory 写入

Auto Memory 的触发有两种方式:被动积累和主动指令。

被动积累是 Claude 在工作过程中自己判断值得记的东西。比如你反复纠正它“测试要连本地 Redis”,它可能就把这条记进debugging.md。主动指令则是你直接说:

记住我们用 pnpm 不用 npm 保存到记忆:API 测试需要本地 Redis 忘掉之前关于 Redis 的记忆

执行完这几句,去看存储目录:

ls -la ~/.claude/projects/<project>/memory/

正常会看到这样的结构:

~/.claude/projects/<project>/memory/ ├── MEMORY.md # 索引文件,每次启动加载前 200 行 ├── debugging.md # 调试相关笔记 ├── api-conventions.md # API 设计决策 └── ...

MEMORY.md是索引文件,启动时只加载前 200 行。主题文件(如debugging.md)按需加载,Claude 需要时才读。如果 MEMORY.md 超过 200 行,系统会提示 Claude 自行精简,把详细内容移到子文件。

4.2 验证读取链路

验证读取最直接的办法是开一个新会话,问一个只有记忆里才有答案的问题。比如你之前让它记了“API 测试需要本地 Redis”,新会话里直接问:

API 测试需要什么前置依赖?

如果它答出本地 Redis,说明 Auto Memory 的读取链路通了。如果没答出来,先确认MEMORY.md里确实有这条,再确认当前会话的工作目录和记忆目录的 project 名对得上。

4.3 验证 Sub-agent 记忆隔离

Sub-agent 的记忆验证要单独做。建一个测试用的 Sub-agent,让它记一条只属于它的信息,然后在主会话里问同样的问题。如果主会话答不出来,说明隔离生效了——这正是我们想要的。

反过来,如果你希望某个 Sub-agent 跨项目保留通用编码风格,就把它的记忆放到 user 作用域~/.claude/agent-memory/<name>/。如果只跟当前项目相关,放 project 作用域,还能通过 Git 共享给团队。

4.4 文件导入语法验证

CLAUDE.md 支持@path/to/file语法导入其他文件:

参考 @README 了解项目概况,@package.json 查看可用命令。 # 额外指令 - Git 工作流 @docs/git-instructions.md - 个人偏好 @~/.claude/my-project-instructions.md

相对路径基于当前文件所在目录解析,支持递归导入,最深 5 层。验证方法是改一下被导入的文件,看新会话里 Claude 是否感知到变化。

5. 本篇常见错排查:401、local proxy failed 与记忆不生效

配置和验证过程中,最容易撞上的是鉴权、网络和记忆加载三类问题。逐个对照排查。

5.1 401 鉴权失败

报错长这样:

API Error: 401 Unauthorized

先查 Key 有没有过期或复制时带了空格。再确认 Base URL 写的是https://taotoken.net/api,不要多加路径或斜杠。如果你用的是 Claude Code 的settings.json配置,检查env段里的ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY是否都填了。三件套里少任何一个都会 401。

5.2 local proxy failed

报错类似:

Error: local proxy failed to start

这类问题通常出在本地端口被占用或配置里指向了一个不存在的本地服务。检查你的settings.json里有没有残留的本地代理地址,把它改成正确的 Base URL。如果你在 CI 里跑,确认环境变量没有覆盖掉配置文件里的地址。

5.3 reading choices 报错

Error: reading choices: unexpected end of JSON input

这通常是响应体被截断或返回了非预期格式。先确认 Model ID 填对了——填了一个服务端不认识的模型名,返回的就不是标准结构。再确认没有中间层篡改响应。把 Model ID 换成明确支持的型号重试。

5.4 OAuth 相关报错

OAuth token expired or invalid

如果你用的是 OAuth 方式登录,token 过期后需要重新授权。但如果你走的是 API Key 方式,就不该出现 OAuth 报错——出现说明配置里混用了两种鉴权方式。清掉 OAuth 相关字段,统一用 API Key。

5.5 记忆不生效

记忆写了但 Claude 不读,按这个顺序查:第一,确认autoMemoryEnabled没被环境变量CLAUDE_CODE_DISABLE_AUTO_MEMORY=1关掉;第二,确认MEMORY.md没超过 200 行被截断;第三,确认当前工作目录对应的 project 名和记忆目录一致;第四,如果是 Sub-agent,确认它的记忆作用域和 name 对得上。

还有一个高频坑:CLAUDE.md 里已经写了“用 pnpm”,Auto Memory 又记一遍,这就是噪音。定期检查 MEMORY.md,把和 CLAUDE.md 重复的条目删掉。记忆越多不代表越好,每次启动都塞进 system prompt,占的是你的上下文窗口。

6. 把记忆链路接进你的工作流

讲完机制和排障,回到实际使用。我的做法是:项目 CLAUDE.md 写团队共识——构建命令、代码规范、架构决策,提交到 Git;CLAUDE.local.md 写个人偏好——测试数据路径、沙箱 URL,自动加到.gitignore;Auto Memory 让它自己跑,但每周花五分钟检查 MEMORY.md 有没有记错的。

Sub-agents 的记忆按用途分:通用编码风格放 user 作用域跨项目复用,项目相关的放 project 作用域跟 Git 走,本地私有的放 local 作用域不提交。这样主会话和各个 Sub-agent 各记各的,不会互相污染。

如果你还没配好接入层,先去控制台生成 API Key,Base URL 用https://taotoken.net/api,Model ID 按需选。配置和排障过程中卡住了,接入文档里有完整的字段说明和示例。想先验证模型对话效果,可以直接在模型对话里试几条记忆指令,确认读写链路通了再往 Sub-agents 上铺。长期跑编码和 Agent 任务的话,Coding Plan 更适合持续使用。

记忆系统的价值不在于记得多,而在于记得准、取得对。把 CLAUDE.md 的确定性指令和 Auto Memory 的自动积累分清楚,再让 Sub-agents 各管各的记忆,你的 Claude Code 才算真正“记住事”了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询