第6节:上下文管理与压缩系统

1 阅读7分钟

1. 上下文管理概述

上下文管理与压缩系统是Claude Code的重要组成部分,负责管理消息历史,确保在token预算范围内保持对话的连贯性。通过智能压缩策略,Claude Code能够在有限的token预算内处理更长的对话历史,提高系统的性能和用户体验。

核心价值

  • Token预算管理:有效管理token使用,避免超出模型的token限制
  • 对话连贯性:在压缩上下文的同时,保持对话的连贯性和一致性
  • 性能优化:减少API调用的token消耗,提高系统响应速度
  • 内存优化:减少内存使用,提高系统的稳定性
  • 用户体验:支持更长的对话历史,提供更好的用户体验

系统架构

    CONTEXT WINDOW BUDGET
    ═════════════════════

    ┌─────────────────────────────────────────────────────┐
    │  System Prompt (tools, permissions, CLAUDE.md)      │
    │  ══════════════════════════════════════════════      │
    │                                                     │
    │  Conversation History                               │
    │  ┌─────────────────────────────────────────────┐    │
    │  │ [compacted summary of older messages]        │    │
    │  │ ═══════════════════════════════════════════  │    │
    │  │ [compact_boundary marker]                    │    │
    │  │ ─────────────────────────────────────────── │    │
    │  │ [recent messages — full fidelity]            │    │
    │  │ user → assistant → tool_use → tool_result   │    │
    │  └─────────────────────────────────────────────┘    │
    │                                                     │
    │  Current Turn (user + assistant response)            │
    └─────────────────────────────────────────────────────┘

2. 上下文窗口预算

上下文窗口预算是指模型能够处理的最大token数量,包括系统提示、对话历史和当前回合的内容。

预算分配

  • 系统提示:工具定义、权限信息、CLAUDE.md等,通常占用固定比例的token预算
  • 对话历史:用户消息、助手响应、工具调用和结果,根据时间远近分配不同的token权重
  • 当前回合:用户的最新输入和助手的响应,需要预留足够的token空间

预算管理策略

  • 动态调整:根据对话长度和内容类型动态调整预算分配
  • 优先级排序:优先保留最近的消息和重要的内容
  • 压缩触发:当token使用接近预算上限时触发压缩
  • 安全边界:预留一定的安全边界,避免超出token限制

3. 压缩策略

Claude Code实现了多种压缩策略,以优化上下文的使用。

三种压缩策略

  • autoCompact:当token计数超过阈值时触发,使用Claude API对旧消息进行总结
  • snipCompact:移除僵尸消息和过时标记,优化上下文结构
  • contextCollapse:重组上下文,提高效率(需要CONTEXT_COLLAPSE特性标志)

压缩方式比较

策略触发条件压缩方式适用场景优点缺点
autoCompacttoken阈值智能总结长对话保持语义连贯API调用开销
snipCompact消息清理移除无用消息消息冗余无API调用可能丢失信息
contextCollapse上下文优化重组结构复杂上下文提高效率实现复杂

4. 压缩流程

压缩流程是上下文管理的核心,负责在适当的时候对上下文进行压缩。

基本流程

messages[] ──> getMessagesAfterCompactBoundary()
                    │
                    ▼
              older messages ──> Claude API (summarize) ──> compact summary
                    │
                    ▼
              [summary] + [compact_boundary] + [recent messages]

详细步骤

  1. 检测token使用:监控当前上下文的token使用情况
  2. 触发压缩:当token使用接近预算上限时触发压缩
  3. 确定压缩边界:确定哪些消息需要压缩,哪些需要保留
  4. 执行压缩:使用适当的压缩策略对旧消息进行压缩
  5. 构建新上下文:将压缩后的摘要与保留的消息重新组合
  6. 更新会话:使用新的压缩上下文更新会话状态

5. 智能总结

智能总结是autoCompact策略的核心,通过Claude API对旧消息进行总结,保持语义连贯的同时减少token使用。

总结生成

async function generateSummary(messages: Message[]): Promise<string> {
  // 准备总结提示
  const summaryPrompt = buildSummaryPrompt(messages);
  
  // 调用Claude API生成总结
  const response = await claudeApi.sendMessage(summaryPrompt, {
    model: 'claude-3-opus-20240229',
    max_tokens: 1000,
    temperature: 0.3
  });
  
  // 提取并返回总结
  return response.content;
}

