向量数据库实际使用价值
首先至少我自己在网上找到的关于向量数据库的说明文章基本上可以说是装B大集合,没有一个文章是为了给你讲清楚啥是向量数据库,它有什么用。很多文章我甚至都觉得作者自己都不知道自己在讲什么,经常出现用概念A去解释概念B,简直了,过于浮夸。好像写篇博文就是为了满足自己的装B需求,实际上这种行为在我看个就是各跳梁小丑,我这篇文章的目的就是为了给所有程序员说明白向量数据库是啥,有什么用。
看懂了这篇文章你就可以出去鉴别谁在装B,谁在科普了。
1.向量是什么东西
向量就是一个一维浮点数组,大概长这个样子:
[5.2, 36.0, 55.1, 2.1, 0.5,.....]
搞清楚向量就是这么个东西,在我们计算机开发者角度来看这个东西就是一维数组;在数学角度来看它代表的是多维向量(数组有多少个元素,它就有几个维度),所以从广义角度来说的话,能够将这个东西存进去的数据库都可以叫做向量数据库,本质上和存字符串/数值/blob/是TM一回事。
1.向量相较hash或b+树有什么优势
hash的核心在一个索引与值一一对应从而形成一个完整的哈希表,而B+树从我们应用的角度来说就是一个多维的哈希表(关系型数据库高手先别杠,仅从应用来讲这么表述没啥问题)可以理解为一个值进一步展开为一个hash表,比如说你存储字符串,本质上就是把字符串里面的每一个字建立一个hash索引和值然后进行排序。所以两者都是hash表的话,那么我们在检索的时候本质上是做等于/大于/小于这三种判断,记住了只有这三种没有其他了:
- 等于:相当于判断hash值是否相等;
- 大于/小于:因为hash是有序的,所以说本质上就是在hash表之中截取;
大于小于没啥好说的,拿所有人都明白的sql我们拆解一下:
- in:这个关键字本质上是等于判断,判断数值与传入的数组进行判定,只要有一个等于则true;
- like:这个关键字很多人都说是模糊查询,实际上也是等于判断,判断的是字符串里面的字是否相等,如果有相等的字则为true,为什么like应用索引需要最左匹配明白了吧,因为他是等于判断。
好了,到这个时候你应该发现传统关系型数据库存在的问题,只要你是hash表我们就不可能去实现真正意义上的模糊查询,比如说:
- 给你一个图片让你去比较它和其他任意图片的相似度
- 给你一个字符串如:“红茶好喝”,让你与“红茶不好喝”去做语意判断
上述两种情况你如果你按照常规数据库逻辑将blob或者字符串存到表里面,仅通过数据库你是完全没法做相关查询的,这就是为什么我们需要向量数据库。
假设我们存储的不是hash而是向量呢,那就好玩了,因为向量可以做相似度判断(当然也可以做等于/大于/小于),任意维度的向量在数学上都可以获取他的模和它与其他同维度向量的角度,这不就是相似度吗?(这里只是说明数学上的可行性,真实对比算法会复杂一些)甚至可以依靠权重获取一个具体的相似百分比,这个只要有高中知识应该都能够理解吧。所以说向量数据库就是拿来做相似度检索的,别看其他博主说上了天,你只需要搞清楚这个原则行了。
2.任意数据转换为向量
好了,我们现在已经知道所谓向量数据库无非是可以存储向量同时使用向量进行相似度查询,不得不引出一个问题,这个向量从哪里来?比如说我现在有一张图片,是不是说向量数据库可以帮我把图片转为向量存起来?不是!!
这个向量其实说白了就是某个数据的特征值,比如说我们做人脸查询功能,那么把人脸图片提取出特征向量然后存储进入数据库,后续其他人脸图片来了我们只需要将其转为特征向量然后去数据库做一个相似度查询这样便可以知道这个人脸是数据库之中的哪一个人脸,所以搞清楚数据库本质上还是一个存储与查询工具,具体的特征怎么来的他不关心。这一来提取出特定元素特征向量的程序或这函数/算法我们一般统称为Embedding(本质上他就是向量化,这类专有名词不好翻译)。
绝大部分情况下Embedding算法其实就是机器学习训练出来的模型程序,不同于我们常规技术,这类程序往往是算法开源但是训练好的模型不开源,比的是谁的训练数据NB,往往针对特定领域比如人脸/语义等都有独立的Embedding,如果你想找现成的东西做测试可以在开源社区你可以搜索如face-embedding/text-embedding等等。
3.基于数据库实现对向量的对比分析
上述我们已经将所有的基础逻辑搞明白了,置于这个相似判断在底层实现的常用算法也有很多具体的实现,当然不是向量模向量角度对比这么简单了,但是也是纯粹的数学方法大致是这些,由于网络上的相关解释很多这里只做简单说明,实在不行就去问AI:
- 余弦距离:用向量的空间夹角做判断
- 欧式距离:用向量的距离做判断
- 向量内积:用向量的点乘值做判断
- KDTree分类:将向量进行分类建立树,这个树是一个多叉树,低维度向量做精确划分时用的
- Annoy分类:将向量进行分类建立树,这个树是一个二叉树,主要用于高维度做排序用的
上述这些对于我们应用开发者而言不需要搞得多么透彻,只需要知道什么时候该用什么就行了,目前几乎所有向量数据库都支持上述判断逻辑。
4.总结
相信有了上述基础的认知,我们可以对当下的一些情况做复盘了:
- 为啥在AI时代网络上对于向量数据库的声音多起来了?
- 因为向量数据库是AI应用的基础呀,大部分模型特征数据和中间数据都是向量数据;
- 为啥MySQL9.0没有完整支持向量,Oracle都是一群SB在上班吗?
- 关系型业务数据库不需要搞向量呀,如何MySQL没有向量我大不了MySQL + ES,没有必要把ES搞到数据库里面去呀,小而美也是一种风格呀;
- 为啥网络上一大堆人没几个可以讲清楚向量数据库呢?
- 因为对于做业务系统的人而言,向量数据库对于业务没有什么实际的帮助;或者说大家其实早就开始使用向量数据库(Elasticsearch)来支撑特殊的检索需要;
- 主要是做业务系统的人是技术含量最低同时吹的NB最大的一类程序员;