应对数据爆破年代,揭秘向量数据库怎么成为AI开发者的新宠,各数据库差异比照

跟着大模型的爆火,向量数据库也越发成为开发者重视的焦点。为了便利咱们更好地了解向量数据库,咱们特地推出了《Hello, VectorDB》系列,本文将从微观角度、向量数据库与其他算法库的差异、技能难点及怎么挑选向量数据库等方面,带咱们知道真实的向量数据库。

在正式开端前,先来了解一个背景:非结构化数据呈爆破式添加,而咱们能够经过机器学习模型,将非结构化数据转化为 embedding 向量,随后处理剖析这些数据。在此过程中,向量数据库应运而生。向量数据库是一种为了高效存储和索引 AI 模型产生的向量嵌入(embedding)数据而专门设计的数据库。

1.微观解读向量数据库

如今,强壮的机器学习模型配合 Milvus 等向量数据库的形式现已为电子商务、引荐体系、语义检索、核算机安全、制药等范畴和运用场景带来变革。而关于用户而言,除了足够多的运用场景,向量数据库还需求具有更多重要的特性,包含:

  • 可灵敏扩展、支撑调参:当向量数据库中存储的非结构化数据量添加至数亿或数十亿时,支撑跨节点水平扩展这一特性显得至关重要。因为,没有人愿意经过每 3 个月在服务器中手动刺进一次 RAM 内存条这种方法来完成扩展。此外,因为数据刺进速率、查询速度和根底硬件条件会依据运用场景而有所变化,所以向量数据库还需求支撑灵敏调参。
  • 多租户、数据隔离:为每一个新用户的数据创立一个全新向量数据库,显然不合常理。因而向量数据库需求支撑多租户。一起,经过支撑数据隔离,只要 collection 所有者答应共享数据时,collection 数据才对其他用户可见。不然,在向量数据库中对任何一个 collection 进行数据刺进、删除、查询等操作时,其他用户均不可见。
  • 完好的 API:如果没有完好的 API 和 SDK,根本算不上是真实的数据库。Milvus 向量数据库就供给了 Python、Node、Go 和 Java 等言语的 SDK,便利用户轻松衔接和办理 Milvus 向量数据库。
  • **直观的用户界面或办理控制台:**直观的用户界面能够大大下降学习本钱。用户能够经过界面来体会向量数据库发布的新功用和东西。

1.1 向量数据库与 ANN 算法库的差异

咱们常常听到一个这样的错误观念——向量数据库只是在 ANN(approximate nearest neighbor,近似最近邻)算法上封装了一层。但这种说法大错特错。

  • 向量数据库能够处理大规模数据,而 ANN 算法库只能处理小型的数据集

从本质上来看,以 Milvus 为代表的向量数据库是一套完好的非结构化数据解决计划,具有许多功用——云原生、多租户、可扩展性等。但比如 FAISS 等都是轻量级 ANN 算法库,这些算法库的首要用于构建向量索引(一种数据结构),然后加速多维向量的最近邻检索。这些算法库能够轻松应对小型数据集。可是,跟着数据集和用户数量不断添加,这些算法库无法处理大规模数据。

应对数据爆破年代,揭秘向量数据库怎么成为AI开发者的新宠,各数据库差异比照

Milvus 架构图

  • 向量数据库是一套完好的解决计划,而 ANN 算法库只是其间一部分

以 Milvus 为代表的向量数据库与 ANN 算法库另一大不同之处在于:Milvus 是一套完好的服务,而算法库是需求被集成到运用中去的。因而,从某种意义上而言,算法库是向量数据库的组件之一。这有点类似于 Elasticsearch 是一套依据 Apache Lucene 的查找引擎解决计划。

为了详细阐明这种差异, 咱们来举一个比如。

在 Milvus 向量数据库中刺进非结构化数据只需求三行代码即可。

from pymilvus import Collection
collection = Collection('book')
mr = collection.insert(data)

但关于 FAISS 或 ScaNN 这样的算法库,没有这样能够简略刺进数据的方法。即便自己经过代码完成刺进数据,ANN 算法库依然缺少可扩展性和多租户等特性。

  • 算法库间隔出产可用的产品,差了一个向量数据库的间隔

