← 返回列表

阅读 —下载 —

Claude Code 六层记忆体系

结构说明:本文采用 总 — 分 — 总 三层组织。 第一层(总):整体认知,先建立全局地图。 第二层(分):逐层拆解 ⑥ 个记忆层 + 1 个横向缓存体系。 第三层(总):收束关系,给出最终结论。

配图 4 张(矢量 SVG + PNG,位于 82.ClaudeCode六层记忆体系-图/): 图 1 六层记忆体系总览(见「2. 整体架构」)、图 3 指令记忆遍历收集与反转加载(见「1.2 加载策略」)、 图 2 摘要记忆压缩过程(见「第 5 层」开头)、图 4 缓存体系与 Prompt Cache(见「横向篇」开头)。


第一层 · 总:整体认知

1. 核心思想

Agent 的记忆不是简单地“保存聊天记录”,而是按照不同的生命周期、作用域和用途进行分层管理,在有限 Token / Context Window 下实现:

  • 规则约束
  • 上下文保持
  • 任务连续
  • 长期沉淀
  • 上下文压缩
  • 记忆治理

一句话概括:

不同的记忆解决不同的问题,用不同的生命周期管理,最终在有限的 Context 里维持长期运行的连续性。


2. 整体架构

Claude Code Memory
│
├── ① 指令记忆|规则级
│   └── CLAUDE.md
│
├── ② 短期会话记忆|Session 级
│   └── Recent Context
│
├── ③ 工作任务记忆|Task 级
│   └── Task State
│
├── ④ 长期记忆|Persistent 级
│   └── memdir / MEMORY.md / Topic Memory
│
├── ⑤ 摘要记忆|Compression 级
│   └── session-memory.md
│
└── ⑥ AutoDream|离线级
    └── 记忆整理 / 重塑 / 索引

横向还有一层缓存体系(性能层),它不属于六层记忆,但和记忆体系协同工作。

Claude Code 六层记忆体系总览:①~⑥ 六层记忆 + 横向缓存体系

图 1 六层记忆体系总览 —— ① 指令记忆 / ② 短期会话记忆 / ③ 工作任务记忆 / ④ 长期记忆 / ⑤ 摘要记忆 / ⑥ AutoDream,底部横带为不属于六层的缓存体系。


3. 六层分别解决什么问题?

层级 核心问题 本质 生命周期
① 指令记忆 Agent 应该怎么做? 规则 长期稳定
② 短期会话记忆 刚才聊了什么? 当前上下文 单次 Session
③ 工作任务记忆 现在做到哪了? 任务状态 单个 Task
④ 长期记忆 以前积累了什么? 长期知识 / 经验 跨 Session 持久
⑤ 摘要记忆 Context 太长怎么办? 上下文压缩 Session 内滚动
⑥ AutoDream 记忆越来越多怎么办? 记忆治理 离线后台

4. 一条主线:记忆 vs 缓存

记忆体系
→ 记什么、怎么保存、怎么压缩、怎么治理

缓存体系
→ 已有内容怎么更高效地复用

两者要严格区分:

Harness / Claude Code 的上下文组织
                ≠
Anthropic Model API 的 Prompt Cache

记忆是“存什么”,缓存是“怎么少重复干活”。


5. 全文地图(阅读指引)

第二层章节 对应层面 核心诉求
第 1 层 ① 指令记忆 应该怎么做
第 2 层 ② 短期会话记忆 刚才聊了什么
第 3 层 ③ 工作任务记忆 现在做到哪
第 4 层 ④ 长期记忆 以前记住什么
第 5 层 ⑤ 摘要记忆 太长了怎么压
第 6 层 ⑥ AutoDream 乱了怎么整理
横向篇 缓存体系 已有内容怎么复用

第二层 · 分:六层记忆 + 缓存逐层详解

第 1 层 | ① 指令记忆|规则级

解决:Agent 应该怎么做。

核心载体是 CLAUDE.md 文件体系。

