前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,向量数据库发挥的作用越来越重要。
一、数据库简介
关系型数据库和非关系型数据库都是用于存储和查询数据的系统,但它们在数据的组织、性能、可扩展性和用例方面有很大的不同。下面是对两者的详细介绍:
关系型数据库:关系型数据库(RDBMS)基于“关系模型”,将数据存储在预定义的表中,表之间通过关联键建立关联。每个表都由行和列组成,每列包含表中每个条目的特定属性,每行则代表一条记录。RDBMS可以保证数据的一致性、原子性、隔离性和持久性(即ACID属性)。例如,MySQL,Oracle,和SQL Server都是关系型数据库。
非关系型数据库:非关系型数据库(NoSQL)并不依赖于传统的表结构来存储数据,而是采用各种数据模型,如键值对、列族、文档和图形。这使得非关系型数据库在处理大量分散的数据、并行运算和高度变化的数据结构方面具有优势。例如:
向量数据库:向量数据库是一种非关系型数据库,专门用于存储和处理向量数据。这些数据库主要用于处理需要理解数据内在语义的应用(例如,使用深度学习和人工智能技术)。向量数据库被设计用来处理高维数据,可以高效地执行相似性搜索和其他向量相关的查询。
图形数据库:图形数据库使用图形结构存储数据,其中节点代表实体,边代表实体之间的关系。它们优于关系型数据库和其他非关系型数据库,当数据和关系复杂且高度连通时。例如,Neo4j和Amazon Neptune是两种常见的图形数据库。
文档存储数据库:文档数据库以文档形式存储数据,这些文档通常采用JSON或XML格式。每个文档可以包含一组键值对,可以嵌套并包含复杂的数据类型。文档数据库非常灵活,可以轻松处理不规则或动态的数据结构。MongoDB和CouchDB是两种常见的文档数据库。
二、向量数据库应用框图
一个典型的基于向量数据库的应用框图可以表示如下:
拆解一下可以分为几个步骤:
1、首先,我们使用嵌入模型为我们想要索引的内容创建向量嵌入。
2、将向量嵌入插入向量数据库,并引用创建嵌入的原始内容。
3、当应用程序发出查询请求时,我们使用相同的嵌入模型为查询创建嵌入,并使用这些嵌入查询数据库中的相似向量嵌入。
通俗易懂版本:
假设你在运营一个在线音乐平台,你希望通过AI算法为每个用户推荐最符合他们音乐品味的歌曲。为了实现这个功能,你首先需要将每一首歌曲和用户的音乐品味都转化为一个向量。这个向量可能包含歌曲的各种特性,比如节奏、音调、歌曲类型等,对于用户,它可能包含他们以往听过的歌曲类型、评价的歌曲等信息。这些向量被称为嵌入,它们将复杂的歌曲信息或用户信息压缩在一个多维的向量中,这个向量在数学上能够表达歌曲或者用户间的关系。
然后,你可以将这些歌曲的嵌入插入到向量数据库中。当一个用户登陆平台,我们就可以根据他的音乐品味向量在向量数据库中查询,找到最接近该向量的歌曲向量,然后推荐这些歌曲给用户。
这个例子中并没有用到嵌入模型,在实际应用中,向量化歌曲和用户的过程通常会涉及到嵌入模型,这个模型能够将具有丰富语义信息的实体(如歌曲或用户)转化为向量。 例如,你可以使用某种嵌入模型,为每一首歌曲生成一个嵌入(也就是向量)。这个嵌入能够捕获歌曲的各种特性(如曲风、节奏、歌词情感等)。同样,你也可以用类似的方法生成用户的嵌入,可能基于他们的听歌历史、评价、喜欢的歌曲类型等。
三、向量数据库 vs 向量索引
简单来说,向量索引可以被视为向量数据库的一个组成部分或核心组件。向量索引关注的是查询效率,而向量数据库则提供一个完整的解决方案,用于处理向量数据的存储和检索。
在大数据时代,如Facebook AI Similarity Search(FAISS)这样的独立向量索引获得了广泛应用,它们在提升向量嵌入的搜索和检索能力方面表现突出。但是,这些独立的工具在一些关键功能方面却无法比肩数据库。为了弥补这一缺陷,向量数据库应运而生,它们专门为管理向量嵌入而设计,相比单独使用向量索引,向量数据库具备多项优势:
数据管理:向量数据库拥有诸如插入、删除和更新数据等用户熟知且易用的数据存储功能,这使得向量数据的管理和维护比使用FAISS等独立向量索引更为简便,后者需要额外集成存储解决方案,增加了复杂性。
元数据存储和筛选:向量数据库能够储存与每个向量条目相关的元数据,用户可以借助元数据过滤器进行更精细的查询。
可扩展性:向量数据库在设计初期就考虑到了随着数据量和用户需求的增长进行扩展的需求,更好地支持分布式和并行处理。相比之下,独立向量索引要达到相似的扩展性可能需要定制解决方案,例如在Kubernetes集群或其他类似系统上进行部署和管理。
实时更新:向量数据库通常支持实时数据更新,以适应数据动态变化的需求,而独立的向量索引在接纳新数据时可能需要全面的重新索引过程,这既耗时又占用大量计算资源。
备份与集合:向量数据库能够处理所有在数据库中存储的数据的常规备份操作。
生态系统集成:向量数据库可以更轻松地与数据处理生态系统的其他部分进行集成,例如ETL管道(如Spark)、分析工具(如Tableau和Segment)、可视化平台(如Grafana)。这种集成简化了数据管理流程,同时也方便了与LangChain、LlamaIndex和ChatGPT插件等AI相关工具的集成。
数据安全与访问控制:向量数据库通常配备内置的数据安全功能和访问控制机制以保护敏感信息,而这些功能在独立的向量索引解决方案中可能无法实现。
简而言之,向量数据库通过解决独立向量索引的局限性——如可扩展性挑战、繁琐的集成过程、缺乏实时更新和内置安全措施,提供了处理向量嵌入的优越解决方案,确保了更有效和流畅的数据管理体验。
四、向量数据库的工作原理
对于我们大多数人来说,传统数据库的运行方式并不陌生——它们在行和列中存储字符串、数字和其他类型的标量数据。然而,向量数据库的工作对象是向量,因此,其优化和查询方式大不相同。
在传统数据库中,我们通常查找数据库中与查询完全匹配的行值。而在向量数据库中,我们采用相似性度量来查找与查询最相似的向量。
向量数据库结合运用了各种算法来实现近似最近邻(ANN)搜索,包括哈希、量化或基于图的搜索等,以优化搜索过程。
这些算法被整合成一种流程,以实现快速准确地查找查询向量的邻居。鉴于向量数据库提供的是近似结果,我们需要在精度与速度之间做出权衡。结果越精确,查询的速度就越慢。不过,良好的系统能够在接近完美精度的同时,提供极速的搜索体验。 下面是向量数据库的常见工作流程:
索引:向量数据库利用PQ、LSH或HNSW等算法为向量建立索引。此步骤将向量映射到一种数据结构中,以便加速搜索。
查询:向量数据库将索引的查询向量与数据集中的索引向量进行比较,找到最近的邻居(应用该索引使用的相似性度量)。
后处理:在某些情况下,向量数据库从数据集中检索最终的最近邻居,并进行后处理以返回最终结果。此步骤可能包括使用不同的相似性度量重新对最近邻居进行排序。
在接下来的部分,我们将更详细地探讨这些算法,并阐述它们如何共同提升向量数据库的整体性能。
常见的embedding算法
文本Embedding
文本嵌入技术主要用于将文本数据转化为机器学习模型可以理解和使用的形式。Word2Vec、GloVe、FastText是常见的词嵌入技术,它们都可以将单词映射到密集的向量中。这些技术在文本分类、情感分析和机器翻译等任务上都有着广泛的应用。 Word2Vec有两种架构:连续词袋模型(CBOW)和Skip-gram。GloVe则通过构造全局的词-词共现矩阵来学习词向量。FastText则在Word2Vec的基础上,加入了字符级别的n-gram信息,使其在处理罕见词和词形变化上更具优势。 然而,这些模型生成的词嵌入通常不包含词在特定上下文中的语义。为了解决这个问题,研究者引入了基于Transformer的模型,如BERT, GPT, XLNet等。这些模型可以生成更具上下文语义的词嵌入。这类模型通常被预训练在大量的文本数据上,然后可以在特定的任务上进行微调。
图像Embedding
图像嵌入技术的目标是将图像数据转化为可用于机器学习模型的形式。卷积神经网络(CNN)是用于图像嵌入的主要工具,其中VGG, ResNet, Inception等架构是非常经典的模型。这些模型通过卷积层和池化层来提取图像的局部特征,并生成表示图像内容的高维向量。 近年来,深度生成模型如变分自编码器(VAE)和生成对抗网络(GAN)也被用于生成图像的嵌入向量。另外,Transformer模型如ViT(Vision Transformer)也在图像处理上取得了不错的效果。ViT是一种将图像分割为多个小块,然后使用Transformer进行处理的模型。
图 Embedding
图嵌入技术的目标是将图中的节点和边转化为可以用于机器学习模型的形式。经典的算法如DeepWalk和node2vec使用随机游走和Word2Vec的思想来生成图中节点的嵌入向量。GraphSAGE算法则可以生成邻居节点的嵌入向量。 图神经网络(GNN)和它的一些变体如GCN, GAT等,使用节点的特征和邻接矩阵来生成节点的嵌入,它们在处理图结构数据上表现出了很好的性能。这些模型可以捕获图的拓扑结构和节点的属性信息,并将这些信息编码到低维向量中,从而方便后续的任务,如节点分类、链接预测和图分类等。
音频Embedding
音频嵌入技术的目标是将原始的音频信号转化为机器学习模型可以理解的形式。经典的方法主要是使用一些信号处理的技术,如傅立叶变换和MFCC(梅尔频率倒谱系数)等来提取音频的特征。 深度学习的方法如卷积神经网络(CNN)和循环神经网络(RNN)在音频嵌入中有广泛的应用。例如,WaveNet是一个生成模型,可以直接对原始音频波形进行建模。最近,也有研究者开始尝试使用Transformer模型来处理音频数据,这表明了Transformer模型在各种类型的数据嵌入上的强大潜力。
常见的向量索引算法
所有向量索引算法的核心思想大部分都是对向量进行压缩(花式降维)从而提高检索效率。
随机投影
随机投影背后的基本思想是使用随机投影矩阵将高维向量投影到低维空间。我们创建一个随机数矩阵,矩阵的大小将是我们想要的目标低维值。然后,我们计算输入向量和矩阵的点积,得到一个维度比我们的原始向量少但仍保留其相似性的投影矩阵。
当我们查询时,我们使用相同的投影矩阵将查询向量投影到低维空间。然后,我们将投影的查询向量与数据库中的投影向量进行比较,找到最近的邻居。由于数据的维度降低,搜索过程比搜索整个高维空间快得多。
请记住,随机投影是一种近似方法,投影质量取决于投影矩阵的属性。一般来说,投影矩阵越随机,投影的质量就越好。但是,生成真正的随机投影矩阵可能在计算上昂贵,尤其是对于大型数据集。
乘积量化
另一种构建索引的方式是乘积量化(PQ),这是一种对高维向量(如向量嵌入)的有损压缩技术。它接收原始向量,将其分解为更小的块,通过为每个块创建代表性的“代码”简化每个块的表示,然后再将所有的块重新组合在一起 - 在不丧失对相似性操作至关重要的信息的情况下。PQ的过程可以分为四个步骤:拆分、训练、编码和查询。
拆分 - 将向量分解为段。
训练 - 我们为每个段建立一个“码本”。简单来说,算法生成一组可能被分配给向量的潜在“代码”。在实践中,这个“码本”是由对向量的每个段执行k-means聚类生成的集群中心点组成的。我们在段码本中的值的数量将与我们用于k-means聚类的值相同。
编码 - 算法为每个段分配一个特定的代码。在实践中,我们在训练完成后,找到码本中与每个向量段最接近的值。我们的PQ代码将是码本中相应值的标识符。我们可以使用尽可能多的PQ代码,这意味着我们可以从码本中选择多个值来代表每个段。
查询 - 当我们查询时,该算法将向量分解为子向量,并使用相同的码本对它们进行量化。然后,它使用索引的代码找到与查询向量最接近的向量。
码本中代表性向量的数量是表示准确性和搜索码本的计算成本之间的权衡。码本中代表性向量越多,子空间中向量的表示就越准确,但是搜索码本的计算成本就越高。相反,码本中代表性向量越少,表示就越不准确,但计算成本就越低。
局部敏感哈希
局部敏感哈希(LSH)是一种在近似最近邻搜索中进行索引的技术。它优化了速度,同时仍能提供近似的、非详尽的结果。LSH使用一组哈希函数将相似的向量映射到“桶”中。
为了找到给定查询向量的最近邻居,我们使用与“桶”相似向量的哈希函数一样的哈希函数。查询向量被哈希到一个特定的表,然后与同一表中的其他向量进行比较,以找到最接近的匹配。这种方法比搜索整个数据集快得多,因为每个哈希表中的向量数量远少于整个空间。
重要的是要记住,LSH是一种近似方法,近似的质量取决于哈希函数的属性。一般来说,使用的哈希函数越多,近似的质量就越好。然而,使用大量的哈希函数在计算上可能很昂贵,并且可能不适合大型数据集。
分层可导航的小世界(HNSW)
HNSW创建了一个分层的、树状结构,其中每个节点代表一组向量。节点之间的边表示向量之间的相似性。该算法首先创建一组节点,每个节点包含少量的向量。这可以通过随机或者通过使用像k-means这样的算法对向量进行聚类来完成,每个聚类成为一个节点。
然后,该算法检查每个节点的向量,并在该节点与最相似的向量的节点之间画出一条边。当我们查询一个HNSW索引时,它使用这个图来导航整个树,访问最有可能包含与查询向量最接近的向量的节点。
局部聚合描述符向量(VLAD)
VLAD是一种用于聚合特征描述符的技术,常用于图像和视频检索任务。VLAD 的基本思想是将一个集合的局部描述符(如 SIFT 或 SURF 特征)聚合为一个单一的向量描述符,该向量描述符能够捕捉集合内部的统计信息。
以下是VLAD的基本步骤:
1、首先,训练一个词袋模型(BoW model),该模型由k个词(在这里,词是向量空间中的一点)组成。这通常通过对训练集的描述符进行聚类实现,例如使用k-means。
2、对于待编码的描述符集合,每个描述符都被分配到词袋模型中的最近的词。
3、然后,对于每个词,计算该词下所有描述符与该词的残差(差值)的和。结果是一个描述符,其维度与原始描述符相同。
4、所有词的描述符都串联在一起,形成一个大向量,其维度是原始描述符维度与词数的乘积。
5、该向量通常会进行进一步的处理,例如l2归一化,以提高检索性能。
相似度度量
基于先前讨论的算法,我们需要理解相似性度量在向量数据库中的角色。这些度量是向量数据库比较和识别给定查询的最相关结果的基础。 相似性度量是用于确定向量空间中两个向量相似程度的数学方法。向量数据库中使用相似性度量来比较存储在数据库中的向量,并找出与给定查询向量最相似的向量。 可以使用多种相似性度量,包括:
1、余弦相似度:度量向量空间中两个向量之间的角度的余弦。它的范围是-1到1,其中1代表相同的向量,0代表正交向量,-1代表相反的向量。
2、欧几里得距离:度量向量空间中两个向量之间的直线距离。它的范围是0到无穷大,其中0代表相同的向量,更大的值代表越来越不相似的向量。
3、点积:度量两个向量的幅度的乘积和它们之间的角度的余弦。它的范围是-∞到∞,其中正值代表向量指向同一方向,0代表正交向量,负值代表向量指向相反的方向。
选择哪种相似性度量将影响从向量数据库得到的结果。同时,每种相似性度量都有其自身的优点和缺点,根据用例和需求选择合适的度量非常重要。
过滤
每个存储在数据库中的向量都包含元数据(元数据,又称为"数据的数据"或"数据之上的数据",是用于描述其他数据的数据。它提供了有关数据的详细信息,如数据的来源、创建时间、最后修改时间、大小、格式、所有者、位置等。元数据可以帮助我们理解数据的含义、用途和组织方式,以便我们能更好地管理和使用数据。 例如,考虑一个音频文件。该文件的音频数据(如声音波形)本身就是数据,而文件的名称、创建日期、持续时间、文件大小、编码格式、比特率等信息就是元数据。)。除了能够查询相似的向量,向量数据库也可以根据元数据查询来过滤结果。为了做到这一点,向量数据库通常维护两个索引:一个向量索引和一个元数据索引。它可以在向量搜索本身之前或之后进行元数据过滤,但无论哪种情况,都会有一些困难导致查询过程变慢。
过滤过程可以在向量搜索本身之前或之后进行,但每种方法都有其自身的挑战,可能会影响查询性能:
预过滤:在这种方法中,元数据过滤在向量搜索之前进行。虽然这可以帮助减少搜索空间,但也可能导致系统忽略了不符合元数据过滤条件的相关结果。另外,大量的元数据过滤可能会因为增加了计算开销而减慢查询过程。
后过滤:在这种方法中,元数据过滤在向量搜索之后进行。这可以确保考虑到所有相关的结果,但也可能引入额外的开销,并且在搜索完成后需要过滤掉不相关的结果,这可能会减慢查询过程。
为了优化过滤过程,向量数据库使用各种技术,如利用先进的索引方法进行元数据处理,或者使用并行处理来加速过滤任务。在搜索性能和过滤准确性之间平衡权衡对于提供高效和相关的向量数据库查询结果至关重要。
开发向量数据库需要考虑什么
性能与容错
性能和容错是相互关联的两个概念。随着我们手中的数据量增加,所需的节点数量也随之增多,从而导致错误和故障的可能性增大。正如我们对其他类型的数据库的期望一样,我们也希望能够在某些底层节点发生故障时,依然能够尽快地执行查询,无论这种故障是由硬件问题、网络问题还是其他类型的技术问题引起的。这些故障可能导致系统停机,或者产生错误的查询结果。 为了实现高性能和高容错性,向量数据库采用了切片和复制的策略:
-
切片 - 该方法将数据分布在多个节点上。有各种各样的数据分区方式,例如,可以根据数据的相似性进行分区,这样可以将相似的向量存储在同一个分区中。在查询时,查询请求会发送到所有的切片,然后检索并汇总结果,这就是所谓的“散播-收集”模式。
-
复制 - 该方法在不同的节点上创建数据的副本。这样即使某个节点发生故障,其他节点也能够接替它。关于复制,有两种主要的一致性模型:最终一致性和强一致性。最终一致性允许数据副本之间暂时存在不一致,这样可以提高可用性和降低延迟,但可能导致数据冲突甚至数据丢失。而强一致性要求在写入操作完成之前,所有数据副本都必须更新,这可以提供更强的一致性,但可能导致更高的延迟。
监控
为了有效地管理和维护向量数据库,我们需要一个强大的监控系统,用以跟踪数据库的性能、健康状况和整体状态。监控系统对于发现潜在的问题、优化性能和确保生产操作的顺利进行是至关重要的。通常,向量数据库的监控主要关注以下几个方面:
-
资源使用 - 监控资源使用情况,例如CPU、内存、磁盘空间和网络活动,能够帮助我们识别可能影响数据库性能的潜在问题或资源限制。
-
查询性能 - 查询延迟、吞吐量和错误率可能暗示着需要我们关注并解决的系统问题。
-
系统健康 - 整体系统健康监控包括单个节点的状态、复制进程和其他重要组件的状态。
访问控制
访问控制是一个管理和调整用户访问数据和资源的过程,是确保数据安全的关键组成部分。它确保只有获得授权的用户才能查看、修改或与向量数据库中存储的敏感数据进行交互。 访问控制的重要性主要体现在以下几点:
- 数据保护:AI应用经常需要处理敏感和机密的信息,实施严格的访问控制策略有助于防止未经授权的访问和数据泄露。
- 合规性:诸如医疗和金融等多个行业,受到严格的数据隐私法规的约束。执行适当的访问控制可以帮助组织遵守这些法规,从而避免法律和财务问题。
- 责任和审计:访问控制机制使组织能够记录用户在向量数据库中的活动。这些信息对于审计是至关重要的,当安全漏洞发生时,有助于追踪任何未授权的访问或修改。
- 可伸缩性和灵活性:随着组织的成长和发展,访问控制需求可能会发生变化。一个强大的访问控制系统能够无缝地修改和扩展用户权限,确保数据的安全在组织增长过程中始终得以维护。
备份和集合
当所有其他保护方法都失败时,向量数据库提供了备份功能,以便定期创建数据的副本。这些备份可以存储在外部存储系统或云服务中,以确保数据的安全和可恢复性。如果数据丢失或损坏,这些备份可以用来恢复数据库到之前的状态,最大程度地减少停机时间和对系统的影响。
API和SDKs
这就是实战之地:开发者希望拥有易于使用,功能强大的API和SDK,以便于向量数据库的集成和操作。一个好的API应该是直观的、易于使用的,并且有清晰的文档,使开发者能够快速理解和利用它。另一方面,SDK应该与主流的编程语言和开发环境兼容。