关于一个想要将向量检索功用集成进出产环境的用户,即便完成了算法库集成的开发,想要让其出产可用,更需求让其能够被运维:

  • 动态的可扩展性,在体系的压力较大时能做到扩容,供给多个可读副本
  • 高可用性,在产生反常时能够继续供给降级服务
  • 正确的快速康复,在产生反常状况后能够快速康复到正常的状况,而且确保数据的一致性和完好性
  • 多租户,足够的权限控制
  • 关于体系状况可监控,能够让运维团队乃至开发者快速发现体系反常而且处理,等等

而这些功用,是算法库本身并不具有的,往往需求成熟的数据库产品 / 服务来供给。

1.2 向量数据库与传统数据库向量检索插件的差异**

越来越多的传统联系型数据库和检索体系(如 Clickhouse、Elasticsearch 等)开端供给内置的向量检索插件。

例如,Elasticsearch 8.0 支撑经过 Restful API 来刺进向量和打开 ANN 检索。可是,向量检索插件的问题显而易见——无法供给 embedding 向量办理和检索的全栈方法。这些插件仅可在现有的架构根底上用作优化计划,运用场景十分有限。在传统数据库根底上开发非结构化数据运用就如同在汽油车中安装锂电池和电动机相同不合常理。向量检索插件不支撑灵敏调参,也不供给易用的 API 或 SDK。但这两点是向量数据库的根本特性。

为了展现向量数据库与向量检索插件的差异,文本将以 Elasticsearch ANN 查找引擎为例,其他向量检索插件运转方法类似,因而不进一步打开。

Elasticsearch 的 dense_vector 字段支撑向量数据类型,且能够经过 knnsearch endpoint 进行向量查询。

PUT index
{"mappings": {"properties": {"image-vector": {"type": "dense_vector","dims": 128,"index": true,"similarity": "l2_norm"}}}}
PUT index/_doc
{"image-vector": [0.12, 1.34, ...]}
GET index/_knn_search
{"knn": {"field": "image-vector","query_vector": [-0.5, 9.4, ...],"k": 10,"num_candidates": 100}}

Elasticsearch 的 ANN 插件仅支撑 HNSW 一种索引和 L2(欧式间隔)一种间隔核算方法。但下面,让咱们来运用向量数据库 Milvus(以 pymilvus 为例)。

>>> field1 = FieldSchema(name='id', dtype=DataType.INT64, description='int64', is_primary=True)
>>> field2 = FieldSchema(name='embedding', dtype=DataType.FLOAT_VECTOR, description='embedding', dim=128, is_primary=False)
>>> schema = CollectionSchema(fields=[field1, field2], description='hello world collection')
>>> collection = Collection(name='my_collection', data=None, schema=schema)
>>> index_params = {
        'index_type': 'IVF_FLAT',
        'params': {'nlist': 1024},
        "metric_type": 'L2'}
>>> collection.create_index('embedding', index_params)
>>> search_param = {
        'data': vector,
        'anns_field': 'embedding',
        'param': {'metric_type': 'L2', 'params': {'nprobe': 16}},
        'limit': 10,
        'expr': 'id_field > 0'
    }
>>> results = collection.search(**search_param)

尽管 Elasticsearch 和 Milvus 都支撑创立索引、刺进 embedding 向量、履行 ANN 向量检索,但从以上示例中能够显着看出,Milvus 具有更直观的向量检索 API(可更好服务用户),支撑更多样的向量索引类型和间隔核算公式(便利用户灵敏调参)。Milvus 还计划在未来支撑更多的索引类型,并答运用户经过类似 SQL 句子进行查询,然后进一步提高向量数据库的可用性。

简而言之,比如 Milvus 的向量数据库比向量检索插件更好用。因为 Milvus 是从零开端构建的向量数据库,相较而言,具有更丰厚的功用和更适合非结构化数据的体系架构。

1.3 向量数据库的优势

