🗜️ Context Compression

上下文压缩 - 把大象塞进冰箱的艺术

更新时间: 2026-04-29 | 分类: Token优化

Context Window Token 优化 Agent Memory 成本控制
"世界上有一种技术叫 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. 调试时先关闭压缩,上线再启用

🆚 压缩策略对比

策略 压缩率 信息损失 计算成本 适用场景
滑动窗口 中等 高(直接丢弃) 简单对话
摘要压缩 高(90%+) 长对话 Agent
语义压缩模型 极高(95%+) 生产环境
分层压缩 最低 复杂 Agent

⚠️ 常见坑点

坑点 1:过度压缩导致关键信息丢失
压缩后 Agent 忘记了之前的重要决策,反复问用户同样的问题。
解决方案:重要信息单独存储到外部记忆,不参与压缩。
坑点 2:压缩本身成本过高
每 5 轮就压缩一次,摘要生成的成本抵消了节省的 token 钱。
解决方案:设置合理的压缩阈值(如 15 轮),且使用小模型生成摘要。
坑点 3:压缩时机不对
在多轮推理任务中压缩,导致 Agent 忘记了前面的推理步骤。
解决方案:只在对话"休息点"压缩(如任务完成、用户确认后)。

📝 总结

Context Compression 就像是给 Agent 装了一个"记忆滤镜"——滤掉噪音,保留精华。用好了能让 Agent 跑得更快、更久、更省;用不好就是"老年痴呆",重要事情全忘光。
适用场景判断
✅ 开启压缩:长对话 Agent(超过 20 轮)、高频调用 Agent、成本敏感场景
❌ 不开压缩:短对话(少于 10 轮)、推理任务、调试阶段