记忆点:删冗余不删依据,省 Token 也要守住证据召回。
💡 答案要点
上下文压缩 = 从检索结果中提取最相关片段,减少LLM输入
问题背景:
检索返回5个文档,每个1000 tokens
→ 总共5000 tokens送给LLM
→ 但只有500 tokens真正有用
→ 浪费4500 tokens,增加成本和延迟压缩策略:
1. 基于LLM的提取
python
from langchain.retrievers.document_compressors import LLMChainExtractor
compressor = LLMChainExtractor.from_llm(llm)
prompt = """
文档: {document}
问题: {query}
请只提取与问题相关的句子,其他都删除。
"""
# 压缩前: 1000 tokens
# 压缩后: 200 tokens (只保留相关部分)2. 基于Embedding的过滤
python
from langchain.retrievers.document_compressors import EmbeddingsFilter
# 计算每个句子与query的相似度
# 只保留相似度>阈值的句子
embeddings_filter = EmbeddingsFilter(
embeddings=OpenAIEmbeddings(),
similarity_threshold=0.76
)3. Rerank + Top-K选择
python
# 先检索50个候选
candidates = vector_db.search(query, top_k=50)
# Rerank重排
reranked = reranker.rerank(query, candidates)
# 只取top-3,并提取关键段落
compressed = []
for doc in reranked[:3]:
# 从每个文档中提取最相关的3个句子
relevant_sentences = extract_relevant(doc, query, max_sentences=3)
compressed.append(relevant_sentences)4. Contextual Compression完整流程
python
from langchain.retrievers import ContextualCompressionRetriever
# 基础检索器
base_retriever = vector_store.as_retriever(search_kwargs={"k": 20})
# 压缩器(LLM提取)
compressor = LLMChainExtractor.from_llm(llm)
# 组合
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=base_retriever
)
# 使用
compressed_docs = compression_retriever.get_relevant_documents(query)效果对比:
| 方法 | 输入Tokens | 输出质量 | 成本 | 延迟 |
|---|---|---|---|---|
| 无压缩 | 5000 | ⭐⭐⭐⭐ | $0.05 | 3s |
| Embedding过滤 | 2000 | ⭐⭐⭐⭐ | $0.02 | 1.5s |
| LLM提取 | 800 | ⭐⭐⭐⭐⭐ | $0.015 | 2s |
| Rerank+提取 | 500 | ⭐⭐⭐⭐⭐ | $0.01 | 2.5s |
Late Chunking(晚期分块):
python
# 传统chunking: 先切分再embedding
doc = "AI技术正在改变世界。大模型是核心。RAG系统很重要。"
chunks = ["AI技术正在改变世界。", "大模型是核心。", "RAG系统很重要。"]
embeddings = [embed(c) for c in chunks] # 丢失跨chunk上下文
# Late chunking: 先embedding再切分
full_embedding = embed(doc) # 保留完整上下文
chunk_embeddings = split_embedding(full_embedding, chunk_boundaries)优势: 保留完整文档上下文,提升检索准确率5-10%
面试话术:
示例表达(仅在能用本人经历或可复现实验佐证时使用): "上下文压缩是成本优化的关键。我们用Rerank+LLM提取,从检索的20个文档中精选3个,每个提取3句话,tokens从8000降到600,成本降低92%,质量反而更好。"