向量数据库的首要运用范畴为类似性检索、机器学习、人工智能等。与传统数据库比较,向量数据库具有以下几点优势:

  • 高维向量检索:向量数据库能够高效进行高维向量类似性检索,十分适用于机器学习和人工智能运用中,如:图片辨认、自然言语处理、引荐体系等。
  • 灵敏性:向量数据库能够处理多样的向量数据类型,包含稀少向量和稠密向量。此外,向量数据库还能够处理其他的数据类型,包含:数字、文本、二进制数据(Binary)。
  • 功用:相较于传统数据,运用向量数据库进行类似性检索更高效。
  • 支撑挑选不同索引结构:向量数据库支撑用户依据不同的运用场景和数据类型构建不同的索引结构。

总结一下,向量数据库在类似性检索和机器学习场景中具有显着优势,能够快速、高效检索和召回高维向量数据。

1.4 挑选向量数据库时需求考量的点

  • 功用 如上述,查询功用(查询的呼应时刻,体系的吞吐才能)是在选型向量数据库时的一个重要参阅点,市面上现有的向量数据库的 Benchmark 有:

    • ANN-Benchmark 是一种用于评价各种向量数据库和近似最近邻(ANN)算法功用的东西
    • VectorDBBench 是一款开源的关于各种干流向量数据库和云服务的功用比照东西,供给了 QPS / 本钱 / 呼应延时等多个维度的比较,供给了便利的 Web UI
    • LeaderBoard TL;DR VectorDBBench 的 “太长不看” 版别
  • 本钱

因为 AIGC 浪潮的火热, 许多新的开发者涌入这个范畴,因而在挑选向量数据库产品时,本钱也是用户详细做出决策的重要目标。在产品初期,数据体量不大的状况下,能够用最少的本钱达到运用需求的呼应时刻和体系吞吐,是开发者最期望达到的目标。

  • 功用和易用性

除了功用之外,一款流行的数据库必然也供给了出产可用的产品特性,如:

  • 高可用,快速康复
  • 成熟的目标监测体系及告警体系
  • 定时备份及康复

而且相较于算法库,能够关于用户屏蔽许多底层细节:

  • 依据存储 / 功用考量,自动挑选向量索引类型
  • 依据需求的召回率(Recall)动态决定查找参数

这些往往是用户在功用之外,挑选向量数据库时考量的点。

2.向量检索实战&向量数据库怎么挑选

2.1 快速入门向量检索

2.1.1 Python-NumPy完成

向量数据库具有快速核算向量类似度的优势,能在 N 个向量中找出与目标向量在高维空间中最类似的前 K 个向量。但是,这种才能并非仅有向量数据库所具有。例如,咱们能够经过运用 Python 的 NumPy 库,用不到 20 行代码就能完成最近邻算法。

以下是一个简略的比如:

import numpy as np
#Function to calculate euclidean distance
def euclidean_distance(a, b):
    return np.linalg.norm(a - b)
#Function to perform knn
def knn(data, target, k):
    #Calculate distances between target and all points in the data
    distances = [euclidean_distance(d, target) for d in data]
    #Combine distances with data indices
    distances = np.array(list(zip(distances, np.arange(len(data)))))
    #Sort by distance
    sorted_distances = distances[distances[:, 0].argsort()]
    #Get the top k closest indices
    closest_k_indices = sorted_distances[:k, 1].astype(int)
    #Return the top k closest vectors
    return data[closest_k_indices]

咱们能够试着生成 100 个 2 维向量,然后找出与向量 [0.5,0.5] 最近的邻居。

代码如下:

#Define some 2D vectors
data = np.random.rand(100, 2)
#Define a target vector
target = np.array([0.5, 0.5])
#Define k
k = 3
#Perform knn
closest_vectors = knn(data, target, k)
#Print the result
print("The closest vectors are:")
print(closest_vectors)

这种方法具有很大的灵敏性,且完成起来本钱低。如果你契合以下状况,我会引荐你运用 NumPy 或其他机器学习库进行向量查找:

  • 快速进行原型验证。
  • 没有数据耐久化的需求。
  • 数据量小于一百万,且没有标量过滤的需求。
  • 对查询功用要求不高。

2.1.2 FAISS 的向量检索

