Claude源码分析 · Claude 是如何"记住"你的项目的
上篇文章基于Claude源码分析了Claude控制会话中上下文的机制,今天继续来聊一聊Claude Code的长期记忆。
一、两套系统,各司其职
Claude Code 有两套长期记忆系统,互补协同:
CLAUDE.md — 主要由你手动编写的指令和规则
项目关键信息的索引地图,你来写,Claude 来读
Auto Memory — Claude 自动记录的笔记
基于你的纠正和偏好,自动沉淀的使用习惯与隐性知识备忘录,默认开启
每次在项目目录下启动 Claude 会话,它都会读取这两样东西加载到上下文中——这就是 Claude 记住你项目的关键。
|
|
|
|
|---|---|---|
| 谁写 |
|
|
| 内容 |
|
|
| 作用域 |
|
|
| 加载时机 |
|
|
| 适用场景 |
|
|
二、CLAUDE.md:四层优先级
Layer 1 · 组织级 — IT/DevOps 管理,所有用户强制生效路径:/Library/Application Support/ClaudeCode/CLAUDE.md(macOS)
Layer 2 · 用户全局 — 个人偏好,跨所有项目生效路径:~/.claude/CLAUDE.md
Layer 3 · 项目级 ⭐ 最常用 — 团队共享,版本控制分发路径:./CLAUDE.md 或 ./.claude/CLAUDE.md
Layer 4 · 本地私有 — 仅自己可见,建议加入 .gitignore路径:./CLAUDE.local.md
加载规则:从当前目录向上遍历,越靠近当前目录的文件优先级越高,后加载的覆盖前面的。
💡 Claude.md 如何写,之前的文章和视频聊了很多了,这里就不展开了
三、Auto Memory:Claude 的自动记忆
Auto Memory 默认开启,核心机制是:Claude 在 System Prompt 中注入约 60 行行为指令,告诉它”你有一个持久化的文件记忆系统”,”如何保存、何时保存、保存什么”。
当触发条件满足时,Claude 主动写入 .md 文件并更新 MEMORY.md 索引。下次会话启动时自动加载。
比如你说”记住我喜欢简洁的回答,不需要总结”,它就会自动记录。
核心设计原则(源码 memoryTypes.ts):
“Memories are constrained to four types capturing context NOT derivable from the current project state.”
只记录无法从当前项目状态推导的隐性知识,严格分为四种类型。
四、四种记忆类型详解
Type 1: user — 用户画像
存什么:你的角色、目标、职责、知识水平作用域:始终 private何时保存:当了解到你的角色/偏好/知识细节时
🗣 你说:”我是数据科学家,正在调查日志系统”✅ Claude 保存:用户角色-数据科学家,当前目标-调查日志系统
用途:让 Claude 针对你的背景定制回答方式和解释策略。
Type 2: feedback — 行为反馈 ⭐⭐⭐ 最重要
存什么:你对工作方式的指导(该做/不该做)作用域:默认 private;项目级规范用 team何时保存:两种情况——① 你纠正(”不要用XX”)② 你确认非显而易见的方案(”对,就这样”)
🚫 纠正:”不要 mock 数据库,上次因此出了生产事故”✅ Claude 保存:integration tests 必须用真实数据库,原因:mock/prod divergence 曾掩盖坏迁移
✅ 确认:”对,单个 bundled PR 是对的,拆分只会增加噪音”✅ Claude 保存:重构此区域时用户偏好单 PR——确认后的有效判断,非纠正
关键设计哲学:不仅要记录失败,还要记录成功。如果只保存纠正,你会避免过去的错误,但会逐渐偏离你已验证过的方法,变得越来越保守。
Type 3: project — 项目上下文
存什么:进行中的工作、目标、bug(代码/git 中无法推导的)作用域:private 或 team(强烈偏向 team)何时保存:当了解到谁在做什么、为什么、何时完成时
🗣 你说:”重构 auth 中间件是因为法务标记了 session token 存储方式不符合新合规要求”✅ Claude 保存:auth middleware rewrite driven by legal/compliance(非技术债清理)
⚠️ 特殊要求:相对日期必须转为绝对日期!”下周四”❌ → “2026-03-05″✅
Type 4: reference — 外部系统指针
存什么:外部系统中信息的位置(Jira、Linear、Grafana、Slack 等)作用域:通常 team何时保存:当了解到外部资源及其用途时
🗣 你说:”bug 都记在 Linear 的 INGEST 项目里”✅ Claude 保存:pipeline bugs tracked in Linear project “INGEST”
五、什么不该存?
|
|
|
|---|---|
| 可从代码推导 |
|
| 可 grep 得到 |
|
| 可 git log 看到 |
|
| 临时性信息 |
|
核心原则:只存无法从当前项目状态推导的隐性知识。
常见滥用与纠正
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
六、CLAUDE.md 与 Auto Memory 怎么分工?
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
简单判断:需要精确措辞、团队共享、人工审核 → CLAUDE.md;隐性知识、个人偏好、自动沉淀 → Auto Memory。
七、MEMORY.md 索引与加载机制
所有记忆文件存储在 ~/.claude/projects/<sanitized-git-root>/memory/ 目录下。其中 MEMORY.md 是索引文件,每次会话都完整加载,最多 200 行或 25KB,超出会被截断。
为什么用索引而不是全量加载?
-
全量加载会消耗大量 token -
包含大量不相关信息 -
违反”只加载相关记忆”的设计原则
加载流程:
-
扫描所有 .md 的 frontmatter(获取 name / description / type / mtime) -
格式化成文本清单 -
用轻量模型(Sonnet)选择 Top-5 最相关的 -
返回路径列表 → 主模型决定是否读取内容
用户提问: "帮我重构认证模块"↓findRelevantMemories(query, memoryDir)↓① scanMemoryFiles() → 扫描所有 .md 的 frontmatter→ 获取 name / description / type / mtime (最多200个文件)↓② formatMemoryManifest() → 格式化为文本清单:[project] auth-rewrite.md (2026-03-05): Legal/compliance driven rewrite[feedback] no-mock-tests.md (2026-02-28): Must use real DB[reference] linear-ingest.md (2026-01-15): Pipeline bugs tracker↓③ Sonnet 模型选择 Top-5 最相关的(轻量模型 sideQuery,成本低;Top-5 为硬编码常量)↓④ 返回路径列表 → 主模型决定是否读取内容
💡 findRelevantMemories.ts
八、autoDream:后台记忆整合
autoDream 是后台记忆整合服务,把分散在多个会话中的短期记忆合并、去重、修正,整理成结构化的长期记忆。默认不开启,需要在 ~/.claude/settings.json 中设置 "autoDreamEnabled": true。
触发需要通过四道 Gate,全部通过才执行:
Gate 1
功能开关 ✅
Gate 2
时间 ≥ 24h
Gate 3
会话 ≥ 5 个
Gate 4
分布式锁 ✅
核心能力:跨会话聚合、记忆合并、去伪存真、索引维护、日期规范化。
九、扩展记忆系统
Agent Memory — 子代理独立记忆
每个 Agent 类型有自己独立的记忆空间,与主对话互不干扰。子代理能积累自己领域的经验,也不会污染主对话的记忆。
以上,就是Claude长期记忆管理的关键机制。
附录:源码索引
|
|
|
|
|---|---|---|
| Auto Memory 加载 | memdir.ts |
|
| 记忆类型定义 | memoryTypes.ts |
|
| RAG 召回 | findRelevantMemories.ts |
|
| 记忆扫描 | memoryScan.ts |
|
| 路径管理 | paths.ts |
|
| CLAUDE.md 解析 | claudemd.ts |
|
| autoDream 整合 | autoDream.ts |
|
| 整合 Prompt | consolidationPrompt.ts |
|
| 分布式锁 | consolidationLock.ts |
|
| Agent Memory | agentMemory.ts |
|
| Team Memory | teamMemPaths.ts |
|
| Stop Hooks | stopHooks.ts |
|
参考文档:Claude Code Official – Memory
源码位置:src/memdir/(持久化记忆)、src/utils/claudemd.ts(CLAUDE.md 解析)
夜雨聆风