检索与重排
在语义搜索中,我们展示了如何使用 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)上的不同检索和重排序方法。它包括
使用 ibm-granite/granite-embedding-30m-sparse 进行稀疏检索
使用 multi-qa-MiniLM-L6-cos-v1 进行稠密检索
使用 cross-encoder/ms-marco-MiniLM-L6-v2 重排序稀疏和稠密结果
使用倒数排名融合进行混合搜索 ReciprocalRankFusionEvaluator
将交叉编码器应用于融合结果的混合重排序
输出:该脚本生成综合指标并将结果保存在 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)
有关预训练的 Sparse Encoder 模型,请参阅:预训练的稀疏编码器。
交叉编码器(重排序器)
有关预训练的交叉编码器模型,请参阅:MS MARCO 交叉编码器