检索与重排
在语义搜索中,我们展示了如何使用 SparseEncoder (稀疏编码器) 为查询、句子和段落计算嵌入,以及如何将其用于语义搜索。对于复杂的搜索任务,例如问答检索,使用检索与重排 (Retrieve & Re-Rank) 可以显著改善搜索效果。请注意,关于使用双编码器 (Bi-Encoder) 生成的密集嵌入的详细说明,请见此处。
概述
检索与重排方法包括两个阶段:
检索阶段:使用快速但精度较低的方法(稀疏编码器/双编码器)来检索一个较大的潜在相关文档集合。
重排阶段:使用更复杂但速度较慢的模型(交叉编码器)对检索到的文档进行重排,以获得更高的精度。
这种方法结合了第一阶段检索的效率和第二阶段重排的准确性。
交互式演示:简单维基百科搜索
文件:retrieve_rerank_simple_wikipedia.ipynb [ Colab 版本 ]
这个 Jupyter notebook 提供了一个基于简单英语维基百科作为语料库的“检索与重排”交互式演示。该示例允许您:
输入查询或问题
比较不同的检索方法
BM25(词法/关键词搜索)
以及使用交叉编码器 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 对稀疏和密集结果进行重排
使用倒数排名融合(Reciprocal Rank Fusion)进行混合搜索 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)
关于预训练的稀疏编码器模型,请参阅:预训练稀疏编码器。
交叉编码器(重排器)
关于预训练的交叉编码器模型,请参阅:MS MARCO 交叉编码器