引言
在信息检索中,我们经常面临的一个挑战是,在数据被存储进系统时,我们无法预知具体的查询内容。这意味着与查询最相关的信息可能被埋藏在大量无关文本中,导致应用程序在处理整个文档时调用大型语言模型(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()
# 使用API代理服务提高访问稳定性
docs = retriever.invoke("What did the president say about Ketanji Brown Jackson")
增加上下文压缩
通过使用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"
)
使用嵌入过滤器
EmbeddingsFilter通过嵌入文档和查询,仅返回与查询有足够相似度的文档,提供了一种快速且成本较低的选择。
from langchain.retrievers.document_compressors import EmbeddingsFilter
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
embeddings_filter = EmbeddingsFilter(embeddings=embeddings, similarity_threshold=0.76)
compression_retriever = ContextualCompressionRetriever(
base_compressor=embeddings_filter, base_retriever=retriever
)
compressed_docs = compression_retriever.invoke(
"What did the president say about Ketanji Jackson Brown"
)
代码示例
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)
常见问题和解决方案
- 成本问题: LLM调用成本较高。解决方案是使用
EmbeddingsFilter减少不必要的LLM调用。 - 准确性问题: 初始检索结果不准确可能导致上下文压缩效果不佳。可以通过提高嵌入的质量或调整相似度阈值来优化。
总结和进一步学习资源
上下文压缩技术为信息检索提供了一种高效的优化方法。通过对文档进行上下文压缩,可以大幅提升智能应用的响应质量,同时降低了调用大型语言模型的成本。此外,开发者在使用国际API时,可能需要考虑使用API代理服务以提高访问稳定性。
进一步学习资源
参考资料
- LangChain API 文档
- OpenAI API 文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---