乐于分享
好东西不私藏

Claude Code 源码分析之 Context 管理记忆机制

Claude Code 源码分析之 Context 管理记忆机制

 Context 管理机制

本章概要

当对话变长,Context 窗口会逐渐填满。Claude Code 实现了四层防御体系来智能管理 Context,确保主循环能持续运行。本章深入剖析各层压缩机制。

前置知识:第3章主循环架构后续章节:第5章权限系统


4.1 四层防御体系

┌─────────────────────────────────────────────────────────────┐
│                 Context 管理四层防御                         │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌───────────────────────────────────────────────────────┐  │
│  │  Layer 1: microCompact                                │  │
│  │  • 触发:60分钟无响应 或 GrowthBook 配置               │  │
│  │  • 频率:最高                                         │  │
│  │  • 代价:最低                                         │  │
│  │  • 效果:轻量级清理                                    │  │
│  └───────────────────────────────────────────────────────┘  │
│                            │                                 │
│                            ▼                                 │
│  ┌───────────────────────────────────────────────────────┐  │
│  │  Layer 2: snipCompact (ANT专用)                       │  │
│  │  • 触发:HISTORY_SNIP feature                         │  │
│  │  • 频率:中等                                         │  │
│  │  • 代价:中等                                         │  │
│  │  • 效果:历史消息剪裁                                  │  │
│  └───────────────────────────────────────────────────────┘  │
│                            │                                 │
│                            ▼                                 │
│  ┌───────────────────────────────────────────────────────┐  │
│  │  Layer 3: contextCollapse (ANT专用)                    │  │
│  │  • 触发:CONTEXT_COLLAPSE feature                     │  │
│  │  • 频率:较低                                         │  │
│  │  • 代价:较高                                         │  │
│  │  • 效果:上下文折叠投影                                │  │
│  └───────────────────────────────────────────────────────┘  │
│                            │                                 │
│                            ▼                                 │
│  ┌───────────────────────────────────────────────────────┐  │
│  │  Layer 4: autoCompact                                 │  │
│  │  • 触发:token 达到阈值                               │  │
│  │  • 频率:最低                                         │  │
│  │  • 代价:最高(需要 AI 生成摘要)                      │  │
│  │  • 效果:完整 AI 总结压缩                              │  │
│  └───────────────────────────────────────────────────────┘  │
│                                                              │
└─────────────────────────────────────────────────────────────┘

4.2 触发条件

机制
触发条件
位置
autoCompact
token 达到阈值
autoCompact.ts
microCompact
60分钟无响应 或 GrowthBook 配置
microCompact.ts
snipCompact
HISTORY_SNIP feature
query.ts:401
contextCollapse
CONTEXT_COLLAPSE feature
query.ts:440

4.3 压缩调用顺序

4.3.1 压缩执行顺序代码

// [源码位置] src/query.ts:401-468 压缩调用顺序
state.messages = await snipCompactIfNeeded(state.messages, deps)
state.messages = await microcompactMessages(state.messages, deps)
state.messages = await contextCollapse.applyCollapsesIfNeeded(state.messages, deps)
if (state.autoCompactTracking) {
  state = await autoCompactIfNeeded(state, deps)
}

4.3.2 四层防御触发顺序图

主循环 Setup Phase
    │
    ├─▶ applyToolResultBudget()       ▶ 工具结果预算控制(5% token 预留)
    │
    ├─▶ snipCompactIfNeeded()        ▶ ANT 专用历史剪裁(Feature 控制)
    │    └── 触发条件:HISTORY_SNIP feature 启用
    │
    ├─▶ microcompactMessages()       ▶ 微压缩(最高频率,无成本)
    │    └── 触发条件:60分钟无响应 或 GrowthBook 配置
    │
    ├─▶ contextCollapse.apply()      ▶ ANT 专用上下文折叠(Feature 控制)
    │    └── 触发条件:CONTEXT_COLLAPSE feature 启用
    │
    └─▶ autoCompactIfNeeded()        ▶ 完整 AI 压缩(最低频率,高成本)
         └── 触发条件:token 使用率 > 90%

4.3.3 压缩层数据流图

原始消息 (token 数: 10000)
    │
    ▼
microCompact → 9000 tokens (压缩率 10%, 延迟 <1ms)
    │
    ▼
snipCompact → 8500 tokens (压缩率 16%, 延迟 <5ms)
    │
    ▼
contextCollapse → 7000 tokens (压缩率 30%, 延迟 <10ms)
    │
    ▼
autoCompact → 3000 tokens (压缩率 70%, 延迟 ~1000ms)

4.4 Layer 1: microCompact

4.4.1 定位

microCompact 是最轻量的压缩,执行频率最高

4.4.2 实现机制

// [源码位置] services/compact/microCompact.ts
functionmicrocompactMessages(messages: Message[]): Message[] {
// 1. 移除过时的工具结果
//    - 保留最近的 N 个工具结果
//    - 移除超出窗口的旧结果

// 2. 压缩长文本输出
//    - 超过限制的输出被截断
//    - 添加 "[truncated]" 标记

// 3. 保留关键上下文
//    - 系统提示
//    - 用户初始请求
//    - 最近的对话
}

4.4.3 触发条件

const MICROCOMPACT_INTERVAL_MS = 60 * 60 * 1000// 60 分钟

functionshouldMicroCompact(state: State): boolean{
// 时间触发
const lastCompact = state.lastCompactTimestamp;
const now = Date.now();

if (now - lastCompact > MICROCOMPACT_INTERVAL_MS) {
returntrue;
  }

// GrowthBook 配置覆盖
if (growthbook.isFeatureEnabled('microcompact_enabled')) {
returntrue;
  }

returnfalse;
}

4.5 Layer 2: snipCompact

