引言
在信息检索过程中,一个典型的挑战是无法预见文档存储系统将面临的具体查询。这意味着与查询最相关的信息可能隐藏在大量无关文本的文档中,直接传递整个文档到应用程序可能导致更昂贵的LLM调用并得到较差的响应。上下文压缩旨在解决这一问题。其核心思想是在返回检索到的文档之前,使用查询的上下文对其进行压缩,以便只返回相关信息。
本文将深入探讨如何使用上下文压缩进行高效信息检索,并提供实用的代码示例,帮助您实现这一过程。
主要内容
1. 基本概念
上下文压缩涉及两个主要组件:
- 基础检索器:用于从存储中初步检索相关文档。
- 文档压缩器:负责通过减少文档内容或直接删除文档来缩短文档列表。
2. 初始化简单的向量存储检索器
我们将从初始化一个简单的向量存储检索器开始,并存储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()
这段代码段将文本分块存储,并通过简单的向量存储进行初步检索。
3. 添加上下文压缩
通过ContextualCompressionRetriever
包装我们的基础检索器,并添加LLMChainExtractor
作为压缩器。
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"
)
4. 使用各种压缩器
不同的压缩器有不同的用途和成本,这里举例说明一些替代方案如LLMChainFilter
和EmbeddingsFilter
,提供了不同的压缩策略。
代码示例
以下是一个完整的代码示例,展示如何使用不同类型的压缩器:
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"
)
常见问题和解决方案
问题:检索结果不准确
解决方案:确保您的嵌入足够精确,并调整similarity_threshold
以优化结果。
问题:LLM调用成本过高
解决方案:使用EmbeddingsFilter
等较便宜的压缩方法以减少成本。
对于API使用,由于某些地区的网络限制,开发者可能需要考虑使用API代理服务以提高访问稳定性。
总结与进一步学习资源
通过本文的介绍,我们学习了如何使用上下文压缩实现高效的信息检索,这不仅优化了查询结果的相关性,同时也降低了计算成本。您可以通过以下资源进一步学习:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!