简化 KNN 检索【翻译】Simplifying kNN search

简化 KNN 检索

#转载 #大数据/ES #翻译

这篇文章是关于如何简化 k 最近邻(k-Nearest Neighbors,简称 kNN)搜索的深入探讨。以下是对全文的翻译(借助 kimi AI):


在这篇博客文章中,我们将深入探讨我们为使 kNN 搜索的入门体验更加轻松所做的努力!

向量搜索

向量搜索在 Elasticsearch 中已经可用了一段时间,通过使用新的专用 knn 搜索类型,同时我们也在 8.12.0 版本中将 kNN 作为查询引入(有关这个惊人的博客文章,我们最近发表了更多内容!)。

尽管每种方法的执行流程和应用有一些差异,但进行基本 kNN 检索的语法非常相似。因此,一个典型的 knn 搜索请求看起来像这样:

GET products/_search
{
   "knn": {
      "field": "my_vector",
      "query_vector": [1, 2, 3],
      "k": 5,
      "num_candidates": 10
   }
}

前几个参数非常直观:我们指定数据存储的位置(field)和我们想要比较的内容(query_vector)。

另一方面,knum_candidates 参数则有点晦涩,需要一些理解才能进行微调。它们特定于我们使用的算法和数据结构,即 HNSW(层次导航小世界),主要存在是为了控制我们想要执行的图形探索量。

Elasticsearch 文档是搜索相关所有事物的绝佳资源,所以查看 knn 部分,我们有:

k:作为顶级命中返回的最近邻居的数量。这个值必须小于 num_candidates

num_candidates → 在每个分片上考虑的最近邻居候选数。需要大于 k,或者如果省略了 k,则不能超过 size,并且不能超过 10,000。Elasticsearch 从每个分片收集 num_candidates 结果,然后将它们合并以找到前 k 个结果。增加 num_candidates 往往会提高最终 k 结果的准确性。

然而,当您第一次遇到类似这样的情况时,这些值应该是多少并不明显,正确配置它们可能是一个挑战。这些值越大,我们将探索的向量就越多,但这将带来性能成本。我们再次面临准确性与性能之间的永恒权衡。

为了使 kNN 搜索更加简单和直观,我们决定使这些参数成为可选的,这样您只需要提供您想要搜索的位置和内容,如果确实需要,您可以调整它们。虽然看似一个相当小的变化,但它使事情变得更加清晰!因此,上述查询现在可以简单地重写为:

GET products/_search
{
   "knn": {
      "field": "my_vector",
      "query_vector": [1, 2, 3]
   }
}

使 knum_candidates 成为可选的

所以我们希望使 knum_candidates 成为可选的。太好了!我们应该如何设置默认值呢?

有两种选择。选择一个看起来像是个好选项的,发布它,然后希望最好的结果,或者做艰苦的工作并进行广泛的评估,让数据驱动我们的决策。在 Elastic,我们喜欢这样的挑战,并希望确保任何决策都是有理由的,并且是出于好的原因!

正如我们上面提到的,kNN 搜索的 k 是每个分片返回的结果数量,所以一个明显的默认值就是使用 size。因此,每个分片将返回 size 个结果,我们将合并并排序它们以找到全局前 size 个结果。这也与没有 k 参数的 kNN 查询很好地配合,而是根据请求的 size 操作(记住,knn 查询的行为就像任何其他查询,如 termprefix 等)。所以,size 似乎是一个合理的默认值,可以涵盖大多数用例(或者至少在入门体验中足够好!)。

另一方面,num_candidates 则有些不同。此参数特定于 HNSW 算法,并控制我们要考虑的最近邻居队列的大小(对于好奇的人:这相当于原始论文中的 ef 参数)。

我们可以考虑采取多种方法:

  • 我们可以考虑到每个图的大小,并设计一个函数来计算 N 个索引向量的适当 num_candidates
  • 我们可以查看底层数据分布,并尝试估计所需的探索(也许还考虑 HNSW 的入口点)
  • 我们可以假设 num_candidates 与索引数据没有直接关系,而是与搜索请求有关,并确保我们进行所需的探索以提供足够好的结果。