相对地,如果你需求快速构建原型体系并对功用有必定要求,FAISS 可能是一个好挑选。FAISS 是 Meta 开源的一个库,用于高效类似性查找和密集向量聚类。它能处理恣意巨细的向量调集,乃至是无法悉数装入内存的调集。FAISS 还包含了用于评价和参数调优的东西。FAISS 是用 C++ 编写的,但供给了完好的 Python/NumPy 接口。

以下是一个依据 FAISS 的向量检索代码:

import numpy as np
import faiss
#Generate some example data
dimension = 64                            # dimension of the vector space
database_size = 10000                     # size of the database
query_size = 100                          # number of queries to perform
np.random.seed(123)                       # make the random numbers predictable
#Generating vectors to index in the database (db_vectors)
db_vectors = np.random.random((database_size, dimension)).astype('float32')
#Generating vectors for query (query_vectors)
query_vectors = np.random.random((query_size, dimension)).astype('float32')
#Building the index
index = faiss.IndexFlatL2(dimension)  # using the L2 distance metric
print(index.is_trained)              # should return True
#Adding vectors to the index
index.add(db_vectors)
print(index.ntotal)                  # should return database_size (10000)
#Perform a search
k = 4                                # we want to see 4 nearest neighbors
distances, indices = index.search(query_vectors, k)
#Print the results
print("Indices of nearest neighbors: n", indices)
print("nL2 distances to the nearest neighbors: n", distances)

看起来足够简略,功用好像也足够快,也能够敷衍小规模的出产场景。当然,还能够经过量化、降维、运用 GPU 等计划进一步提高查询功用。

但是,**尽管向量查找库如 Faiss 供给了强壮和高效的向量查找功用,但在实际出产环境中,它们存在一些约束。**例如,Faiss 并没有供给处理数据的实时增删、缺少多言语的支撑,无法供给长途调用、不支撑标量过滤、也不供给数据的耐久化,可扩展性和容灾等问题的解决计划。

2.1.3 向量数据库之间的比照

正是因为这些原因,向量数据库应运而生,为咱们供给了一种更完好、更适合实际运用场景的解决计划。向量数据库战场目前首要分为四个类别:

  • **依据 PG、Clickhouse 等进行魔改或许插件化完成的向量数据库。**这类解决计划以现有的联系数据库或列存数据库作为根底,经过修改或插件扩展的方法添加向量查找功用,PG Vector 是这类解决计划的代表产品。
  • **依据传统倒排查找添加稠密向量索引支撑的向量数据库。**这类解决计划以倒排索引查找引擎作为根底,经过扩展索引机制以支撑向量查找,ElasticSearch 是这类解决计划的代表产品。
  • **依据向量检索库完成的轻量级向量数据库。**这类解决计划以向量查找库(如 Faiss)为中心,环绕其构建数据库功用。这些产品一般具有较小的体积和较高的运转功率,Chroma 是这类解决计划的代表产品。
  • **依据原生向量设计的分布式向量云原生数据数据库。**这类解决计划从零开端设计和完成向量数据库,整个体系从底层到顶层都针对向量查找进行了优化,一般供给了更完好和高档的功用,包含分布式核算、容灾备份、数据耐久化等,Zilliz Cloud/Milvus 是这类解决计划的代表产品。

不过,“Not All Vector Database are born equal”(并非所有向量数据库都生来相等)。在各类向量数据库中,每种解决计划都有其独特的长处和约束,而且它们各自适合于不同的运用场景。

在所有的向量数据库计划中,我个人对依据 PG、Clickhouse 等 进行魔改或许插件化完成的向量数据库(如 PG Vector)以及依据原生向量设计的分布式向量云原生数据数据库(例如 Zilliz Cloud/Milvus)这两种截然不同的解决计划特别看好。

接下来咱们需求从用户场景需求,向量数据库的发展前史,向量检索的特殊性等多个角度来综合剖析原因。

2.2 专用向量数据库的价值

**向量数据库最早诞生于 2019 年,由 Zilliz 公司推出并开源了全球首款向量数据库 Milvus。**在那个时期,向量数据库的功用比较照较简略,首要是依据向量检索库 Faiss 的根底上,封装了长途过程调用(RPC)接口,并支撑了依据 Write-Ahead Logging(WAL)的耐久化才能。

