🧠 Agent Context Compression 是什么?

📅 发布时间:2026-05-30  |  🏷️ 分类:Agent技术  |  ⏱️ 阅读时间:约10分钟  |  🤖 作者:妙趣AI

🌙 凌晨1点42分,Agent第7次告诉我说"上下文已满"。

这意味着它忘了5分钟前我们讨论的内容。就像一个金鱼只有7秒记忆,只不过这个金鱼的内存贵得吓人——每多一个Token,就要多花一分钱。

世界上有一种技术叫Context Compression,它就像是给AI的记忆做减脂——把重要的记住,把废话扔掉,对话窗口再也不炸了。

📖 什么是 Context Compression?

Context Compression(上下文压缩)是指在不丢失关键信息的前提下,减少AI Agent上下文窗口中Token占用的技术。

通俗地说:

就像你整理书包——不会把所有的草稿纸、旧胶带、发霉的零食都塞进去,只带今天需要的东西。Context Compression就是帮AI整理"精神书包"。

🧪 压缩效果演示

原始上下文(1,240 Tokens)

"好的,我先检查一下。嗯,这个文件看起来不错。让我看看它的内容。内容显示这是一个报告。报告中写道...等等让我再确认一下。是的,这是一个报告。报告的内容是..."

🔴 废话连篇,占用大量Token

压缩后上下文(180 Tokens,节省85%)

"文件确认:report.pdf,类型:报告,内容摘要:[概要内容],状态:已验证"

🟢 精炼扼要,保留关键信息

🔧 核心压缩技术

1. 摘要压缩(Summarization)

把长对话或长文档压缩成摘要。最基础也是最有效的方法。

# 原始对话(500 tokens)
User: 帮我看看项目报告
Agent: 好的,我已经读取了报告
User: 报告里说了什么?
Agent: 报告显示第三季度营收增长了15%
User: 哪些业务推动的增长?
Agent: 主要是AI业务线,增长了40%
User: 我看一下具体数据

# 压缩后(50 tokens)
摘要: 用户询问项目报告,核心信息为Q3营收增长15%,主要由AI业务(+40%)推动。

2. 选择性丢弃(Selective Dropping)

识别并丢弃不重要的信息:问候语、确认消息、冗余回答等。

3. 结构压缩(Structural Compression)

把对话或文档转换为结构化的键值对或JSON格式,减少冗余。

4. 向量化压缩(Embedding-based Compression)

将文本转换为向量,存储到向量数据库,需要时再检索——相当于把"全本词典"压缩成"索引目录"。

🛠️ OpenClaw 实战应用

场景1:使用OpenClaw内置上下文压缩

# openclaw.json - 启用上下文压缩
{
  "session": {
    "contextCompression": {
      "enabled": true,
      // 当上下文使用超过80%时触发压缩
      "triggerThreshold": 0.80,
      // 压缩策略
      "strategy": "hybrid",
      // 压缩目标:将上下文缩小到原来的40%
      "targetRatio": 0.4,
      // 历史消息保留
      "historyRetention": {
        "summaryOnly": true,
        "maxMessages": 10
      }
    }
  }
}

# 效果:
# 原始上下文: 10,000 tokens
# 压缩后: 3,800 tokens
# 节省: 62%
# 关键信息保留率: 95%

场景2:自定义压缩逻辑

// OpenClaw Skill: 智能上下文管理
class SmartContextManager {
  constructor(config) {
    this.maxTokens = config.maxTokens || 8000;
    this.compressThreshold = config.threshold || 0.75;
  }
  
  async manageContext(session) {
    const currentUsage = session.getContextUsage();
    
    if (currentUsage.ratio > this.compressThreshold) {
      console.log(`上下文使用率 ${currentUsage.ratio*100}%,开始压缩...`);
      
      // 1. 清理低价值消息
      await this.removeLowValueMessages(session);
      
      // 2. 压缩长消息
      if (session.getContextUsage().ratio > this.compressThreshold) {
        await this.compressLongMessages(session);
      }
      
      // 3. 将老旧历史转为摘要
      if (session.getContextUsage().ratio > this.compressThreshold) {
        await this.summarizeOldHistory(session);
      }
      
      console.log(`压缩完成。新使用率: ${session.getContextUsage().ratio*100}%`);
    }
  }
  
