向量数据库

向量数据库是一种专为高效存储和检索高维向量数据而设计的数据库系统。
这些向量通常来源于机器学习和深度学习模型对非结构化数据(如文本、图像、音频、视频)的编码处理。通过将原始数据转化为密集的数值向量(生产使用一般向量维度会大于512),向量数据库能够支持诸如相似性搜索、推荐系统、图像检索、语音识别等多种应用场景。
基本概念
维度 (dimensionality)
该空间中的每个维度都可以被视为数据的一个特征或特征。 对于单词或句子,这些维度可以捕获句法角色、语义含义、上下文或各种抽象语言属性。 维度越多,表示就越细致,但也需要更多的计算资源。
向量 (Embeddings)
向量Embeddings是自然语言处理(NLP)中的一个基本概念,是单词、句子、文档、图像、音频或视频数据等对象的数字表示。
- 生成句子Embeddings的常用方法包括Doc2Vec (Document-to-vector)
- 卷积神经网络(cnn)和视觉几何组(VGG)用于生成图像Embeddings
点击“运行代码”查看 embeddings 检索与分类结果。
距离和相似度 (distance and similarity)
将单词或句子转换为向量的主要原因是为了测量相似度。 在这些向量空间中,任何两个向量之间的 “距离”(通常使用余弦相似度或欧几里德距离等度量)可以指示这两个项目的相似程度。 向量越接近,它们就越相似。
向量的相似性度量基于距离函数,常见的距离函数有欧式距离、余弦距离、点积距离,
$$ i^* = \underset{i}{\operatorname{argmin}} \left\lVert x - x_i \right\rVert $$- 欧式距离(L2 distance): 衡量两个向量在空间中的直线距离。欧式距离存在尺度敏感性的局限性,通过归一化等技术可以有效降低尺度敏感性对相似度的干扰。欧式距离适用于低维向量,在高维空间下会逐渐失效。
- 余弦距离(Cosine similarity): 衡量两个向量之间夹角的余弦值。余弦距离存在数值敏感性的局限性,因为其只考虑了向量的方向,而没有考虑向量的长度。余弦距离适用于高维向量或者稀疏向量。
- 点积距离(Dot product similarity): 通过将两个向量的对应分量相乘后再全部求和而进行相似度衡量,点积距离同时考虑了向量的长度和方向。点积距离存在尺度敏感性和零向量的局限性。
常见向量数据库
依据是否开源与是否为专用向量数据库,将其分为四类。
第一类是开源的专用向量数据库,如 Chroma、Vespa、LanceDB、Marqo、Qdrant 和 Milvus,这些数据库专门设计用于处理向量数据。
- Milvus - 开源,由Zilliz开发,专为大规模向量相似性搜索设计,支持多种索引类型,适用于图像检索、推荐系统等场景。
- qdrant- 开源,是一款高性能的开源向量数据库,采用Rust开发,支持二进制量化技术。它提供多种索引策略和向量混合搜索功能,能够实现极高的性能(RPS>4000)和低延迟搜索。Qdrant特别适合性能敏感应用、高并发场景以及中小规模部署。
- FAISS (Facebook AI Similarity Search) - 开源库,由Facebook AI Research (FAIR)开发,针对相似性搜索进行了优化,特别是对于GPU加速的场景非常有效。当与 LangChain 结合使用时,它可以作为一个强大的本地向量存储方案,非常适合快速原型设计和中小型应用。
第二类是支持向量搜索的开源数据库,如 OpenSearch、PostgreSQL、ClickHouse 和 Cassandra,它们是常规数据库,但支持向量搜索功能。
- pgvector- 开源 pg 插件
第三类是商用的专用向量数据库,如 Weaviate 和 Pinecone,它们专门用于处理向量数据,但属于商业产品或通过商业许可获得源码。
第四类是支持向量搜索的商用数据库,如 Elasticsearch、Redis、Rockset 和 SingleStore,这些常规数据库支持向量搜索功能,同时属于商业产品或可通过商业许可获得源码。
- elasticsearch 8.0: https://www.elastic.co/search-labs/blog/vector-search-improvements
milvus
Milvus部署依赖许多外部组件,如存储元信息的ETCD、存储使用的MinIO、消息存储Pulasr 等等
qdrant
Qdrant完全独立开发,支持集群部署,不需要借助ETCD、Pulsar等组件
pgvector
<=> : 是 pgvector 的余弦距离运算符。用 1 - 距离 转成相似度分数,越接近 1 越相似。
<-> : L2 距离
FAISS
Index 类型(算法)
召回率来表示模糊检索相对于精确检索的损失.
1 Flat :暴力检索
优点:该方法是Faiss所有index中最准确的,召回率最高的方法,没有之一;
缺点:速度慢,占内存大。
适用情况:向量候选集很少(在50万以内),并且内存不紧张。
2 IVFx Flat :倒排暴力检索
优点:IVF主要利用倒排的思想,在文档检索场景下的倒排技术是指,一个key-word后面挂上很多个包含该词的doc,由于key-word数量远远小于doc,因此会大大减少了检索的时间。在向量中如何使用倒排呢?可以拿出每个聚类中心下的向量ID,每个中心ID后面挂上一堆非中心向量,每次查询向量的时候找到最近的几个中心ID,分别搜索这几个中心下的非中心向量。通过减小搜索范围,提升搜索效率。 缺点:速度也还不是很快。 适用情况:相比Flat会大大增加检索的速度,建议百万级别向量可以使用。通常可以采用 4096, 或者 16384 个聚类中心的 IVF_Flat 索引
3 PQx :乘积量化
优点:利用乘积量化的方法,改进了普通检索,将一个向量的维度切成x段,每段分别进行检索,每段向量的检索结果取交集后得出最后的Top-K。因此速度很快,而且占用内存较小,召回率也相对较高。 缺点:召回率相较于暴力检索,下降较多。 适用情况:内存及其稀缺,并且需要较快的检索速度,不那么在意召回率。
4 IVFxPQy 倒排乘积量化
优点:工业界大量使用此方法,各项指标都均可以接受,利用乘积量化的方法,改进了IVF的k-means,将一个向量的维度切成x段,每段分别进行k-means再检索。 缺点:集百家之长,自然也集百家之短
5 LSH 局部敏感哈希
原理:哈希对大家再熟悉不过,向量也可以采用哈希来加速查找,我们这里说的哈希指的是局部敏感哈希(Locality Sensitive Hashing,LSH),不同于传统哈希尽量不产生碰撞,局部敏感哈希依赖碰撞来查找近邻。高维空间的两点若距离很近,那么设计一种哈希函数对这两点进行哈希计算后分桶,使得他们哈希分桶值有很大的概率是一样的,若两点之间的距离较远,则他们哈希分桶值相同的概率会很小。 优点:训练非常快,支持分批导入,index占内存很小,检索也比较快。 缺点:召回率非常拉垮。
6 HNSWx、IndexHNSWFlat
这是一种基于图检索的改进方法,HNSWx中的x为构建图时每个点最多连接多少个节点,x越大,构图越复杂,查询越精确,当然构建index时间也就越慢,x取4~64中的任何一个整数。
优点:不需要训练,基于图检索的改进方法,检索速度极快,10亿级别秒出检索结果,而且召回率几乎可以媲美Flat,能达到惊人的97%。检索的时间复杂度为O(loglogn),几乎可以无视候选向量的量级了。并且支持分批导入,极其适合线上任务,毫秒级别实时反应时间。
缺点:构建索引极慢,占用内存极大(是Faiss中最大的,大于原向量占用的内存大小);添加数据不支持指定数据ID,不支持从索引中删除数据
向量数据库技术原理
数据向量化:这是向量数据库工作的起点,涉及将非结构化数据(如文本、图像、音频)通过机器学习或深度学习模型转化为高维数值向量的过程。这个过程被称为嵌入(Embedding),目的是捕捉原始数据的语义特征。例如,文本可以通过词嵌入模型(如Word2Vec、BERT)转换为向量,图像则可能通过卷积神经网络(CNN)提取特征向量。
向量存储:将转换后的向量存储在数据库中。由于向量通常是高维的,存储方案需高效且可扩展,以支持海量数据。这通常涉及多维索引结构,以便快速定位和检索向量。
相似度计算:向量数据库的核心功能之一是快速计算向量间的相似度。常用的距离度量方法包括欧氏距离、余弦相似度等,这些度量方法帮助评估两个向量的接近程度,从而找到最相似的向量。
近似最近邻搜索(Approximate Nearest Neighbor, ANN):为了提高大规模数据集上的查询效率,向量数据库采用ANN算法。这些算法通过预先构建索引,牺牲极小的精确度换取大幅度的查询速度提升。常见的ANN索引方法包括基于树的方法(如KD树、Ball Tree)、基于哈希的方法(如LSH、PQ)、基于图的方法(如HNSW)、以及乘积量化方法等。
索引构建与更新:构建高效索引是向量数据库的基础,这一步骤通常在数据写入时完成。随着数据的增加和更新,索引也需要动态调整和优化,以维持查询性能。
分布式与并行处理:面对大规模数据集,向量数据库往往采用分布式架构,通过并行处理和数据分片技术来分散存储和计算压力,保证系统的扩展性和高性能。
索引
向量检索算法有 kNN(k-Nearest Neighbors)和 ANN ( Approximate Nearest Neighbor) 两种。
- kNN(k-Nearest Neighbors)是一种蛮力检索方式,当给定目标向量时,计算该向量与候选向量集中所有向量的相似度,并返回最相似的 K 条。当向量库中数据量很大时 kNN 会消耗很多计算资源,耗时也不理想
- ANN ( Approximate Nearest Neighbor)其基本思想是预先计算向量间的距离,并将距离相近的向量存储在一起,从而在检索时可以更高效。预先计算就是构建向量索引的过程
在向量数据库领域,HNSW(Hierarchical Navigable Small-World)和 DiskANN 正逐渐成为主流索引方案。
其中NHSW主要以内存搜索为主,DiskANN主要以磁盘搜索为主。
HNSW(Hierarchical Navigable Small-World 层次导航小世界图)

它是跳表和小世界图(SWG)结构的扩展,可以有效地找到近似的最近邻。
HNSW是一种基于多层图的算法,在顶层,我们可以看到一个由极少向量构成的图,这些向量之间的连线最长,也就是说,这是一个由相似度最低的相连向量构成的图。 我们越深入到较低层,发现的向量就越多,图也变得越密集,越来越多的向量彼此靠得更近。 在最底层,我们可以找到所有的向量,其中相似度最高的向量彼此距离最近。在搜索时,该算法从顶层的任意入口点开始,找到与查询向量最接近的向量(由灰色点表示)。 然后,它向下移动一层,并从上层离开的同一向量开始重复相同的过程,依此类推,逐层进行,直到到达最底层并找到查询向量的最近邻。
DiskANN (DISK Approximate Nearest Neighbors)
ANN计算每个候选点与查询点之间的实际距离(如欧几里得距离、余弦相似度)。然后根据与查询点的距离/相似度对候选项进行排名。排名靠前的候选人作为近似近邻返回。