菜鸟AI - 让提示词生成更简单! 全站导航 全站导航
AI工具安装 新手教程 进阶教程 辅助资源 AI提示词 热点资讯 技术资讯 产业资讯 内容生成 模型技术 AI信息库

已有账号?

首页 > AI教程 > 2024年程序员必看:Claude Code记忆系统深度测评,功能体验与优缺点完整解析
进阶教程 程序员必看

2024年程序员必看:Claude Code记忆系统深度测评,功能体验与优缺点完整解析

2026-06-08
阅读 0
热度 0
作者 菜鸟AI编辑部
摘要

摘要

ClaudeCode记忆系统由内容语义与存储范围两个正交维度构成,包含用户手写规则(CLAUDE md)

Claude Code 记忆系统全解析:分类架构与工作流程

Claude Code 的记忆系统究竟如何运转?表面上是存储信息,底层却包含分类、分层设计以及并发检索机制,远不止简单的文件读写。下面从底层拆解整个记忆生命周期。

一、双重维度解析记忆类型

Claude Code 记忆系统由两个维度构成,理解这两个维度是掌握整个系统的关键。

维度 A:内容语义类型(记忆“描述什么”)

类型含义衰减速度
user用户身份、目标与背景知识极低衰减,近乎永久
feedback对 Claude 行为的纠正或认可慢,偏好稳定无变化
project进行中的工作、决策、里程碑与截止时间快,源码注释标有“decay fast”
reference外部系统资源指针中,外部系统相对固定

维度 B:存储范围类型(记忆“存储位置”)

前三种属于 CLAUDE.md 指令体系(用户手写规则),后三种属于 AutoMem 体系(Fork Agent 自动维护)。

类型体系存储路径跨项目
UserCLAUDE.md~/.claude/CLAUDE.md
ProjectCLAUDE.md/CLAUDE.md.claude/CLAUDE.md
LocalCLAUDE.md.claude/CLAUDE.md.local
ManagedCLAUDE.md外部注入(frontmatter 标记)
AutoMemAutoMem~/.claude/projects//memory/
TeamMemAutoMem~/.claude/projects//memory/team/

两个维度的正交关系

维度 A(内容语义)与维度 B(存储范围)构成正交坐标轴。AutoMem 承载全部四种内容类型——Fork Agent 提取记忆时,依据语义类型写入对应的 topic 文件,文件名直接反映类型(例如user_role.mdfeedback_testing.md)。

Session Memory:独立于分类的特殊机制

文档中提到的 Session Memory 不属于上述任何类型,定位完全不同:

AutoMem / CLAUDE.mdSession Memory
本质提炼的知识点当前对话的压缩摘要
目的跨会话传递知识解决上下文窗口过满问题
生命周期长期持久存储仅服务于当前会话
触发时机每轮对话结束后上下文累计 token ≥ 10,000 时

Session Memory 是 Compact 机制的一部分——当对话过长时,用结构化摘要替换原始对话历史,使对话得以延续。它解决的是“单次对话太长如何处理”,而非“下次会话如何记住本次内容”。

二、完整闭环:一次对话的生命周期

先看完整时序图,再逐阶段展开。

sequenceDiagram
participant 用户
participant Claude主线程
participant SystemPrompt
participant SonnetRanker
participant MemoryFS
participant ForkAgent

Note over 用户,ForkAgent: ── 会话 A 启动 ──
Claude主线程->>SystemPrompt: 请求加载跨会话记忆摘要
SystemPrompt->>MemoryFS: 读取记忆索引(≤200行/25KB)
MemoryFS-->>SystemPrompt: 返回 AutoMem 摘要索引
SystemPrompt-->>Claude主线程: 将长期记忆注入 System Prompt(每次必加载)

