再仔细品品Elasticsearch的向量检索

我在es一开始有向量检索,就开始关注这方面内容了。特别是在8.X之后的版本,更是如此。我也已经把它应用在亿级的生产环境中,用于多模态检索和语义检索,以及RAG相关。

也做过很多的优化:ES 8.x 向量检索性能测试 & 把向量检索性能提升100倍!_elastiknn-CSDN博客

这篇文章再带大家品一品es的向量检索。

k-nearest neighbor (kNN) search | Elasticsearch Guide [8.12] | Elastic

一、es的向量检索在很大程度上依赖页缓存

以下是引用官方文档的描述!

Compared to other types of search, approximate kNN search has specific resource requirements. In particular, all vector data must fit in the node’s page cache for it to be efficient. Please consult the approximate kNN search tuning guide for important notes on configuration and sizing. 

 也就是说,想要向量检索的性能足够好,内存是至关重要的因素。同时,也说说明它的上限的瓶颈在内存上。

 有条件的给足够的内存,去做页缓存,性能一定不会差。

 没条件,一定要把磁盘IO提升去。最好是SSD,磁盘组raid10。

二、Elasticsearch 使用HNSW算法进行近似 kNN 搜索

 HNSW 是一种基于图的算法,只有当大多数矢量数据保存在内存中时才能有效地工作。您应该确保数据节点至少有足够的 RAM 来保存向量数据和索引结构。要检查矢量数据的大小,您可以使用分析索引磁盘使用情况API。作为一个宽松的经验法则,并假设默认的 HNSW 选项,使用的字节将为num_vectors * 4 * (num_dimensions + 12).使用时byte element_type 所需的空间会更接近 num_vectors * (num_dimensions + 12)。请注意,所需的 RAM 用于文件系统缓存,它与 Java 堆分开。

数据节点还应该为其他需要 RAM 的方式留下缓冲区。

三、向量相似度算法支持

l2_norm

根据向量之间的 L 2距离(也称为欧几里得距离)计算相似度。该文档_score计算为 1 / (1 + l2_norm(query, vector)^2)

dot_product

计算两个单位向量的点积。此选项提供了执行余弦相似度的优化方法。约束和计算得分由 定义element_type

element_type是 时float,所有向量都必须是单位长度,包括文档向量和查询向量。该文档_score计算为 (1 + dot_product(query, vector)) / 2

element_type是 时byte,所有向量必须具有相同的长度,包括文档向量和查询向量,否则结果将不准确。文档的_score计算方式为 0.5 + (dot_product(query, vector) / (32768 * dims)) 其中dims是每个向量的维度数。

cosine

计算余弦相似度。请注意,执行余弦相似度的最有效方法是将所有向量归一化为单位长度,然后使用 dot_product。仅cosine当需要保留原始向量且无法提前对其进行标准化时才应使用。该文档_score 计算为(1 + cosine(query, vector)) / 2。相似cosine性不允许向量具有零幅度,因为在这种情况下未定义余弦。

max_inner_product

计算两个向量的最大内积。这与 类似dot_product,但不需要向量进行归一化。这意味着每个向量的大小都会显着影响分数。该文档_score已进行调整以防止出现负值。对于max_inner_product价值观来说< 0_score是 1 / (1 + -1 * max_inner_product(query, vector))。对于非负max_inner_product结果,_score计算max_inner_product(query, vector) + 1

