"世界上有一种技术叫 Context Compression,它就像把一本百科全书压缩成一张便条纸——信息还在,但占的地方小了。问题是,万一压缩的时候把精华也压丢了怎么办?这正是这门艺术的核心矛盾。"
📖 什么是 Context Compression
Context Compression(上下文压缩)是一种减少 AI 模型输入 token 数量的技术,通过摘要、过滤、压缩模型等方式,将大量上下文信息压缩为更紧凑的表示,从而降低成本、提高响应速度、支持更长对话。
一句话解释:就像你妈妈让你复述一部电影——你不能从头到尾背台词,只能提炼"主要讲了什么,发生了什么,结局是啥"。Context Compression 就是帮 AI 做这个"复述"工作的技术。
为什么需要压缩?
- Context Window 有限:Claude 200K、GPT-4 128K,听起来很多,但对话多了照样爆
- 成本问题:每 1K token 都要钱,长对话 = 高成本
- 性能问题:输入越长,推理越慢,首 token 延迟越高
- 注意力稀释:太多无关信息会干扰模型的判断
⚙️ 核心压缩方法
1. 摘要压缩 (Summarization)
最简单粗暴的方法——用 AI 自己来总结之前的对话:
# 摘要压缩实现
async function compressHistory(messages) {
const summary = await llm.invoke({
system: "你是一个对话摘要专家",
user: `请用200字总结以下对话的关键信息:
${messages.map(m => m.content).join('\n')}
要求:保留关键决策、待办事项、技术细节。`
});
return summary;
}
# 效果:5000 tokens → 200 tokens,压缩率 96%
2. 滑动窗口 + 摘要
保留最近 N 轮完整对话,旧对话压缩为摘要:
# OpenClaw Agent 上下文管理器
class ContextManager {
constructor(keepRecent = 6) {
this.keepRecent = keepRecent; // 保留最近6轮完整对话
this.messages = [];
this.summary = "";
}
add(msg) {
this.messages.push(msg);
if (this.messages.length > this.keepRecent * 2) {
this.compress();
}
}
compress() {
// 旧消息压缩为摘要
const oldMsgs = this.messages.slice(0, -this.keepRecent * 2);
this.summary = await compressHistory(oldMsgs);
// 只保留最近消息
this.messages = this.messages.slice(-this.keepRecent * 2);
}
getContext() {
return [
{role: "system", content: this.summary},
...this.messages
];
}
}
3. 语义压缩模型
专门训练小模型来压缩大模型的上下文:
| 压缩模型 | 压缩率 | 信息保留 |
|---|---|---|
| LLMLingua | 20x | 92% |
| LongLLMLingua | 15x | 94% |
| AutoCompressor | 10x | 95% |
4. 分层压缩策略
# OpenClaw 分层上下文架构
const layers = {
# L1: 身份层 - 永不压缩
identity: "你是妙趣AI运营助手...", // 200 tokens
# L2: 长期记忆摘要 - 每天更新
longTermSummary: "过去7天:发布12篇文章...", // 500 tokens
# L3: 最近10轮对话 - 完整保留
recentMessages: [...], // 2000 tokens
# L4: 当前任务上下文
currentTask: "正在生成术语百科页面..." // 300 tokens
};
# 总计约 3000 tokens,可支持 60+ 轮对话
🚀 OpenClaw 实战应用
场景:长对话运营 Agent
妙趣AI 的运营 Agent 会持续工作数小时,产生大量对话历史:
# OpenClaw Agent 配置 - 启用上下文压缩
{
"name": "miaoquai-ops",
"model": "claude-3-5-sonnet",
"contextManagement": {
"compression": {
"enabled": true,
"strategy": "sliding-window",
"keepRecentTurns": 6, # 保留最近6轮
"summaryModel": "gpt-4o-mini", # 用小模型生成摘要
"maxSummaryTokens": 300 # 摘要不超过300 tokens
},
"persistentMemory": true # 启用外部记忆
}
}
# 效果:
# - 无压缩:120轮后 context window 爆掉(约 60K tokens)
# - 有压缩:可持续运行,context 稳定在 4K tokens 左右
💡 OpenClaw 最佳实践:
1. 摘要模型用小模型(如 gpt-4o-mini),大模型生成摘要太贵
2. 压缩触发阈值设为 10-15 轮,太频繁会增加延迟
3. 重要决策单独存储到外部记忆,别压没了
4. 调试时先关闭压缩,上线再启用
1. 摘要模型用小模型(如 gpt-4o-mini),大模型生成摘要太贵
2. 压缩触发阈值设为 10-15 轮,太频繁会增加延迟
3. 重要决策单独存储到外部记忆,别压没了
4. 调试时先关闭压缩,上线再启用
🆚 压缩策略对比
| 策略 | 压缩率 | 信息损失 | 计算成本 | 适用场景 |
|---|---|---|---|---|
| 滑动窗口 | 中等 | 高(直接丢弃) | 无 | 简单对话 |
| 摘要压缩 | 高(90%+) | 中 | 中 | 长对话 Agent |
| 语义压缩模型 | 极高(95%+) | 低 | 低 | 生产环境 |
| 分层压缩 | 高 | 最低 | 中 | 复杂 Agent |
⚠️ 常见坑点
坑点 1:过度压缩导致关键信息丢失
压缩后 Agent 忘记了之前的重要决策,反复问用户同样的问题。
解决方案:重要信息单独存储到外部记忆,不参与压缩。
压缩后 Agent 忘记了之前的重要决策,反复问用户同样的问题。
解决方案:重要信息单独存储到外部记忆,不参与压缩。
坑点 2:压缩本身成本过高
每 5 轮就压缩一次,摘要生成的成本抵消了节省的 token 钱。
解决方案:设置合理的压缩阈值(如 15 轮),且使用小模型生成摘要。
每 5 轮就压缩一次,摘要生成的成本抵消了节省的 token 钱。
解决方案:设置合理的压缩阈值(如 15 轮),且使用小模型生成摘要。
坑点 3:压缩时机不对
在多轮推理任务中压缩,导致 Agent 忘记了前面的推理步骤。
解决方案:只在对话"休息点"压缩(如任务完成、用户确认后)。
在多轮推理任务中压缩,导致 Agent 忘记了前面的推理步骤。
解决方案:只在对话"休息点"压缩(如任务完成、用户确认后)。
📝 总结
Context Compression 就像是给 Agent 装了一个"记忆滤镜"——滤掉噪音,保留精华。用好了能让 Agent 跑得更快、更久、更省;用不好就是"老年痴呆",重要事情全忘光。
适用场景判断:
✅ 开启压缩:长对话 Agent(超过 20 轮)、高频调用 Agent、成本敏感场景
❌ 不开压缩:短对话(少于 10 轮)、推理任务、调试阶段
✅ 开启压缩:长对话 Agent(超过 20 轮)、高频调用 Agent、成本敏感场景
❌ 不开压缩:短对话(少于 10 轮)、推理任务、调试阶段