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”。

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

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

相关文章

nodejs+vue+微信小程序+python+PHP个性化服装搭配系统APP-计算机毕业设计推荐 android

考虑到实际生活中在个性化服装搭配方面的需要以及对该系统认真的分析,将app权限按管理员和用户这两类涉及用户划分。 (a) 管理员;管理员使用本系统涉到的功能主要有个人中心、用户管理、个性穿搭管理、我的衣橱管理、服饰分类管理、我的收藏管理、系统管理等功能。 …

大华摄像头windows、linuxJavaSDK开发使用

文章目录 简介环境要求库加载问题及解决方法大华摄像头Java SDK,完成摄像头设备登录、视频录像目录结构windows 的c代码Linux的C代码项目结构 登录云台控制录像调用的接口注意码云地址 简介 本文档主要介绍 SDK 接口参考信息,包括主要功能、接口函数和回…

小模型学习(1)-人脸识别

【写作背景】因为最近一直在研究大模型,在与客户进行交流时,如果要将大模型的变革性能力讲清楚,就一定要能将AI小模型的一些原理和效果讲清楚,进而形成对比。当然这不是一件简单的事情,一方面大模型分析问题的的本质原…

Flask和Vue框架实现WebSocket消息通信

1 安装环境 1.1 安装Flask环境 主要的安装包 Flask、Flask-SocketIO,注意Python版本要求3.6 # Flask-SocketIO参考地址 https://flask-socketio.readthedocs.io/en/latest/ https://github.com/miguelgrinberg/flask-socketio更新基础环境 # 更新pip python -m …

JVM垃圾回收

文章目录 垃圾回收四种引用引用计数算法可达性分析算法 垃圾回收算法标记清除标记整理复制 分代回收GCGC相关参数GC分析大对象 垃圾回收器串行吞吐量优先响应时间优先 垃圾回收 四种引用 强引用 new创建一个对象,通过等号运算符赋值给一个变量,那么这个…

Vue3中的defineModel

目录 一、vue3的defineModel介绍 二、defineModel使用 (1)在vite.config.js中开启 (2)子组件 (3)父组件 一、vue3的defineModel介绍 为什么要使用到defineModel呢?这里有这样一种场景&…

Java设计模式分类

java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式&am…

vue3中关于echars的使用

今天介绍一个好用的插件echars&#xff0c;一个可视化插件Apache ECharts 一、使用步骤 1、安装 npm install echarts --save 2、导入 import * as echarts from echarts 3、正式使用 echars的使用非常的简单&#xff0c;直接点击官网有现成的代码的可用 代码示例 <t…

【Spring教程24】Spring框架实战:从零开始学习SpringMVC 之 SpringMVC入门案例代码示例

目录 1:创建Maven项目&#xff0c;并导入对应的jar包2:创建控制器类3:创建配置类4:创建Tomcat的Servlet容器配置类5:配置Tomcat环境6:启动运行项目7:浏览器访问8:知识点总结 欢迎大家回到《Java教程之Spring30天快速入门》&#xff0c;本教程所有示例均基于Maven实现&#xff0…

FFmpeg抽取视频h264数据重定向

根据视频重定向技术解析中的 截获解码视频流的思路&#xff0c;首先需要解决如何输出视频码流的问题。 目前只针对h264码流进行获取&#xff0c;步骤如下&#xff1a; 打开mp4文件并创建一个空文件用于存储H264数据 提取一路视频流资源 循环读取流中所有的包(AVPacket),为…

2023团体程序设计天梯赛——模拟赛和总决赛题

M-L1-1 嫑废话上代码 Linux 之父 Linus Torvalds 的名言是&#xff1a;“Talk is cheap. Show me the code.”&#xff08;嫑废话&#xff0c;上代码&#xff09;。本题就请你直接在屏幕上输出这句话。 输入格式&#xff1a; 本题没有输入。 输出格式&#xff1a; 在一行中输出…

Docker Compose(容器编排)——9

目录 什么是 Docker Compose生活案例为什么要 Docker ComposeDocker Compose 的安装Docker Compose 的功能Docker Compose 使用场景Docker Compose 文件&#xff08;docker-compose.yml&#xff09; 文件语法版本文件基本结构及常见指令Docker Compose 命令清单 命令清单如下命…

【网络奇缘系列】计算机网络|数据通信方式|数据传输方式

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 这篇文章是关于计算机网络中数据通信的基础知识点&#xff0c; 从模型&#xff0c;术语再到数据通信方式&#…

C++面试宝典第4题:合并链表

题目 有一个链表&#xff0c;其节点声明如下&#xff1a; struct TNode {int nData;struct TNode *pNext;TNode(int x) : nData(x), pNext(NULL) {} }; 现给定两个按升序排列的单链表pA和pB&#xff0c;请编写一个函数&#xff0c;实现这两个单链表的合并。合并后&#xff0c;…

SqlServer中,数字-null的问题

一、业务描述 叫货单&#xff0c;已知叫货金额&#xff0c;填写本次付款金额&#xff0c;计算待付款金额 二、问题 在计算待付款金额时&#xff0c;偶尔会出现待付款金额为空的情况&#xff0c;百思不得其解 三、解决 仔细检查&#xff0c;发现了猫腻。 简单的说&#xff…

前端开发tips

前端开发tips 关于package.json里面&#xff0c;尖角号&#xff08;^&#xff09;和波浪线&#xff08;~&#xff09;的区别 在package.json里面&#xff0c;我们可以使用尖角号&#xff08;^&#xff09;和波浪线&#xff08;~&#xff09;来表示不同的包版本。这些符号通常被…

gin投票系统3

对应视频v1版本 1.优化登陆接口 将同步改为异步 原login前端代码&#xff1a; <!doctype html> <html lang"en"> <head><meta charset"utf-8"><title>香香编程-投票项目</title> </head> <body> <m…

[GPT]Andrej Karpathy微软Build大会GPT演讲(上)--GPT如何训练

前言 OpenAI的创始人之一,大神Andrej Karpthy刚在微软Build 2023开发者大会上做了专题演讲:State of GPT(GPT的现状)。 他详细介绍了如何从GPT基础模型一直训练出ChatGPT这样的助手模型(assistant model)。作者不曾在其他公开视频里看过类似的内容,这或许是OpenAI官方…

在javaweb项目中resource目录和webapp目录的区别

resource存放的是一些配置文件&#xff0c;这些文件一般都是与java代码相关的配置文件&#xff0c;比如这里的jdbc配置文件,在java中可以使用这个目录下的文件&#xff0c;不用写全路径 webapp存放的是web的资源文件&#xff0c;如jsp,html,css&#xff0c;js文件,在网页请求会…

〖大前端 - 基础入门三大核心之JS篇㊿〗- 面向对象之对象的方法、遍历、深浅克隆

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…