5.20 上下文压缩
💡 一句话总结:优化上下文管理,让 AI 在有限的 token 内理解更多代码。
学完你能做什么
- 理解上下文压缩的原理和作用
- 配置压缩策略,优化 token 使用
- 处理大型项目时避免上下文溢出
- 提高 AI 响应速度和质量
你现在的困境
- 大项目时 AI "看不到" 完整代码
- 对话多了之后响应变慢
- Token 超限导致无法处理
- 不知道如何优化上下文效率
什么时候用这一招
- 当你需要:处理大型项目或复杂任务
- 而且不想:因为 token 限制影响 AI 理解能力
🎒 开始前的准备
确保你已经完成以下事项:
- [ ] 完成了 5.1b 配置进阶
- [ ] 了解 token 的基本概念
核心思路
什么是上下文压缩
上下文压缩 是指在不影响理解的前提下,减少传递给 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+ 文件)能高效处理
- 创建
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"- 测试压缩效果:
分析这个项目的整体架构,并给出优化建议你应该看到:
- AI 快速理解项目结构
- Token 使用在预算范围内
- 响应速度明显提升
实战 2:配置对话历史压缩
目标:长时间对话后保持良好性能
- 配置历史压缩:
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: 创建一个用户注册表单
任务 2: 添加表单验证
任务 3: 集成后端 API
任务 4: 添加错误处理
任务 5: 优化样式你应该看到:
- 即使到了任务 5,性能依然良好
- AI 记住了之前的所有操作
- Token 使用量稳定
实战 3:处理频繁变化的文件
目标:优化增量更新,减少重复传输
- 配置增量更新:
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: 创建 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 stats2. 渐进式配置
从小项目开始,逐步配置:
yaml
# 阶段 1:启用基础摘要
strategies:
- summary
# 阶段 2:添加相关性过滤
strategies:
- summary
- relevance
# 阶段 3:启用所有策略
strategies:
- summary
- relevance
- incremental
- symbolize3. A/B 测试
对比不同配置的效果:
| 配置 | Token 使用 | 响应时间 | 准确率 |
|---|---|---|---|
| 无压缩 | 100% | 基准 | 基准 |
| 策略 A | 70% | -30% | +5% |
| 策略 B | 60% | -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: 60005. 定期清理缓存
bash
# 清理过期的压缩缓存
opencode cache clean --older-than 7d高级技巧
1. 基于语义的压缩
使用 AI 判断代码的重要性:
yaml
strategies:
- name: semantic_relevance
enabled: true
model: "gpt-4"
# 只对大文件启用
file_size_threshold: 10002. 自适应压缩
根据当前任务动态调整策略:
yaml
adaptive_compaction:
enabled: true
# 任务类型检测
task_detection:
pattern_matching: true
ml_classification: false
# 自动调整参数
auto_tuning:
enabled: true
learning_rate: 0.13. 分布式压缩
对于超大项目,分块压缩:
yaml
distributed_compaction:
enabled: true
# 按模块分块
chunk_by: "module"
# 每个块的 Token 预算
chunk_budget: 2000本课小结
你学会了:
- 上下文压缩的原理和重要性
- 5 种常见的压缩策略
- 如何配置压缩策略
- 针对不同场景的优化方案
- 监控和调优压缩效果
下一课预告
下一课我们将学习思考深度配置,了解如何调整 AI 的思考模式,平衡速度和质量。
📚 更多完整模板:Prompt 模板库

