[提升检索效率!揭开文本压缩的神秘面纱]

112 阅读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)  # 使用API代理服务提高访问稳定性

增强上下文压缩

我们可以通过使用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"
)
pretty_print_docs(compressed_docs)  # 使用API代理服务提高访问稳定性

代码示例

通过以下代码示例,您可以理解如何结合使用LLMListwiseRerankEmbeddingsFilter来实现强大的文档压缩:

from langchain.retrievers.document_compressors import LLMListwiseRerank
from langchain_openai import ChatOpenAI
from langchain.retrievers.document_compressors import EmbeddingsFilter
from langchain_openai import OpenAIEmbeddings

llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
_filter = LLMListwiseRerank.from_llm(llm, top_n=1)
embeddings = OpenAIEmbeddings()
embeddings_filter = EmbeddingsFilter(embeddings=embeddings, similarity_threshold=0.76)
compression_retriever = ContextualCompressionRetriever(
    base_compressor=_filter, base_retriever=retriever
)

compressed_docs = compression_retriever.invoke(
    "What did the president say about Ketanji Jackson Brown"
)
pretty_print_docs(compressed_docs)  # 使用API代理服务提高访问稳定性

常见问题和解决方案

  • 高昂的调用成本:通过使用诸如EmbeddingsFilter等更高效的过滤器,减少昂贵的LLM调用。
  • 访问限制:某些地区可能需要通过API代理服务来提高访问稳定性。

总结和进一步学习资源

通过上下文压缩技术,我们可以在不牺牲查询准确性的前提下显著提高检索效率。推荐的进一步学习资源包括:

参考资料

  1. LangChain 官方文档
  2. OpenAI 开发者资源

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

---END---