1.1 四层体系

Managed
   ↓
User
   ↓
Project
   ↓
Local
层级 作用
Managed 组织 / 公司级统一策略
User 用户个人全局偏好
Project 项目 / 团队共享规范
Local 当前项目的本地私有规则

核心思想:

全局提供基础约束,局部提供项目灵活性。

例如:

Managed
└── 公司安全规范

User
└── 我的编码习惯

Project
└── 项目技术栈、架构规范

Local
└── 本机特殊配置

1.2 加载策略

不是只读取当前目录的 CLAUDE.md。

可以理解为:

CWD
 ↓
parent
 ↓
grandparent
 ↓
...
 ↓
root

第一步:遍历收集

CWD → parent → ... → root

收集沿途存在的指令文件。

第二步:反转加载

root → ... → parent → CWD

即:

先向上遍历收集,再从全局到局部反向加载。

最终形成:

全局基础规则
      ↓
用户规则
      ↓
项目规则
      ↓
当前目录规则

越具体的作用域拥有越强的针对性。

指令记忆加载策略:遍历收集与反转加载

图 3 ① 指令记忆加载策略 —— 左侧肘形折线向上为「遍历收集 CWD → … → root」,右侧肘形折线向下为「反转加载 root → … → CWD」,下方接四级注入顺序与双轨注入。

1.3 设计好处

统一约束
   +
局部定制
   ↓
既规范,又灵活

避免:

  • 所有项目都强制使用一套规则
  • 每个项目都从零定义规则
  • 用户习惯无法复用

1.4 双轨注入架构

指令进入模型可以从两个通道理解:

             指令 / 行为规范
                    │
          ┌─────────┴─────────┐
          ↓                   ↓
      通道 A                通道 B
   用户/项目指令            系统行为规范
          │                   │
     CLAUDE.md              System Prompt
          ↓                   ↓
   上下文中的指令内容       模型系统级约束

通道 A:CLAUDE.md

CLAUDE.md
    ↓
读取 / 聚合
    ↓
进入当前模型请求上下文

特点:

  • 用户 / 项目相关
  • 动态
  • 具有较强的局部性

通道 B:系统行为规范

系统行为规范
    ↓
System Prompt

特点:

  • 系统内建
  • 相对稳定
  • 生命周期长
  • 更适合作为稳定上下文的一部分

核心区别

CLAUDE.md
→ “这个用户 / 项目有什么要求”

System Prompt
→ “Agent 本身应该遵守什么行为规范”

第 2 层 | ② 短期会话记忆|Session 级

解决:当前这次对话发生了什么。

主要就是当前 Session 的上下文:

User
 ↓
Assistant
 ↓
Tool Call
 ↓
Tool Result
 ↓
User
 ↓
...

包括:

  • 用户问题
  • Agent 回复
  • Tool 调用
  • Tool Result
  • 当前上下文信息

2.1 Recent Context

不是简单按照“多少轮对话”计算。

核心受:

Context Window
+
Token Budget

约束。

可以理解为:

完整 Session
      ↓
当前 Context
      ↓
Token Budget
      ↓
Context Window

当上下文越来越长,就需要:

  • 截断
  • 压缩
  • 摘要
  • 召回长期记忆

2.2 和长期记忆的区别

短期记忆
→ 当前 Session 发生了什么

长期记忆
→ 跨 Session 以后还需要记住什么

短期记忆更接近当前原始上下文。

长期记忆则是跨 Session 提炼后的持久知识。


第 3 层 | ③ 工作任务记忆|Task 级

解决:当前任务做到哪里了。

短期记忆回答:

“我们刚才聊了什么?”

工作记忆回答:

“这件事情现在做到哪了?”

3.1 存什么?

典型包括:

任务目标
当前进度
已完成步骤
中间结论
失败尝试
待办事项
下一步计划
临时状态

例如:

实现用户登录
│
├── ✓ 数据库表
├── ✓ Entity
├── ✓ Service
├── → Controller
└── ○ 测试

