向量数据库 VS 知识图谱
图数据库擅长推理能力,但是图实体模型建立本身门槛高,需要大量专业人员。向量数据库人工介入较少,但是结果准确度就差一些,各有各合适空间。下面是两者的对比:
向量数据库+大模型 | 图数据库+知识图谱 | |
性能 | 数据量大,性能更好 | 数据量大,性能受挑战 |
复杂问题 | 复杂问题,查询结果不一定完整 | 复杂问题,可以取得更可靠的内容 |
建模难度 | 适合处理非结构化数据,文本转换成高维向量 | 实体关系建模,构建知识图谱 建模工作难度和工作量很大 |
适合场景 | 智能推荐系统:找出相似的,不需要精确 | 决策支持系统,需要梳理特定关系,保证逻辑关系正确性 |
如果一个业务到底要选型向量还是知识图谱,就要从多个维度去考虑,下面是建议参考和选型的维度:
向量数据库 | 知识图谱 | |
问题复杂度 | 非结构化,无复杂关系的选向量 | 大量相互关联知识实体 |
使用场景 | 简单相似度搜索,用向量数据库 | 基于实体关系的,复杂推理 |
数据量考量 | 扩展性高,数据量大 | 数据增长,关系复杂,维护难度会变高 |
团队能力 | 人力缺乏,选向量 | 事件建模,开发,算法技能 |
Milvus
主要处理从非结构化数据转换而来的嵌入向量。如果两个嵌入向量非常相似,那么意味着原始数据源也是相似的。
向量索引
向量索引是从原始数据派生出的重新组织的数据结构,可大大加速向量相似性搜索的过程。Milvus 支持多种向量索引类型。其主要目的是优化向量相似性搜索的性能。
Milvus 支持的大多数向量索引类型使用近似最近邻搜索(ANNS),包括:
-
FLAT:FLAT 最适合于在小型百万级数据集上寻求完全准确和精确的搜索结果的场景。
-
IVF_FLAT:IVF_FLAT 是基于量化的索引,最适合于在准确性和查询速度之间寻求理想平衡的场景。还有一个 GPU 版本 GPU_IVF_FLAT。
-
IVF_SQ8:IVF_SQ8 是一种基于量化的索引,最适合于在磁盘、CPU 和 GPU 内存消耗非常有限的场景。
-
IVF_PQ:IVF_PQ 是一种基于量化的索引,最适合于在牺牲准确性的情况下追求高查询速度的场景。还有一个 GPU 版本 GPU_IVF_PQ。
-
HNSW:HNSW 是一种基于图的索引,最适合于对搜索效率有很高要求的场景。
选择合适的向量索引技术需要考虑以下几个关键因素:
1、数据规模和维度:
-
对于小规模、低维度的数据集,可以考虑使用FLAT(暴力搜索)等简单索引。
-
对于大规模、高维度的数据集,需要选择更高效的索引方法,如HNSW或IVF系列。
2、查询性能要求:
-
如果对查询速度要求极高,可以选择HNSW等基于图的索引方法。
-
如果可以接受稍慢的查询速度,但需要更高的准确率,可以考虑IVF系列索引。
3、内存限制:
-
对于内存受限的场景,可以选择IVF_PQ等压缩索引方法来降低内存占用。
-
如果内存充足,可以选择HNSW等内存占用较大但性能更好的索引。
4、数据更新频率:
-
对于频繁更新的数据集,应选择支持动态插入的索引方法,如HNSW。
-
对于静态数据集,可以选择IVF等需要预先构建的索引方法。
5、精度要求:
-
如果需要精确结果,可以选择FLAT或IVF_FLAT等精确索引。
-
如果允许近似结果,可以选择HNSW、IVF_PQ等近似索引来提高性能。
6、硬件资源:
-
如果有GPU资源,可以考虑支持GPU加速的索引方法。
-
对于分布式环境,需要选择支持分布式部署的索引技术。
7、应用场景:
-
对于图像检索,HNSW通常表现较好。
-
对于文本检索,IVF系列索引可能更适合。
8、可扩展性:
-
考虑数据规模增长的趋势,选择具有良好可扩展性的索引方法。
9、工程化考虑:
-
评估不同索引方法的实现复杂度和维护成本。
-
考虑团队的技术栈和经验。
10、实际测试:
-
在最终决策前,建议使用真实数据集进行benchmark测试,比较不同索引方法的性能。
总之,没有一种索引方法能够适用于所有场景。需要根据具体的应用需求、数据特征和资源限制,权衡各种因素,选择最适合的向量索引技术。在实际应用中,可能还需要结合多种索引方法,或者对选定的索引方法进行参数调优,以达到最佳效果。
索引类型 | 使用场景 | 向量规模 | 召回率 | 检索速度 | 写入速度 |
FLAT | 暴力检索,召回率100%,但检索效率低。 | 10万以内 | 最高,可保证100%召回率 | 慢 | 慢 |
HNSW | 基于图算法构建索引,可通过调整检索参数提升召回率。 检索效率高,但数据量大后写入效率会变低。 | 10万-1亿 | 95%+,可根据参数调整 | 快 | 慢 |
IVF系列 | 基于聚类算法构建的索引,可通过参数调整召回率,适用于上亿规模的数据集,检索效率高,内存占用低,写入效率高。 | 1亿以上 | 95%+,可根据参数调整 | 快 | 快(批量写入后统一构建索引) |
向量相似度计算
内积(IP)
全称为 Inner Product,内积也称点积,计算结果是一个数。它计算两个向量之间的点积(内积),其计算公式如下所示。其中,a = (a1, a2,..., an) 和 b = (b1, b2,..., bn) ,是 n 维空间中的两个点。计算所得值越大,越与搜索值相似。
欧式距离(L2)
欧式距离(L2)全称为 Euclidean distance,指欧几里得距离。它计算两个向量点在空间中的直线距离。计算公式如下所示。其中,a = (a1, a2,..., an) 和 b = (b1, b2,..., bn) 是 n 维空间中的两个点。它是最常用的距离度量。计算所得的值越小,越与搜索值相似。L2在低维空间中表现良好,但是在高维空间中,由于维度灾难的影响,L2的效果会逐渐变差。
余弦相似度(COSINE)
余弦相似度(Cosine Similarity)算法,是一种常用的文本相似度计算方法。它通过计算两个向量在多维空间中的夹角余弦值来衡量它们的相似程度。其计算公式如下所示。其中,a = (a1, a2,..., an) 和 b = (b1, b2,..., bn) 是 n 维空间中的两个点。|a|与|b|分别代表 a 和 b 归一化后的值。cosθ 代表 a 与 b 之间的余弦夹角。计算所得值越大,越与搜索值相似。取值范围为[-1,1]。
在向量归一化之后,内积与余弦相似度等价。余弦相似性只考虑向量夹角大小,而内积不仅考虑向量夹角大小,也考虑了向量的长度差。
其他距离可以参考文档:
机器学习中的数学——距离定义:基础知识_知识距离定义-CSDN博客
向量相似性搜索
向量相似性搜索是将一个向量与数据库中的向量进行比较,以找到与目标搜索向量最相似的向量的过程。近似最近邻(ANN)搜索算法被用来计算向量之间的相似度。
通过搜索算法找到与查询向量最相似的向量。常用的算法包括K最近邻(KNN)、近似最近邻(ANN)。
ANN(Approximate Nearest Neighbor)和KNN(K-Nearest Neighbor)在原理上有以下主要区别:
-
搜索方式:
-
KNN对所有数据点进行全面搜索,计算查询点与所有点的距离。
-
ANN只在一小部分候选点中搜索,通常使用聚类等技术来选择这些候选点。
-
时间复杂度:
-
KNN的时间复杂度为O(N),随数据规模线性增长。
-
ANN的时间复杂度为O(log N),对大规模数据更高效。
-
准确性:
-
KNN提供精确结果,能找到真正的K个最近邻。
-
ANN提供近似结果,结果可能不是最精确的,但通常足够好。
-
适用场景:
-
KNN适合小到中等规模数据集,需要精确结果的场景。
-
ANN适合大规模、高维数据集,或需要快速计算的场景。
-
实现复杂度:
-
KNN实现相对简单直观。
-
ANN实现更复杂,涉及额外的索引构建步骤。
-
可扩展性:
-
KNN在数据规模增大时性能下降明显。
-
ANN具有更好的可扩展性,能更好地处理大规模数据。
总的来说,KNN追求精确结果但计算开销大,ANN牺牲一定精度换取更高效的搜索,两者各有优势,需要根据具体应用场景选择。