Context Compression
Context Compression 是在不丢失关键信息的前提下,减少上下文 token 消耗的技术,包括文本压缩、摘要、去重和结构化。
#type / concept
#status / evergreen
#tech / ai
[!info] related notes
Context Compression
一句话定义
Context Compression 是在不丢失关键信息的前提下,减少上下文 token 消耗的技术。检索到的文档可能很长,工具返回的结果可能很大,需要压缩后再注入上下文。
核心原理
压缩技术
| 技术 | 原理 | 适用场景 |
|---|---|---|
| 摘要 | LLM 压缩文本 | 长文档 |
| 提取 | 只保留相关段落 | 检索结果 |
| 去重 | 移除重复信息 | 多源检索 |
| 结构化 | 转成表格/列表 | 自由文本 |
检索结果压缩
class ContextualCompressor:
def __init__(self, llm):
self.llm = llm
async def compress(self, query: str, documents: list[str], max_tokens: int = 2000) -> str:
"""压缩检索结果,只保留与查询相关的部分"""
prompt = f"""
从以下文档中提取与问题相关的关键信息。只保留直接相关的内容。
问题: {query}
文档:
{chr(10).join(documents)}
提取的关键信息:
"""
return await self.llm.chat(prompt)
工具结果压缩
def compress_tool_result(result: any, max_length: int = 1000) -> str:
"""压缩工具返回结果"""
text = json.dumps(result) if not isinstance(result, str) else result
if len(text) <= max_length:
return text
# 截断并添加省略号
return text[:max_length] + "\n... (结果已截断)"
常见设计模式
1. 按查询压缩
根据用户问题,只保留相关的部分。
2. 分层压缩
重要信息保留原文,次要信息用摘要。
3. 渐进式压缩
先用原文,token 不够时再压缩。
常见坑
- 压缩太狠: 丢失关键信息
- 不做压缩: 检索结果太长浪费 token
- 压缩增加延迟: 每次都调用 LLM 压缩