3.2 生命周期

Task Start
    ↓
创建 Task State
    ↓
任务执行
    ↓
不断更新
    ↓
Task Complete
    ↓
清理 / 销毁

它和长期记忆最大的区别:

工作记忆主要是临时状态,不应该把所有 Task State 都永久保存。

只有真正具有长期价值的信息,才应该沉淀到长期记忆。


第 4 层 | ④ 长期记忆|Persistent 级

解决:跨 Session 以后还记得什么。

这是整个记忆体系中真正负责持久化的一层。

4.1 Memory 结构

可以理解为:

memdir
│
├── User
│   └── 用户画像
│
├── Feedback
│   ├── 成功确认
│   └── 错误纠正
│
├── Project
│   └── 项目长期上下文
│
├── Reference
│   └── 外部知识指针
│
└── MEMORY.md

User:用户画像

保存长期稳定的:

  • 偏好
  • 工作风格
  • 经验水平
  • 习惯

Feedback:行为反馈

特别重要的是:

错误纠正
→ “以后不要这么做”

成功确认
→ “以后优先这么做”

也就是:

通过用户反馈不断形成 Agent 的长期经验。

Project:项目上下文

例如:

技术栈
架构约定
目录结构
业务规则
项目特殊约束

Reference:外部指针

不是把所有外部知识全部复制进 Memory。

而是保存:

Reference
   ↓
URL
Wiki
官方文档
知识库
代码仓库

需要时再读取。

因此:

Memory 更适合保存“以后应该知道什么 / 去哪里找”,而不是把所有外部知识全部塞进 Memory。

4.2 索引与动态召回

长期记忆不是:

所有 Memory
    ↓
全部塞进 Context

而是:

当前任务
    ↓
Memory 索引
    ↓
候选记忆
    ↓
动态筛选
    ↓
Relevant Memory
    ↓
进入当前 Context

核心目标:

只把当前任务真正需要的长期记忆召回。

4.3 AI 决策式召回

传统 RAG 可以理解为:

Query
 ↓
Embedding
 ↓
Vector Search
 ↓
Top-K

Agent Memory 可以进一步采用:

当前任务
    ↓
候选 Memory
    ↓
AI 判断哪些记忆有用
    ↓
Relevant Memory

也就是:

不一定单纯依赖关键词或向量相似度,而可以让模型参与判断记忆是否真正相关。

这是 Agent Memory 和传统知识库检索之间的重要区别之一。

4.4 为什么 Fork 子 Agent 写 Memory?

不要让主 Agent 同时承担:

业务任务
+
Memory 整理
+
Memory 写入

可以:

                主 Agent
                   │
          ┌────────┴────────┐
          ↓                 ↓
      完成业务任务       Fork Memory Agent
                            ↓
                       整理 / 提炼 / 写入

好处:

  • 降低主 Agent 上下文压力
  • 减少主 Agent 的额外认知负担
  • Memory 操作与业务任务解耦
  • 可以后台异步执行

4.5 Memory 读写互斥

多个 Agent 同时操作 Memory 可能出现:

Agent A ──┐
          ├── Memory
Agent B ──┘

可能导致:

  • 并发覆盖
  • 脏写
  • 数据竞争
  • 更新丢失

因此需要相应的:

读写互斥 / 锁 / 原子更新 / 版本控制等机制。


第 5 层 | ⑤ 摘要记忆|Compression 级

解决:Session 越来越长,Context Window 不够怎么办。

核心载体:

session-memory.md

这一层需要重点区分两个概念:

Session Memory 更新
        ≠
真正 Context Compact

Session Memory 是后台持续维护的摘要状态;Context Compact 才是真正让主 Context 变小的过程。

摘要记忆压缩过程:双时间轴、Compact 触发与循环

图 2 ⑤ 摘要记忆压缩过程 —— 主 Context 与后台 Session Memory 双时间轴并行;≈187K 触发 Compact;老历史压成摘要、最近 40K 以内保留原文;缩到 ≈45K 后继续增长并再次 Compact。

