再仔细品品Elasticsearch的向量检索

news2024/11/18 5:39:27

我在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.coloradmin.cn/o/1541712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3 上手笔记

1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 截止2023年10月&#xff0c;最…

网络行为管理系统招标模板

项目名称&#xff1a;网络行为管理系统招标 一、项目背景 随着信息技术的迅猛发展&#xff0c;网络安全和数据保护已成为企业和组织面临的关键挑战。为了确保网络环境的安全、合规&#xff0c;并实现对网络行为的有效管理和审计&#xff0c;我们特此启动网络行为管理系统的招…

Linux系统下——PS1、PS2、PS3、PS4变量详解

目录 前言 一、PS1变量 1.PS1变量详解 2.PS1变量可用参数 3.彩色提示符 二、PS2变量 三、PS3变量 1.不使用PS3变量 2.使用PS3变量 四、PS4变量 前言 在Linux系统中&#xff0c;PS1、PS2、PS3和PS4是特定的环境变量&#xff0c;它们各自在控制提示符和菜单提示信息…

【算法每日一练]

目录 今日知识点&#xff1a; 辗转相减法化下三角求行列式 组合数动态规划打表 约数个数等于质因数的次方1的乘积 求一个模数 将n个不同的球放入r个不同的盒子&#xff1a;f[i][j]f[i-1][j-1]f[i-1][j]*j 将n个不同的球放入r个相同的盒子&#xff1a;a[i][j]a[i-j][j]a[…

[AIGC] Redis基础命令集详细介绍

Redis是一个强大的开源的键-值存储系统&#xff0c;被广泛应用于各种应用程序中。在使用Redis时&#xff0c;我们需要掌握一些基本的Redis命令来操作存储在其上的数据。这篇文章将向你介绍一些基本的Redis命令&#xff0c;让你能够更好地使用和理解Redis。 文章目录 启动Redis…

手撕算法-删除有序数组中的重复项

描述 很简单&#xff0c;就是&#xff0c;遇到重复的&#xff0c;只留一个&#xff0c;保存在数组的左半边。如&#xff1a;[0,0,1,1,1,2,2,3,3,4]变为[0,1,2,3,4] 分析 使用双指针。slow指针代表没重复的数应该放置的位置&#xff0c;fast表示遍历的不重复数字的位置&…

C++中,数字以0开头,会默认八进制,不是十进制

代码1 以下代码&#xff1a; #include <iostream>using namespace std;int main(){uint8_t a 0101;int b (int)(a);cout<<b<<endl;}结果输出&#xff1a; 代码2 如果改为&#xff1a; #include <iostream>using namespace std;int main(){uint8_…

【新版】系统架构设计师 - 新版架构备考索引<附2023年11月原题回忆>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 新版架构备考索引机考详情备考索引与方向&#xff08;个人观点&#xff0c;仅供参考&#xff09;总结附&#xff1a;2023年11月改版机试原题简单回忆 架构 - 新版架构备考索引 首先&#xff0c;此…

知识图表示学习中的负抽样研究综述

摘要 知识图表示学习(KGRL)或知识图嵌入(KGE)在知识构建和信息探索的人工智能应用中起着至关重要的作用。这些模型旨在将知识图中的实体和关系编码到低维向量空间中。在KGE模型的训练过程中&#xff0c;使用正样本和负样本是区分的必要条件。然而&#xff0c;直接从现有的知识…

Unity基础框架

公共模块 单例基类 如果有很多个这样的单例模式对象,创建他们时都要重复的写单例模式代码。那么能不能利用泛型来减少这部分重复的工作量呢。 单例模式基类,最简单的写法 继承MonoBehaviour的单例基类 所以需要做一些改进 获取单例时如果为空,创建一个名字一样的物体,挂…

如何在C语言中使用命令行参数

C语言文章更新目录 C语言学习资源汇总&#xff0c;史上最全面总结&#xff0c;没有之一 C/C学习资源&#xff08;百度云盘链接&#xff09; 计算机二级资料&#xff08;过级专用&#xff09; C语言学习路线&#xff08;从入门到实战&#xff09; 编写C语言程序的7个步骤和编程…

树的遍历方式DFS和BFS

DFS(depth first search) 深度优先遍历 从图中一个未访问的顶点V开始&#xff0c;沿着一条路一直走到底&#xff0c;然后从这条路尽头的节点回退到上一个节点&#xff0c;再从另一条路走到底…不断递归重复这个过程&#xff0c;直到所有的顶点都遍历完成。前序遍历&#xff0c…

高可用、逻辑保护、容灾、多活、妥协、流程

可用性三叉戟&#xff1a; 本地高可用性&#xff1a;消除单点故障&#xff0c;确保链路所有环节系统高可用 本地是指&#xff1a;针对生产中心的内部故障 故障类型&#xff1a;服务器、硬盘、适配器卡、网络 特点&#xff1a;快速恢复、自动的接管、实施简单 RPO-0 业务逻辑保护…

栈、队列——练习题

1. ✌有效的括号 代码实现&#xff1a; bool isValid(char* s) {char stack[10000];int top -1;while (*s) {if (*s ( || *s { || *s [) {stack[top] *s;} else {if (top -1) { // 栈空return false;}int top_val stack[top]; // 获取栈顶元素if (top_val ( &&…

遥感原理与应用—绪论

一、关于基本概念与对应的英文 遥感&#xff1a;Remote Sensing 遥测&#xff1a;Telemetry&#xff0c;对被测物体某些运动参数和性质进行远距离测量的技术&#xff0c;分为接触测量与非接触测量&#xff0c;对于RS的概念&#xff0c;遥测探测的目标显得狭隘了一些&#xff…

快速修复找不到msvcp140.dll,无法继续执行此代码问题

在电脑使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“无法找到msvcp140.dll”的错误。那么&#xff0c;msvcp140.dll究竟是什么呢&#xff1f;它为什么会出现这样的错误呢&#xff1f;通过查阅资料和自己的实践经验&#xff0c;我对msvcp140.dll…

需求分析的过程

需求分析的工具 ominGraffle/Visio Gliffy ProcessOn RSA(UML) PPT/WORD 手绘 需求所需要的工件&#xff1a; 系统上下文、用例模型、质量限制 1.系统上下文的工件 2.用例模型工件&#xff08;什么功能&#xff09; 3.质量和限制 质量&#xff1a;管理10个小动物&#xff0c;…

Affiliate Stores: 建立营销联盟商店的详细教程- US Domain Center主机

第一步&#xff1a;了解营销联盟商店 营销联盟商店是一种电子商务模式&#xff0c;您可以在其中通过推广其他企业的产品或服务来赚取佣金。您在自己的网站上展示其他企业的产品&#xff0c;并在买家购买时获得佣金。通过 WooCommerce 平台&#xff0c;您可以轻松创建一个营销联…

C++ 基本运算

何谓运算符和操作数 基本运算 1、双目运算 2、单目运算 3、赋值表达式 表达形式&#xff1a; <变量><表达式>; 表达式是指各种运算符把常量、变量&#xff0c;函数等运算对象连接起来的具有实际意义并符合C语法规则的式子。赋值是指表达式的值赋给一个变量。 …

第390场 LeetCode 周赛题解

A 每个字符最多出现两次的最长子字符串 滑动窗口&#xff1a;枚举窗口的左边界&#xff0c;尽可能右移窗口的右边界。 (当然也可以暴力枚举) class Solution { public:int maximumLengthSubstring(string s) {vector<int> cnt(26);int res 0;for (int l 0, r -1, n s…