四、如何选择——向量函数适用于不同的场景

  1. cosine_similarity:

    • 适用场景:当你需要衡量两个向量在方向上的相似性而不是它们的大小时,cosine_similarity 是一个很好的选择。这在文本相似性搜索推荐系统和语义分析中非常有用。
    • 特点:余弦相似度不依赖于向量的长度,因此它适用于比较不同长度的向量或者在向量长度不具有重要意义的情况下。
  2. dot_product:

    • 适用场景:dot_product 适用于当你需要计算两个向量在数量上的相似性,同时考虑它们的方向和大小时。这在推荐系统、图像识别和任何需要考虑向量大小的场景中很有用。
    • 特点:点积考虑了向量的长度和方向,因此它可以提供更全面的相似性度量。
  3. l2_norm:

    • 适用场景:l2_norm(欧几里得范数)适用于当你需要计算向量间的直线距离时。这在地理空间数据的搜索、聚类分析和任何需要精确度量向量间“实际”距离的场景中非常有用。
    • 特点:L2范数计算的是向量分量平方和的平方根,它提供了一个直观的距离度量,符合我们对物理距离的直觉。
  4. max_inner_product 是 Elasticsearch 中的一个脚本函数,用于计算两个向量之间的最大内积(点积)。这个函数在处理向量空间模型时特别有用,尤其是在需要找到与给定查询向量最相关的文档时。以下是 max_inner_product 函数的一些适用场景
    • 推荐系统:

      • 在推荐系统中,max_inner_product 可以用来找到与用户兴趣向量最匹配的项目或内容。例如,如果用户的兴趣向量是基于他们过去的行为(如评分、浏览历史等)构建的,那么可以使用 max_inner_product 来找到最可能吸引用户的内容。
    • 语义搜索:

      • 对于语义搜索,max_inner_product 可以帮助识别与查询语义上最相关的文档。通过将文本转换为向量(例如,使用词嵌入或文档嵌入),max_inner_product 可以衡量查询向量与文档向量之间的相似度。
    • 相似性排名:

      • 在执行相似性搜索时,max_inner_product 可以用来对搜索结果进行排名。通过计算每个文档与查询向量的内积,可以确定哪些文档与用户的查询最相关,并据此对结果进行排序。
    • 内容过滤:

      • 在内容过滤场景中,max_inner_product 可以用来确定哪些内容与特定的标准或准则最匹配。例如,可以用来过滤出与特定主题或品牌最相关的文章或产品。
    • 数据聚类:

      • 在数据聚类分析中,max_inner_product 可以帮助识别数据点之间的相似性,从而将相似的数据点归为一类。这在市场细分、用户分群等场景中非常有用。
    • 异常检测:

      • 虽然 max_inner_product 主要用于找到相似性,但它也可以在异常检测中发挥作用。通过计算数据点与已知正常数据集的内积,可以识别出与正常模式显著不同的异常点。

在选择使用哪种向量函数时,需要考虑你的具体需求和数据的特性。例如,如果你的数据是文本或词语嵌入,并且你更关心文档内容的语义相似性,那么cosine_similarity可能是更好的选择。如果你在处理图像数据,并且关心图像内容的精确相似性,那么dot_productl2_norm可能更适合。

五、语义相似度,选 max_inner_product 还是 cosine_similarity

max_inner_productcosine_similarity 都可以用来计算文本相似度,但它们在适用性和计算方式上有所不同。选择哪一个更适合做文本相似度匹配取决于具体的应用场景和需求。

  1. max_inner_product:

    • max_inner_product 计算的是两个向量之间的点积(内积),它衡量的是向量在数量上的相似性,同时考虑了向量的方向和大小。
    • 在文本相似度匹配中,如果文本向量的长度(维度)和幅度(向量的大小)都很重要,那么 max_inner_product 可能是一个合适的选择。例如,在广告系统中,如果广告和用户查询的向量长度相同,且我们关心的是广告内容与查询内容在数量上的匹配程度,那么 max_inner_product 可以用来找到与用户查询最相关的广告。
  2. cosine_similarity:

    • cosine_similarity 计算的是两个向量之间的余弦相似度,它衡量的是向量在方向上的相似性,而忽略了向量的大小。
    • 在文本相似度匹配中,如果文本向量的长度(维度)不重要,我们只关心向量的方向是否一致,即文本内容的语义是否相似,那么 cosine_similarity 是一个更好的选择。例如,在信息检索系统中,我们通常关心的是文档内容的语义匹配程度,而不是文档的长度或特定关键词的出现频率,这时 cosine_similarity 可以用来找到与用户查询语义上最相关的文档。

总结来说,如果你的应用场景更关注文本内容的语义相似性,而不太关心文本的长度或特定关键词的权重,cosine_similarity 是更合适的选择。相反,如果你需要考虑文本的长度和数量上的匹配程度,max_inner_product 可能更适合你的需求。在实际应用中,通常 cosine_similarity 在文本相似度匹配中更为常见,因为它能够有效地处理文本数据的稀疏性和高维性问题。

