要将 BM25 与向量搜索一起实现,您需要将传统的基于关键词的排序与现代语义搜索技术相结合。首先独立运行这两种搜索方法,然后合并它们的结果。BM25 根据词频和文档长度计算相关性,而向量搜索使用嵌入(稠密数值表示)来查找语义上相似的内容。关键在于标准化来自两种方法的分数,并使用加权和或混合排序算法将它们组合起来。例如,您可以根据您的使用案例将 60% 的权重分配给 BM25 分数,将 40% 的权重分配给向量相似度分数。诸如 Elasticsearch(用于 BM25)和 FAISS 或 Annoy(用于向量搜索)之类的工具可以分别处理每个部分,并使用自定义代码来合并结果。
预处理和索引对于一致性至关重要。对于 BM25,将文本标记化为词项,删除停用词,并存储文档-词项频率。对于向量搜索,使用诸如 BERT 或 sentence-transformers 之类的模型生成嵌入,并将它们索引到向量数据库中。确保两个系统处理相同的文本输入——例如,如果您将文本转换为小写以用于 BM25,则在生成嵌入之前应用相同的转换。在处理查询时,通过两个管道运行它们:BM25 检索具有匹配关键词的文档,而向量搜索查找在上下文中相似的内容。为了合并结果,标准化分数(例如,最小-最大缩放),以便 BM25 的无界分数和向量相似度的余弦范围(通常为 -1 到 1)是可比的。您还可以使用倒数排名融合 (RRF),它组合排名而不依赖于原始分数。例如,如果一个文档在 BM25 中排名第一,在向量搜索中排名第三,则其组合分数可以是基于 RRF 的 1/(1+1) + 1/(3+1)
。
对于实际实现,请考虑诸如 rank_bm25
用于 BM25 和 sentence-transformers
用于嵌入之类的库。这是一个简化的工作流程
- 使用标记化的文本通过 BM25 索引文档。
- 为所有文档生成嵌入,并将它们索引到 FAISS 中。
- 对于查询,从 BM25 和向量搜索中检索 top-k 结果。
- 标准化分数(例如,使用批处理中最高的 score 将 BM25 分数缩放到 0-1)。
- 使用类似
final_score = (bm25_weight * bm25_score) + (vector_weight * vector_score)
的公式组合分数。 - 排序并返回合并的列表。
测试至关重要——根据诸如 precision@k 或用户反馈之类的指标调整权重。如果 BM25 在精确匹配方面优于向量搜索,则增加其权重。如果向量搜索能更好地处理释义查询,则优先考虑它。诸如 Elasticsearch 的 混合搜索插件 通过原生集成这两种方法来简化此过程,从而减少自定义代码。