检索与重排序
在语义搜索中,我们展示了如何使用 SparseEncoder 来计算查询、句子和段落的嵌入,以及如何将其用于语义搜索。对于复杂的搜索任务,例如问答检索,通过使用检索与重排序可以显著改善搜索结果。请注意,使用 Bi-Encoder 生成的密集嵌入的详细解释可在此处查看。
概述
检索与重排序方法包含两个阶段
检索阶段:使用快速但精度较低的方法(SparseEncoder/bi-encoders)来检索更大集合的潜在相关文档
重排序阶段:使用更复杂但较慢的模型(cross-encoders)对检索到的文档进行重排序,以提高精度
这种方法结合了第一阶段检索的效率和第二阶段重排序的准确性。
交互式演示:简单维基百科搜索
文件:retrieve_rerank_simple_wikipedia.ipynb [ Colab 版本 ]
这个 Jupyter Notebook 提供了一个在简单英语维基百科语料库上进行检索与重排序的交互式演示。该示例允许您
输入查询或问题
比较不同的检索方法
BM25(词法/关键词搜索)
并使用 CrossEncoder cross-encoder/ms-marco-MiniLM-L6-v2 对结果进行重排序
综合评估:混合搜索管道
此脚本提供了一个完整的评估管道,用于比较给定数据集(在此示例中为NanoNFCorpus)上的不同检索和重排序方法。它包括
使用multi-qa-MiniLM-L6-cos-v1进行密集检索
使用cross-encoder/ms-marco-MiniLM-L6-v2对稀疏和密集结果进行重排序
使用倒数排名融合进行混合搜索ReciprocalRankFusionEvaluator
混合重排序将 cross-encoder 应用于融合结果
输出:脚本生成全面的指标,并将结果保存在runs/
目录中。
评估结果
在NanoNFCorpus上运行混合搜索评估的示例结果
================================================================================
EVALUATION SUMMARY
================================================================================
METHOD NDCG@10 MRR@10 MAP
--------------------------------------------------------------------------------
Sparse Retrieval 32.10 47.27 28.29
Dense Retrieval 27.35 41.59 22.79
Sparse + Reranking 37.35 57.19 32.12
Dense + Reranking 37.56 58.27 31.93
Hybrid RRF 32.62 49.63 22.51
Hybrid RRF + Reranking 36.16 55.77 26.99
================================================================================
主要观察:
重排序持续改善所有检索方法的性能
稀疏检索似乎已经给出了强大的初始结果
稀疏和密集重排序都实现了相似的高性能
混合方法提供平衡的结果
预训练模型
稀疏编码器(检索)
SparseEncoder 独立地为您的段落和搜索查询生成嵌入。您可以像这样使用它:
from sentence_transformers import SparseEncoder
model = SparseEncoder("naver/splade-cocondenser-ensembledistil")
docs = [
"My first paragraph. That contains information",
"Python is a programming language.",
]
document_embeddings = model.encode_document(docs)
query = "What is Python?"
query_embedding = model.encode_query(query)
有关预训练的稀疏编码器模型,请参阅:预训练稀疏编码器。
Cross-Encoders(重排序器)
有关预训练的 Cross Encoder 模型,请参阅:MS MARCO Cross-Encoders