Elasticsearch:向量数据库的真相

通过工作示例了解什么是向量数据库、它们如何实现 “相似性” 搜索以及它们可以在明显的 LLM 空间之外的哪些地方使用。除非你一直生活在岩石下,否则你可能听说过诸如生成式人工智能和大型语言模型(LLM)之类的术语。 除此之外,你很有可能听说过向量数据库,它为 LLMs 的查询提供上下文。 有没有想过它们是什么以及它们在明显的 LLM 领域之外有何用处? 好吧,请继续阅读以了解这项令人兴奋的新技术,构建您自己的向量数据库并思考如何在你的项目中利用它,包括但不限于 LLMs。

以值匹配为中心的搜索的局限性

首先,让我们看看到底缺少什么而引发了对不同类型数据库技术的需求。 这是与搜索数据有关。 当你在数据库中听到 “搜索” 这个词时,你可能会立即想到正常的以数值或关键字为中心的搜索,例如:

  • 相等:其中 customer_id = 123
  • 比较:年龄大于 25 岁
  • 通配符:客户名称以 “Mc” 开头,例如 “McDonald”

有时,这些以价值为中心的搜索也相互依存,例如

其中年龄 (age) > 25 且邮政编码 (zipcode) = ‘12345’

现代数据库技术在过去几十年中不断发展,提高了此类搜索的效率,我将其称为 “以值为中心的搜索”,其中评估特定值以在查询中进行过滤。 虽然它们在许多情况下都可以工作,可以说在几乎所有与业务相关的应用程序中,但请考虑如下:

给我找一个像丽莎 (Lisa) 一样的客户

请注意所使用的过滤器:它并没有询问姓名为 “Lisa” 的客户; 只是像她这样的人,即与丽莎相似的人。 相似是什么意思? 这是一个很难回答的问题。 这不是名字,因为类似的客户可能被命名为 Alice、Bob 或 Chris。 难道是他们的年龄? 可能吧。 假设丽莎的年龄是 40 岁。40 岁的顾客最相似。 25 岁的客户相似度会降低,55 岁的客户也同样不相似。

让我们思考一下。 考虑这三位顾客各自的年龄。

顾客及其年龄

如果我们画一个图表,将 Lisa 的余额放在中间,然后绘制其他的图表,它将如下图所示。 他们的年龄与 40 岁(丽莎的年龄)的距离显示了他们距离该目标有多远。 在本例中,我们表明 Bob 最相似,Charlie 最不相似,而 Alice 更相似一些。

年龄只是客户的一方面。 在寻找 “像丽莎” 这样的人时,我们可能会想到更多的属性; 不只是一个。 其中一个属性可以是客户的净资产,如下所示,添加到原始表中:

具有两个属性的客户:年龄和净资产

如果 Lisa 的净资产是10万,这些客户之间会有什么新的相似之处? 我们可以创建一个以年龄和净资产为两个轴的二维图表,如下图所示。

二维客户年龄和净资产 (注意上面 Y 轴的单位是 “千”)

然而,由于后者以千为单位,而前者以两位数为单位,因此图表将不成比例。 为了获得相同的比例,我们需要将这些绝对值转换为一些相对值以进行比较。 年龄从 20 岁到 80 岁不等,即相差 60 岁。因此,Alice 与 Lisa 的年龄距离为 (40–20)/60 = 0.33。 同样,净资产的分布范围为 50 到 200,即 150。同样,Bob 的净资产距离为 (200–100)/150 = 0.67。

顾客与 Lisa 的相对距离

我们发现 Bon 的档案不再与丽莎 “相似”。 为了找到复合距离,我们可以在二维图上计算它们之间的距离,例如:

Composite Distance = Square Root of (Square of (Age Distance) + Square of (Net Worth Distance))

使用该公式,我们计算与 Lisa 的复合距离。

客户与 Lisa 的复合距离