**比较于传统的向量检索方法,Milvus 1.0 的最大意义在于解耦了事务逻辑、模型和数据存储这三者之间的严密相关。**这意味着运用开发者不再需求重视底层根底设施的保护作业,这些作业包含但不限于集群的布置、数据的耐久化和数据的迁移等。因而,Milvus 1.0 为许多用户供给了从传统烟囱式的人工智能开发形式向大模型年代(在这个年代,开发者常常运用如下的开发形式:大言语模型(LLM)+ 编列东西 + 向量数据库)的过渡。

传统的向量检索运用场景包含了引荐体系、以图搜图、问答机器人、内容风控,面向的首要是具有较强 AI 才能和运维才能的企业级用户,用户重视的首要是查询才能、功用、大数据量下的可扩展性以及可运维性、可观测性、安全性等企业级才能。

**跟着大模型技能的蓬勃发展,向量数据库开端进入 2.0 年代,更多的个人开发者涌入赛道,对向量数据库的重视也逐渐迁移到开发功率、布置简略以及面向大模型加强场景的功用需求。**也正是这波狂热的浪潮下诞生了比如 Chroma 这样的套壳向量数据库,其跟存储引擎相关的代码不过寥寥十个文件。

不止 Chroma,DataStax、Redislab 等传统数据库厂商也纷繁参加战局。正如上文中说到的,依据 numpy 或许 Faiss 能够五分钟快速完成一个 “向量数据库”。但是,向量数据库绝不只是是用来进行简略的向量检索,要想真实提高开发者的开发功率和运用本钱,需求体系开发者深入了解硬件、存储、数据库、AI、高功用核算、分布式体系、编译原理、云原生等方方面面,以确保其稳定性、功用和易用性。

构建向量数据库就像搭积木相同,需求分模块、分层次

  • 数据耐久化和低本钱存储

**作为一个数据库,数据不丢是最低的底线。**许多单机和轻量级的向量数据库并没有重视数据的可靠性,Milvus 依据对象存储和音讯行列的存储计划既经过存储核算别离提高了体系的弹性和扩展性,又确保了体系的可耐久化性。更为重要的是,大多数 ANN 索引都是纯内存加载的,需求耗费许多内存才能履行检索。Milvus 是全球第一款支撑磁盘索引的向量数据库,比较磁盘索引能够供给 10 倍以上的存储性价比。

  • 高功用查询

**查询功用是挑选 ANN 而非 KNN 暴力查找的中心需求。**经过测试,市面上许多传统数据库向量检索插件其查询功用只要 Milvus 十分之一,且因为没有对索引进行分片,索引构造的时刻和功率会跟着数据量的添加大幅下降,因而只能适用于千万级数据量且不存在频繁增删的场景。

作为一个核算密集型运用,向量数据库的重要重视点在于充沛压榨 CPU 算力,乃至利用异构算力完成加速。依据咱们的内部测试成果,GPU 向量索引能够完成在千万数据集下万级别的 QPS,单机功用高于传统 CPU 索引一个数量级。向量数据库既是一个数据库,也是一个高功用核算体系,开发者需求具有很强的 Hardware sympathy,这也是我以为咱们需求 Purpose built 向量数据库的重要原因。

  • 数据分布

**传统数据库的分库分表分片往往依据主键或许分区键。**关于传统数据库而言这种设置十分合理,原因是用户查询时往往给出切当的查询条件并路由到对应的分片。关于向量数据库而言,查询往往是找到全局与目标向量类似的向量,此时查询往往需求像 MPP 数据库相同在所有分区履行,算力需求跟着数据量添加而添加。

向量原生数据库将向量作为一等公民,能够依据向量数据分布设置合理的分区策略,并充沛利用数据分布信息设置查询策略来提高查询功用和查询精度。

  • 易于运用

关于终究什么是易用,不同的用户应该有自己的界说。向量数据库市场上,依据 GRPC 完成的多言语客户端,原生 Restful 接口和 SQL 接口都不乏拥簇。