总结质量控制

  • 提示优化:设计专门的提示模板,确保总结质量
  • 温度控制:使用较低的温度值,确保总结的准确性和一致性
  • 长度限制:限制总结的长度,平衡信息保留和token节省
  • 上下文理解:确保总结能够准确反映原始对话的内容和意图

6. 边界标记

边界标记是上下文压缩的重要组成部分,用于区分压缩的摘要和完整的消息。

边界标记的作用

  • 分隔压缩内容:清晰区分压缩的摘要和完整的消息
  • 保持上下文结构:维护对话的逻辑结构
  • 支持增量压缩:便于后续的增量压缩操作
  • 提高模型理解:帮助模型更好地理解上下文的结构

边界标记格式

const compactBoundaryMessage: SystemMessage = {
  type: 'system',
  subtype: 'compact_boundary',
  content: '--- Compacted History Below ---',
  metadata: {
    compressed_at: new Date().toISOString(),
    original_message_count: originalMessages.length,
    compressed_token_count: compressedTokenCount
  }
};

7. 性能优化

上下文管理与压缩系统的性能优化是确保系统高效运行的关键。

优化策略

  • 压缩时机:选择合适的时机进行压缩,避免频繁压缩
  • 压缩粒度:根据对话长度和内容类型调整压缩粒度
  • 缓存策略:缓存压缩结果,避免重复计算
  • 并行处理:并行处理压缩操作,减少用户等待时间
  • 智能预压缩:在空闲时预压缩上下文,提高响应速度

性能指标

  • 压缩时间:执行压缩操作所需的时间
  • token节省:压缩后节省的token数量
  • 压缩率:压缩前后的token比例
  • 响应时间:压缩对系统响应时间的影响
  • 内存使用:压缩前后的内存使用变化

8. 实现细节

核心文件

  • src/services/compact/:上下文压缩相关实现
  • src/query.ts:主查询循环中的压缩逻辑
  • src/context.ts:上下文管理相关功能
  • src/utils/messages/:消息处理工具

关键代码片段

自动压缩

async function autoCompact(messages: Message[], tokenBudget: number): Promise<Message[]> {
  // 计算当前token使用
  const currentTokens = calculateTokenCount(messages);
  
  // 检查是否需要压缩
  if (currentTokens < tokenBudget * 0.8) {
    return messages; // 不需要压缩
  }
  
  // 确定压缩边界
  const { recentMessages, olderMessages } = splitMessagesByBoundary(messages);
  
  // 生成总结
  const summary = await generateSummary(olderMessages);
  
  // 构建新的上下文
  const compactBoundary = createCompactBoundary(olderMessages.length, currentTokens);
  const newMessages = [
    createSummaryMessage(summary),
    compactBoundary,
    ...recentMessages
  ];
  
  return newMessages;
}

Token计数

function calculateTokenCount(messages: Message[]): number {
  // 对每个消息计算token数
  return messages.reduce((total, message) => {
    // 根据消息类型和内容计算token数
    return total + estimateTokenCount(message);
  }, 0);
}

function estimateTokenCount(message: Message): number {
  // 使用合适的token估算方法
  // 对于文本消息,使用字符数或更复杂的估算方法
  // 对于工具调用和结果,使用特定的估算方法
  return estimatedTokens;
}

9. 最佳实践

上下文管理最佳实践

  • 合理设置token预算:根据模型的token限制设置合理的预算
  • 优化系统提示:精简系统提示,减少固定token开销
  • 监控token使用:定期监控token使用情况,及时调整策略
  • 选择合适的压缩策略:根据对话类型选择合适的压缩策略
  • 测试压缩效果:定期测试压缩效果,优化压缩参数

常见问题与解决方案

问题原因解决方案
压缩后信息丢失压缩过度调整压缩边界,保留更多重要信息
压缩频繁预算设置过低增加token预算,减少压缩频率
压缩效果差提示模板不合适优化总结提示模板
响应延迟压缩开销大并行处理压缩,智能预压缩

10. 小结

上下文管理与压缩系统是Claude Code的重要组成部分,通过智能压缩策略,确保在有限的token预算内处理更长的对话历史。合理的上下文管理不仅能够提高系统的性能和稳定性,还能够提供更好的用户体验。

理解上下文管理与压缩系统的设计与实现,对于优化Claude Code的使用和构建自己的AI代理系统都具有重要意义。下一节我们将深入探讨MCP集成与扩展能力的实现。