再仔细品品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带有向量函数的查询。代价是暴力遍历,时间成本很大,资源花费成本也很大。

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

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

相关文章

Vue2谷粒商城

1.初始化项目 npm init -y 2. 安装vue 2 npm install vue^2 3.编写基本代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sc…

构建以太网交换网络——(生成树实验)

实验介绍 关于本实验 以太网交换网络中为了进行链路备份&#xff0c;提高网络可靠性&#xff0c;通常会使用冗余链路。但是使用冗余链路会在交换网络上产生环路&#xff0c;引发广播风暴以及MAC地址表不稳定等故障现象&#xff0c;从而导致用户通信质量较差&#xff0c;甚至…

PB 级速度,单一数据库操作:走进 Amazon Aurora Limitless Database 的神奇

在数字时代的浪潮中&#xff0c;数据库管理面临着前所未有的挑战和复杂性。对于许多应用程序开发者而言&#xff0c;维护数据库、确保一致性保证、执行升级和备份等日常操作变得越来越复杂。随着应用程序规模的不断扩大&#xff0c;这些任务可能变得琐碎而繁重。传统的数据库管…

前端Webpack5高级进阶课程

课程介绍 本套视频教程主要内容包含React/Vue最新版本脚手架分析、基于Webpack5编写自己的loader和plugin等&#xff0c;让你开发时选择更多样&#xff0c;最后&#xff0c;用不到一百行的代码实现Webpack打包。通过本套视频教程的学习&#xff0c;可以帮你彻底打通Webpack的任…

美团2024届秋招笔试第二场编程真题

要么是以0开头 要么以1开头 选择最小的答案累加 import java.util.Scanner; import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和…

计算机网络⑦ —— 网络层协议

1. ARP协议 在传输⼀个 IP 数据报的时候&#xff0c;确定了源 IP 地址和⽬标 IP 地址后&#xff0c;就会通过主机路由表确定 IP 数据包下⼀跳。然⽽&#xff0c;⽹络层的下⼀层是数据链路层&#xff0c;所以我们还要知道下⼀跳的 MAC 地址。由于主机的路由表中可以找到下⼀跳的…

多模态检索增强生成的简单介绍

原文地址&#xff1a;An Easy Introduction to Multimodal Retrieval Augmented Generation 2024 年 3 月 20 日 如果检索增强生成(RAG) 应用程序可以处理多种数据类型&#xff08;表格、图形、图表和图表&#xff09;而不仅仅是文本&#xff0c;那么它的实用性就会呈指数级…

2023年全国职业院校技能大赛(网络系统管理赛项)样题三

2023****年全国职业院校技能大赛 GZ073****网络系统管理赛项 赛题第3套 模块A&#xff1a;网络构建 ​ 目 录 任务清单… 1 &#xff08;一&#xff09;基础配置… 1 &#xff08;二&#xff09;有线网络配置… 1 &#xff08;三&#xff09;无线网络配置… 3 &#…

华为OD七日集训第4期 - 按算法分类,由易到难,循序渐进,玩转OD

目录 一、适合人群二、本期训练时间三、如何参加四、七日集训第 3 期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、字符串处理第3天、矩阵第4天、深度优先搜索dfs算法第5天、回溯法第6天、二分查找第7天、正则表达式 大家好&#xff0c;我是…

5个适用于 Windows/PC 的水印去除软件(视频/图像)

水印是文本、徽标、印记、图像或签名&#xff0c;通常叠加在视频、其他图像或具有较高透明度的 PDF 文档上。当您免费使用某些产品&#xff08;例如视频编辑器&#xff09;时&#xff0c;最终输出通常带有代表您使用的编辑器的水印。您可能需要出于您的目的从此类媒体文件中删除…

继承和多态(1)(继承部分)

继承 继承的概念 上文就是继承的概念。 必须记住父类也可以称为基类&#xff0c;超类。 子类也可以称为派生类。 继承的语法 在Java中如果要表示类之间的继承关系&#xff0c;需要借助extends关键字&#xff0c;具体如下&#xff1a; 修饰符 class 子类 extends 父类 {//…

德邦物流上门取件,寄重货和大件物品时,实际费用比预估的要贵,难道被坑了吗?

实际并不是哈&#xff01;温馨提示&#xff1a;快递物流计费标准&#xff1a;实际体积和重量两者取最大值&#xff0c;哪个大按哪个计费。 体积重量&#xff08;kg&#xff09;换算公式长(cm) x宽(cm)x高(cm) 抛比系数如果邮寄一个长100cm、宽58cm、高60cm的纸箱。 寄德邦快递…

Spring Cloud五:Spring Cloud与持续集成/持续部署(CI/CD)

Spring Cloud一&#xff1a;Spring Cloud 简介 Spring Cloud二&#xff1a;核心组件解析 Spring Cloud三&#xff1a;API网关深入探索与实战应用 Spring Cloud四&#xff1a;微服务治理与安全 文章目录 一、Spring Cloud在CI/CD中的角色1. 服务注册与发现&#xff1a;自动化管理…

Android14之模板类StaticString16解析(二百零一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(四)

概览 从上一篇博文: Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(三)我们学到了 Swift 中完全自己撸码实现 SwiftHook 类似功能的基本思路、提出了两个“难关”,并首先解决了其中第一道难题。 在这一篇中,我们将会继续克服各种“艰难险阻”,…

绝地求生:PUBG七周年庆典开启!参与周年话题投稿赢丰厚奖励

为庆祝七周年&#xff0c;闲游盒PUBG官方准备了众多活动与奖励&#xff0c;一起在庆典中创造难忘的回忆吧&#xff01;七周年庆典期间游玩PUBG&#xff0c;参与 #乐在7中鸡味无穷# 周年话题投稿&#xff0c;即有机会赢取魔力甜心萨莉套装 2奖励。 参与方式 在小黑盒PUBG社区中…

Conda 常用命令合集

Anaconda是一个开源的Python和R语言的分布式发行版&#xff0c;用于科学计算&#xff08;数据科学、机器学习应用、大规模数据处理和预测分析&#xff09;。Anaconda旨在提供一个简单的一站式解决方案来进行科学计算的需求。它包括了许多用于科学计算、数据分析的最流行的库和工…

【Qt问题】Qt中文乱码问题解决方案(详细汇总)

【Qt问题】Qt中文乱码问题解决方案&#xff08;详细汇总&#xff09; 一、问题描述&#xff1a; 由于Qt对中文的支持不是很好&#xff0c;使用QtCreator进行开发的过程中&#xff0c;经常会出现各种乱七八糟的中文乱码问题&#xff0c;比如我前面遇到的 【Qt问题】初始化菜单…

数据库引论:3、中级SQL

一些更复杂的查询表达 3.1 连接表达式 拼接多张表的几种方式 3.1.1 自然连接 natural join&#xff0c;自动连接在所有共同属性上相同的元组 join… using( A 1 , A 2 , ⋯ A_1,A_2,\cdots A1​,A2​,⋯):使用括号里的属性进行自然连接&#xff0c;除了这些属性之外的共同…

Garnet技术实战测试开发:像使用Redis一样使用Garnet

一、Garnet简介 最近一段时间&#xff0c;看到非常多的文章描述和转发Garnet项目&#xff0c;比如说&#xff1a; .NET的集群Redis实现版本&#xff1a; Garnet – 一种开源、下一代 …Garnet发布 Redis不再是唯一选择 - Setli - 博客园Garnet: 力压Redis的C#高性能分布式存储…