背景介绍
Elasticsearch 从8.8版本开始,新增 RRF,支持对多种不同方式召回的多个结果集进行综合再排序,返回最终的排序结果。之前Elasticsearch已经分别支持基于BM25的相关性排序和向量相似度的召回排序,通过RRF可以对这两者的结果进行综合排序,可以提升排序的准确性。本文通过一个具体例子来介绍这个过程。
前置条件
需要准备一个8.8+版本Elasticsearch集群,阿里云Elasticsearch已经上线售卖8.9.1的集群可以购买
选择版本8.9
选择节点配置
随后选择网络配置,点击购买即可。
RRF试验
RRF介绍
算法公式:
k是一个常数值,默认是60,R包含每个查询结果的doc排序集合。r(d)表示doc d在某个查询条件中排序号,排序次序从1开始。
如下是一个排序的示例:
数据和模型准备
按照ESRE 系列(一)文章中介绍的方法,通过 Eland 导入 text_embedding 的模型和启动模型部署,通过 kibana 上传初始数据,配置 text-embeddings pipeline,通过索引重建,生成带向量的索引数据。
查询效果评估
同样,我们从 TREC 2019 Deep Learning Track 对“段落排名任务”的查询中选取了1个查询,分别使用文本查询,向量召回,和RRF混排,获得前 10 个结果并参考 TREC 判断。
我们以"hydrogen is a liquid below what temperature" 这个查询条件为例,分别构造三个查询
// RRF混排查询GETcollection-with-embeddings/_search{ "size": 10, "query": { "query_string": { "query": "hydrogen is a liquid below what temperature" } }, "knn": [ { "field": "text_embedding.predicted_value", "k": 10, "num_candidates": 100, "query_vector_builder": { "text_embedding": { "model_id": "sentence-transformers__msmarco-minilm-l-12-v3", "model_text": "hydrogen is a liquid below what temperature" } } } ], "_source": [ "id" ], "rank": { "rrf": { "window_size": 10, "rank_constant": 1 } } } //向量查询GETcollection-with-embeddings/_search{ "size": 10, "knn": [ { "field": "text_embedding.predicted_value", "k": 10, "num_candidates": 100, "query_vector_builder": { "text_embedding": { "model_id": "sentence-transformers__msmarco-minilm-l-12-v3", "model_text": "hydrogen is a liquid below what temperature" } } } ], "_source": [ "id" ] } //文本查询GETcollection-with-embeddings/_search{ "size": 10, "query": { "query_string": { "query": "how are some sharks warm blooded" } }, "_source": [ "id" ] }
对于查询"hydrogen is a liquid below what temperature",三种查询方式返回结果和准确性如下。准确性分为四个等级:不相关 (0)、相关(段落切题但没有回答问题)(1)、高度相关 (2) 和完全相关 (3)。准确性分数越高越相关
RRF混排 |
向量召回 |
文本查询 |
|||
段落ID |
准确性 |
段落ID |
准确性 |
段落ID |
准确性 |
8588222 |
0 |
8588222 |
0 |
7911557 |
3 |
8588219 |
3 |
8588219 |
3 |
8588219 |
3 |
7911557 |
3 |
6080460 |
3 |
8588222 |
0 |
128984 |
3 |
128984 |
3 |
2697752 |
2 |
6080460 |
3 |
4254815 |
1 |
128984 |
3 |
2697752 |
2 |
6343521 |
1 |
1721142 |
0 |
4254815 |
1 |
1020793 |
0 |
8588227 |
0 |
1721142 |
0 |
4254811 |
3 |
302210 |
1 |
6343521 |
1 |
1959030 |
0 |
2697746 |
2 |
8588227 |
0 |
4254813 |
1 |
7350325 |
0 |
可以看出RRF的排序结果,在向量查询结果的基础上,结合了文本查询的结果,将没有在向量召回出现的结果"7911557" 排到了前面,提高了召回的准确性。
与此同时,RRF的排序结果,也将没有在文本查询中出现的结果"6080460" 排到了前面,提高了召回的准确性。
Elasticsearch技术社区2群