5.1 两条线同时运行

整个过程可以理解成:

                    Claude Code
                         │
          ┌──────────────┴──────────────┐
          │                             │
          ▼                             ▼
     主 Context                  后台 Session Memory
          │                             │
          │                             ▼
          │                       Forked Agent
          │                             │
          │                             ▼
          │                     session-memory.md
          │                             │
          │                       不断更新版本
          │
          ▼
    Context 持续增长
          │
          ▼
    接近 Compact 阈值
          │
          ▼
     真正 Compact

主 Context 是:

当前模型调用真正携带的上下文。

可以包括:

System Prompt
+
Claude Code Instructions
+
当前 Session 消息
+
Assistant 消息
+
Tool Use
+
Tool Result
+
当前请求需要的其他信息

正常情况下:

后台 Session Memory 更新,不会立即删除主 Context 中的原始消息。

5.2 Session Memory 如何渐近式更新

Session Memory 并不是:

Context 爆掉
    ↓
一次性总结整个 Session

而更接近:

已有 Memory
     +
上一次提取之后新增的原始消息
     ↓
新的 Memory

即:

增量 / 渐近式维护 Session Memory。

例如:

10K 原始消息
   ↓
Memory V1

新增 5K
   ↓
V1 + 新增原始消息
   ↓
Memory V2

再新增 5K
   ↓
V2 + 新增原始消息
   ↓
Memory V3

不是每次都重新总结全部历史。

关键状态

源码分析中可以看到类似:

lastSummarizedMessageId
tokensAtLastExtraction
sessionMemoryInitialized

它们用于知道:

已经总结到哪里
+
上次总结时是多少 Token
+
Session Memory 是否已经初始化

因此后台 Agent 不需要每次从头处理整个 Session。

Session Memory 默认触发参数

在我们分析的 Claude Code 源码版本中,可以看到:

参数 默认值 作用
首次建立 Session Memory 10K tokens 对话达到一定规模后开始建立
后续更新 Token 增量 5K tokens 距离上次提取新增约 5K 后满足更新条件
Tool Call 门槛 3 次 与 Token 增长、自然对话断点共同参与触发判断

核心逻辑可以理解为:

Token 增长 ≥ 5K
        AND
Tool Call ≥ 3

或者:

Token 增长 ≥ 5K
        AND
最新 Assistant Turn 没有 Tool Call

所以:

5K 是必要的 Token 增量条件;3 次 Tool Call 不是任何情况下都必须满足的绝对条件。

同时需要注意:

不同 Claude Code 版本可能调整这些内部参数,因此不要把这些数字理解成永久固定的 API 合同。

5.3 Session Memory 是异步的

主 Context 和 Session Memory 的进度不是完全同步的。

例如:

主 Context
0K → 10K → 50K → 100K → 150K → 180K → 187K
                                      ↑
                                继续正常执行

与此同时:

Session Memory
10K  → V1
15K  → V2
20K  → V3
...
150K → V20

因此完全可能出现:

主 Context = 187K

Session Memory
只总结到了 150K

甚至此时后台 Memory Agent 仍然可能正在更新。

因此:

主 Context 当前长度 ≠ Session Memory 当前已经总结到的位置。

5.4 什么时候真正 Compact?

这里需要区分:

Session Memory 更新

和:

Context Compact

Session Memory 更新解决:

“提前准备一份压缩后的 Session 状态。”

Context Compact解决:

“主 Context 已经太长了,必须真正把它缩小。”

200K Context 的示例

在我们讨论的源码配置/分析中,可以用:

Context Window ≈ 200K
Auto Compact Buffer ≈ 13K

来理解:

200K - 13K
≈ 187K

因此可以把:

≈ 187K

理解为这个配置下的 Auto Compact 触发位置。

注意:

187K 是主 Context 的总 Token 数,不是 Session Memory 的大小。

