I. 核心架构 - 6. Compaction
📍 课程位置
阶段 :I. 核心架构
课序 :第 6 课
前置知识 :I-5. Memory 系统
后续课程:I-7. Streaming
🎯 本课核心问题
如果你问我:"对话太长了,Agent 记不住怎么办?历史记录越来越多,空间不够用怎么办?"
我会这样回答:这就是 **Compaction(压缩)**要做的事情------它像"整理房间"一样,把冗长的对话历史压缩成精简的摘要。
📚 为什么需要 Compaction?
问题 1:Context 溢出
- AI 模型有 Context Window 限制(如 200K tokens)
- 对话历史越来越长,总会超过限制
- 超过后 → "Context length exceeded" 错误
问题 2:成本增加
- Context 越长,AI 调用的 token 越多
- 费用越来越高
- 不压缩就是在烧钱
问题 3:性能下降
- 处理超长 Context 需要更多计算
- 响应变慢
- 用户体验变差
🔧 Compaction 的工作原理
三种压缩策略
策略 1:Summarization(摘要)
原始对话:
User: 我想买一件蓝色的衣服
Agent: 好的,您喜欢什么款式?
User: 我喜欢休闲风格
Agent: 明白了
压缩后:
"用户想要蓝色的休闲风格衣服"
策略 2:Pruning(剪枝)
原始:
[很长的工具执行结果...]
[之前的讨论...]
[无关的细节...]
压缩后:
删除不重要的内容,只保留关键信息
策略 3:池化(Pooling)
原始:10 条消息
压缩后:合并成 3 个"池"
- 意图池:用户的需求
- 关键信息池:重要参数
- 上下文池:背景信息
⏱️ 什么时候触发 Compaction?
自动触发
1. 接近 Context 边界
当使用 > 80% 的 Context 时
→ 自动开始压缩
→ 保留 20% 空间
2. 定时触发
每天/每次会话开始时
→ 检查是否需要压缩
→ 按策略压缩
手动触发
bash
# 手动压缩某个 Session
openclaw sessions compact <sessionId>
# 查看压缩日志
openclaw logs | grep compaction
🔍 Compaction 的具体流程
1. 检查当前 Context 使用量
↓
2. 如果超过阈值(比如 80%)
↓
3. 决定压缩策略
- 摘要?剪枝?池化?
↓
4. 执行压缩
- 调用 AI 生成摘要
- 或直接删除不重要内容
↓
5. 更新 Session 文件
↓
6. 验证压缩后的大小
↓
7. 如果还是太长 → 再次压缩
🔧 实战:配置 Compaction
基本配置
json5
{
"agents": {
"defaults": {
"compaction": {
// 压缩模式
"mode": "safeguard", // auto | safeguard | manual
// 触发阈值
"threshold": "80%", // 超过 80% 时压缩
// 保留空间
"reserveTokens": "10000", // 保留 10K tokens 空间
// 压缩策略
"strategy": {
"type": "hybrid", // hybrid | summarize | prune
"preserveIntent": true, // 保留用户意图
"preserveKeyInfo": true // 保留关键信息
}
}
}
}
}
模式说明
| 模式 | 说明 | 适用场景 |
|---|---|---|
auto |
完全自动压缩 | 需要频繁压缩 |
safeguard |
只在快溢出时压缩 | 保守策略,推荐 |
manual |
手动触发压缩 | 精确控制 |
📊 Compaction 的效果
压缩前后对比
压缩前:
- Context 大小:180,000 tokens
- 费用:$0.54/次调用
压缩后:
- Context 大小:40,000 tokens
- 费用:$0.12/次调用
- 节省:77% 费用!
压缩后的质量
- ✅ 保留用户意图
- ✅ 保留关键信息
- ✅ 删除冗余细节
- ⚠️ 失去一些"人情味"
⚠️ 常见陷阱
| 陷阱 | 表现 | 原因 | 解决 |
|---|---|---|---|
| 压缩过度 | Agent "失忆"了 | 删除太多 | 调整保留策略 |
| 压缩不够 | 仍然溢出 | 阈值太高 | 调低阈值 |
| 压缩太频繁 | 性能下降 | 触发条件太宽松 | 调整触发频率 |
| 信息丢失 | 重要内容被删 | 没有设置保留 | 配置 preserveIntent |
📝 学习心得
我学这一课时的体会
我以前以为"压缩"就是"删除旧内容"。
学完后才知道:
- Compaction 是智能的
- 它会用 AI 生成摘要
- 它知道保留什么,删除什么
最大的收获是:
- Compaction + Session + Memory 是三位一体的
- Session = 本次对话
- Memory = 长期记忆
- Compaction = 整理优化
与其他课程的关联
- 前置课程:Session 管理 - 存储对话
- 前置课程:Memory 系统 - 长期记忆
- 后续课程:Streaming - 另一个优化手段
- 配合课程:Context 管理 - Context 的成本
✅ 你现在应该理解的
- 解释为什么需要 Compaction
- 说出三种压缩策略
- 知道什么时候触发压缩
- 能配置 Compaction 参数
- 理解压缩后的效果
📚 快速参考表
| 概念 | 简单说 |
|---|---|
| Compaction | 压缩对话历史 |
| Summarization | 摘要模式 |
| Pruning | 剪枝模式 |
| 触发阈值 | 超过多少百分比时压缩 |
| Reserve | 保留多少空间 |
🔗 相关资源
官方文档:
- Compaction:https://docs.openclaw.ai/concepts/compaction
- Context:https://docs.openclaw.ai/concepts/context
相关课程:
- 上一课:I-5. Memory 系统
- 下一课:I-7. Streaming
📊 本课总结
最关键的 3 点:
-
为什么压缩
- 防止 Context 溢出
- 节省成本
- 提升性能
-
三种策略
- Summarization:生成摘要
- Pruning:删除不重要的
- Pooling:合并信息
-
配置建议
- 用
safeguard模式 - 保留关键意图
- 定期检查效果
- 用
现在你应该理解了如何"整理"对话历史。下一课会讲另一个优化手段:Streaming(流式输出)。