Context Window Compression(上下文窗口压缩)

更新时间:2026-05-14 | 难度:⭐⭐⭐⭐ | 阅读时长:9分钟

"世界上有一种存储叫做上下文窗口,它能装下整个宇宙的知识,但你永远装不满——因为每次你塞进去一块,另一块就被挤出来了。"

🤔 这是什么问题?

Context Window Compression(上下文窗口压缩)是一系列技术的总称,目的是在不丢失关键信息的前提下,减少LLM上下文占用的Token数量

为什么需要压缩?因为:

🎯 通俗比喻

想象你的大脑是一个固定大小的抽屉(上下文窗口):

就像你收拾行李箱——不是把东西扔了,而是把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开发者的建议:

  1. 不要等窗口满了才压缩:在70%使用率时就触发压缩
  2. 摘要要有结构:用JSON格式存摘要,便于后续检索
  3. 关键决策保留原文:用户确认的决定不要压缩,原文保留
  4. 工具调用结果可以激进压缩:中间执行结果只需要保留最终输出
  5. 错误信息保留最近3次:太旧的错误信息没有保留价值

压缩黄金法则

"能检索的不全部塞入,能摘要的不保留原文,
能丢弃的不心存侥幸"