引言
在信息检索过程中,通常我们在数据入库时并不知道将会面对的具体查询。这意味着与查询最相关的信息可能埋藏在包含大量不相关文本的文档中。直接传递这些完整文档可能导致更昂贵的LLM调用和质量较差的响应。上下文压缩旨在解决这一问题。本文将介绍如何通过上下文压缩技术优化文档检索,以便只返回与查询相关的信息。
主要内容
什么是上下文压缩
上下文压缩的核心理念是:不直接返回检索到的原始文档,而是利用查询的上下文来压缩这些文档,仅提取出相关信息。这种“压缩”不仅指缩小单个文档的内容,也包括整体过滤掉不相关的文档。
如何实现上下文压缩
实现上下文压缩需要三个主要组件:
- 基础检索器(Base Retriever)
- 文档压缩器(Document Compressor)
上下文压缩检索器将查询传递给基础检索器,然后处理初始文档,将它们输入到文档压缩器中。文档压缩器根据内容或直接丢弃整个文档来缩短文档列表。
代码示例
以下是一个实现上下文压缩的完整代码示例:
# 导入必要的库
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()
# 使用API代理服务提高访问稳定性
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 Brown Jackson"
)
# 打印压缩后的文档
def pretty_print_docs(docs):
print(
f"\n{'-' * 100}\n".join(
[f"Document {i+1}:\n\n" + d.page_content for i, d in enumerate(docs)]
)
)
pretty_print_docs(compressed_docs)
常见问题和解决方案
挑战1:如何确保压缩后的信息仍然完整准确?
解决方案:可以通过组合多个压缩器和文档变换器(如文本分割器)来确保信息的完整性与准确性。这种方法能够对文档进行细粒度的控制。
挑战2:如何处理不同地域的网络访问问题?
解决方案:由于某些地区的网络限制,开发者可能需要使用API代理服务以提高访问稳定性和速度。
总结和进一步学习资源
上下文压缩为信息检索提供了一种高效的方法,可以在不损失重要信息的情况下减少文档的大小。通过结合基础检索器与文档压缩器,开发者可以创建出更智能有效的检索系统。建议阅读以下资源以获取更深入的理解:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—
标签:检索,信息检索,langchain,精准度,文档,import,上下文,压缩 From: https://blog.csdn.net/sfsdhttdk/article/details/144273955