联系型数据库
在了解什么是向量数据库之前,必须先对常见的联系型数据库进行分析。
联系型数据库,是指选用了联系模型来安排数据的数据库,其以行和列的方式存储数据,以便于用户了解,联系型数据库这一系列的行和列被称为表,一组表组成了数据库。
-
同一组的实体具有相同的数据结构
-
实体经过主键(ID)安排数据结构 (使用 树 进行存储)
-
实体数据结构中的大部分特点都是能够参加比较的
-
至于那些不能够参加比较的特点,无法被检索
- 例如,数据只是编码,不能反映实体的联系,例如”太阳”、”月亮”、”星星” 编码上的比较不能反映
举例,咱们能够将图片(转为二进制)存放到联系型数据库,可是咱们没有办法直接以图搜图
字符串(自然语言文本)基本上也能够认为是无法比较的,因为大部分的操作都是十分昂贵的
向量化
向量能够进行比较,如果将那些不能够比较的数据转化成为向量,且这些向量的散布和间隔能够反映出实体的联系,那么就能够经过比较向量的要害进行检索,也就能够完成图搜图、文搜文的功用了
巧了,经过深度学习的模型,就能够完成向量化(或许应该称为vector embeddings)。例如能够将不同尺度、不同内容的图片映射成为同一个空间内的向量,或许将不同长度的文本映射到同一个向量空间内,在同一个空间中,相邻的向量具有附近的语义意义。(实际上向量数据库正是为了辅佐深度学习而生的)
尽管向量化是根底,可是向量化一般是专门的模型去完成,而不是数据库担任。(因为模型和事务强相关,且会定期更新)
可是需要数据库担任向量的存储、更新&版别办理
向量相似度检索(vector similarity search)
相对于传统的标量数据库
最近邻查找,或简称 ANN 查找,因为提出的解决方案数量之多,因而能够将其单独视为机器学习和模式识别的一个子范畴。
向量的存储与索引(Vector Index)
- 向量很长(高维数据) (矢量紧缩技术)
- 向量空间极端稀疏
- 向量间需要许多核算间隔,需要核算不同的间隔
第一种 Hashing-based
它的思路很简单,找到一组哈希函数,哈希高维空间里的一些点,那个值依然能表示出它的近邻联系,用这个哈希函数把这个空间分红许多份,在查询的时分,依据要查的数据先做一个哈希,找到对应的桶里面去,核算量就能够大大削减。
第二种 Tree partitioning based
它根据解释空间区分的一个思想,依照不同的纬度把空间进行屡次区分,终究做成一个树结构。
第三种 IVF
它本质上便是做一个聚类,然后在这个聚类当中找到每个聚类中心点,查询的时分去跟这些中心点做比较,间隔比较近的就认为可能有最近邻的数据,只去查找其中的一部分数据。
第四种 Graph based index
它的完成方式是构建近邻图,在高维空间下构建这张图的时分,经过一种算法去找到一些最近邻,在查询的进程中,从图上恣意一个点出发,不停地经过最近邻找到最近的节点,发现周围没有更优解了,它便是部分最优,如果分散的节点数足够多,终究召回率相对比较高。这种图结构索引相对履行速度比较快,但占有内存相对会大一些。
前两种做法它都存在一个比较大的问题,便是召回精度不够,随着纬度变大,召回精度可能会变得越来越低,现在在工业中主要是选用的后两种做法。
开源的向量数据库
Faiss
- Facebook 开源的
- 一个 C++ library
- vector indices
Milvus
- 根据 Faiss 开发
- 引擎层用 C++ 写的
Qdrant
- 根据 Rust 的向量数据库
总结
将上述提到的基本概念进行总结,个人认为,向量数据库有3个要害
-
向量化(编码)
- 不同于字符串文本编码或许图片的编码,向量化的模型可能会不断更新,这就对向量数据库提出了更新和版别办理的需求
- 向量化的质量,决议了向量数据库效果的上限
- 向量化进程无法通用,至少目前没有办法,是和事务强相关的
-
数据结构
- 合理地构建数据结构办理向量,并保证核算和检索时分的功能
- 这个点决议了向量数据库的功能,即决议了向量数据库效果的下限
-
间隔核算
- 怎么更合理的核算向量间的间隔,一起尽量削减资源的占用