用FlashRank提升搜索结果的精准度与速度

81 阅读3分钟

引言

在现代的信息检索系统中,重新排序(re-ranking)已成为提高搜索结果相关性的关键步骤。FlashRank是一款轻量级且快速的Python库,专为现有的搜索和检索管道添加重新排序功能而设计。本文将介绍如何使用FlashRank进行文档压缩和检索,帮助开发者提升搜索结果的准确性。

主要内容

FlashRank简介

FlashRank基于最先进的交叉编码器模型,能够快速有效地为搜索结果重新排序。它特别适用于需要高效处理大规模文档集合的应用场景。

环境安装

首先,确保安装FlashRank及其依赖库FAISS:

%pip install --upgrade --quiet flashrank
%pip install --upgrade --quiet faiss_cpu

设置向量存储检索器

我们将通过一个简单的向量存储检索器,使用OpenAI的嵌入技术,初始化数据并进行基本检索。

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

# 设置OpenAI API密钥
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)

# 为每个文本创建嵌入
embedding = OpenAIEmbeddings(model="text-embedding-ada-002")

# 初始化检索器,设置搜索返回的文档数量k=20
retriever = FAISS.from_documents(texts, embedding).as_retriever(search_kwargs={"k": 20})

使用FlashRank重排序

我们在基础检索器的基础上,使用FlashRank进行文档重排序来提高搜索结果的精确性。

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

# 设置LLM和压缩检索器
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")

结果对比

通过FlashRank的重排序功能,检索到的文档顺序会有明显不同,确保相关性更高。

print([doc.metadata["id"] for doc in compressed_docs])

代码示例

以下是完整的代码示例,用于演示文档加载、切分、嵌入生成以及重排序过程。

# 使用API代理服务提高访问稳定性
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})
query = "What did the president say about Ketanji Brown Jackson"
docs = retriever.invoke(query)

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

常见问题和解决方案

1. 如何提高API请求的稳定性?

由于网络限制,开发者可以考虑使用API代理服务来提高访问稳定性。这可以显著减少由于网络问题导致的请求失败。

2. 为什么需要文档重排序?

基础检索器可能返回大量不相关或冗余的结果。通过重排序,可以根据内容相关性优先展示最相关的结果,改善用户体验。

总结和进一步学习资源

FlashRank提供了一种高效的方式来改进检索系统的性能。通过结合向量检索和重排序技术,我们可以显著提高搜索结果的准确性和用户满意度。

参考资料

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