1. 为什么你的 Claude Code 每次开新会话都像失忆
用 Claude Code 写项目,最让人抓狂的不是它写不出代码,而是它记不住你的项目。昨天刚跟它讲清楚「领域层不能依赖应用层」「所有表必须带逻辑删除字段」,今天新开一个终端,它又开始在 Controller 里写业务判断,又开始手写硬编码 SQL。你不得不把同一套项目背景、技术栈、编码规范反复粘贴,粘贴到怀疑人生。
这个问题的根源在于:Claude Code 默认只有短期会话记忆,当前对话窗口一关,上下文就销毁了。它本质上是一个高度可扩展的智能体框架,采用模块化分层架构加事件驱动主循环,而不是一个能自动记住你项目的聊天工具。要让上下文跨会话延续,必须显式搭建一套记忆系统。
Claude Code 的记忆系统分三层:长期静态记忆(人工编写的 CLAUDE.md)、中期自动记忆(Auto Memory,AI 自己沉淀经验)、短期会话记忆(当前对话)。其中 CLAUDE.md 是项目的长期大脑,每次会话启动都会优先加载;Auto Memory 则让 Claude 在开发过程中自动把架构决策、踩坑日志、接口约定写进记忆文件,下次会话自动生效。
这篇就聚焦落地配置:从 CLAUDE.md 的骨架结构,到 Auto Memory 的开关与目录机制,给出可复制的 settings.json 片段和验证步骤,让你在真实项目里把记忆系统跑起来。适合已经在用 Claude Code、但被跨会话失忆折磨过的开发者。
2. 前置准备:TaoToken 接入与 Claude Code 环境
在配置记忆系统之前,得先让 Claude Code 能正常跑起来。我这边是通过 TaoToken 接入的,它提供统一的 API 入口,配置简单,模型对话、Coding Plan、API Keys 都在一个控制台里管理。
先拿到 API Key。打开控制台,进入 API Keys 页面创建一个新 Key:
# 控制台地址(创建 Key) https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite创建后复制 Key,然后配置 Claude Code 的环境变量。Claude Code 读取的是ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY这两个变量:
# 写入 shell 配置(以 zsh 为例) echo 'export ANTHROPIC_BASE_URL="https://taotoken.net/api"' >> ~/.zshrc echo 'export ANTHROPIC_API_KEY="sk-你的Key"' >> ~/.zshrc source ~/.zshrc # 验证变量生效 echo $ANTHROPIC_BASE_URL echo $ANTHROPIC_API_KEY | head -c 8注意 API 地址是https://taotoken.net/api,不要带任何多余路径。如果你用的是长期编码或 Agent 场景,建议直接上 Coding Plan,额度更划算,适合每天跑大量代码生成:
# Coding Plan 入口 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite环境配好后,进入你的项目根目录,运行claude能正常对话就说明接入成功了。接下来才是记忆系统的正题。
3. CLAUDE.md 骨架:把项目规则写进长期记忆
CLAUDE.md 是记忆系统的核心。它的加载优先级是这样的:全局用户记忆(~/.claude/CLAUDE.md)→ 项目团队记忆(项目根目录CLAUDE.md)→ 本地私有记忆(CLAUDE.local.md)→ 自动学习记忆(~/.claude/projects/{仓库hash}/memory/)。高层覆盖低层的冲突项。
其中项目根目录的 CLAUDE.md 是团队共享的核心文件,会全文完整加载,没有行数上限,但官方建议精简到 500 行以内。行数越少,模型遵守度越高。
3.1 六段式骨架模板
一个能落地的 CLAUDE.md,固定分六块。我把它整理成可直接复制的骨架:
# 项目:<项目名称> ## 1. 项目业务概述 ### 业务范围(严格遵守边界,禁止扩展) - <核心业务模块 1> - <核心业务模块 2> ### 业务约束 - <数据隔离规则 / 权限边界> ## 2. 技术架构 ### 后端 - 分层:<如 DDD 四层,禁止跨层调用> - 技术栈:<Java17 / SpringBoot3 / MyBatis-Plus ...> ### 前端 - 框架:<React19 / TypeScript / Vite ...> - 状态管理:<Zustand / Redux ...> ### 技术栈清单 - <完整依赖列表> ## 3. 全局目录结构(禁止随意新增目录) <目录树,标注每层职责> ## 4. 编码强制规范 ### 后端规范 1. <分层约束> 2. <异常处理约定> ### 前端规范 1. <类型约束> 2. <组件规范> ## 5. 本项目专属业务规则(最重要) ### 权限规则 ### 核心业务规则 ### 流程约束 ## 6. 开发命令清单(只允许执行以下命令) ### 后端 ### 前端 ## 7. 禁止操作清单 1. <禁止修改的文件> 2. <禁止跨层依赖>这个骨架的关键在于第 5 块业务规则和第 7 块禁止清单。前者是模型最容易忽略、但业务上最不能错的部分;后者是防止模型「自作聪明」乱改代码的护栏。
3.2 写 CLAUDE.md 的三个原则
第一,只写不变的规则。架构分层、业务边界、编码规范写这里;临时调试方案、本地环境配置不要写,那些放CLAUDE.local.md。
第二,业务规则单独切块。像评分逻辑、审批流转这类核心业务,单独开章节,模型优先级最高。我试过把评分规则混在编码规范里,模型经常漏读;单独成章后,遵守度明显提升。
第三,严格控制行数。300 到 500 行是甜点区。规则越少越精炼,模型遵守度越高。不要把几万字的 PRD 塞进去,那是反效果。
3.3 本地私有记忆:CLAUDE.local.md
有些配置只跟你本机有关,比如本地数据库端口、调试用的 mock 开关,这些不该提交到代码库。Claude Code 支持CLAUDE.local.md,放在项目根目录,记得加进.gitignore:
# 项目根目录创建本地记忆 touch CLAUDE.local.md echo "CLAUDE.local.md" >> .gitignore# 本地开发配置(不提交) - 本地 MySQL 端口:3307 - 前端 dev 端口:3100 - 调试开关:VITE_MOCK=true这样团队共享的 CLAUDE.md 保持干净,个人环境差异走 local 文件,互不干扰。
4. Auto Memory 开关与 settings.json 配置
CLAUDE.md 是人工写的静态记忆,Auto Memory 则是 Claude 自己沉淀的动态经验。开发过程中,它会自动把架构决策、调试经验、API 约定写进记忆文件,同一个 Git 仓库的所有目录共享一套自动记忆。
4.1 Auto Memory 的存储机制
自动记忆存放在~/.claude/projects/{仓库hash}/memory/目录下,主要文件有:
| 文件 | 作用 | 加载时机 |
|---|---|---|
| MEMORY.md | 主记忆,架构决策、踩坑日志 | 会话启动加载前 200 行 |
| debugging.md | Bug 修复方案、调试记录 | 按需读取 |
| api-conventions.md | 接口格式、分页参数约定 | 按需读取 |
关键限制:MEMORY.md 只有前 200 行在会话初始化时载入,超长内容会拆分到子文件,避免挤占 Token。所以自动记忆也不是越多越好,得控制主文件长度。
4.2 settings.json 配置片段
Auto Memory 的开关和记忆目录配置在 Claude Code 的 settings.json 里。项目级配置放在.claude/settings.json,用户级放在~/.claude/settings.json。下面是我在项目里用的配置片段:
{ "memory": { "autoMemory": true, "memoryDir": "~/.claude/projects/${PROJECT_HASH}/memory", "maxMemoryLines": 200, "autoFlush": true }, "context": { "loadProjectMemory": true, "loadLocalMemory": true, "memoryPriority": ["local", "project", "global"] } }参数说明:
autoMemory:总开关,设为true才会自动沉淀经验。memoryDir:记忆目录,${PROJECT_HASH}是 Claude Code 根据 Git 仓库自动生成的哈希,不用手动填。maxMemoryLines:主记忆文件加载行数上限,默认 200,不建议调太大。autoFlush:会话结束时自动把本次经验刷入记忆文件。memoryPriority:记忆加载优先级,local 覆盖 project,project 覆盖 global。
如果你想让某些经验强制写入自动记忆,可以在 CLAUDE.md 里加一段提示:
## 调试经验沉淀(自动记忆补充项) > 以下内容会自动同步到 Auto Memory,下次会话自动生效 1. <踩坑记录 1> 2. <踩坑记录 2>Claude 读到这段标记后,会在会话结束时把这些内容写入 MEMORY.md。
4.3 验证 Auto Memory 是否生效
配置完别急着写业务,先验证记忆系统真的在工作。分两步:
第一步,检查记忆目录是否生成:
# 查看项目对应的记忆目录 ls -la ~/.claude/projects/ # 进入你的项目 hash 目录,确认 memory 文件夹存在 ls -la ~/.claude/projects/<你的仓库hash>/memory/第二步,在会话里触发一次经验沉淀。随便让 Claude 修一个 bug,然后问它:
你刚才修复的这个 bug,会记录到自动记忆里吗?记录在哪个文件?如果配置正确,它会告诉你写入了debugging.md或MEMORY.md。然后退出会话,重新开一个终端,问它:
上次我们修复的那个 bug,你还记得原因吗?能答上来,说明跨会话记忆生效了。
5. 验证请求:让记忆系统跑通一次完整闭环
光看配置不够,得跑一次完整闭环。下面是我在真实项目里的验证流程,你可以照着做。
5.1 写入一条业务规则并验证加载
在 CLAUDE.md 的「业务规则」章节加一条:
### 考核评分业务规则 1. 考核总分 = 定量指标得分 * 权重 + 定性评价得分 2. 已提交评审的考核记录不允许修改,只能走驳回流程保存后,新开一个 Claude Code 会话,直接问:
我们这个项目的考核总分是怎么算的?已提交的考核记录能直接改吗?如果它准确答出「定量乘权重加定性」和「不能直接改,只能驳回」,说明 CLAUDE.md 被正确加载了。
5.2 触发 Auto Memory 沉淀
让 Claude 做一次真实的调试任务,比如修一个接口报错。修完后,在会话里显式要求:
把这次修复的原因和方案,记录到自动记忆的 debugging.md 里。然后检查文件:
cat ~/.claude/projects/<你的仓库hash>/memory/debugging.md应该能看到刚才的修复记录。再退出重进,问它这个 bug 的修复方案,能复述出来就说明 Auto Memory 闭环通了。
5.3 用模型对话快速验证记忆内容
如果你不想每次都开终端验证,可以用模型对话页面直接测。把 CLAUDE.md 的内容贴进去,问它某个业务规则,看它能不能准确理解:
# 模型对话入口 https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite这个方式适合快速验证 CLAUDE.md 的表述有没有歧义。如果模型对话里都理解错了,那 Claude Code 里大概率也会错,回去改 CLAUDE.md 的措辞。
6. 本篇常见错误排查
配置记忆系统时,踩过的坑基本集中在这几个地方。
CLAUDE.md 不生效。先确认文件位置对不对:项目根目录的CLAUDE.md才会被加载,放在子目录里不认。再确认文件名大小写,必须是全大写CLAUDE.md,claude.md在部分系统上不识别。
Auto Memory 目录不生成。检查 settings.json 里autoMemory是否为true,以及memoryDir路径里的${PROJECT_HASH}有没有被错误地写成了字面量。这个变量是 Claude Code 运行时替换的,你手动填反而会出错。
记忆内容互相冲突。比如 CLAUDE.md 说「禁止手写 SQL」,Auto Memory 里却记了一条「某处手写 SQL 更快」。这时候靠memoryPriority决定谁覆盖谁。我的建议是静态规则永远优先,把memoryPriority设成["local", "project", "global"],让人工写的规则压过 AI 自学的经验。
MEMORY.md 太长导致加载变慢。前面说过只加载前 200 行,超出的部分按需读取。如果你发现会话启动变慢,检查一下 MEMORY.md 是不是堆了几千行。定期清理,把过时的经验删掉,或者拆到子文件里。
改了 CLAUDE.md 但当前会话没反应。CLAUDE.md 是会话启动时加载的,改了之后要新开会话才生效。当前会话里想让它立刻遵守,得手动把改动贴给它。
API 请求报 401。多半是ANTHROPIC_API_KEY没配好或者 Key 失效了。去控制台重新生成一个:
# API Keys 管理 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite接入文档找不到对应配置项。Claude Code 的配置项版本间有差异,遇到不认识的字段,查接入文档最准:
# 接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite7. 把记忆系统用成习惯
记忆系统配好只是第一步,真正让它产生价值的是日常使用习惯。我的做法是:每次 Claude 帮我解决一个非平凡的 bug,我都会顺手让它把方案写进 Auto Memory;每次项目架构有调整,我第一时间更新 CLAUDE.md 的对应章节。这样积累下来,新会话的启动成本越来越低,Claude 对项目的理解越来越准。
如果你还在用零散的对话上下文硬撑,建议从今天开始,先给项目建一个 CLAUDE.md,把最核心的三条业务规则写进去,跑一次验证闭环。等你体验到新会话里 Claude 张口就能说出项目规则的感觉,就回不去了。
需要长期跑编码和 Agent 任务的,直接上 Coding Plan,配合记忆系统用,效率提升最明显:
# Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewriteClaude Code 相关的接入配置和 API 用法,文档里都有:
# 接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite