提升检索效率!揭开文本压缩的神秘面纱
引言
在信息检索领域,文档通常包含大量无关紧要的文本,这可能会导致高昂的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代理服务提高访问稳定性
代码示例
通过以下代码示例,您可以理解如何结合使用LLMListwiseRerank和EmbeddingsFilter来实现强大的文档压缩:
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代理服务来提高访问稳定性。
总结和进一步学习资源
通过上下文压缩技术,我们可以在不牺牲查询准确性的前提下显著提高检索效率。推荐的进一步学习资源包括:
参考资料
- LangChain 官方文档
- OpenAI 开发者资源
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---