检索与重排

语义搜索中,我们展示了如何使用 SparseEncoder 计算查询、句子和段落的嵌入,以及如何将其用于语义搜索。对于复杂的搜索任务,例如问答检索,通过使用 检索与重排序 可以显著改进搜索。请注意,关于由 Bi-Encoder 生成的稠密嵌入的详细解释可在此处找到。

概述

检索与重排序方法包含两个阶段

  1. 检索阶段:使用快速但准确性较低的方法(SparseEncoder/bi-encoders)检索一组较大的潜在相关文档

  2. 重排序阶段:使用更复杂但较慢的模型(cross-encoders)对检索到的文档进行重排序,以提高精度

这种方法结合了第一阶段检索的效率和第二阶段重排序的准确性。

综合评估:混合搜索管道

文件hybrid_search.py

此脚本提供了一个完整的评估管道,用于比较给定数据集(在此示例中为NanoNFCorpus)上的不同检索和重排序方法。它包括

  1. 使用 ibm-granite/granite-embedding-30m-sparse 进行稀疏检索

  2. 使用 multi-qa-MiniLM-L6-cos-v1 进行稠密检索

  3. 使用 cross-encoder/ms-marco-MiniLM-L6-v2 重排序稀疏和稠密结果

  4. 使用倒数排名融合进行混合搜索 ReciprocalRankFusionEvaluator

  5. 将交叉编码器应用于融合结果的混合重排序

输出:该脚本生成综合指标并将结果保存在 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 交叉编码器