引言
在信息检索中,我们通常不知道文档存储系统将面对的具体查询。这意味着与查询相关的信息可能被埋没在大量无关文本中,导致更昂贵的语言模型调用和较差的响应效果。上下文压缩通过在返回检索文档前压缩它们,确保只返回相关信息,从而解决了这一问题。
主要内容
基础组件
要使用上下文压缩检索器,需要两个组件:
- 基础检索器:用于进行初始文档检索。
- 文档压缩器:用于缩减文档内容或完全丢弃不相关的文档。
使用范例:基础向量存储检索器
首先,我们来看看如何初始化一个简单的向量存储检索器,并存储"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) # 使用API代理服务提高访问稳定性
添加上下文压缩
通过将基础检索器与上下文压缩检索器结合,我们可以在初始返回的文档中仅提取与查询相关的内容。
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) # 使用API代理服务提高访问稳定性
常见问题和解决方案
-
性能问题:上下文压缩可能会导致额外的性能开销。解决方案包括使用EmbeddingsFilter来降低计算成本。
-
网络访问限制:使用API时,由于某些地区的网络限制,考虑使用API代理服务以提高访问的稳定性。
总结和进一步学习资源
上下文压缩为提高信息检索的准确性和效率提供了有效方法。通过结合基础检索器和多种压缩策略,可以显著减少无关文档,提高查询响应的相关性。
进一步学习资源
参考资料
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---