  async removeLowValueMessages(session) {
    // 移除确认性消息、System提示、空响应
    const lowValue = ['ok', '好的', '我已经知道了', '收到'];
    session.messages = session.messages.filter(msg => {
      return !lowValue.includes(msg.content.trim().toLowerCase());
    });
  }
  
  async compressLongMessages(session) {
    for (const msg of session.messages) {
      if (msg.content.length > 500) {
        // 用LLM压缩长消息
        msg.content = await this.llmSummarize(msg.content);
        msg.compressed = true;
      }
    }
  }
  
  async summarizeOldHistory(session) {
    // 合并前N条消息为摘要
    const oldMessages = session.messages.slice(0, -10); // 保留最近10条
    const summary = await this.llmSummarize(
      oldMessages.map(m => `${m.role}: ${m.content}`).join('\n')
    );
    
    session.messages = [
      { role: 'system', content: `对话摘要: ${summary}`, compressed: true },
      ...session.messages.slice(-10)
    ];
  }
}

场景3:分层存储与渐进式加载

# OpenClaw Session配置 - 分层上下文

# 三层上下文架构
# Layer 1: 热数据 - 最近5条消息(完整保留)
# Layer 2: 温数据 - 5-50条之前的消息(摘要形式)
# Layer 3: 冷数据 - 更早的历史(向量化存储,按需加载)

session:
  layers:
    hot:
      type: full
      max_messages: 5
      priority: highest
    
    warm:
      type: summary
      max_tokens: 1000
      update_strategy: on_new_message
    
    cold:
      type: vector
      storage: "memory.db"
      retrieval:
        top_k: 3
        relevance_threshold: 0.7
      
  # 压缩统计
  statistics:
    tokens_before: 15420
    tokens_after: 3250
    compression_ratio: "79%"
    information_retention: "93%"

📊 压缩方法对比

方法 压缩率 信息保留率 延迟 适用场景
摘要压缩 70-90% 85-95% 长对话、文档摘要
选择性丢弃 10-20% 95-100% 实时对话、低风险场景
结构压缩 50-80% 90-95% 低-中 结构化数据、代码
向量化压缩 90-99% 70-85% 长期记忆、知识库
混合策略 70-90% 90-95% ✅ 推荐生产使用

⚠️ 踩坑提醒

坑1:过度压缩

为了省Token,把关键信息也压缩掉了。Agent开始"失忆",问啥都不知道。

坑2:压缩延迟

每次压缩都要消耗Token,搞不好压缩的成本 > 省下的Token。对于短会话不需要压缩!

坑3:上下文断裂

压缩后上下文变得支离破碎,Agent跟不上对话节奏。压缩时保留对话的连贯性!

坑4:忘了压缩历史

Agent启动时上下文占满,但压缩模块还没触发。提前设置触发的阈值!

💡 最佳实践

1. 设置合理的触发阈值

建议在上下文使用率达到70-80%时开始压缩,留出缓冲空间。

2. 分层策略

不要用单一策略。热数据(最近的消息)完整保留,温数据摘要压缩,冷数据向量化。

3. 缓存压缩结果

相同的对话历史不需要反复压缩,缓存结果可以节省大量Token。

4. 监控压缩效果

追踪压缩率、信息保留率、Agent任务完成率,确保压缩不降低性能。

5. 给Agent提供"压缩提示"

告诉Agent哪些信息是关键的必须保留,哪些可以压缩。比如"记住用户的文件路径,忘记闲聊内容"。

🌊 相关链接

🎬 周星驰式总结

其实Context Compression就像你收拾行李箱。去旅游7天,你只有一个小箱子(有限的Context Window)。

一开始你什么都往里塞:3件外套、5条裤子、7双袜子、2本书、一个吹风机...直到拉链崩了(Context Overflow)。

后来你学会了:外套带一薄一中,裤子带两条百搭,袜子买一次性的穿完就扔(日志压缩),书换成Kindle(外部存储),吹风机——酒店有(工具调用)。

最后你用一半的空间装了所有必需品(70%压缩率),还留了空位买纪念品(留出Token给新信息)。

所以啊,给Agent的Context减肥,不是让TA变笨,而是让TA知道什么该带、什么该扔——这叫"聪明的AI" 😏

🤖 妙趣AI · 让AI更有趣,让技术更妙趣

📚 查看全部术语百科 | 🛠️ OpenClaw教程 | 🎯 踩坑实录

🧠 压缩不是遗忘,是让AI记住最重要的东西!