4.5.1 定位

snipCompact 是ANT(Anthropic 内部)专用的历史剪裁机制。

4.5.2 实现机制

// [源码位置] query.ts:401-410
asyncfunctionsnipCompactIfNeeded(state: State): Promise<void{
if (!feature('HISTORY_SNIP')) {
return;
  }

// 1. 识别可以剪裁的消息
//    - 早期的工具执行结果
//    - 冗长的中间过程
//    - 已过时的上下文

// 2. 用摘要替换原始消息
//    - 保留关键决策点
//    - 移除细节

// 3. 更新消息历史
  state.messages = applySnip(state.messages);
}

4.6 Layer 3: contextCollapse

4.6.1 定位

contextCollapse 是上下文折叠投影机制,将多轮对话压缩为简洁视图。

4.6.2 实现机制

// [源码位置] query.ts:440-447
interface CollapseConfig {
  preserveFirst: number;     // 保留前 N 条
  preserveLast: number;     // 保留后 N 条
  windowSize: number;       // 中间窗口大小
  summaryModel: string;     // 摘要模型
}

asyncfunctionapplyCollapsesIfNeeded(
  state: State,
  config: CollapseConfig
): Promise<void
{
// 1. 检查是否需要折叠
if (!shouldCollapse(state)) {
return;
  }

// 2. 识别折叠点
const collapsePoints = findCollapsePoints(state.messages);

// 3. 对每个折叠点进行处理
for (const point of collapsePoints) {
// 保留首尾,中间用摘要替代
const summary = await generateSummary(
      state.messages[point],
      config.summaryModel
    );
    state.messages[point] = summary;
  }
}

4.7 Layer 4: autoCompact

4.7.1 定位

autoCompact 是最重量级的压缩,使用 AI 生成摘要。

4.7.2 实现机制

// [源码位置] services/compact/autoCompact.ts
asyncfunctionautoCompact(state: State): Promise<void{
// 1. 保存最近 N 条消息(保持上下文连贯)
const recentMessages = state.messages.slice(-KEEP_COUNT);

// 2. 调用 AI 生成摘要
const summaryPrompt = buildSummaryPrompt(state.messages);
const summaryResponse = await callModel(summaryPrompt);

// 3. 用摘要替换历史消息
  state.messages = [
// 系统提示(保持不变)
    state.messages[0],
// AI 生成的摘要
    createSummaryMessage(summaryResponse),
// 最近的消息
    ...recentMessages
  ];

// 4. 更新追踪状态
  state.autoCompactTracking = {
    lastCompactAt: Date.now(),
    compactedCount: state.messages.length - recentMessages.length
  };
}

4.7.3 摘要生成提示

functionbuildSummaryPrompt(messages: Message[]): string{
return`
请总结以下对话的要点,保留关键信息和决策:

${formatMessages(messages)}

摘要应包含:
1. 用户的主要目标
2. 已完成的操作
3. 当前状态
4. 后续建议

请用简洁的语言总结。
  `
.trim();
}

4.8 Context 管理源码地图

services/compact/
├── autoCompact.ts       # 完整 AI 压缩
│    │
│    └─ callModel() → 生成摘要

├── microCompact.ts      # 微压缩
│    │
│    └─ removeStaleToolResults()
│    └─ truncateLongOutputs()

├── compact.ts          # 完整上下文压缩
│    │
│    └─ applyToolResultBudget()
│    └─ buildContext()

└── contextCollapse.ts  # 上下文折叠
     │
     └─ applyCollapsesIfNeeded()

4.9 设计模式与最佳实践

4.9.1 设计模式分析

  • 责任链模式:四层压缩按顺序执行,每层处理后传递给下一层,任意一层都可以独立决定是否需要处理
  • 策略模式:不同压缩场景使用不同算法,支持灵活替换扩展
  • 渐进式降级:优先使用轻量级压缩,极端情况下才使用高成本AI压缩

4.9.2 最佳实践

  • 优先依赖前三层压缩,autoCompact作为最后防线使用,降低成本
  • 长会话定期使用 /session compact 手动触发压缩,避免突然性能下降
  • 重要上下文可以通过 /pin 命令固定,防止被压缩丢失

4.9.3 常见问题与调试技巧

  1. 上下文丢失关键信息

    • 调试:运行 /ctx-inspect 查看压缩历史
    • 解决:使用 /force-snip 手动裁剪冗余历史,或 /pin 固定关键消息
  2. token 计数不准

    • 调试:检查 autoCompactTracking.tokenCount 字段
    • 解决:对比 API 返回的实际 token 使用量,运行 /ctx-reset 重置计数

4.9.4 设计权衡

  • microCompact 轻量级设计
    • ✅ 优点:速度快,无额外开销
    • ❌ 缺点:压缩率仅 5%-10%,只能处理冗余格式
    • 决策背景:90%场景下轻量级压缩即可解决token不足问题

4.10 小结

本章完成了以下内容:

  1. 四层防御体系:microCompact → snipCompact → contextCollapse → autoCompact
  2. 触发条件:时间、token 阈值、feature flags
  3. 调用顺序:在主循环 Setup Phase 依次执行
  4. 各层机制
    • microCompact:轻量级清理
    • snipCompact:历史剪裁
    • contextCollapse:上下文折叠
    • autoCompact:AI 摘要压缩

修正说明:autoCompact不是唯一的压缩机制,四层防御共同工作,各有适用场景。

下一步:第5章将深入分析权限系统,这是 Claude Code 安全的核心保障。


源码位置

  • 压缩调用顺序:src/query.ts:380-470
  • microCompact:services/compact/microCompact.ts
  • autoCompact:services/compact/autoCompact.ts
  • contextCollapse:src/query.ts:440-447