1. 问题:

Agent 面临两大核心困境:

  • 进程级失忆:Agent 的记忆仅存于会话内存中,进程重启后一切归零,跨会话需重新认知。
  • 有损压缩不可逆:受限于上下文窗口,历史对话必须被压缩,但压缩会导致关键细节(如“用 Tab”退化为“有代码偏好”)永久丢失,且摘要无法跨会话传递。

2. 核心解法:Harness 层的“四层记忆架构”

为了解决“关掉重开全不知”,Claude Code 建立了独立于会话进程的持久化文件仓库~/.claude/projects/.../memory/)。其核心逻辑是 “索引常驻 + 按需加载 + 永不压缩”

第一层:永久索引(MEMORY.md)
  • 机制:项目根目录下的 .memory/MEMORY.md 文件。它不存细节,只存指针(每行一个链接,限制 200 行 / 25KB)。 Claude Code 自动记录和学习的“经验”,比如你的调试过程、架构决策或特定偏好。它的设计是与项目(Git 仓库)强绑定的,路径结构如下:~/.claude/projects/<项目名>/memory/
  • 加载每次会话启动时,该索引自动注入 System Prompt(利用 Prompt Cache 缓存,不额外消耗大量 token)。MEMORY.md 有⼀个硬性限制:前 200 ⾏或前 25KB,以先到者为准。超过这个阈值的内容不会⾃
    动加载。为什么要限制?因为每次会话都要加载 MEMORY.md,如果它膨胀到 5000 ⾏,光索引就要吃掉⼤量上下⽂窗⼜——这就又回到了"把百科全书塞进⼜袋"的⽼路。
  • 作用:让 Agent 每次启动时至少知道“有哪些事是重要的”。
  • 使用方法:系统自动维护,通过用户在聊天过程中的偏好表达自动存储。例如,当你说“请记住这个项目使用 TypeScript 5.0”、“我喜欢用双引号而不是单引号”或“这个函数应该总是返回 Promise”时,Claude 会自动提取这些偏好,创建对应的记忆文件并更新 MEMORY.md 索引。
第二层:按需深度加载(Topic Files + Skill)
  • 机制:每个记忆是一个独立的 .md 文件(带 YAML frontmatter,包含 name/description/type)。
  • 加载逻辑(Side-query):每轮用户提问时,Agent 通过一次轻量级 LLM 调用,根据当前对话内容从索引中筛选出最相关的 ≤5 个 记忆文件,读取完整内容注入到当前 user turn(而非注入 System Prompt,避免破坏缓存)。
  • Skill 加载(技能):同样遵循分层注入。System Prompt 只放技能名称(Layer 1,约 100 token/个),只有当 Agent 主动调用 load_skill 时,才返回完整的技能 Markdown 正文(Layer 2)。
  • 使用方法:https://blog.csdn.net/m0_73980980/article/details/161300753?spm=1001.2014.3001.5501
第三层:项目实时配置(CLAUDE.md)
  • 机制:区别于长期记忆,CLAUDE.md(用户级、项目级、目录级)属于环境上下文
  • 特点:在每轮对话前动态重新加载(包含当前 Git 分支、最近的 commit 信息)。修改该文件无需重启会话,即时生效,告诉 Agent “在这个项目里当下该怎么工作”。
  • 使用方法
    1. /init 命令:在新项目中使用 /init,Claude 会扫描代码库并自动生成一个初始的 CLAUDE.md 文件。这是一次性的、由用户主动发起的操作。
    2. 自然语言指令:你可以直接通过对话要求 Claude 更新记忆。例如,输入“更新 CLAUDE.md:在这个项目中永远使用 bun 而不是 npm”,Claude 便会代为修改文件。
    3. /memory 命令:手动编辑当前项目的 CLAUDE.md 文件,进行精细化的配置管理。
第四层:Transcripts——只搜不加载的档案
  • 机制:历史对话记录的完整存档。这些 Transcripts 文件存储在 ~/.claude/projects/<项目名>/transcripts/ 目录下,按会话和时间戳组织。
  • 加载策略永远不加载到上下文中。Transcripts 层采用“只搜不加载”原则,只能通过 grepag 等搜索工具进行检索。
  • 工作流程:当 Agent 需要回忆“三天前我们讨论过什么”或“上次关于某个函数的讨论”时,它会搜索 Transcripts 目录,但搜索结果只以摘要形式返回,完整的历史文本不会进入上下文。
  • 设计原理:为什么这一层这么严格?因为历史对话的体量可能是天文数字——一周的高频使用可能产生几十万 token 的对话记录。如果允许直接加载,上下文窗口瞬间就满了。通过“搜索→摘要”模式,Agent 既能获取历史信息,又不会耗尽宝贵的上下文资源。
  • 使用场景
    • 追溯历史决策过程
    • 查找之前讨论过的技术方案
    • 回顾项目演进历程
    • 验证某个功能是否曾经实现过

3. 永久索引(MEMORY.md)记忆的写入与提取(Extract Memories)