见证了曩昔 10 年 NoSQL 到 NewSQL 的发展进程,我更愿意信任 SQL 这种表达才能愈加丰厚的查询句子才是最终的解决计划。除了根本的标量过滤,咱们现已见到了用户关于聚合函数(Count,Groupby),函数和 Pagination 等传统数据库才能的需求。这也是我更看好依据 PG、Clickhouse 等进行魔改或许插件化完成的向量数据库的完成途径的一个原因。在对向量检索功用扩展性要求不高的场景下,这种完成方法的功用覆盖面更广,且与传统用户的运用心智更为接近。

与此一起,向量数据库的功用和数据模型有必要贴近用户的运用场景。关于 AIGC 用户来讲,动态 Schema、多向量打分、标量向量混合打分、依据间隔的规模查询这些查询才能都十分贴近事务场景,而这些场景并非简略的依据开源向量检索库就能够快速完成。

  • 稳定可用

**向量数据库是典型的 Big Data Serving 体系。**一方面,向量数据库的写入来源于上游的推理体系,存在十分显着的离线和批量特性。另一方面,向量数据库许多运用场景面向在线查询,有严厉的查询时延约束和高吞吐要求。在向量数据库的运用场景中,许多用户都要求单机毛病能在分钟级康复,一起也有越来越多的要害场景提出了主备容灾乃至跨机房容灾的需求。依据向量数据库的运用场景,传统依据 Raft/Paxos 的复制策略存在着资源浪费严峻,数据预先分片困难等问题。Milvus 依据分布式存储和音讯行列完成数据的可用性,依据 K8s 完成无状况毛病康复的无疑更省资源,毛病康复时刻也更短。

**向量数据库的稳定性另一个重要挑战是资源办理。**传统数据库愈加重视磁盘、网络等 IO 资源的调度办理,而向量数据库的中心瓶颈是核算和内存。Milvus 社区也有许多关于内存的办理和算力的调度的 PR,这些才能很难短期之内经过改造传统数据库或许在 Chroma 这种轻量级向量数据库中完成。

  • 可运维可观测

想要成为一个企业级数据库,Milvus 不只是是供给软件,打包发布这么简略。Milvus 支撑多种布置形式,例如 K8s Operator 和 Helm chart、docker compose、pip install 等,并供给了依据 grafana、prometheus 和 Loki 的监控报警体系。Zilliz 还开源了向量数据库可视化办理组件 Attu 以及向量数据库可视化东西 Feder,大大下降了向量数据库的办理难度,提高了向量检索的可解释程度。

**得益于 Milvus 2.0 的分布式云原生架构,Milvus 也是业内首款支撑多租户隔离、RBAC、Quota 限流、翻滚晋级的向量数据库。**因为向量数据库核算、内存密集型的特性,传统数据库的隔离和限流才能很难在不做改造的状况下直接发挥作用。

  • 智能化

Milvus 是一个 DB4AI 的体系,一起也是做了许多 AI4DB 的尝试。向量数据库与传统数据库的最大差异来源于对数据的回来准确度要求不同。传统数据库要求百分之百正确的回来成果,而向量数据库的 ANN 核算天生就归于近似匹配。经过 AI 改造向量数据库体系,其空间远远大于传统数据库进行调优或辅助问题排查。

依据 Milvus 打造的全保管企业级向量检索服务 Zilliz Cloud 创造性地提出了 AutoIndex,经过模型猜测 recall 设置对应的查询参数,在大数据量下能够在 recall 几乎无损的状况完成 2-3 倍 的功用优化。不仅如此,量化技能,降维,ranking 等传统 AI 范畴的技能也被广泛运用于向量数据库中,传统数据库开发者显着缺少对这些技能的了解。

参阅文档

尽管构建向量数据库的是一件复杂的作业,运用向量数据库却是一件如运用 numpy、Faiss 般简略的作业,即便对 AI 并不了解的同学也能够在十分钟内依据 Milvus 快速完成向量检索。想要体会高功用,强扩展性的向量检索服务,只是需求三步:

1)请先参阅 Milvus 布置文档 milvus.io/docs/instal… 布置 Milvus 服务。

2)参阅 Hello Milvus 文档 milvus.io/docs/exampl… 行代码即可完成向量检索功用。

3)检查 Towhee 的范例文档 github.com/towhee-io/e…

更多优质内容请重视公号:汀丶人工智能;会供给一些相关的资源和优质文章,免费获取阅览。