技术背景介绍
在处理文档检索时,我们需要应对一个重要挑战:在数据存储系统中输入数据时,通常无法预测将来会面临的具体查询。这意味着,最相关的信息可能埋藏在大量不相关文本的文档中,导致昂贵的LLM调用和较差的响应质量。上下文压缩旨在解决这个问题,通过在返回检索到的文档之前,根据查询的上下文对它们进行压缩,仅返回相关信息。
核心原理解析
上下文压缩检索器由三个关键组件组成:
- 基础检索器 - 用于初步检索候选文档。
- 文档压缩器 - 接收基础检索器返回的文档列表,并通过缩减文档内容或丢弃不相关文档来进行压缩。
- 上下文压缩检索器 - 综合运用基础检索器和文档压缩器以优化检索过程。
代码实现演示
下面我们将通过代码示例展示如何使用上下文压缩技术优化文档检索流程。
初始化基础检索器
这里我们使用FAISS向量存储和OpenAI Embeddings来设置基础检索器,并加载2023年国情咨文文档。
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
# 加载文档并进行预处理
documents = TextLoader("state_of_the_union.txt").load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
retriever = FAISS.from_documents(texts, OpenAIEmbeddings()).as_retriever()
# 测试检索效果
docs = retriever.invoke("What did the president say about Ketanji Brown Jackson")
pretty_print_docs(docs)
添加上下文压缩
接下来,我们将使用上下文压缩检索器进行压缩,确保返回的文档内容更加聚焦于查询上下文。
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
from langchain_openai import OpenAI
# 配置压缩器
llm = OpenAI(temperature=0)
compressor = LLMChainExtractor.from_llm(llm)
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor, base_retriever=retriever
)
# 获取压缩后的文档
compressed_docs = compression_retriever.invoke(
"What did the president say about Ketanji Jackson Brown"
)
pretty_print_docs(compressed_docs)
使用内嵌过滤器提高效率
嵌入过滤器可以通过计算文档与查询之间的相似性来提高效率,减少不必要的LLM调用。
from langchain.retrievers.document_compressors import EmbeddingsFilter
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
embeddings_filter = EmbeddingsFilter(embeddings=embeddings, similarity_threshold=0.76)
compression_retriever = ContextualCompressionRetriever(
base_compressor=embeddings_filter, base_retriever=retriever
)
compressed_docs = compression_retriever.invoke(
"What did the president say about Ketanji Jackson Brown"
)
pretty_print_docs(compressed_docs)
应用场景分析
上下文压缩技术适用于需要处理大量文档并确保查询结果高度相关的场景,如法律文件检索、医疗记录分析等。这种方法既能提高检索效率,又能降低计算成本。
实践建议
在实际应用中,建议结合需求选择合适的文档压缩策略,如过滤器或重新排名机制。利用上下文压缩不仅能提升检索质量,还能有效节约资源。
如果遇到问题欢迎在评论区交流。
—END—