解决了“读”的问题,还要解决“写”的问题。用户不会总说“请记住”,偏好常散落在正常对话中。

  • 触发时机:在 Agent 循环结束时触发,即一轮对话结束。
  • 执行逻辑(去重与纪律)
    1. 截取最近的对话。

    2. 读取现有的记忆列表(防止重复)。

    3. 调用 LLM 提取新的偏好、约束或项目事实,返回 JSON 数组 {name, type, description, body}
      在这里插入图片描述
      每种类型都配有详细的 XML 格式描述,包含 <when_to_save> (何时保存)、 <how_to_use>(如何使⽤)和 (⽰例对话)——这些描述直接注⼊到系统提⽰词中,指导 Agent 的记忆⾏为。

    4. 写入纪律(工业级要求)先写入具体的 .md 文件,再更新 MEMORY.md 索引。防止索引指向一个未成功写入的“幽灵文件”。

    5. 使用前验证:记忆是“提示(Hint)”而非“真理(Truth)”。Agent 在使用记忆中的路径或函数名前,必须先通过 lsgrep 确认其当前是否存在(防止记忆老化导致误操作)。


4. 永久索引(MEMORY.md)记忆的整理与巩固(Auto Dream)

记忆文件会随使用越来越多,且可能产生矛盾或过时信息。Claude Code 通过 Auto Dream(类似人类 REM 睡眠)解决认知熵增。
在这里插入图片描述

  • 触发机制(四层门控)

    1. 时间门控:距上次整理 ≥ 24 小时。
    2. 节流门控:避免频繁扫描文件系统。
    3. 会话门控:自上次整理以来,已修改了 ≥ 5 个会话。
    4. 锁门控:确保没有其他进程正在整理(通过 .consolidate-lock 文件)。
  • 执行过程

    • Fork 一个独立的子 Agent(上下文与主 Agent 完全隔离)。
    • 该子 Agent 处于“只读梦境”状态(受限权限,只能读写记忆文件,不能修改项目代码)。
    • 执行 6 项认知整理工作:审查全貌 → 强化有效信息 → 删除过时内容 → 解决矛盾(保留最新) → 转化模糊洞察为确定事实 → 重组索引。
      在这里插入图片描述
  • 安全兜底:梦境不会污染现实(Auto Dream ⼦ Agent 的⼯具访问是受限的。它可以读写记忆⽂件,但不能执⾏ bash 命令、不能修改项⽬代码、不能发起⽹络请求。)。即使 Dream 误判删除了某个记忆,Agent 在实际使用时依然会通过工具验证现实环境,而非盲目相信记忆。
    在这里插入图片描述


总结:

维度 自动记忆 (Auto Memory) CLAUDE.md Skill
核心定位 Agent 的“长期工作经验”
自动记录对话中的偏好、决策与项目事实
Agent 的“员工手册”
静态的项目规则、编码规范与上下文说明
Agent 的“专业知识库”
按需加载的专项领域操作指南
存储位置 ~/.claude/projects/<项目名>/memory/
(按 Git 项目隔离)
分层存储:
• 用户级:~/.claude/CLAUDE.md
• 项目级:./CLAUDE.md
• 本地级:./CLAUDE.local.md
./.claude/skills/*/SKILL.md
(项目内或全局技能目录)
写入/更新方式 系统自动
每轮对话结束时由 extract_memories() 自动提取并写入
用户手动
通过 /init 生成,或用户/Claude 主动编辑,或 # 指令追加
用户手动
开发者预先编写好技能文件,Claude 按需读取
是否自动更新 (每轮结束后静默自动提取新记忆) (必须用户发起指令才会修改) (静态文件,内容固定)
加载方式 索引常驻 + 正文按需
MEMORY.md 索引注入 System Prompt
• 正文通过 Side-query 检索 Top-K 注入当前轮次
全量常驻
所有层级的 CLAUDE.md 内容在每轮对话前自动加载到 System Prompt
渐进式披露
• Layer 1:名称+描述常驻 System Prompt
• Layer 2:完整内容通过 load_skill 工具按需注入
作用域 项目隔离
不同 Git 仓库的记忆互不可见
分层叠加
用户级(所有项目共享)+ 项目级(当前项目)+ 本地级(个人覆盖)
项目绑定
技能目录通常位于项目内,特定项目可用
内容类型 动态的、对话中涌现的信息
(如“用户偏好 Tab 缩进”、“auth 重写是合规驱动”)
静态的、预先定义好的规则
(如“用 pnpm 安装”、“测试用 Vitest”)
结构化的长文本指南
(如“PDF 处理完整步骤”、“代码审查检查清单”)
典型用途 • 记住用户偏好
• 追踪项目当前状态
• 积累历史决策
• 设定编码规范
• 说明项目架构
• 提供常用命令
• 提供专业领域知识
• 执行复杂多步骤流程
• 封装专家经验
记忆是否可被压缩 永不压缩
独立存储,不参与上下文压缩,确保细节无损
永不压缩
作为 System Prompt 的一部分,不参与压缩
永不压缩
按需加载,不占用常驻上下文窗口
用户可见性 (黑盒运行,但可通过 /memory 查看) (直接可见的 Markdown 文件) (技能列表可见,内容调用后可见)
维护成本 (系统自动维护,定期由 Auto Dream 整理) (需手动维护,但使用频率高) (需预先编写和测试技能内容)

💎 三者协作关系

在实际工作流中,三者互补协作:

场景 谁在起作用
“这个项目用 Vitest 而不是 Jest” CLAUDE.md(项目规则)
“用户上次说偏好 Tab 而非空格” 自动记忆(跨会话召回)
“怎么对 PDF 进行加密签名?” Skill(按需加载专业知识)
“根据用户偏好,为新文件使用 Tab 缩进” 自动记忆 提供约束 + CLAUDE.md 提供代码风格规则

简单记忆口诀:

记忆记偏好(自动),手册定规则(CLAUDE.md),技能存方法(Skill)——三者各司其职,共同构筑 Agent 的完整知识体系。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