向量数据库技术

news2025/3/12 22:24:55

前言

这里有一些狗,熟悉犬类的朋友应该能很快区分出它们的品种,我们之所以能做到这一点,是因为我们会从不同的角度来观察它们的特征。

在这里插入图片描述
比如体型的大小,如果我们使用一个坐标轴来表示这个特征,这些狗将落在不同的坐标点上
在这里插入图片描述
然而,单纯依靠体型这一个特征还不够,比如金毛和拉布拉多的体型就非常接近
在这里插入图片描述
所以需要继续观察其他特征,比如毛发的长短,我们再建立一个(毛长的)坐标轴,这样就区分开了金毛和拉布拉多,现在每只狗对应一个二维的坐标点
在这里插入图片描述
但这仍然不能很好的区分德国牧羊犬和罗威纳犬,因为无论体型还是毛发长短它们都十分的接近,所以我们需要从更多的角度来观察,比如鼻子的长短,再建立一个(鼻长的)坐标轴,于是这两个犬种也被区分开来,现在每只狗对应一个三维坐标点
在这里插入图片描述
还可以有更多的角度,比如眼睛的大小。虽然作为三维生物,我们不可能在四维空间做图,但在坐标点的数值上却很容易实现这一点,继续向后追加就好,现在每只狗对应一个四维坐标点。如果我们从更多的角度,或者说维度来观察一只狗的特征,比如腿的粗细,毛发的卷曲,甚至是一些抽象的角度,比如服从性、攻击性等等。我们使用的维度越多,对狗的区分能力就越强,同时坐标点所在的空间维度也就越高
在这里插入图片描述

向量定义

不仅是狗,实际上几乎任何事物都可以被这样表达。可以是具象的山河日月,鸟兽鱼虫,也可以是抽象的喜怒哀乐,悲欢离合,不同事物在不同的特征维度中有着不同的表现,或者说不同的数值,所以说最终都会在一个高维的特征空间中对应着一个坐标点
在这里插入图片描述
只不过在这些更大的范围内,我们可能需要很高的特征维度才能很好的对事物进行区分,可能几百几千,乃至上万。但由于我们无法做出超过三维的图,所以接下来都是用二维坐标来讲解。

这种表达事物的方式有着很多美妙的特性,那些概念上更为接近的点将在空间中更为聚集,而那些概念上非常不同的点则距离很远。

在这里插入图片描述
更近一步,如果以坐标原点为起始点,这些坐标点为终点,这些就是我们熟悉的带有方向和大小的向量
在这里插入图片描述
而从向量的角度,这种表达方式甚至有了一定程度的推理能力。比如警察的向量减去小偷的向量得到的结果向量和猫减去老鼠的结果向量十分的相似。这意味着猫和老鼠的关系类似于警察和小偷的关系。
在这里插入图片描述

向量化数据

用向量化的数据来表达概念,不得不说这是一个非常好的想法。如果我们对图片进行向量化,那么就可以通过搜索相似的向量实现"以图搜图"的功能,如果对视频进行向量化,就可以通过搜索相似的向量实现相关视频推荐,如果对商品进行向量化,就可以通过搜索相似的向量针对用户当前浏览商品进行相关推荐。而如果对一个文本进行向量化,就能在一个智能问答系统中,根据用户当前的问题找到一些已经解决过的相似问题以供参考。
在这里插入图片描述

词向量

说到文本类型的数据,近些年对词汇进行向量化在自然语言处理领域得到了巨大的应用,也就是所谓的词向量。

实际上语言作为概念的符号,你会发现一个训练得当的词向量集合,将和其所代表的事物之间的向量集合十分的接近,这很利于发现自然语言中所蕴涵的实际概念。
在这里插入图片描述

向量应用

除了词向量以外,最近随着以ChatGPT为代表的大语言模型的如火如荼,人们又发现了向量数据的一些妙用。如果把ChatGPT的对话内容进行向量化,便可以用当前的对话搜索到历史中最相似的一些对话,也就是找到和当前对话最相关的记忆。而把这些最相关的记忆提示给模型,将极大的提高其输出的效果。

在这里插入图片描述

向量数据库

最近几年,一种叫做向量数据库的产品,正趁着AI的热潮开始崭露头角。伴随着AI时代的到来,向量将成为一种重要的数据形式,而传统数据库并不适合用来存储和检索向量数据,因此我们大约需要一种专门设计的数据库来处理这些问题。

和存储数据表,然后用查询语句进行精准搜索的传统数据库不同,向量数据库存储的是向量数据,而查询过程则是从库中搜索出和查询向量最为相似的一些向量,具有一定的模糊性。

向量相似度

比较两个向量相似度的具体方法有许多,两个向量的夹角越小越相似,所以可以通过计算向量夹角的余弦值(夹角越小,余弦值越大)来判断。
在这里插入图片描述

再比如直接计算两个向量的欧式距离,距离越近越相似。
在这里插入图片描述

最近邻问题

通过以上这些例子不难看出,向量数据库的主要应用场景就是:给定一个查询向量,然后从众多向量中找到最为相似的一些,这就是所谓的最近邻问题。而能实现这一点的则称之为最近邻搜索算法。

在这里插入图片描述

暴力搜索

一种最容易想到的方法可能就是"暴力搜索",也叫平坦搜索,就是直接一路平推过去,依次比较所有向量和查询向量的相似度,挑选出相似度最高的几个。
在这里插入图片描述

显然,如果库中的向量过多,这种毫无技术含量的暴力方法将导致极高的搜索时间。但这种方法也有其他方法永远无法达到的一个好处:搜索质量是完美的,因为它真的比较了每一个向量。所以如果库中数据规模较小,遍历全部向量的时间可以接受,这也不失为一种好的方法。

然而实际应用中的数据规模往往都不会太小,所以必须要找出一些方法进行优化。有一种朴素的想法指出了优化的大致思路,可以用一个寻人的例子来说明。
假如已经知道照片上这人在A城市,现在请你想一个办法把他找出来。爆搜相当于去找A城市的每一个人逐一比较,这样一定能找到,但要花费海量的时间。但通过胸前的红领巾知道他是一名小学生,所以就把寻找范围缩小到A市的所有小学,如此就可能将千万级别的查找次数降到只有几十万的级别。
在这里插入图片描述

聚类算法(k-means)

所以对于向量的搜索问题,假如能够为查询向量先划定一个大致范围再搜索。有一种称之为聚类的算法可以实现这一点。以最为流行的k-means聚类算法为例:

  1. 选一个想要分类的数量,比如4类

  2. 随机生成4个点,称之为聚类中心点

  3. 这些向量和哪个中心点最近就被分为哪一类
    在这里插入图片描述

  4. 用当前被分为一类的向量计算出一个平均向量点
    在这里插入图片描述

  5. 把对应的中心点的位置更新为这个平均点
    在这里插入图片描述

  6. 判断每个向量点和哪一个中心点最近,重新分类

  7. 继续用同一类的向量点计算出一个平均点,把中心点更新过去,再次重新分类,如此反复

这个不断迭代的过程,就称之为训练。最后这些中心点将趋于稳定,或者说收敛。最终将这些向量分成了4类。如此在搜索的时候,只需要找出和查询向量最近的那个聚类中心,搜索这个分类中的向量即可,也就实现了缩小搜索范围的目的。

当然,聚类方法并不能保证不会出现遗漏的问题,比如查询向量在这里,但和他最接近的向量其实在这个分类中
在这里插入图片描述
有一些缓解这个问题的办法,比如增加聚类的数量,同时指定搜索多个最近区域从而减少遗漏。但只要是试图提高搜索质量,基本上都会增加搜索时间,实际上速度和质量,往往是一对难以调和的矛盾。
在这里插入图片描述

几乎所有的算法都是在这两个指标上结合实际情况衡量的结果(还有一个存储问题),所以现实就是除了爆搜能一定找到最近邻的一些向量以外,其他任何方法都不能保证这一点。而只能得到一些近似的结果,所以这些算法一般被称之为近似最近邻算法(ANN, Approximate Nearest Neighbors)

位置敏感哈希(LSH)

除了聚类以外,减少搜索范围的方式还有很多,再介绍一种比较流行的基于哈希的方法,位置敏感哈希(Locality Sentence Hashing)。
哈希的概念简单来说就是,任何数据经过哈希函数计算后,都会输出一个固定长度的哈希值,比如128位
在这里插入图片描述

而且由于输入是任意数据,而输出是固定长度的数据,以有穷对无穷,根据鸽巢原理必然会出现数据不同但哈希值相同的情况,这也被称之为碰撞。通常情况下,哈希函数的设计一般力求减少这种碰撞的发生。但这里所构建的哈希函数却反其道而行,它力求增大碰撞发生的可能。因为哈希碰撞正是分组的依据,这些分组也被称之为桶(Bucket)
在这里插入图片描述

除了容易发生碰撞以外,这个哈希函数还要具备这样一个特征:位置越近,或者说越相似的向量,发生碰撞的概率越高,被分到一个桶中的可能性越大。如此,在查询的时候只需要计算一下查询向量的哈希值,找到其所在的桶,再在这个桶中搜索就好。因为和查询向量最相似的一些向量,大概率都在这个桶中。把具体这种特性的哈希函数称之为(对向量)位置敏感的哈希函数LSH。

这样的哈希函数怎么实现呢?看一种常用的手法。以A、B、C三个向量为例:

  1. 随机生成一条直线,而且这条直接区分正反两侧
    在这里插入图片描述
    如果一个向量在这条线的正的一侧,那么它就是1,如果在反的一侧那么就是0

  2. 再随机生成一条直线
    在这里插入图片描述
    同样正侧的向量是1,反侧的向量是0

如此这般,随机生成若干个这样的直线,每次都根据向量所在的正反侧得到1或者0。如果一共使用四条随机的直线,如此就为每个向量算出了4个0或1,各自得到一个四位的二进制编码
在这里插入图片描述

现在观察一下这3个二进制编码的相似程度,很明显,AC这两个相近的向量的编码更为相似,只有第3位不同,相似度高达3/4(这种比较方式也称汉明距离)。而这个较远的B和AC的相似度都很低,一个是1/4,一个是0
在这里插入图片描述
所以为什么向量越接近,得到的二进制编码越相似呢?直观的来定性分析一下
在计算这4个二进制编码的某一位的时候,如果要让B和C的结果一样,这条线无论如何,一定要从AC和BC之间穿过去
在这里插入图片描述

同样,如果要让A和C的结果一样的,这条线应该从BC和AB之间穿过
在这里插入图片描述

忽略共同穿越的AB,直观上来看,B和C之间的宽度要远大于A和C之间的宽度。而直线是随机生成的,所以从概率上来说,生成的直线从BC间穿过的可能性要比从C间穿过的要更大。所以在生成二进制编码的过程中,C更有可能和A的一样而不是B。

同样如果要让A和B的编码值一样,直线要穿过AC和BC。而如果要让A和C的结果一样,这条线应该从BC和AB之间穿过。忽略共同穿越的BC,AC间的宽度也远小于AB,所以A也是更有可能和C一样而不是B。

所以这串二进制编码便可以作为向量的哈希值,而这个生成的过程就是一种寻找的哈希函数。因为它满足刚才所说的两个要求:

  1. 容易碰撞
  2. 越近越容易碰撞

越近越相似的向量,越容易碰撞以至于被分到一个桶中

当然,这个三个向量的哈希值并不完全相同,但如果在观察一个距离A更近的D,会发现D最后的二进制编码或者说哈希值和A一样,发生了碰撞
在这里插入图片描述
用4个向量展示了这个方法的基本工作原理,而对于真实情况中许多的向量而言,每个向量通过这个哈希函数后,都会得到一串二进制编码的哈希值。
在这里插入图片描述
而那些非常接近的向量的哈希值大概率是一样的(碰撞),也就会被分到了同一个桶中。对于更高维度的向量,道理也是一样的。比如三维便可以使用三维空间中的一个随机平面来做哈希函数的计算。在这里插入图片描述
这个面也有正反,正面的向量得到1,反面的得到0,若干的随机平面自然也得到了一串二进制编码的哈希值。