作为开始,并保持事情简单,我们研究了将 num_candidates 值相对于 k(或 size)进行设置。因此,您实际想要检索的结果越多,我们在每个图上执行的探索就越多,以确保我们从局部最小值中逃脱。我们将重点关注的候选选项如下:

  • num_candidates = k
  • num_candidates = 1.5 * k
  • num_candidates = 2 * k
  • num_candidates = 3 * k
  • num_candidates = 4 * k
  • num_candidates = Math.max(100, k)

值得注意的是,最初考虑了更多的替代方案,但更高的值几乎没有带来好处,因此在博客的其余部分,我们将主要关注上述内容。

有了一组 num_candidates 候选项(没有双关语!),我们现在专注于 k 参数。我们选择同时考虑标准搜索和非常大的 k 值(以查看我们执行的探索的实际影响)。因此,我们决定更关注以下值:

  • k = 10(用于没有指定 size 的请求)
  • k = 20
  • k = 50
  • k = 100
  • k = 500
  • k = 1000

数据

由于没有一种解决方案适用于所有情况,我们希望测试具有不同属性的不同数据集。因此,不同的总向量数量、维度,以及由不同模型生成,因此具有不同的数据分布。

同时,我们有 rally,这是一个用于基准测试 Elasticsearch 的很棒的工具(https://github.com/elastic/rally),它支持运行一堆查询并提取多个向量数据集的指标。在 Elastic,我们广泛使用 rally,并依赖它进行我们所有的夜间基准测试,您可以在这里查看!

在 rally 上运行基准测试就像运行以下命令一样简单:

pip3 install esrally && esrally race --track=dense-vector

为此,我们略微修改了赛道(即 rally 的测试场景),以包含额外的指标配置,添加了一些新的,最终得到了以下赛道集:

  • dense-vector(200 万文档,96 维):https://github.com/elastic/rally-tracks/tree/master/dense_vector
  • so-vector(200 万文档,768 维):https://github.com/elastic/rally-tracks/tree/master/so_vector
  • cohere-vector(300 万文档,768 维):https://github.com/elastic/rally-tracks/tree/master/cohere_vector
  • openai-vector(250 万文档,1536 维):https://github.com/elastic/rally-tracks/tree/master/openai_vector
  • Glove 200d(120 万,200 维)基于https://github.com/erikbern/ann-benchmarks repo 创建的新赛道

同样值得注意的是,对于前几个数据集,我们还想考虑有一个与多个段的情况,因此我们包含了每种的两个变体,

  • 一个我们执行 force_merge 并拥有单个段,
  • 一个我们依赖底层的 MergeScheduler 来做它的魔法,最终得到它认为合适的段数。

指标

对于上述每个赛道,我们计算了标准的召回率和精确度指标、延迟,以及通过报告我们访问的节点来实际探索的图形。前几个指标是针对真正的最近邻居评估的,因为在我们的场景中,这是黄金标准数据集(记住,我们正在评估近似搜索的质量,而不是向量本身的质量)。nodes_visited 属性最近已添加到 knn 的配置文件输出中(https://github.com/elastic/elasticsearch/pull/102032),因此,通过对赛道定义进行一些微小的更改以提取所有所需的指标,我们应该可以开始了!

开始实际工作

现在我们知道了我们想要测试的内容、要使用的数据集以及如何评估结果,是时候实际运行基准测试了!

为了有一个标准化的环境,对于每个测试,我们使用了一个干净的 n2-standard-8(8 vCPU,4核,32 GB内存) 云节点。Elasticsearch 配置以及所需的映射和所有其他内容都通过 rally 配置和部署,因此对于所有类似测试都是一致的。

上述每个数据集都执行了多次,收集了所有候选集定义的所有可用指标,确保结果不是一次性的。

结果

每个指定数据集和参数组合的召回率-延迟图可以在下面找到(越高越向左越好,延迟以毫秒为单位测量):

针对dense_vectoropenai_vector赛道的绝对延迟@50 th 百分位值和召回率值如下:

类似地,每个场景下 HNSW 图形节点访问的 99 th 百分位数可以在下面找到(越小越好):

少即是多*

*嗯,在所有情况下都不是这样,但嘿 😃

从结果来看,有两点比较突出:

一个分段与多个分段明显成反比地影响召回率和延迟指标。分段越少,延迟就越短(因为我们需要遍历的图更少,也就是需要运行的搜索更少),这固然很好,但它也会以相反的方式影响召回率,因为很有可能一些好的候选者会被遗漏(因为候选者列表数量更少)。
即使探索很少,我们也能在几乎所有情况下获得足够好的召回率,这非常好!
我们一直在努力改进多分段搜索(本文章中就有一个很好的例子),因此我们希望在今后的工作中,这种取舍将不再是一个问题(此处报告的数据不包括这些改进)。

考虑到所有因素,我们讨论的两个主要选项如下:

Num_candidates = 1.5 * k - 这在几乎所有情况下都能达到足够好的召回率,同时获得非常好的延迟分数。
Num_candidates = Math.Max (100, k)–这种方法的召回率稍高,尤其是在 k 值较低的情况下,但代价是增加了图形探索和延迟。
经过仔细考虑和(漫长的!)讨论,我们选择了前者作为默认设置,即设置 num_candidates = 1.5 * k。在我们测试的几乎所有情况下,我们需要做的探索工作要少得多,召回率也都超过了 90%(有些报告的数字还明显更高),这应该能带来足够好的上机体验。

结论

Elastic 处理 kNN 搜索的方式一直在不断发展,我们也在不断引入新功能并进行改进,因此这些参数和整体评估很可能很快就会过时!我们一直在关注这一变化,无论何时发生,我们都会确保跟进并适当调整我们的配置!

需要记住的重要一点是,这些值只是简化上架体验和非常通用的使用案例的合理默认值。人们可以在自己的数据集上轻松地进行实验,并根据自己的需求进行相应的调整(例如,在某些情况下,召回可能比延迟更重要)。

调优愉快 😃

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/611002.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第36期DAY18

DAY18 二叉树的层序遍历 102二叉树的层序遍历 “队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。” 二叉树层序遍历模版: /** * Definition for a binary tree node. * struct TreeNode { *…

PostgreSQL的学习心得和知识总结(一百四十二)|深入理解PostgreSQL数据库数据库之 Continuous Integration

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…

办公技巧之合集文档 拆分_word

问题 如何将文档合集拆分为单独文档。 操作步骤 软件 word 365 原理简述: 在 word 大纲视图下,通过一级标题确定子文档范围,然后导出即可。 文档结构 从下图可见,文档结构为已建立大纲级别的文档,如果没有建立&a…

每日一题——力扣27. 移除元素(举一反三)

题目链接:https://leetcode.cn/problems/remove-element/description/ 菜鸡写法: // 函数定义,移除数组nums中所有值为val的元素,并返回新的数组长度 int removeElement(int* nums, int numsSize, int val) {// 如果数组长度为…

Steam游戏搬砖,不说破万,月入5K没问题

steam游戏搬砖项目的玩法就是打汇率差,在steam平台购买道具,挂在网易buff上出售,通过汇率差盈利。一天交易几百美金的道具,大概能搞到200块左右的利润,而且平台是支持这样交易的,还很稳定。目前最主流的游戏…

设计模式1——初步认识篇

设计模式1——初步认识篇 一、先让我们浅聊一下面向对象和设计模式。 说起设计模式,我第一次听到它,是在学习面向对象的时候。那么什么是面向对象,什么是设计模式,而且设计模式和面向对象又有什么关系呢? 1、什么是面…

im8mm 网络卡死 Rx packets:1037578 errors:66 dropped:0 overruns:66 frame:0

1:网络接收数据包异常 2:问题复现 问题在进行网络数据包同吞吐量测试的时候出现的。同时发现,在使用iperf2测试时,是不会出现网络中断卡死的情况,使用 iperf3时才会出现此问题 指令(下面的指令运行在PC2上面&#xff…

十二种网络威胁防护方案

一、SQL注入 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任…

kali linux更新卡在libc6:amd64 (2.37-15)

适配于linux的windows子系统,wsl2,安装kali linux,运行 sudo apt update 卡在:Setting up libc6:amd64 (2.37-15) … 关机重启、重新修复执行也不行 解决办法:kill当前apt进程或者关机重启kali-linux,然后执行: ssudo mv /usr/sbin/telinit /usr/sbin/telinit.baksu…

安装docker镜像nginx1.26.0版本,与删除docker容器【灵异事件】

为了http3 的这个模块,所以需要升级nginx的版本,需要nginx1.26.0才有 –with-http_v3_module 这个模块 为什么记录一下?因为觉得奇怪 1:删除nginx镜像,显示镜像还被某个容器在使用 luichunluichun:~$ docker rmi ng…

数电——集成计数器

分析 (1)74161 4位同步(cp相同)二进制,模16(2的4次方) 逻辑符号 端口 D0,D1,D2,D3为输入信号 Q0,Q1,Q2,Q3为输出信号 RCO输出进位标志:记满16个数后,输出1 P,T 控…

番外篇 | 利用PyQt5+YOLOv5来搭建目标检测系统(附可视化界面+功能介绍+源代码)

前言:Hello大家好,我是小哥谈。PyQt5是一个Python绑定的Qt库,是用于创建图形用户界面(GUI)和其他应用程序组件的工具包。PyQt5提供了许多GUI元素,如按钮、文本框、标签等,也提供了许多Qt的功能,如网络、数据库、XML等。通过PyQt5可以在Python中使用Qt的丰富功能和强大的工…

远程桌面连接不上怎么连服务器,原因是什么?如何解决?

远程桌面连接不上怎么连服务器,原因是什么?如何解决? 面对远程桌面连接不上的困境,我们有办法! 当你尝试通过远程桌面连接服务器,但遭遇连接失败的挫折时,不要慌张。这种情况可能由多种原因引起…

Python运维之协程

目录 一、定义协程 二、并发 三、异步请求 协程是一种轻量级的线程,它通过保存和恢复寄存器上下文和栈来实现调度切换,从而保留函数执行的状态。 这种机制使得协程在处理I/O密集型任务时效率较高,因为它们可以在I/O操作期间让出CPU&#…

【触摸案例-手势解锁案例-错误的样式 Objective-C语言】

一、然后呢,我们再来说一下这个错误的样式 1.首先,在我们的示例程序里边,我现在来连一条线,一撒手的时候, 它先出来一个,红色的按钮的样式,那么这个时候呢,实际上,是在设置另外一种状态,给按钮的另外一种状态,再去设置另外一张红色的图片,然后呢,再去切换成那一种…

C++青少年简明教程:C++中的常量、变量、表达式和语句

C青少年简明教程:C中的常量、变量、表达式和语句 在C编程中,常量、变量、表达式和语句是基本的编程概念。 常量(Constants):在程序中具有固定值的数据称为常量。常量可以是字面值,如整数、浮点数、字符或…

信息系统项目管理基础

目录 一、项目管理概论 1、定义 2、项目管理的十二原则 3、SMART原则 4、项目经理 5、项目的生命周期 二、项目立项管理 1、项目启动过程 三、项目整合管理 1、管理基础 2、项目整合管理过程 ①制定项目章程 ②制定项目管理计划 ③指导与管理项目工作 ④管理项目…

河南大学大礼堂火灾事故引发安防监控对智能分析技术应用的思考

一、方案背景 2024年5月2日,在修缮施工期间的河南大学河南留学欧美预备学校旧址大礼堂发生火情。现场航拍画面显示,大礼堂经过火灾,房顶已经基本坍塌,被火烧过的建筑呈焦黑状。 公开资料显示,大礼堂属河南留学欧美预…

【栈】Leetcode 比较含退格的字符串

题目讲解 844. 比较含退格的字符串 算法讲解 使用栈模拟,但遇到#字符就让栈顶元素出栈,但是在写的过程中有两点需要注意:当#出现在第一个位置,需要特殊处理一下;当栈为空的时候,还出现#字符需要特殊处理…

FFmpeg常用API与示例(二)—— 解封装与转封装

封装层 封装格式(container format)可以看作是编码流(音频流、视频流等)数据的一层外壳,将编码后的数据存储于此封装格式的文件之内。 封装又称容器,容器的称法更为形象,所谓容器,就是存放内容的器具,饮料是内容&…
最新文章