Skip to content

5.20 上下文压缩

💡 一句话总结:优化上下文管理,让 AI 在有限的 token 内理解更多代码。


学完你能做什么

  • 理解上下文压缩的原理和作用
  • 配置压缩策略,优化 token 使用
  • 处理大型项目时避免上下文溢出
  • 提高 AI 响应速度和质量

你现在的困境

  • 大项目时 AI "看不到" 完整代码
  • 对话多了之后响应变慢
  • Token 超限导致无法处理
  • 不知道如何优化上下文效率

什么时候用这一招

  • 当你需要:处理大型项目或复杂任务
  • 而且不想:因为 token 限制影响 AI 理解能力

🎒 开始前的准备

确保你已经完成以下事项:


核心思路

什么是上下文压缩

上下文压缩 是指在不影响理解的前提下,减少传递给 AI 的 token 数量。

原始上下文 (10,000 tokens)
    ↓ 压缩策略
压缩后上下文 (6,000 tokens)
    ↓ 传递给 AI
更好的性能 + 更少费用

为什么要压缩

原因说明
Token 限制模型有上下文窗口限制
性能优化越少 token = 越快响应
成本控制Token 是按量计费的
质量提升去除噪音,聚焦关键信息

压缩策略

1. 智能摘要

原理:用简短的摘要代替完整内容

适用场景

  • 历史对话记录
  • 已处理的代码文件
  • 不再频繁使用的上下文

示例

yaml
# 原始对话 (500 tokens)
用户: 帮我创建一个 React 组件
AI: 好的,我来创建一个 Button 组件...
用户: 能添加 hover 效果吗?
AI: 可以,我来添加 hover 样式...

# 压缩后 (50 tokens)
对话摘要: 创建了 React Button 组件,添加了 hover 样式

2. 相关性过滤

原理:只保留与当前任务相关的信息

适用场景

  • 大型项目中的多个模块
  • 历史会话中的不同主题

示例

yaml
# 原始上下文 (所有文件)
- src/components/Button.tsx
- src/components/Input.tsx
- src/components/Modal.tsx
- src/api/user.ts
- src/api/product.ts
- src/utils/helpers.ts

# 当前任务:优化 Button 组件
# 压缩后上下文 (只保留相关文件)
- src/components/Button.tsx
- src/components/Input.tsx  (相似的组件)
- src/utils/helpers.ts       (Button 用到的工具)

3. 增量更新

原理:只传递变化的代码,而不是整个文件

适用场景

  • 文件被多次编辑
  • 增量开发场景

示例

yaml
# 原始方式:每次传递整个文件 (1,000 tokens)
第 1 次:完整文件
第 2 次:完整文件
第 3 次:完整文件

# 增量方式:只传递变化部分
第 1 次:完整文件 (1,000 tokens)
第 2 次:变化的行 (50 tokens)
第 3 次:变化的行 (80 tokens)

4. 符号化表示

原理:用符号列表代替完整代码

适用场景

  • 不需要详细实现细节
  • 只需要了解结构

示例

yaml
# 原始代码 (500 tokens)
class UserService {
  private users: User[] = [];

  async getUser(id: number): Promise<User> {
    // ... 50 行代码
  }

  async createUser(data: CreateUserDto): Promise<User> {
    // ... 50 行代码
  }

  async updateUser(id: number, data: UpdateUserDto): Promise<User> {
    // ... 50 行代码
  }
}

# 符号化表示 (50 tokens)
UserService:
  - users: User[]
  + getUser(id: number): Promise<User>
  + createUser(data: CreateUserDto): Promise<User>
  + updateUser(id: number, data: UpdateUserDto): Promise<User>

5. 优先级排序

原理:根据重要程度对上下文排序,保留最重要的

适用场景

  • Token 紧张时
  • 需要权衡信息价值

排序标准

优先级类型示例
1️⃣ 最高用户当前请求"修改 Button 组件"
2️⃣ 高直接相关代码Button.tsx
3️⃣ 中依赖和引用Button 依赖的 helpers
4️⃣ 低历史信息之前的对话摘要
5️⃣ 最低不相关信息其他组件的代码

配置压缩策略

基础配置

AGENTS.md 或项目配置中:

yaml
context_compaction:
  enabled: true
  max_tokens: 8000
  strategies:
    - name: summary
      priority: 1
      threshold: 3  # 对话超过 3 轮后启用

    - name: relevance
      priority: 2
      threshold: 0.7  # 相关性阈值

    - name: incremental
      priority: 3
      enabled: true

    - name: symbolize
      priority: 4
      file_size_threshold: 1000  # 文件超过 1000 行时启用

高级配置

yaml
context_compaction:
  enabled: true

  # Token 预算分配
  budget_allocation:
    user_query: 0.2      # 20% 给用户查询
    relevant_code: 0.5   # 50% 给相关代码
    symbols: 0.2        # 20% 给符号
    history: 0.1        # 10% 给历史摘要

  # 压缩触发条件
  triggers:
    token_limit: 8000
    file_count: 20
    conversation_turns: 5

  # 特定文件处理
  file_handlers:
    "*.json":
      strategy: minimal  # 最小化表示
    "*.md":
      strategy: summary  # 摘要
    "node_modules/**":
      strategy: exclude  # 完全排除

  # LRU 缓存配置
  cache:
    enabled: true
    max_size: 1000
    ttl: 3600

跟我做