六、要检索速度还是准确度?

为了收集结果,kNN 搜索 APInum_candidates在每个分片上查找多个近似最近邻候选者。搜索计算这些候选向量与查询向量的相似度,k 从每个分片中选择最相似的结果。然后,搜索会合并每个分片的结果,以返回全局顶级k最近邻居。

您可以增加num_candidates搜索速度以获得更准确的结果,但代价是搜索速度变慢。具有高值的搜索会num_candidates 考虑每个分片中的更多候选者。这需要更多时间,但搜索找到真正的k顶部最近邻居的概率更高。

同样,您可以减少num_candidates更快的搜索,但结果可能不太准确。

七、选择近似向量搜索还是精确向量搜索?

Elasticsearch 使用HNSW 算法来支持高效的 kNN 搜索。与大多数 kNN 算法一样,HNSW 是一种近似方法,它牺牲结果精度来提高搜索速度。这意味着返回的结果并不总是真正的k 个最近邻。

要运行精确的 kNN 搜索,请使用script_score带有向量函数的查询。代价是暴力遍历,时间成本很大,资源花费成本也很大。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】环形纸牌均分问题

104. 货仓选址 - AcWing题库 有n家商店&#xff0c;求把货仓建在哪能使得货仓到每个点的距离总和最小&#xff0c;输出最短的距离总和。 首先&#xff0c;我们看只有两个点的情况&#xff0c;在这种情况下我们选[1,2]的任何一个位置都是一样的&#xff0c;总和就是这段区间的长…

【机器学习】包裹式特征选择之序列前向选择法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

证书(公钥):网络安全的关键

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

eBMC套件固件烧录及上电过程

1 概述 本期讲解 eBMC 套件上电和固件烧录过程。关于 eBMC 套件的开关、接口和芯片位置&#xff0c;可查看前两期文章&#xff0c;里面有详细描述。 2 固件烧录 eBMC 套件烧录涉及以下固件、其芯片位置和烧录口位置&#xff1a; 其中&#xff0c;eBMC-D4 板上固件可…

『Apisix进阶篇』动态负载均衡:APISIX的实战演练与策略应用

&#x1f680;『Apisix系列文章』探索新一代微服务体系下的API管理新范式与最佳实践 【点击此跳转】 &#x1f4e3;读完这篇文章里你能收获到 &#x1f3af; 掌握APISIX中多种负载均衡策略的原理及其适用场景。&#x1f4c8; 学习如何通过APISIX的Admin API和Dashboard进行负…

软考100-上午题-【信息安全】-网络攻击

一、常见的网络攻击 拒绝服务攻击(Dos攻击)&#xff1a;目的是使计算机或网络无法提供正常的服务 拒绝服务攻击是不断向计算机发起请求来实现的&#xff0c;是一种网络攻击手段。 攻击者通过向目标服务器发送大量的无效请求&#xff0c;如TCP连接请求、HTTP请求等&#xff0…

IS-IS路由

概览&#xff1a; Intermediate System-to-Intermediate System&#xff0c;中间系统到中间系统协议 IS-IS--IGP--链路状态协议--AD值&#xff1a;115 IS--中间系统&#xff08;路由器&#xff09; ES--终端系统&#xff08;PC&#xff09; 在早期IS-IS的开发并不是为了IP…

Matlab|基于隐式Zbus高斯法的三相不平衡潮流计算【可设定变压器数量和位置】【Yy、Yd两种绕组方式】

目录 主要内容 部分代码 结果一览 主要内容 该模型基于隐式高斯法实现对配电网的三相不平衡潮流计算&#xff0c;通过选项可实现【不含变压器】和【含变压器】两种方式下的潮流计算&#xff0c;并且通过参数设置可实现多个变压器接入&#xff0c;该程序可计算【IE…

AI视频风格转换动漫风:Stable Diffusion+TemporalKit