5.5 真正 Compact 时发生什么?

假设:

主 Context = 187K

但后台 Session Memory 最新版本只总结到了:

150K

那么:

0K ───────────────── 150K ─────────────── 187K
│                     │                    │
│ 已被 Memory 总结     │                    │
│                     │                    │
└─────────────────────┘                    │
                                            │
                                   尚未总结的原始消息

真正 Compact 时:

前面的 150K 由:

Session Memory V20

来代表。

后面的内容尽量保留最近的原始消息。

最终可以理解为:

┌──────────────────────────────┐
│ Session Memory V20           │
│                              │
│ 代表较早历史的压缩状态         │
├──────────────────────────────┤
│ 最近的原始消息                 │
│                              │
│ ≤ 40K tokens                 │
└──────────────────────────────┘

5.6 40K 是什么?

这里特别容易和 5K、187K 混淆。

5K
→ Session Memory 后续更新的 Token 增量门槛

187K
→ 示例配置下主 Context 的 Auto Compact 触发位置

40K
→ 真正 Compact 时,最近原始消息的最大保留量

所以:

40K 不是 Session Memory 的大小。

而是:

Compact 时,为了保留最近上下文而设置的 recent raw messages 上限。

源码分析中的相关配置可以看到类似:

minTokens = 10K
minTextBlockMessages = 5
maxTokens = 40K

其中 40K 是 recent messages 的 hard cap。

5.7 为什么 Compact 后还要保留 Raw?

因为摘要存在信息损失。

例如原始消息:

用户:
把 payment-service 的超时时间从 3 秒改成 5 秒。

Agent:
已修改 application.yml。

用户:
另外把 Redis timeout 改成 10 秒。

Agent:
已修改。

如果全部压成:

项目配置已经完成相关修改。

虽然节省了大量 Token,但:

3 秒 → 5 秒
Redis → 10 秒

这些具体细节就可能丢失。

因此 Compact 通常采用:

老历史
  ↓
Summary

最近历史
  ↓
Raw

形成:

Summary
+
Recent Raw

即:

越老的信息越抽象,越新的信息越完整。

5.8 第一次 Compact 的例子

假设:

Context Window = 200K
Compact ≈ 187K

达到:

187K

此时:

Session Memory
已经总结到 150K

那么:

150K
 ↓
Session Memory V20

37K
 ↓
最近原始消息

因为:

37K < 40K

所以这 37K 可以全部保留。

Compact 后:

Session Memory V20
+
37K Recent Raw

如果:

Session Memory Summary ≈ 8K

这里只作为示例:

8K + 37K
≈ 45K

那么主 Context 就从:

187K

大幅下降到:

≈ 45K

注意:

8K 只是示例,不是 Claude Code 固定规定 Summary 必须是 8K。

5.9 如果尚未总结的原始消息超过 40K

例如:

Context = 187K

Session Memory
只总结到了 120K

那么:

187K - 120K
= 67K

但最近 Raw 的上限约为:

40K

因此不会把全部 67K 原文都保留下来。

而是从最近消息向前选择:

最近消息
    ↑
    │
    │ ≤ 40K
    │
────┴────────────────
更老的部分

同时需要考虑:

  • 消息边界
  • Tool Use
  • Tool Result
  • 上下文结构完整性

核心思想:

优先保留最近的、最完整的原始交互。

5.10 Compact 完以后,新消息怎么算?

这是理解整个机制非常关键的一点。

假设 Compact 后:

Session Memory = 8K
Recent Raw = 37K

那么:

当前 Context
= 8K + 37K
= 45K

之后用户又产生:

+10K

那么新的 Context 就继续增长:

8K Summary
+
37K Recent Raw
+
10K New Raw
=
55K

然后继续:

55K
 ↓
80K
 ↓
120K
 ↓
150K
 ↓
...
 ↓
≈187K
 ↓
再次 Compact

所以 Context Compact 不是“一次性的”。

它是一个循环:

Context 增长
    ↓
