Skip to content
🔗 分享本题
查看我的学习进度 →

上下文压缩动漫知识图:检索片段经过重排、过滤和证据抽取,仅把保留来源边界的相关内容交给模型

记忆点:删冗余不删依据,省 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.053s
Embedding过滤2000⭐⭐⭐⭐$0.021.5s
LLM提取800⭐⭐⭐⭐⭐$0.0152s
Rerank+提取500⭐⭐⭐⭐⭐$0.012.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%,质量反而更好。"