实战 1:为大型项目配置压缩

目标:让大型项目(100+ 文件)能高效处理

  1. 创建 opencode.yml
yaml
context_compaction:
  enabled: true
  max_tokens: 6000

  # 大项目专用的压缩策略
  strategies:
    - name: relevance
      enabled: true
      threshold: 0.8  # 更严格的相关性

    - name: symbolize
      enabled: true
      file_size_threshold: 500  # 更小的阈值

    - name: lru_cache
      enabled: true
      max_items: 50

  # 排除不需要的文件
  excludes:
    - "node_modules/**"
    - "dist/**"
    - "build/**"
    - "*.min.js"
    - "*.lock"
  1. 测试压缩效果:
分析这个项目的整体架构,并给出优化建议

你应该看到

  • AI 快速理解项目结构
  • Token 使用在预算范围内
  • 响应速度明显提升

实战 2:配置对话历史压缩

目标:长时间对话后保持良好性能

  1. 配置历史压缩:
yaml
context_compaction:
  strategies:
    - name: conversation_summary
      enabled: true
      # 每 3 轮对话后压缩一次
      interval: 3
      # 保留最近的 2 轮详细对话
      keep_recent: 2
      # 摘要格式
      summary_template: |
        对话 #{turn}:
        - 用户: {user_intent}
        - AI: {action_taken}
        - 结果: {outcome}
  1. 模拟长时间对话:
任务 1: 创建一个用户注册表单
任务 2: 添加表单验证
任务 3: 集成后端 API
任务 4: 添加错误处理
任务 5: 优化样式

你应该看到

  • 即使到了任务 5,性能依然良好
  • AI 记住了之前的所有操作
  • Token 使用量稳定

实战 3:处理频繁变化的文件

目标:优化增量更新,减少重复传输

  1. 配置增量更新:
yaml
context_compaction:
  strategies:
    - name: incremental_diff
      enabled: true
      # 检测文件变化的策略
      diff_method: "line_based"  # line_based 或 ast_based
      # 缓存文件版本
      cache_versions: true
      # 缓存多少个版本
      max_cached_versions: 5
  1. 多次编辑同一个文件:
任务 1: 创建 User.tsx
任务 2: 添加类型定义
任务 3: 添加验证逻辑
任务 4: 重构代码结构

你应该看到

  • 后续任务传输的 token 更少
  • AI 能准确追踪变化
  • 整体效率提升 50%+

📋 压缩策略对比

策略Token 节省理解损失适用场景复杂度
智能摘要80-90%历史对话
相关性过滤60-80%大型项目
增量更新70-90%频繁编辑
符号化表示85-95%只需结构
优先级排序30-50%Token 紧张

检查点 ✅

全部通过才能继续

  • [ ] 理解了上下文压缩的原理
  • [ ] 为项目配置了压缩策略
  • [ ] 观察到 Token 使用量下降
  • [ ] AI 响应速度有提升

踩坑提醒

现象原因解决
AI 理解能力下降压缩过度降低压缩阈值,保留更多信息
性能没有提升策略未生效检查配置是否正确加载
增量更新失效缓存问题清空缓存或调整缓存配置
符号化后无法修改信息丢失严重对重要文件禁用符号化

最佳实践

1. 监控 Token 使用

定期检查 Token 使用情况:

bash
# 查看当前会话的 Token 统计
opencode stats

2. 渐进式配置

从小项目开始,逐步配置:

yaml
# 阶段 1:启用基础摘要
strategies:
  - summary

# 阶段 2:添加相关性过滤
strategies:
  - summary
  - relevance

# 阶段 3:启用所有策略
strategies:
  - summary
  - relevance
  - incremental
  - symbolize

3. A/B 测试

对比不同配置的效果:

配置Token 使用响应时间准确率
无压缩100%基准基准
策略 A70%-30%+5%
策略 B60%-40%-2%

4. 针对不同任务使用不同策略

yaml
task_specific_compaction:
  code_review:
    strategies: [relevance, symbolize]
    max_tokens: 4000

  refactoring:
    strategies: [incremental, relevance]
    max_tokens: 8000

  documentation:
    strategies: [summary]
    max_tokens: 6000

5. 定期清理缓存

bash
# 清理过期的压缩缓存
opencode cache clean --older-than 7d

高级技巧

1. 基于语义的压缩

使用 AI 判断代码的重要性:

yaml
strategies:
  - name: semantic_relevance
    enabled: true
    model: "gpt-4"
    # 只对大文件启用
    file_size_threshold: 1000

2. 自适应压缩

根据当前任务动态调整策略:

yaml
adaptive_compaction:
  enabled: true
  # 任务类型检测
  task_detection:
    pattern_matching: true
    ml_classification: false

  # 自动调整参数
  auto_tuning:
    enabled: true
    learning_rate: 0.1

3. 分布式压缩

对于超大项目,分块压缩:

yaml
distributed_compaction:
  enabled: true
  # 按模块分块
  chunk_by: "module"
  # 每个块的 Token 预算
  chunk_budget: 2000

本课小结

你学会了:

  1. 上下文压缩的原理和重要性
  2. 5 种常见的压缩策略
  3. 如何配置压缩策略
  4. 针对不同场景的优化方案
  5. 监控和调优压缩效果

下一课预告

下一课我们将学习思考深度配置,了解如何调整 AI 的思考模式,平衡速度和质量。


📚 更多完整模板Prompt 模板库