达到阈值
    ↓
Compact
    ↓
Context 变小
    ↓
继续增长
    ↓
再次 Compact

5.11 第二次 Compact

假设第二次达到:

≈187K

此时后台 Session Memory 可能已经更新到:

V30

那么第二次 Compact 可以理解为:

V30
+
V30 之后最近的 Raw Messages

然后再次形成一个新的较小 Context。

因此整个生命周期:

第一次
────────────────────

完整原始 Context
        ↓
后台维护 V1 V2 V3...
        ↓
≈187K
        ↓
Compact
        ↓
V20 + Recent Raw


第二次
────────────────────

V20
+
Recent Raw
+
New Messages
        ↓
继续增长
        ↓
后台产生 V21 V22 V23...
        ↓
≈187K
        ↓
Compact
        ↓
V30 + Recent Raw

5.12 长期运行后的信息保真度

因此会出现一个自然规律:

距离当前越远
      ↓
经历的 Summary / Compact 次数越多
      ↓
信息越来越抽象
      ↓
细节保真度通常越低

而:

距离当前越近
      ↓
越可能仍然保留 Raw
      ↓
细节越完整

所以它本质上是在:

Context Window 有限的情况下,用“历史摘要 + 最近原文”换取长期连续性。


第 6 层 | ⑥ AutoDream|离线级

解决:长期运行后,Memory 越来越多、越来越乱怎么办。

AutoDream 可以理解为:

Agent 空闲或后台运行时,对长期 Memory 进行整理、重塑和治理。

它和 Session Memory Agent 不是一回事。

6.1 三者区别

Session Memory Agent
→ 这次 Session 发生了什么?

Memory Extraction Agent
→ 这次对话有什么以后还应该记住?

AutoDream
→ 过去积累的长期记忆现在怎么整理?

所以:

Session Memory
→ 当前 Session 压缩

Memory Extraction
→ 新长期记忆提炼

AutoDream
→ 长期 Memory 治理

6.2 核心流程

已有长期 Memory
        ↓
定向探索
        ↓
发现重复 / 冲突 / 过期内容
        ↓
信息整合
        ↓
去重 / 合并 / 重写
        ↓
更新结构
        ↓
重建索引

类似人类:

平时产生大量笔记
        ↓
定期整理
        ↓
删除重复内容
        ↓
合并相关知识
        ↓
更新过期内容
        ↓
重新分类
        ↓
建立索引

所以:

AutoDream 本质是长期 Memory 的离线治理与重塑。

6.3 为什么需要 AutoDream?

长期运行后 Memory 可能出现:

重复
过期
冲突
碎片化
索引混乱

因此需要:

Memory
 ↓
发现问题
 ↓
整理
 ↓
合并
 ↓
更新
 ↓
重建索引

最终让长期 Memory 更:

  • 稳定
  • 精简
  • 结构化
  • 容易召回

6.4 并发安全

AutoDream 可能和正常 Agent 同时操作 Memory:

        Memory
       ↙      ↘
   Agent     AutoDream

因此需要相应的并发控制,例如:

文件锁
版本号
CAS
原子更新

核心目标:

避免 AutoDream 整理 Memory 时覆盖 Agent 刚刚写入的新内容。


横向篇 | 缓存体系|性能层

缓存不是第七层记忆。

六层解决的是“记忆是什么、生命周期是什么、如何压缩和治理”;缓存解决的是“已有数据/上下文如何减少重复处理”。

这里尤其要区分:

Harness / Claude Code 的上下文组织
                ≠
Anthropic Model API 的 Prompt Cache

缓存体系一共三层:

第一层:Harness / 本地数据缓存
第二层:Context / Session 复用
第三层:Model / API Prompt Cache

缓存体系与 Prompt Cache:三层缓存与 Harness / Model API 分工

图 4 横向缓存体系 —— 三层缓存(Harness 本地缓存 / Context·Session 复用 / Model·API Prompt Cache)、Harness 与 Model/API 的职责分工,以及「缓存」与「一致性」必须分开。

