🗜️ Context Compression详解

让有限的Context Window装下无限的知识

📅 发布时间:2026年6月1日 | 🏷️ 分类:LLM优化 | ⏱️ 阅读时间:9分钟
📖 定义

Context Compression(上下文压缩)是指通过算法将大量文本信息压缩成更少Token,同时保留关键信息的技术。就像把一本书压缩成一份大纲,既节省空间,又不丢失核心内容。

在AI Agent领域,Context Compression是突破Context Window限制的关键技术——让Agent能处理远超其窗口大小的信息。

💡 类比:Context Compression就像"脱水蔬菜"——把水分(冗余信息)去掉,保留营养(关键信息),体积变小但营养价值不变。

🧠 核心原理

🔬 为什么需要Context Compression?

凌晨1点42分,我盯着那个200k token的Context Window,突然意识到一个问题:不是窗口不够大,而是里面的水太多。

看一个例子:

  • 原始文本:"今天天气非常非常好,阳光明媚,万里无云,真的是一个特别适合出去玩的好日子啊!" (45字/约45 tokens)
  • 压缩后:"今日晴朗,适合外出" (8字/约8 tokens)
  • 压缩率:82%! 信息基本不变,Token消耗大减。

Context Compression的核心目标:在最小化Token消耗的同时,最大化信息保留

🛠️ 五种主流压缩技术

1️⃣ 提取式压缩(Extractive Compression)

从原文中挑选关键句子,删除冗余内容。就像做阅读理解时划重点。

# 提取式压缩:基于TF-IDF选择关键句
from sklearn.feature_extraction.text import TfidfVectorizer

def extractive_compress(text, compression_ratio=0.3):
    sentences = text.split('.')
    
    # 计算TF-IDF分数
    vectorizer = TfidfVectorizer()
    tfidf = vectorizer.fit_transform(sentences)
    
    # 计算每句重要性分数
    sentence_scores = tfidf.sum(axis=1).A1
    ranked_sentences = [i for _, i in sorted(zip(sentence_scores, range(len(sentences))), reverse=True)]
    
    # 选择前N句
    num_sentences = max(1, int(len(sentences) * compression_ratio))
    selected = sorted(ranked_sentences[:num_sentences])
    
    return '. '.join([sentences[i] for i in selected]) + '.'

# 使用示例
original = "AI is transforming industries. It helps with automation. Many companies adopt AI. Automation reduces costs. AI also improves efficiency."
compressed = extractive_compress(original, 0.4)
print(f"原始: {len(original.split())}词")
print(f"压缩: {len(compressed.split())}词")
2️⃣ 抽象式压缩(Abstractive Compression)

用生成式模型重新表述原文,生成更简洁的摘要。就像人类用自己的话总结。

# 使用LLM进行抽象式压缩
def abstractive_compress(text, max_tokens=100):
    prompt = f"""请压缩以下文本到{max_tokens} tokens以内,保留所有关键信息:

文本:{text}

压缩版:"""
    return llm.generate(prompt, max_tokens=max_tokens)

# 注意:这种方法会消耗额外Token来压缩,要权衡使用
3️⃣ 递归摘要(Recursive Summarization)

将长文本分成小块,每块先压缩,再合并压缩结果继续压缩。适合处理超长文档。

def recursive_compress(text, chunk_size=1000, max_depth=3):
    if len(text) <= chunk_size or max_depth == 0:
        return abstractive_compress(text)
    
    # 分块压缩
    chunks = [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]
    compressed_chunks = [abstractive_compress(chunk) for chunk in chunks]
    
    # 递归合并压缩
    merged = " ".join(compressed_chunks)
    return recursive_compress(merged, chunk_size, max_depth-1)
4️⃣ 向量压缩(Vector Compression)

将文本转换为向量,只保留向量表示,丢弃原文。查询时通过向量相似度检索。

def vector_compress(documents):
    from openai import Embedding
    import numpy as np
    
    embeddings = []
    for doc in documents:
        # 生成文档向量
        vec = Embedding.create(input=doc, model="text-embedding-3-small")
        embeddings.append(vec["data"][0]["embedding"])
    
    return np.array(embeddings)  # 只存储向量,不存原文
    
# 查询时:将问题向量化,找最相似的文档向量
def query(question, embeddings, documents, top_k=3):
    q_vec = Embedding.create(input=question, model="text-embedding-3-small")
    scores = cosine_similarity(q_vec, embeddings)
    top_indices = np.argsort(scores)[-top_k:]
    return [documents[i] for i in top_indices]
5️⃣ 工具描述压缩(Tool Description Compression)

专门针对Agent工具调用的压缩——精简工具描述,减少Token消耗。

# 工具描述压缩前后对比

# ❌ 压缩前(冗长)
{
    "name": "search_web",
    "description": "这是一个用于搜索互联网网页的工具,它可以帮你找到关于任何话题的最新信息,支持中文和英文搜索,返回结果包括标题、摘要和链接"
}
# Token消耗:~35 tokens

# ✅ 压缩后(精简)
{
    "name": "search_web",
    "description": "搜索网页,返回标题+摘要+链接,支持中英文"
}
# Token消耗:~12 tokens(节省65%!)

🚀 OpenClaw实战:Context Compression应用

💡 实战案例:妙趣AI的"含虾率"优化

妙趣AI通过Context Compression技术,成功降低了"含虾率"(工具数÷产出):

  • 优化前:237个工具,产出62篇/月,含虾率=3.82
  • 优化后:199个工具(-38个僵尸工具),产出26篇/12天,含虾率=0.32

使用的压缩技术

  1. 工具描述压缩:所有Skills的description精简到50字以内,节省Context空间30%
  2. 动态工具加载:每次只加载相关工具(10-15个),而非全部237个
  3. 向量压缩:术语百科使用向量存储,检索时只加载相关页面内容
  4. 递归摘要:RSS聚合使用递归摘要,将2508期内容压缩到每日摘要中

效果:Context Window利用率从95%降到60%,响应速度提升40%。

🎯 压缩效果评估指标

def evaluate_compression(original, compressed):
    metrics = {
        "compression_ratio": len(compressed) / len(original),  # 压缩率(越小越好)
        "token_savings": len(original) - len(compressed),   # Token节省数
        "information_retention": calculate_rouge_score(original, compressed),  # 信息保留度
        "key_facts_preserved": check_key_facts(original, compressed)  # 关键事实保留
    }
    
    # 综合评分
    score = (1 - metrics["compression_ratio"]) * 0.4 + \
            metrics["information_retention"] * 0.4 + \
            metrics["key_facts_preserved"] * 0.2
    
    return {"metrics": metrics, "score": score}

🏷️ 相关标签

#ContextCompression #上下文压缩 #Token优化 #ContextWindow #OpenClaw #LLM优化

🔗 相关推荐

📄 文章
AI Agent 入门
📄 文章
Agent 配置指南
📄 文章
创建第一个 Agent
📄 文章
Agent 记忆系统
📄 文章
Agent 提示词技巧

📚 相关术语

📖 术语
Context Window
📖 术语
Tool Poisoning
📖 术语
Embedding
📄 文章
OpenClaw
📖 术语
Agent
📖 术语
工具调用