Context Window Compression(上下文窗口压缩)
"世界上有一种存储叫做上下文窗口,它能装下整个宇宙的知识,但你永远装不满——因为每次你塞进去一块,另一块就被挤出来了。"
🤔 这是什么问题?
Context Window Compression(上下文窗口压缩)是一系列技术的总称,目的是在不丢失关键信息的前提下,减少LLM上下文占用的Token数量。
为什么需要压缩?因为:
- 上下文窗口有限:即使128K token,长对话也会用完
- 成本昂贵:每1K token都是钱,浪费Token就是浪费钱
- 性能衰减:上下文越长,模型在中间部分的注意力越弱("Lost in the Middle"现象)
- 延迟增加:处理100K token比10K token慢10倍以上
🎯 通俗比喻
想象你的大脑是一个固定大小的抽屉(上下文窗口):
- 你和AI聊了2个小时,对话记录塞满了整个抽屉
- 但AI只需要记住"当前在讨论什么"和"之前的关键决定"
- Context Window Compression就是把抽屉里的东西整理打包——把10条"嗯嗯""好的""收到"压缩成一行"用户表示同意"
- 效果:原来需要8MB的对话,压缩后只需要800KB,但关键信息一个没丢
就像你收拾行李箱——不是把东西扔了,而是把T恤叠起来、把充电器放角落、把液体装进分装瓶。
📐 压缩技术分类
1. 摘要压缩(Summarization)
用LLM把旧对话总结成简短摘要:
# 原始对话(2000 tokens)
User: "帮我写一个Python脚本读取CSV"
Agent: "好的,用pandas库..."[100行代码]
User: "运行报错了"
Agent: "看起来是编码问题,试试..."[修复代码]
User: "可以了!"
Agent: "太好了!"
# 压缩后(50 tokens)
[摘要] 用户请求读取CSV文件,使用pandas完成,
遇到编码问题后修复,最终成功。
2. Token合并(Token Merging)
在模型内部层合并相似Token,减少计算量:
# 原始:The cat sat on the mat
# 合并后:The(猫) sat(坐) on(上) the mat(垫)
# Token数从6降到5,语义不变
3. 关键信息提取(Key Information Extraction)
用轻量级模型提取关键实体和关系:
# 提取模板
{
"user_intent": "读取CSV文件",
"tech_stack": ["Python", "pandas"],
"issues_encountered": ["编码问题"],
"resolution": "修改encoding参数",
"status": "resolved"
}
4. 滑动窗口(Sliding Window)
保留最近的N轮对话,丢弃更早的:
# 对话历史
[msg 1-10] → 丢弃(已摘要)
[msg 11-20] → 丢弃(已摘要)
[msg 21-30] → 保留(近期上下文)
[msg 31-35] → 保留(当前上下文,完整)
# 配合摘要:
summary_of_1_10 + summary_of_11_20 + full_21_35
5. 向量化压缩(Vector Compression)
将上下文转为向量,用相似度检索代替全文加载:
# 当需要历史信息时
user_query = "之前那个CSV脚本怎么写的?"
# 不加载全部历史,只检索相关部分
relevant_history = vector_search(
collection="conversation_history",
query=user_query,
top_k=5
)
# 只把相关部分加入上下文
📊 压缩率对比
| 技术 | 压缩率 | 信息损失 | 计算成本 |
|---|---|---|---|
| 摘要压缩 | 5-20x | 中等(细节丢失) | 高(需要LLM调用) |
| Token合并 | 1.2-2x | 低 | 低(推理时自动) |
| 信息提取 | 10-50x | 高(只保留结构) | 中等 |
| 滑动窗口 | 2-10x | 高(旧信息丢失) | 零 |
| 向量化检索 | 50-200x | 可变(取决于召回率) | 低(查询时计算) |
⚡ OpenClaw实战应用
🚀 OpenClaw的上下文管理策略
1. 自动摘要机制
OpenClaw在长会话中自动触发上下文压缩:
# OpenClaw内部的上下文管理
当上下文接近窗口限制时:
1. 触发自动摘要
2. 旧消息 → 压缩为摘要
3. 保留最近N条完整消息
4. 摘要 + 近期消息 = 新上下文
# 效果:
原始: 50000 tokens (50轮对话)
压缩: 5000 tokens (摘要2000 + 近期3000)
节省: 90%
2. 记忆分层
# OpenClaw的三层记忆体系
Layer 0: 工作记忆 (context window)
- 当前对话内容
- 128K tokens
- 超出时自动压缩
Layer 1: 会话记忆 (tdai_memory_search)
- 结构化长期记忆
- 按相关性检索
- 不占用上下文
Layer 2: 文件记忆 (Scene Navigation)
- 详细场景记录
- 按需加载
- 只有相关部分进入上下文
# 关键:Layer 1和Layer 2不需要全部塞进上下文,
# 只在需要时按需拉取
3. 上下文预算管理
# SOUL.md等配置文件进入上下文的方式
# 只注入相关部分,而非全部
# 项目上下文(自动注入,约5000 tokens)
SOUL.md → 只注入核心规则(不是全部)
IDENTITY.md → 完整注入(很短)
USER.md → 完整注入(很短)
TOOLS.md → 注入工具路径配置
# 记忆(按需注入)
tdai_memory_search → 只在有相关记忆时注入
Scene Navigation → 只在read_file时加载
# 效果:
总上下文预算: 128K
固定占用: ~8K (系统提示+配置)
可用空间: ~120K (对话+工具调用)
🎓 最佳实践
给Agent开发者的建议:
- 不要等窗口满了才压缩:在70%使用率时就触发压缩
- 摘要要有结构:用JSON格式存摘要,便于后续检索
- 关键决策保留原文:用户确认的决定不要压缩,原文保留
- 工具调用结果可以激进压缩:中间执行结果只需要保留最终输出
- 错误信息保留最近3次:太旧的错误信息没有保留价值
压缩黄金法则
"能检索的不全部塞入,能摘要的不保留原文,
能丢弃的不心存侥幸"