7.1 第一层:Harness / 本地数据缓存

如果 Harness 对某些本地数据做缓存,例如:

CLAUDE.md
项目配置
已经读取 / 解析的数据
工具定义
Memory 文件读取结果

它的作用主要是:

第一次:
磁盘
 ↓
读取
 ↓
解析
 ↓
得到结果

后续:
Cache
 ↓
直接复用

作用:

减少重复 IO
减少重复解析
降低本地处理开销

但必须注意:

这种缓存本身不负责保证数据最新。

如果原始数据发生变化,就需要通过:

文件修改时间
版本号
Hash
TTL
事件通知
其他失效机制

等方式判断缓存是否还能使用。

因此:

缓存本身 ≠ 数据一致性机制。

7.2 第二层:Context / Session 复用

这一层更准确地理解为:

减少不必要的上下文重新构建,而不是一种独立的“模型缓存”。

例如当前 Session 已经存在:

System
+
Rules
+
Tools
+
Memory
+
历史 Context

Harness 会基于当前 Session 状态继续组织下一次请求,而不是每次都把整个 Agent 状态从零开始构建。

因此它解决的是:

Session 状态连续性
+
Context 组织效率

这一层和 Prompt Cache 不要混为一谈。

7.3 第三层:Model / API Prompt Cache

真正意义上的 Prompt Cache 位于:

Model / API 推理层

而不是 Harness 自己实现。

它缓存的不是:

❌ Memory.md 文件
❌ 最终答案
❌ 一个普通的文件缓存

而是:

对于重复输入 Prefix,模型侧可以复用之前已经完成的输入处理。

例如第一次:

System
+
Rules
+
Tools
+
100K History
+
Current Question

第二次:

System
+
Rules
+
Tools
+
100K History
+
New Question

如果前面的稳定部分满足 Prompt Cache 的缓存条件:

System
+
Rules
+
Tools
+
100K History

就可以作为稳定 Prefix 被复用。

Prompt Cache 的作用

核心是:

第一次:

100K Prefix
    ↓
模型处理
    ↓
产生可复用的缓存状态


第二次:

同样的 100K Prefix
    ↓
Prompt Cache Hit
    ↓
复用之前的处理
    ↓
只需要继续处理变化部分

所以:

Prompt Cache 不减少 Context 中实际存在的 Token 数量,而是减少重复输入的计算成本,并在适用的 API 计费规则下减少缓存输入的处理成本。

例如:

第一次:
Input = 100K

第二次:
Input = 100K

并不意味着第二次 Context 变成:

Input = 5K

而是:

Context 仍然 ≈100K

其中:
稳定 Prefix → Cache Hit
新增内容   → 正常处理

7.4 Harness 和 Prompt Cache 到底是什么关系?

这是最容易混淆的地方。

正确关系:

Claude Code / Harness
        │
        │ 负责组织 Context
        ▼
┌──────────────────────────┐
│ 稳定 Prefix               │
│ System / Rules / Tools   │
│ Memory / History         │
├──────────────────────────┤
│ 动态内容                  │
│ Current User Input       │
│ Tool Result              │
└─────────────┬────────────┘
              │
              ▼
       Model / API 层
              │
              ▼
        Prompt Cache
              │
       ┌──────┴──────┐
       ↓             ↓
     Hit            Miss
       ↓             ↓
  复用处理结果      重新处理

因此:

Harness 做什么?

组织 Context,让稳定内容尽量稳定、连续、可复用。

Model/API 做什么?

真正判断 Prompt Cache 是否命中,并复用之前的输入处理。

所以不能理解成:

Harness
  ↓
自己决定“这个 Prompt 是缓存”

更准确是:

Harness
  ↓
把 Context 组织好
  ↓
形成稳定 Prefix
  ↓
Model/API
  ↓
判断是否满足 Prompt Cache 条件

