引言
在现代的信息检索系统中,重新排序(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---