es向量搜索插件-knn

es向量搜索插件-knn,第1张

1. knn向量检索插件

使用过下面两个插件

https://github.com/opendistro-for-elasticsearch/k-NN

优点: 相对elastiknn,该插件支持把底层生成hnsw一个结构加载进内存,376w数据,768纬基族度向量,搜索性能在300-400ms左右

缺点:搏并弊 

1.该蔽兄插件需要基于nmslib生成一个c的so文件,该文件比较依赖底层 *** 作系统的库,建立项目最好使用docker容器的方式,不然把本地打的so文件,放到其他环境会出现各种bug,比如: [libKNNIndexV1_7_3_6.so_0x6b1da]  _GLOBAL_sub_I_distcomp_sparse_scalar_fast.cc+0x2a

2. 该插件对应于es7.7.1的版本存在各种bug,比如打重复分数、使用cosine距离,但是实际算出来是l2距离,因此建议使用最新的版本,目前最新该插件对应的es版本是7.10.2

2. https://github.com/alexklibisz/elastiknn

优点: 这个是完全对接了es和luence语法的,应该java原生应用,这个不需要安装so库,官网直接就有插件,使用起来比较简单

缺点: 性能相对于上面插件有差距,看官网的QPS在400多左右

向量检索将加速深度学习的落地与应用,向量检索的应用场景如下图所示,它几乎覆盖了大部分的可以应用AI的业务场景

这里的KNN其实是ANN,与传统的KNN算法相比ANN在性能和召回准确性方面做了平衡,传统的KNN检索性嫌隐能损耗是暴力线性增长的,仅能处理百万内的数据量。

首先 ,在创建索引时需要选择dense_vector类型并指定index为true,并定义索引时文档间相似度量算法,此时es在索引文档时会为knn搜索生成新的索引文件,新的索引文件采用的是树加链表的存储结构,并根据similarity指定的相似算法计算文档间距离,特征相近的数据会存储在临近的分支里

文档索引后就可以通过knn_search语法进行topK近邻检索了。这里需要注意的时返回的K个数据为近似最优解 ,并不是真实的最近邻数据。

其中num_candidates是检索分片时获得的候选集数量宏者和。

下个版本_knn将支持filter

目前knn查询还处于试验阶段不能和DSL语法混合使用,官方正在努力解决,预估在8.2之后版本会逐步增加布尔查询及filter *** 作,蔽盯不过采用的是多路归并的方式,即分别检索标签和向量再进行结果合并,虽可以解决部分问题,但多数情况下结果不甚理想。主要原因在于,向量检索无范围性,其目标是尽可能保证 TOPK 的准确性,TOPK 很大时,准确性容易下降,造成归并结果的不准确甚至为空的情况。

当结果低于K个时会触发精准最近邻检索,也就是前面说的KNN

写在最后

随着 AI 技术的广泛应用以及数据规模的不断增长,向量检索作为深度学习中的主流方法,其具备的泛检索和多模态搜索的能力也将进一步得到发挥。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12304263.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存