7.5 为什么 Harness 的 Context 组织会影响 Prompt Cache?

因为 Prompt Cache 关注的是:

输入的稳定 Prefix。

情况 A:稳定内容在前

System
Rules
Tools
Memory
History
────────────
Current Question

下一次:

System
Rules
Tools
Memory
History
────────────
New Question

前面大量内容没有变化。

因此更容易形成稳定 Prefix。

情况 B:动态内容混在前面

Current Question
System
Tools
History

下一次:

New Question
System
Tools
History

那么一开始就发生变化。

后面的内容即使没变,也不再属于相同的前缀。

因此:

Harness 的 Context 编排会影响 Prompt Cache 的可复用程度。

但它仍然不是 Harness 在实现 Prompt Cache。

7.6 缓存和一致性必须分开

这是缓存体系中最重要的概念之一:

Cache
→ 能不能复用之前的东西?

Consistency / Invalidation
→ 之前的东西现在还有效吗?

两者不是一个问题。

例如本地文件:

10:00
CLAUDE.md = V1
 ↓
Harness Cache = V1

10:05
CLAUDE.md 被修改
 ↓
文件 = V2

如果没有失效机制:

Harness
 ↓
继续使用 V1

那么当然可能产生旧数据。

因此真正完整的缓存逻辑是:

数据源
  ↓
Cache
  ↓
判断 Cache 是否有效
  │
  ├── 有效 → 复用
  │
  └── 失效 → 重新读取

而 Prompt Cache 又是另外一回事:

Harness
  ↓
最新 Context
  ↓
Model API
  ↓
Prefix 是否满足缓存条件?
  │
  ├── Hit → 复用模型输入处理
  │
  └── Miss → 正常处理

第三层 · 总:最终总结

1. 整体关系图

最终可以把整个体系理解成:

                    Claude Code
                         │
        ┌────────────────┼────────────────┐
        │                │                │
        ▼                ▼                ▼
    记忆体系          Context 管理       性能优化
        │                │                │
        │                │                │
  ┌─────┴─────┐          │          ┌─────┴─────┐
  │           │          │          │           │
规则       长期记忆      Compact   Harness    Prompt Cache
Session    AutoDream               Cache      Model/API
Task       Memory

2. 六层记忆解决什么

① 指令
→ 应该怎么做

② 短期
→ 刚才聊了什么

③ 工作
→ 现在做到哪

④ 长期
→ 以前记住什么

⑤ 摘要
→ 太长了怎么压

⑥ AutoDream
→ 长期记忆乱了怎么整理

3. 缓存解决什么

Harness / 本地缓存
→ 少做重复的数据读取和处理

Context / Session 复用
→ 少做不必要的上下文重新构建

Model Prompt Cache
→ 少做重复的模型输入计算

4. 六层一览(最终收口)

层级 核心问题 关键载体 关键机制
① 指令记忆 应该怎么做 CLAUDE.md 四级作用域 + 反转加载 + 双轨注入
② 短期会话记忆 刚才聊了什么 Recent Context 受 Context Window / Token Budget 约束
③ 工作任务记忆 现在做到哪 Task State 任务生命周期内创建与销毁
④ 长期记忆 以前记住什么 memdir / MEMORY.md 索引 + 动态召回 + 读写互斥
⑤ 摘要记忆 太长了怎么压 session-memory.md 渐近式更新 + Compact(Summary + Recent Raw)
⑥ AutoDream 乱了怎么整理 长期 Memory 离线治理:去重 / 合并 / 重建索引
横向 · 缓存 怎么少重复干活 Harness / Model API 本地缓存 + Context 复用 + Prompt Cache

5. 最终一句话

六层记忆解决“记什么、怎么保存、怎么压缩、怎么治理”;缓存解决“已有内容怎么更高效地复用”。其中 Prompt Cache 的真正执行与命中判断位于 Model/API 推理层,Harness 的主要作用是组织 Context、保持稳定 Prefix,从而让这种缓存更容易发挥作用。