如果是更高的维度,在这些更高维度中也存在着高维的超平面,同样也可以完成这样的哈希值生成。所以把这种方法称之为随机超平面或者随机投影。

当然,除了直接爆搜,任何试图减少搜索量的方法都会在一定程度上降低搜索的质量。

比如还是这四个向量,现在用9个随机直线,每个向量生成长度为9的二进制哈希编码,可能是这样的过程,AD两个比较近的点的哈希值一致,被分到了同一个桶中,这是比较理想的结果。
在这里插入图片描述

但因为直线是随机的,所以这个过程也有可能是这样的,在生成第6个编码的时候,这个直线就随机到了AD中间穿过,导致A和D的哈希编码的第6位不同
在这里插入图片描述
虽然说概率比较小,但毕竟是有可能发生的,最后A和D无法进入同一个桶。
LSH一般会采用一种分段的措施来改善这种情况。比如:

  1. 把这些二进制哈希值分成3段
    在这里插入图片描述
  2. 独立对这些片段进行分桶
    在这里插入图片描述
    虽然AD的第二个片段被分到了不同的桶中,但第1、3两个片段被分到了同一个桶。可以采用只要匹配一个片段,就将其作为候选项的策略,合理的扩充更多的搜索范围。在这种分段措施下,A和C的第二段也分到一个桶中,两者由此成为了相似向量的候选项,因为它们比较接近,这是一种合理的扩充,而B则没有任何一个段和其他向量对应的段被分到同一个桶中,因为它们距离很远,这很合理。

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

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

相关文章

算法攻略:顺序表的进阶之路——移除元素

题目如下: 思路: 双指针法 nums[src] val,srcnums[src] ! val,src的值赋值给dst,src和dst都 注: 1)双指针法:只是抽象出了两个指向数组的变量,并不是真的指针。 2&#…

docker Error response from daemon

问题 Error response from daemon: Get "https://index.docker.io/v1/search?qnginx&n25": read tcp 192.168.50.233:54354->54.198.86.24:443: read: connection reset by peer Unable to find image redis:latest locally docker: Error response from d…

【HTML】Day02

【HTML】Day02 1. 列表标签1.1 无序列表1.2 有序列表1.3 定义列表 2. 表格标签2.1 合并单元格 3. 表单标签3.1 input标签基本使用3.2 上传多个文件 4. 下拉菜单、文本域5. label标签6. 按钮button7. div与span、字符实体字符实体 1. 列表标签 作用:布局内容排列整齐…

iOS 11 中的 HEIF 图像格式 - 您需要了解的内容

HEIF,也称为高效图像格式,是iOS 11 之后发布的新图像格式,以能够在不压缩图像质量的情况下以较小尺寸保存照片而闻名。换句话说,HEIF 图像格式可以具有相同或更好的照片质量,同时比 JPEG、PNG、GIF、TIFF 占用更少的设…

【MATLAB APP Designer】小波阈值去噪(第一期)

代码原理及流程 小波阈值去噪是一种信号处理方法,用于从信号中去除噪声。这种方法基于小波变换,它通过将信号分解到不同的尺度和频率上来实现。其基本原理可以分为以下几个步骤: (1)小波变换:首先对含噪信…

NCCL源码解读3.1:double binary tree双二叉树构建算法,相比ring环算法的优势

目录 一、双二叉树出现的原因 二、双二叉树介绍 三、双二叉树大规模性能 四、双二叉树源码解读 双二叉树注意事项 核心逻辑 源码速递 视频分享在这,未完待补充: 3.1 NCCL源码解读双二叉树构建算法,double binary tree相比ring环算法的…

Linux部署web项目【保姆级别详解,Ubuntu,mysql8.0,tomcat9,jdk8 附有图文】

文章目录 部署项目一.安装jdk1.1 官网下载jdk81.2 上传到Linux1.3 解压1.4 配置环境变量1.5 查看是jdk是否安装成功 二.安装TomCat2.1 官网下载2.2 上传到Linux2.3 解压2.4配置2.5 启动Tomcat2.6 验证是否成功 三.安装mysql四.部署javaweb项目4.1 打包4.2 启动tomcat 部署项目 …

unity中的UI系统---GUI

