如何使用上下文压缩进行高效信息检索

82 阅读2分钟

引言

在信息检索中,我们通常不知道文档存储系统将面对的具体查询。这意味着与查询相关的信息可能被埋没在大量无关文本中,导致更昂贵的语言模型调用和较差的响应效果。上下文压缩通过在返回检索文档前压缩它们,确保只返回相关信息,从而解决了这一问题。

主要内容

基础组件

要使用上下文压缩检索器,需要两个组件:

  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()

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代理服务提高访问稳定性

常见问题和解决方案

  1. 性能问题:上下文压缩可能会导致额外的性能开销。解决方案包括使用EmbeddingsFilter来降低计算成本。

  2. 网络访问限制:使用API时,由于某些地区的网络限制,考虑使用API代理服务以提高访问的稳定性。

总结和进一步学习资源

上下文压缩为提高信息检索的准确性和效率提供了有效方法。通过结合基础检索器和多种压缩策略,可以显著减少无关文档,提高查询响应的相关性。

进一步学习资源

参考资料

  1. Langchain 文档
  2. OpenAI 文档

结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---