Claude主线程->>SystemPrompt: 请求加载用户指令规则
SystemPrompt->>MemoryFS: 读取 CLAUDE.md / rules/*.md(从当前目录向上遍历)
MemoryFS-->>SystemPrompt: 返回用户手写的行为约束规则
SystemPrompt-->>Claude主线程: 将用户指令注入 User Context

Note over 用户,ForkAgent: ── 用户发消息 ──
用户->>Claude主线程: 发送 prompt
par 并发执行(不阻塞主对话响应)
Claude主线程->>SonnetRanker: 异步启动相关记忆预取(不等结果)
SonnetRanker->>MemoryFS: 轻量扫描所有记忆文件元数据(只读前30行)
MemoryFS-->>SonnetRanker: 返回文件名、描述、修改时间清单
Note over SonnetRanker: 去除本轮已注入过的文件(防重复)
SonnetRanker->>SonnetRanker: 语义评分,精选最相关的 ≤5 个文件
SonnetRanker->>MemoryFS: 读取选中文件完整内容(≤200行/4KB)
MemoryFS-->>SonnetRanker: 返回文件内容(超1天附加过期提醒)
and
Claude主线程->>Claude主线程: 执行工具调用(Bash/Read/Edit...)
end
SonnetRanker-->>Claude主线程: 将相关记忆作为上下文注入本轮推理

Note over 用户,ForkAgent: ── Claude 推理(含记忆上下文)──
Claude主线程->>Claude主线程: 结合记忆与工具结果生成响应
Claude主线程-->>用户: 输出响应

Note over 用户,ForkAgent: ── 对话结束,异步触发记忆沉淀 ──
Claude主线程->>ForkAgent: 对话结束后异步派生子 Agent 提取记忆
Note over ForkAgent: fire-and-forget,主线程不等待
ForkAgent->>MemoryFS: 扫描已有记忆文件,获取现有内容清单
MemoryFS-->>ForkAgent: 返回已有 topic 文件列表(防止重复创建)
ForkAgent->>ForkAgent: 分析新增消息,按内容语义分类
ForkAgent->>MemoryFS: 将新记忆写入对应分类文件
ForkAgent->>MemoryFS: 更新记忆索引,保持摘要最新
Note over ForkAgent: 推进游标,下次只处理新增消息

Note over 用户,ForkAgent: ── 会话 B 启动(闭环完成)──
Claude主线程->>SystemPrompt: 请求加载跨会话记忆摘要
SystemPrompt->>MemoryFS: 读取已含上轮提取结果的记忆索引
MemoryFS-->>SystemPrompt: 返回最新记忆索引(包含上轮对话产生的新记忆)
SystemPrompt-->>Claude主线程: 注入 System Prompt → 循环往复

各阶段设计意图

① 会话启动:为何同时加载两套内容?

MEMORY.md(AutoMem)和 CLAUDE.md 是两套完全独立的体系,职责各异:前者是 Claude 从历史对话中学到的内容,后者是用户主动告知的行为规则。两者在会话启动时全量加载,因为都属于“无论聊什么都应知晓的背景”——不经相关性筛选,直接进入 System Prompt。

② 记忆预取:为何不等预取完成再开始推理?

预取(prefetch)与工具执行并发。Claude 收到用户消息后立即启动记忆预取,同时开始执行工具调用。工具调用本身存在 I/O 等待,预取在此期间悄然完成。等到第二轮 API 请求时,记忆已经就绪,可随工具结果一同发送给模型。这样用户感知到的延迟仅来自推理本身,记忆检索耗时完全隐藏在工具执行的等待中。

③ 语义评分:Sonnet 为何只看 description 而不看文件内容?

扫描阶段只读取每个文件的前 30 行(frontmatter),将所有文件的description字段汇总成清单,一次 sideQuery 即可完成选择。若让 Sonnet 阅读完整文件内容,则需先将所有文件读入,既耗时又消耗 token。description字段正是为此设计——写入记忆时要求描述精准,使评分阶段无需正文即可准确判断相关性。

④ 记忆注入时机:为何两次 API 请求之间才注入?

Claude Code 的核心是一个while(true)循环,每次循环对应一次 API 请求。推理(thinking)与响应(response)属于同一次 API 请求的流式输出块,无法在中间插入新内容。因此记忆只能在两次请求之间注入——第一轮请求触发工具调用,工具执行期间预取完成,第二轮请求时记忆与工具结果一并发送给模型。对于无工具调用的简单问答,第一轮直接 break,可能无法获取记忆。

⑤ 记忆提取:为何采用 fire-and-forget(异步记忆提取)而非等待结果?

提取记忆仅需将新内容写入磁盘,主线程无需知道“写了什么”即可继续——用户已获得响应,对话已结束,主线程没有理由继续等待。因此后台异步写入,主线程立即释放,用户感知不到额外延迟。

系统内置两层保护,防止多次提取互相冲突:

  • 互斥:若主 Agent 本轮已自行写入记忆,后台提取跳过该范围,避免重复
  • 排队:若上一次提取仍在运行,新请求进入队列,待前一次完成后触发补充运行

⑥ 游标机制:为何记录上次提取到哪条消息?

每次对话结束后,Fork Agent 只需分析“上次提取之后新增的消息”,而非重新扫描整个对话历史。游标记录提取边界,确保增量处理。若无游标,每次提取都将重新分析全部历史,既浪费 token,又可能产生重复记忆。

§1 会话启动 — 两套内容同步加载

每次会话启动时,Claude 同步加载两套完全独立的内容,各自承载不同的职责:

第一套:跨会话长期记忆(AutoMem 索引)

~/.claude/projects/<项目哈希>/memory/MEMORY.md 读取记忆摘要索引,注入 System Prompt。这些是 Claude 从历史对话自动积累的知识——用户角色背景、工作偏好、项目决策等。索引文件有大小限制(≤200 行/25KB),超出时自动截断。

第二套:用户手写指令规则(CLAUDE.md 体系)

从当前工作目录向上遍历目录树,依次读取 CLAUDE.md.claude/CLAUDE.md.claude/rules/*.md 等文件,注入 User Context。这些是用户主动告知 Claude 的行为约束——代码风格、禁止操作、项目规范等。

两套内容的本质区别:

跨会话长期记忆用户手写指令
来源Claude 从对话中自动提炼用户手动编写
存储位置~/.claude/ 用户目录项目目录树
更新方式每次对话结束后异步写入用户手动编辑
一句话Claude 自主记住的内容用户告知 Claude 的规则

两套内容均全量加载,不经相关性筛选——它们属于“无论聊什么都应知道”的背景,直接进入上下文,不经过 Sonnet 评分。

§2 用户发消息 — 相关记忆并发预取

用户发消息后,相关记忆预取立即并发启动,不阻塞主对话响应。预取与工具执行同步进行,利用工具 I/O 等待时间在后台完成,用户无额外延迟感。

检索流程分为 6 步:

  1. 扫描:递归读取 memory 目录所有 .md 文件,每个文件仅读前 30 行(frontmatter),按修改时间倒序,最多扫描 200 个文件
  2. 去重:过滤本 session 已注入过的文件,避免重复
  3. 构建清单:将所有文件的 description 字段汇总为清单,格式 - [type] filename (时间戳): description
  4. Sonnet 语义评分:将清单发送给 Sonnet 做独立侧边查询,Sonnet 仅看文件名和 description,不读正文,从中选出最相关的 ≤5 个文件
  5. 防幻觉校验:将 Sonnet 返回的文件名与实际存在的文件列表做交集,滤除不存在的文件名
  6. 读取内容:读取选中文件完整内容(每文件 ≤200 行且 ≤4KB),修改时间超过 1 天的附加过期提醒

为何评分只用 description 而不读文件内容?

若让 Sonnet 阅读完整文件内容,则需先读入所有文件,既慢又占 token。扫描阶段仅读取 frontmatter,将所有 description 汇总成清单,一次请求完成选择。这也是写记忆时要求 description 精准描述内容的原因——description 质量直接决定记忆能否被正确召回。

各层限制:

限制项数值
每轮最多召回文件数5 个
每个文件最大行数200 行
每个文件最大字节4 KB
每轮最大注入量≈20 KB
session 累计上限60 KB
扫描文件上限200 个

§3 推理 — 记忆注入时机

预取完成的记忆以 形式追加在用户消息之前,作为 Claude 的推理上下文呈现。

关键细节:记忆注入发生在两次 API 请求之间。

Claude Code 的核心是一个持续循环,每次循环对应一次 API 请求。推理(thinking)与响应(response)属于同一次请求的流式输出阶段,无法在中间插入新内容。因此记忆只能在两次请求之间注入:

轮次记忆状态
第 1 轮(用户发消息,预取刚启动)无记忆
工具执行期间(预取在后台完成)注入记忆
第 2 轮(工具结果 + 记忆一起发给模型)有记忆
无工具的简单问答(第 1 轮直接结束)可能无记忆

这意味着对于需要工具调用的复杂任务,记忆一定在第二轮推理前就绪;而对于简单的直接问答,记忆可能来不及注入。

§4 对话结束 — 异步记忆提取(fire-and-forget)

每轮对话结束后,系统异步触发两套独立的提取机制,主线程不等待结果:

长期记忆提取(AutoMem):

  • 每轮对话结束后调用 stop hook 无条件触发,在后台异步运行
  • 互斥保护:若主 Agent 本轮已自行写入记忆文件,后台提取跳过该范围
  • 排队机制:若上一次提取仍在运行,新请求进入等待队列,完成后触发补充运行

会话摘要提取(Session Memory):

  • 触发条件:context window 累计 token ≥ 10,000(首次),之后每增长 ≥ 5,000 token 且满足工具调用或对话断点条件
  • 用途:生成结构化会话摘要,供 Compact 时替代原始对话历史

Fork Agent 提取流程(5 步):

  1. 预扫描:读取现有 topic 文件列表,生成已有记忆清单注入提示词,避免重复创建文件
  2. 构建提示词:包含新增消息数量、已有记忆清单、四类内容定义(user/feedback/project/reference)及写入规则
  3. 派生子 Agent 执行:子 Agent 与主对话共享 System Prompt 前缀(命中 Prompt Cache,复用缓存),工具权限受限(只读 + 仅限记忆目录写入),最多执行 5 轮
  4. 写入记忆文件:按内容语义分类写入对应 topic 文件,并更新 MEMORY.md 索引
  5. 推进游标:记录本次提取处理到的最后一条消息,下次提取只处理新增消息,避免重复分析

三、文件格式详解

指令类(CLAUDE.md 体系)— 纯 Markdown,用户手写

# ~/.claude/CLAUDE.md
不要使用 any 类型。
永远先写测试。
回复用中文。
@./docs/coding-standards.md

支持 @include 引用其他文件,从 cwd 向上遍历目录树,越近优先级越高。

AutoMem 类(topic 文件体系)— 带 frontmatter,自动维护

topic 文件格式:

---
name: 回复风格偏好
description: 不要在回复末尾总结刚做了什么
type: feedback
---
不要在回复末尾用“总结”段落重复已完成的操作。
**Why:** 用户说“我能看到 diff,不需要你再重复”
**How to apply:** 所有回复结尾直接停,不加总结段

MEMORY.md 索引格式:

- [用户角色](user_role.md) — 研发架构师,侧重系统设计
- [回复风格](feedback_style.md) — 不要在末尾总结
- [项目状态](project_auth.md) — auth 重构由合规驱动

两套体系对比:

维度指令类(CLAUDE.md)AutoMem 类(topic 文件)
文件格式纯 Markdown,无 frontmatter带 YAML frontmatter
谁写用户手写Extract Agent 自动生成
加载时机每次会话启动,全量加载MEMORY.md 必加载;topic 文件按相关性每轮最多召回 5 个
跨项目User 类全局生效;Project/Local 限当前项目始终项目隔离

四、检索 vs 提取:并发机制对比

维度检索记忆(Retrieval)提取记忆(Extraction)
触发点用户发消息时对话结束时
并发机制非阻塞轮询异步
取消机制[Symbol.dispose]() 显式中止feature gate 控制
错误处理.catch() 返回空数组错误被吞掉,不影响主对话
何时完成工具执行期间对话结束后

五、新鲜度机制

文件年龄处理
≤ 1 天直接注入,无提醒
> 1 天附加:“This memory is X days old. Memories are point-in-time — verify against current code before asserting as fact.”

六、存储路径速查

文件路径何时读取何时写入
MEMORY.md~/.claude/projects//memory/MEMORY.md每次会话启动Extract Agent 完成后
topic *.md~/.claude/projects//memory/每轮对话 prefetch(≤5个)Extract Agent(按内容语义类型分文件)
CLAUDE.md项目根 / 父目录 / ~/.claude/CLAUDE.md每次会话启动用户手动编辑
team/*.md~/.claude/projects//memory/team/同 topic 文件(TEAMMEM flag 开启时)Extract Agent(scope=team)
session-memory~/.claude/projects//session-memory/auto-compact 触发时Session Memory subagent

七、设计哲学

整个记忆系统背后,有一套清晰的设计哲学:

1. 不阻塞主流程。 检索和提取均为异步,用户感知到的延迟仅来自推理本身。这是最关键的原则——任何额外等待都会削弱体验。

2. 精准而非全量。 每轮最多注入 5 个文件,借助 Sonnet 语义评分而非关键词匹配。宁缺毋滥,因为大量不相关记忆只会稀释有效上下文。

3. description 是记忆能否被找到的唯一入口。 评分阶段 Sonnet 仅查看 description,意味着写入记忆时 description 的质量直接决定能否正确召回。这不是理论问题——实际使用中,描述模糊的记忆与没有记忆几乎没有区别。

4. 两套体系各司其职。 CLAUDE.md 代表用户意图表达,AutoMem 代表 Claude 的学习积累。两者互不干扰,加载路径完全分离。若需规则永久生效,写在 CLAUDE.md 中;若希望 Claude 自主总结规律,依赖 AutoMem 的自动提取能力。

5. 游标机制保证增量。 确保每次提取仅处理新增消息,避免重复分析历史内容。此设计使记忆提取成本与对话长度无关,仅与单轮新增消息量成正比。

来源:互联网

免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

同类文章推荐

相关文章推荐

更多