一、工作原理和主要作用 1.GUI是什么? 即即时模式游戏用户交互界面(IMGUI),在unity中一般简称为GUI,它是一个代码驱动的UI系统。 2.GUI的主要作用 2.1作为程序员的调试工具,创建游戏内调测试工具 2.2为…

MySQL 【多表查询】

一 . 概述 多表关系: 一对多(多对一) , 多对多 ,一对一 1) 一对一 案例: 用户 与 用户详情的关系 关系: 一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另 一张表…

【大模型】ChatGPT 数据分析与处理使用详解

目录 一、前言 二、AI 大模型数据分析介绍 2.1 什么是AI数据分析 2.2 AI数据分析与传统数据分析对比 2.2.1 差异分析 2.2.2 优劣势对比 2.3 AI大模型工具数据分析应用场景 三、AI大模型工具数据分析操作实践 3.1 ChatGPT 常用数据分析技巧操作演示 3.1.1 快速生成数据…

【面试系列】深入浅出 Spring Boot

熟悉SpringBoot,对常用注解、自动装配原理、Jar启动流程、自定义Starter有一定的理解; 面试题 Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?Spring Boot的自动配置原理是什么?你如何理解 Spring Boot 配置…

【Java项目】基于SpringBoot的【新生宿舍管理系统】

【Java项目】基于SpringBoot的【新生宿舍管理系统】 技术简介:本系统使用采用B/S架构、Spring Boot框架、MYSQL数据库进行开发设计。 系统简介:管理员登录进入新生宿舍管理系统可以查看首页、个人中心、公告信息管理、院系管理、班级管理、学生管理、宿舍…

【AI学习】Transformer深入学习(二):从MHA、MQA、GQA到MLA

前面文章: 《Transformer深入学习(一):Sinusoidal位置编码的精妙》 一、MHA、MQA、GQA 为了降低KV cache,MQA、GQA作为MHA的变体,很容易理解。 多头注意力(MHA): 多头注…

IP5385应用于移动电源快充方案的30W到100W大功率电源管理芯片

英集芯IP5385一款专为智能手机,平板,移动电源,手持电动工具等便携式电子设备提供快充解决方案的30W到100W大功率电源管理SOC芯片。集成了快充协议芯片、MCU、同步升降压控制器等多种功能于一个封装内部,有效减小了整体方案的尺寸。…

信息科技伦理与道德1:研究方法

1 问题描述 1.1 讨论? 请挑一项信息技术,谈一谈为什么认为他是道德的/不道德的,或者根据使用场景才能判断是否道德。判断的依据是什么(自身的道德准则)?为什么你觉得你的道德准则是合理的,其他…

.Net加密与Java互通

.Net加密与Java互通 文章目录 .Net加密与Java互通前言RSA生成私钥和公钥.net加密出数据传给Java端采用java方给出的公钥进行加密采用java方给出的私钥进行解密 .net 解密来自Java端的数据 AES带有向量的AES加密带有向量的AES解密无向量AES加密无向量AES解密 SM2(国密)SM2加密Sm…

西安电子科技大学初/复试笔试、面试、机试成绩占比

西安电子科技大学初/复试笔试、面试、机试成绩占比 01通信工程学院 02电子工程学院 03计算机科学与技术学院 04机电工程学院 06经济与管理学院 07数学与统计学院 08人文学院 09外国语学院 12生命科学与技术学院 13空间科学与技术学院 14先进材料与纳米科技学院 15网络与信息安…

服务器信息整理

文章目录 引言I BIOS时间Windows查看BIOS版本安装日期linux查看BIOS时间II 操作系统安装日期LinuxIII MAC 地址IV 设备序列号Linux 查看主板信息引言 信息内容:重点信息:用途、操作系统安装日期、设备序列化、IP、MAC地址、BIOS时间、系统 Linux查看工具:ifconfig、宝塔运维…

关于PINN进一步的探讨

pinn 是有监督、无监督、半监督? PINN(Physics-Informed Neural Networks,物理信息神经网络)通常被归类为一种有监督学习的方法。在PINN中,神经网络的训练过程不仅依赖于数据点(例如实验观测数据&#xff0…