📖 定义
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
使用的压缩技术:
- 工具描述压缩:所有Skills的description精简到50字以内,节省Context空间30%
- 动态工具加载:每次只加载相关工具(10-15个),而非全部237个
- 向量压缩:术语百科使用向量存储,检索时只加载相关页面内容
- 递归摘要: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优化
🔗 相关教程与资源
- 🧠 Context Window优化 - 更全面的Context管理策略
- 🛡️ Tool Poisoning防御 - 压缩后的安全验证
- 🛠️ Skills工程化 - 工具描述的精简技巧
- 🚨 Context Window Overflow - 窗口溢出的危害
- 🧠 Agent Memory详解 - 压缩后的记忆存储
- 😵 Tool Confusion - 工具过多导致的选择困难