我们可能会发现 Alice 距离 Lisa 的距离可能比 Bob 要近,而且和 Charlie 距离是最远。 只需添加一个维度即可显着改变相似性。 考虑添加另一个维度,例如 “孩子的数量”,使其成为 3 维图,这可能会进一步改变物体与丽莎的距离。 实际上,对象有数百个属性可供比较。 将所有这些都写在纸上是不可能的。 但希望你能了解多维空间中两点之间的距离。 距离越小,点越相似,0 表示在所有维度上完全相同。

点的属性被捕获为向量。 在上面的例子中,向量的维度将是 [Age,Net Worth]; 所以我们将按如下方式表示这些值。

代表 Lisa 的向量是 [40,100000]。 点之间的距离通常表示为欧几里德距离,如下面二维空间的函数 d() 所示。 资料来源:维基百科。

运用 Elasticsearch 作为向量数据并计算距离

在上面,我们通过一个详细的例子描述了如何把数据转换为向量,并计算向量直接的距离。事实上,如果我们通过手动的方式来计算,就显得非常麻烦。Elasticsearch 作为全球下载量最多的向量数据库,我们可以很方便地利用它来帮我们进行计算向量之间的相似性。下面,我们来通过 Elasticsearch 来实现向量之间的相似性。

首先,我们为向量的索引定义一个 mapping:

PUT my-index
{"mappings": {"properties": {"my_vector": {"type": "dense_vector","dims": 2,"similarity": "l2_norm"},"name" : {"type" : "keyword"}}}
}

请注意,在上面,我们定义了一个叫做 dense_vector 的数据类型。这个就是我们的向量数据类型。它的维度为 2。我们可以详细参考 Elastic 官方文档来了解这个数据类型。my_vector 的相似性,我们使用 l2_norm 来定义 similarity,它表明是欧几里得距离。请详细参阅文档。

我们通过如下的命令来写入数据到 Elasticsearch:

POST my-index/_bulk?refresh=true
{ "index" : { "_id" : "1" } }
{ "name" : "Alice", "my_vector": [20,100000] }
{ "index" : { "_id" : "2" } }
{ "name" : "Bob", "my_vector": [40,200000] }
{ "index" : {"_id" : "3" } }
{ "name" : "Charlie", "my_vector": [80,50000] }

我们可以通过如下的命令来查看写入的数据:

GET my_index/_search?filter_path=**.hits

上面的命令返回的响应为:

  "hits": {"hits": [{"_index": "my_index","_id": "1","_score": 1,"_source": {"name": "Alice","my_vector": [20,100000]}},{"_index": "my_index","_id": "2","_score": 1,"_source": {"name": "Bob","my_vector": [40,200000]}},{"_index": "my_index","_id": "3","_score": 1,"_source": {"name": "Charlie","my_vector": [80,50000]}}]}
}

我们可以通过 Elasticsearch 来计算我们搜索对象 Lisa 的距离。搜索的结果将返回在我们的向量数据库中最近的向量。它们是按照距离的大小进行排序的。在上面的向量中,我们想找到一个最相近的 Lisa,而它的向量为 [40, 100000]。我们可以通过如下的方法来搜索我们的向量:

接下来,我们使用 Elasticsearch 的 knn search 端点来进行搜索:

POST my-index/_search?filter_path=**.hits
{"knn": {"field": "my_vector","query_vector": [40, 100000],"k": 10,"num_candidates": 100}
}

上面的搜索结果是:

{"hits": {"hits": [{"_index": "my-index","_id": "1","_score": 0.0024937657,"_source": {"name": "Alice","my_vector": [20,100000]}},{"_index": "my-index","_id": "3","_score": 3.9999976e-10,"_source": {"name": "Charlie","my_vector": [80,50000]}},{"_index": "my-index","_id": "2","_score": 1e-10,"_source": {"name": "Bob","my_vector": [40,200000]}}]}

如上所示,我们看到的结果是 Alice 排名是第一的,而紧随其后的是 Charlie。而我们之前认为的 Bob 是排在最后的一个。Bob 的距离是最远的,这个和之前的推送方法有一定的误差,比如相对计算的方法不同。

更多有关 Elasticsearch 向量搜索的内容,请详细阅读文章 “AI”。

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

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

相关文章

如何利用Axure制作移动端产品原型

Axure是一款专业的快速原型设计工具,作为专业的原型设计工具,Axure 能够快速、高效地创建原型,同时支持多人协作设计和版本控制管理。它已经得到了许多大公司的采用,如IBM、微软、思科、eBay等,这些公司都利用Axure 进…

android 13.0 Settings去掉二级三级菜单搜索功能

1.概述 在13.0的系统rom定制化开发中,由于客户定制开发需求,需要去掉Settings里面的搜索功能,主页面的搜索功能,在前面的章节已经讲了 这里需要去掉二级三级菜单的搜索功能,需要从搜索功能流程分析去掉搜索功能 2.Settings去掉二级三级菜单搜索功能核心代码 packages/ap…

stl模板库成员函数重载类型混肴编译不通过解决方法

stl模板库成员函数重载类型混肴编译不通过解决方法 这种方式编译不通过IsArithmetic和HasMemberList编译器存在混肴 template <typename T, typename Enable std::enable_if<IsArithmetic<T>::value>::type >static void DumpWrapper(T* filed, std::strin…

SAP UI5 walkthrough step7 JSON Model

这个章节&#xff0c;帮助我们理解MVC架构中的M 我们将会在APP中新增一个输入框&#xff0c;并将输入的值绑定到model&#xff0c;然后将其作为描述&#xff0c;直接显示在输入框的右边 首先修改App.controllers.js webapp/controller/App.controller.js sap.ui.define([&…

python变量的命名和使用

变量名只能包含字母、数字和下划线 变量名只能包含字母、数字和下划线。变量名可以字母或下划线打头&#xff0c;但不能以数字打头。例如&#xff0c;可将变量命名为message_1&#xff0c;但不能将其命名为1_message。 Python 语言中&#xff0c;以下划线开头的标识符有特殊含…

Redis server启动源码

入口main函数 src/redis.c文件main函数 int main(int argc, char **argv) {struct timeval tv;/* We need to initialize our libraries, and the server configuration. */// 初始化库 #ifdef INIT_SETPROCTITLE_REPLACEMENTspt_init(argc, argv); #endif//设置本地时间setl…

翻译: 生成式人工智能的经济潜力 第3部分工作和生产力的影响 The economic potential of generative AI

麦肯锡报告 翻译: 生成式人工智能的经济潜力 第一部分商业价值 The economic potential of generative AI翻译: 生成式人工智能的经济潜力 第2部分行业影响 The economic potential of generative AI 1. 工作和生产力的影响 技术几十年来一直在改变工作的解剖学。多年来&…

vue全屏事件与关闭全屏事件

首先&#xff0c;在 Vue 组件中&#xff0c;可以使用 click 或者 v-on 来监听点击事件&#xff0c;然后通过调用相应的方法来触发全屏或关闭全屏。 执行requestFullscreen事件 <template><div><button click"enterFullScreen">进入全屏</butt…

前端知识(十二)———ES6迭代器

ES6中的迭代器是一种新的对象&#xff0c;它具有一个next()方法。next()方法返回一个对象&#xff0c;这个对象包含两个属性&#xff1a;value和done。value属性是迭代器中的下一个值&#xff0c;done属性是一个布尔值&#xff0c;表示迭代器是否已经遍历完所有的值。迭代器是一…

js实现在线预览(PC)图片(jpg、png)、pdf、excel(xlsx)、docx

js实现图片预览 参考&#xff1a;添加链接描述 图片预览 本来用的是element-plus自带的组件el-image&#xff0c;但是去不掉缩略图&#xff0c;所以换成了el-imag-viewer组件&#xff08;图片可拖拽&#xff09;&#xff0c;由于用的vite没有require方法&#xff0c;需要自己处…

c++新经典模板与泛型编程:const修饰符的移除与增加

const修饰符的移除 让你来写移除const修饰符&#xff0c;你会怎么样来写&#xff1f; &#x1f602;&#x1f602;trait类模板&#xff0c;如下 #include <iostream>// 泛化版本 template<typename T> struct RemoveConst {using type T; };// 特化版本 template…

docker-compose 常用命令和指令

目录 1. 概要 2. 常用的docker-compose命令 2.1、image 2.2、build 2.3、command 2.4、links 2.5、external_links 2.6、ports 1.7、expose 1.8、volumes 1.9、volumes_from 1.10、environment 1.11、networks 1. 概要 默认的模板文件是 docker-compose.yml&…

阿里云(云服务器)上搭建项目部署环境

目录 安装docker docker安装MySQL5.7.37 安装MySQL 方式一&#xff1a;docker中MySQL时区调整 方式二&#xff1a;docker中MySQL时区调整 docker安装MySQL8.0.27 docker安装redis5.0.14 云服务器上安装jdk1.8 安装docker 1、先卸载docker&#xff0c;因为有一些服务器…

西南科技大学C++程序设计实验十(函数模板与类模板)

一、实验目的 1. 掌握函数模板与类模板; 2. 掌握数组类、链表类等线性群体数据类型定义与使用; 二、实验任务 1. 分析完善以下程序,理解模板类的使用: (1)补充类模板声明语句。 (2)创建不同类型的类对象,使用时明确其数据类型? _template<typename T>__…

c-语言->数据在内存的存储

系列文章目录 文章目录 系列文章目录前言 前言 目的&#xff1a;学习整数在内存的储存&#xff0c;什么是大小端&#xff0c;浮点数的储存。 1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#xff1a; 整数的2进制表⽰⽅法有三种&#xff0…

设计模式之观察者模式(主题对象发生变化,通知各个观察者)

当涉及到电商场景时&#xff0c;观察者模式可以用于处理多种情况&#xff0c;比如订单状态更新、库存变化、用户积分变化等。下面是一个简化的订单状态更新的观察者模式案例。 1.首先&#xff0c;定义一个主题接口 OrderSubject /*** Description:主题&#xff0c;用于管理观察…

基于Java会员管理系统

基于Java会员管理系统 功能需求 1、会员信息管理&#xff1a;该系统需要提供会员信息管理功能&#xff0c;包括会员的姓名、性别、年龄、联系方式等基本信息。同时&#xff0c;还需要提供会员的消费记录、积分、优惠券等信息的管理。 2、会员注册和登录&#xff1a;系统需要…

动手学习深度学习-跟李沐学AI-自学笔记(3)

一、深度学习硬件-CPU和GPU 芯片&#xff1a;Intel or AMD 内存&#xff1a;DDR4 显卡&#xff1a;nVidia 芯片可以和GPU与内存通信 GPU不能和内存通信 1. CPU 能算出每一秒能运算的浮点运算数&#xff08;大概0.15左右&#xff09; 1.1 提升CPU利用率 1.1.1 提升缓存…

自动驾驶学习笔记(十六)——目标跟踪

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 匹配关联 轨迹记录 状态预测 总结 前…

【文件上传系列】No.2 秒传(原生前端 + Node 后端)

上一篇文章 【文件上传系列】No.1 大文件分片、进度图展示&#xff08;原生前端 Node 后端 & Koa&#xff09; 秒传效果展示 秒传思路 整理的思路是&#xff1a;根据文件的二进制内容生成 Hash 值&#xff0c;然后去服务器里找&#xff0c;如果找到了&#xff0c;说明已经…