话不多说&#xff0c;直接开干。 基本方法 首先通过 Temporal-Kit 这个插件提取视频中的关键帧图片&#xff0c;然后使用 Stable Diffusion WebUI 重绘关键帧图片&#xff0c;然后再使用 Temporal-Kit 处理转换后的关键帧图片&#xff0c;它会自动补充关键帧之间的图片&#…

C++ STL - 优先级队列及其模拟实现

目录 0. 引言 1. priority_queue 介绍 1.1 构造函数 1.2 priority_queue 接口函数使用 1.3 仿函数 1.4 题目练习 2. priority_queue 模拟实现 2.1基本框架&#xff1a; 2.2 默认构造函数 2.3 基本函数 2.4 堆的向上以及向下调整 0. 引言 优先队列 (priority_queu…

分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测

分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测 目录 分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测分类效果基本介绍模型描述程序设计参…

计算机网络(二)物理层

物理层 一、通信基础1.奈氏准则、香农定理2.编码与调制3.电路交换、报文交换、分组交换 二、 传输介质、设备1.导向性传输介质&#xff1a;1.1双绞线1.2 同轴电缆1.3光纤 2.非导向性传输介质&#xff1a; 一、通信基础 信道带宽&#xff1a;信道能通过的最高频率和最低频率之差…

Python爬虫学习完整版

一、什么是爬虫 网络爬虫&#xff0c;是一种按照一定规则&#xff0c;自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性&#xff0c;根据用户需求定向抓取相关网页并分析也成为如今主流的爬取策略。 1 爬虫可以做什么 你可以爬取网络上的的图片&#…

鸿蒙雄起!风口就在当下,你如何抉择?

近年来&#xff0c;华为自主研发的鸿蒙操作系统&#xff08;HarmonyOS&#xff09;引起了广泛的关注和讨论。鸿蒙系统不仅标志着华为在软件领域的一次重大突破&#xff0c;也预示着全球智能设备市场格局的潜在变化。本文将深入探讨鸿蒙系统的兴起、其在市场上的表现以及对程序员…

刚刚,百度和苹果宣布联名

百度 Apple 就在刚刚&#xff0c;财联社报道&#xff0c;百度将为苹果今年发布的 iPhone16、Mac 系统和 iOS18 提供 AI 功能。 苹果曾与阿里以及另外一家国产大模型公司进行过洽谈&#xff0c;最后确定由百度提供这项服务&#xff0c;苹果预计采取 API 接口的方式计费。 苹果将…

【AI漏洞】人工而后智能

注&#xff1a;公众号暂时不再使用了 本文主要内容&#xff1a; 1、主题&#xff1a;AI漏洞 2、过程&#xff1a;测试步骤 3、笔者&#xff1a;寄语 &#xff08;重点&#xff1a;本文只做技术研究&#xff0c;请遵守相关法律法规&#xff0c;发现自身单位有漏洞请及时修复&…

C语言指针详解(上)

一.什么是指针 指针是一种类型&#xff0c;用来存储变量的地址的类型 有哪些类型呢 字符指针&#xff1a;char* 整型指针&#xff1a;int* 浮点型指针&#xff1a;float* 双精度浮点型指针&#xff1a;double* 空指针&#xff1a;void* &#xff08;每一个类型的指针&a…

搜维尔科技:【应急演练】【工业仿真】救援模拟演练可视化仿真项目实施

安全救援综合演练系统是一套面向公共安全事故、预案管理、应急救援模拟演练的虚拟仿真解决方案&#xff0c;它为警察、消防以及专门的应急救援保障部门提供一个综合的应急救援培训和仿真演练平台。平台主要通过设计不同的事故模型和特定的灾难场景&#xff0c;定制不同的应急救…

Phoenix伪分布安装

引言 Phoenix是构建在HBase上的一个SQL层&#xff0c;能让我们用标准的JDBC APIs而不是HBase客户端APIs来创建表&#xff0c;插入数据和对HBase数据进行查询。Phoenix完全使用Java编写&#xff0c;作为HBase内嵌的JDBC驱动。Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫…

大话设计模式之模板方法模式

模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个算法的框架&#xff0c;将特定步骤的实现延迟到子类中。模板方法模式通过在父类中定义算法的骨架&#xff0c;而将具体步骤的实现留给子类来完成&#xff0c;从而使子类…