一、前言

我们目前正处于人工智能革命的中期。这场革命正在全面改变各行各业,并带来了伟大的创新,但也带来了新的挑战。对于涉及大型语言模型、生成式人工智能和语义搜索的应用程序而言,高效地处理数据变得比以往任何时候都更加重要。

所有这些新应用程序都依赖于向量嵌入,这是一种数据表示形式。向量嵌入携带着对人工智能理解和长期记忆非常重要的语义信息,这些记忆可以在执行复杂任务时提供参考。

向量嵌入是由人工智能模型(如大型语言模型)生成的,具有许多属性或特征,使其表示变得难以管理。在人工智能和机器学习背景下,这些特征代表了数据不同维度,在理解模式、关系和潜在结构方面至关重要。

因此,我们需要专门为处理此类数据而设计的数据库。向量数据库(如Pinecone)满足了这一需求,通过提供优化的存储和查询能力来处理嵌入。相比传统数据库缺乏独立向量索引和处理向量嵌入的专业能力,向量数据库具备这些能力。

使用向量嵌入的挑战在于,传统基于标量的数据库无法跟上这种数据的复杂性和规模,从而使得提取洞察和进行实时分析变得困难。这就是向量数据库发挥作用的地方 - 它们是专门为处理此类数据而设计的,并提供了性能、可扩展性和灵活性,让您能够从数据中获得最大收益。

有了向量数据库,我们就可以为我们的人工智能添加高级功能,如语义信息检索、长期记忆等。下面的图表有助于更好地理解向量数据库在此类应用中所扮演的角色:

让我们逐步解释一下:

首先,我们使用嵌入模型来生成向量嵌入,用于索引所需的内容。

然后,将这些向量嵌入插入到向量数据库中,并与它们所对应的原始内容建立关联。

当应用程序发起查询时,我们使用相同的嵌入模型为查询生成嵌入,并利用这些嵌入在数据库中进行相似向量嵌入的查询。正如之前提到的,这些相似的嵌入与它们所创建的原始内容相关联。

二、向量索引和向量数据库有什么区别?

像FAISS(Facebook AI Similarity Search)这样的独立向量索引可以显著提高向量嵌入的搜索和检索效率,但它们缺乏数据库的其他功能。相比之下,向量数据库是专门为管理向量嵌入而设计的,并具有以下优势:

数据管理:向量数据库提供了易于使用的数据存储功能,如插入、删除和更新数据。与独立的向量索引相比,它更容易管理和维护向量数据。

元数据存储和过滤:向量数据库可以存储与每个向量条目相关联的元数据,并允许使用额外的元数据过滤器进行查询。

可扩展性:向量数据库设计为随着数据规模和用户需求增长而扩展,并提供更好的分布式和并行处理支持。相比之下,独立的向量索引可能需要定制解决方案来实现类似的可扩展性。

实时更新:大多数向量数据库支持实时数据更新,允许动态更改数据。而独立的向量索引可能需要完整重新构建来合并新数据。

备份和集合: 向量数据库处理对所有存储在其中的数据进行备份操作,并可按”集合”形式备份特定的索引以供以后使用。

生态系统集成:向量数据库更容易与数据处理生态系统中的其他组件集成,如ETL管道、分析工具和可视化平台,简化了数据管理工作流程。

数据安全和访问控制:向量数据库通常提供内置的数据安全功能和访问控制机制,用于保护敏感信息。这些功能在独立的向量索引解决方案中可能不可用。

总而言之,向量数据库通过解决独立向量索引的限制(如可扩展性挑战、繁琐的集成过程、缺乏实时更新和内置安全措施)提供了更优越的解决方案,用于处理向量嵌入,并确保更有效和流畅的数据管理体验。

三、向量数据库的工作原理是什么?

向量数据库与传统数据库的工作方式有很大不同。传统数据库将字符串、数字和其他类型的标量数据存储在行和列中,而向量数据库操作向量,并使用不同的优化和查询方式。

在传统数据库中,我们通常查询与我们的查询完全匹配的行。而在向量数据库中,我们使用相似度度量来寻找与我们的查询最相似的向量。

为了优化搜索效率,向量数据库使用多种算法来进行近似最近邻(ANN)搜索。这些算法包括散列、量化和基于图的搜索。

这些算法被组合成一个管道,用于快速准确地检索查询向量的邻居。由于向量数据库提供近似结果,因此需要权衡准确性和速度之间的平衡。结果越准确,查询速度可能就越慢。然而,在良好设计的系统中,可以实现超快速搜索并且近乎完美地保持准确性。

以下是一个常用于向量数据库管道示例:

1、索引:向量数据库使用诸如PQ、LSH或HNSW(下面会详细介绍)等算法对向量进行索引。这一步将向量映射到一个能够实现更快搜索的数据结构。

2、查询:向量数据库将索引的查询向量与数据集中的索引向量进行比较,以找到最近邻(应用该索引使用的相似度度量)

3、后处理:在某些情况下,向量数据库从数据集中检索最终最近邻,并对它们进行后处理以返回最终结果。这一步可以包括使用不同的相似度度量对最近邻进行重新排序。

在以下部分中,我们将更详细地讨论每种算法,并解释它们如何促进向量数据库的整体性能。

四、算法

有多种算法可用于创建向量索引,它们的共同目标是通过构建能够快速搜索的数据结构来实现高效查询。这些算法通常会将原始向量表示转换为压缩形式,以优化查询过程。

以下部分将介绍几种常见算法及其处理向量嵌入的独特方法。这些知识将帮助您做出明智决策,并欣赏到Pinecone在解锁应用程序全部潜力时所提供的无缝性能。

4.1、随机投影

随机投影背后的基本思想是使用一个随机投影矩阵将高维向量投影到一个低维空间。我们创建一个随机数矩阵,其大小与目标低维度相当。然后,我们计算输入向量与该矩阵之间的点积,得到一个投影矩阵,该矩阵具有比原始向量更低的维度,但仍然保持了它们之间的相似性。

在查询时,我们使用相同的投影矩阵将查询向量投影到低维空间。然后,我们将投影后的查询向量与数据库中的投影向量进行比较,以找到最近邻。由于数据的维度降低了,搜索过程比在整个高维空间中搜索要快得多。

需要注意的是,随机投影是一种近似方法,其质量取决于投影矩阵的属性。通常情况下,投影矩阵越随机,投影质量越好。然而,在生成一个真正随机的投影矩阵可能会很计算密集,特别是对于大型数据集来说。更多关于随机投影的信息,请参考相关文档或学术资料。

4.2、乘积量化

另一种创建索引的方法是乘积量化(PQ),它是一种针对高维向量(如向量嵌入)的有损压缩技术。PQ将原始向量分解为更小的块,并通过为每个块创建一个代表性的“代码”来简化每个块的表示,然后将所有块重新组合在一起,而不会丢失对相似性操作至关重要的信息。PQ过程包括四个步骤:分割、训练、编码和查询。

1、分割 - 将向量分解成段。

2、训练 - 为每个段构建一个“代码本”。简单来说,算法生成一个潜在的“代码”池,这些代码可以被分配给一个向量。实际上,这个“代码本”由对每个段进行k均值聚类后所得到簇中心点组成。段代码本中的值数量与用于k均值聚类的值数量相同。

3、编码 - 算法为每个段分配一个特定的代码。在训练完成后,我们找到与每个向量段最接近的代码本中的值。我们使用PQ代码来表示与代码本中值对应的标识符。我们可以使用多个PQ代码,这意味着我们可以从代码本中选择多个值来表示每个段。

4、查询 - 在查询时,算法将向量分解为子向量,并使用相同的代码本对其进行量化。然后,它使用索引中的代码来找到与查询向量最接近的向量。

代码本中代表性向量的数量是表示精度和搜索代码本计算成本之间的权衡。代码本中的代表性向量越多,子空间中向量的表示就越准确,但搜索代码本的计算成本就越高。相反,代码本中的代表性向量越少,表示就越不准确,但计算成本就越低。了解更多关于乘积量化(PQ)方面的信息,请参考相关资料或文献。

4.3、局部敏感哈希

局部敏感哈希(LSH)是一种用于近似最近邻搜索的索引技术。它通过速度上的优化提供了一个近似但非穷尽的结果。LSH使用一组哈希函数将相似的向量映射到“桶”中,如下图所示:

为了找到给定查询向量的最近邻,我们使用相同的哈希函数将相似的向量映射到哈希表中的“桶”。查询向量被哈希到特定表中,然后与该表中其他向量进行比较,以寻找最接近的匹配。这种方法比在整个数据集上搜索要快得多,因为每个哈希表中只包含较少数量的向量。

需要注意的是,LSH是一种近似方法,其近似质量取决于所使用的哈希函数属性。通常来说,使用更多哈希函数可以提高近似质量。然而,在大型数据集上使用大量哈希函数可能会计算开销较大,并且可能不可行。如需了解更多关于局部敏感哈希(LSH)方面的信息,请参考相关资料或文献。

4.4、分层可导航小世界(HNSW)

HNSW是一种创建分层树状结构的方法,其中每个节点代表一组向量。节点之间的边表示向量之间的相似性。算法首先创建一组节点,每个节点包含少量向量。这可以通过随机选择或者使用聚类算法

然后,算法检查每个节点中的向量,并在该节点与具有最相似向量的节点之间建立边连接。
当我们查询一个HNSW索引时,它利用这个图来导航树结构,以访问最有可能包含与查询向量最接近的向量的节点。通过在图中搜索,HNSW可以快速定位到与查询向量最相似的节点和相应的向量。如需了解更多关于分层可导航小世界(HNSW)方面的信息,请参考相关资料或文献。

4.5、相似度度量

在前面讨论的算法的基础上,我们需要理解相似度度量在向量数据库中的作用。这些度量是向量数据库比较和识别给定查询最相关结果的基础。

相似度度量是一种数学方法,用于确定向量空间中两个向量的相似程度。向量数据库中使用相似度度量来比较数据库中存储的向量,并找到与给定查询向量最相似的向量。

可以使用几种相似度度量,包括:

余弦相似度:衡量向量空间中两个向量之间的夹角的余弦。它的范围从-1到1,其中1表示相同的向量,0表示正交的向量,-1表示相对立的向量。

欧几里得距离:衡量向量空间中两个向量之间的直线距离。它的范围从0到无穷大,其中0表示相同的向量,较大的值表示越不相似的向量。

点积:衡量两个向量的大小和它们之间夹角的余弦的乘积。它的范围从-∞到∞,其中正值表示指向同一方向的向量,0表示正交的向量,负值表示指向相反方向的向量。

相似度度量的选择会影响从向量数据库获得的结果。另外,需要注意的是,每种相似度度量都有自己的优缺点,根据用例和需求选择合适的度量是很重要的。了解更多关于相似度度量。

4.6、过滤

数据库中存储的每个向量也包含元数据。除了能够查询相似的向量外,向量数据库还可以根据元数据查询来过滤结果。为此,向量数据库通常维护两个索引:一个是向量索引,另一个是元数据索引。然后,在向量搜索之前或之后执行元数据过滤,但无论哪种情况,都有困难导致查询过程变慢。

过滤过程可以在向量搜索之前或之后执行,但每种方法都有自己的挑战,可能影响查询性能:

预过滤:在这种方法中,在向量搜索之前进行元数据过滤。虽然这可以帮助减少搜索空间,但也可能导致系统忽略了不符合元数据过滤条件的相关结果。另外,大量的元数据过滤可能会由于增加了计算开销而降低查询过程的速度。

后过滤:在这种方法中,在向量搜索之后进行元数据过滤。这可以帮助确保考虑所有相关结果,但也可能引入额外的开销并降低查询过程的速度,因为需要在搜索完成后过滤掉不相关结果。

为了优化过滤过程,向量数据库使用各种技术,如利用高级索引方法进行元数据索引或使用并行处理来加速过滤任务。在搜索性能和过滤准确性之间平衡权衡对于提供高效和相关的查询结果至关重要。了解更多关于向量搜索过滤。

五、数据库操作

与向量索引不同,向量数据库配备了一套能力,使它们更有资格在高规模的生产环境中使用。让我们来看看涉及到操作数据库的组件的总体概述。

性能和容错性

性能和容错性在向量数据库中密切相关。随着数据量的增加,所需的节点数量也会增加,从而增加了错误和故障的风险。为了确保即使发生节点故障,查询仍能快速执行,我们需要关注性能和容错性。

1、分片是一种将数据分布在多个节点上的方法。可以使用不同的数据分区方法,例如根据相似性将数据分区,以便相似向量存储在同一个分区中。当进行查询时,查询将发送到所有分片,并检索和组合结果。这被称为“散播-收集”模式。

2、复制是在多个节点上创建数据副本的方法。这样即使某个节点出现故障,其他节点也可以替代它。有两种主要的一致性模型:最终一致性和强一致性。最终一致性允许不同副本之间存在暂时的不一致,提高可用性但可能导致冲突或数据丢失;强一致性要求更新所有副本后才认为写操作完成,在保证更高一致性的同时可能导致较高延迟。

通过使用分片和复制来确保高性能和容错性,在面对硬件故障、网络故障或其他技术错误时,向量数据库可以保证持续运行并提供正确的查询结果。

六、监控

为了有效地管理和维护一个向量数据库,我们需要一个强大的监控系统,跟踪数据库性能、健康状况和整体状态的重要方面。监控对于发现潜在问题、优化性能和确保平稳的生产运营至关重要。监控向量数据库的一些方面包括:

1、资源使用 - 监控资源使用情况,如CPU、内存、磁盘空间和网络活动,可以识别可能影响数据库性能的潜在问题或资源限制。

2、查询性能 - 查询延迟、吞吐量和错误率可能表明需要解决的潜在系统问题。

3、系统健康 - 整体系统健康监控包括单个节点、复制过程和其他关键组件的状态。

6.1、访问控制

访问控制是管理和调节用户对数据和资源的访问的过程。它是数据安全的重要组成部分,确保只有授权的用户才能查看、修改或与向量数据库中存储的敏感数据进行交互。

访问控制有几个原因:

1、数据保护:由于人工智能应用程序经常处理敏感和机密信息,实施严格的访问控制机制有助于保护数据免受未经授权的访问和潜在的违规。

2、合规性:许多行业,如医疗和金融,都受到严格的数据隐私法规的约束。实施适当的访问控制有助于组织遵守这些法规,保护它们免受法律和财务后果。

3、责任和审计:访问控制机制使组织能够维护向量数据库中用户活动的记录。这些信息对于审计目的至关重要,当发生安全违规时,它有助于追溯任何未经授权的访问或修改。

4、可扩展性和灵活性:随着组织的发展和演变,它们的访问控制需求可能会发生变化。一个强大的访问控制系统允许无缝地修改和扩展用户权限,确保数据安全在组织的增长过程中保持完整。

6.2、备份和集合

当一切都失败时,向量数据库提供了依赖定期创建备份的能力。这些备份可以存储在外部存储系统或基于云的存储服务上,确保数据的安全性和可恢复性。在发生数据丢失或损坏的情况下,这些备份可以用来将数据库恢复到以前的状态,最大限度地减少停机时间和对整个系统的影响。

6.3、API和SDK

向量数据库提供一个易于使用的API,以便与数据库进行交互。这个API层简化了开发高性能向量搜索应用程序的过程,使开发人员能够使用熟悉和舒适的工具集。

除了API之外,向量数据库还提供特定于编程语言的SDK。SDK封装了API,并提供更便捷的方式让开发者与数据库进行交互。这使得开发者可以专注于他们特定的用例,如语义文本搜索、生成式问答、混合搜索、图像相似度搜索或产品推荐等,而不需要关心底层基础设施的复杂性。

API和SDK为开发者提供了一个友好且高效的接口来构建应用程序,并简化了与向量数据库交互和操作数据的过程。通过使用这些工具,开发者可以更快速地实现他们想要达到的功能和业务需求。

七、总结

向量嵌入在自然语言处理、计算机视觉和其他人工智能应用领域的指数增长,导致了向量数据库的出现,它是一种计算引擎,允许我们在应用程序中有效地与向量嵌入进行交互。

向量数据库是专门为处理生产场景中管理向量嵌入时出现的问题而设计的数据库。因此,它们相比传统的基于标量的数据库和独立的向量索引具有显著的优势。

在这篇文章中,我们回顾了向量数据库的关键方面,包括它是如何工作的,它使用了什么算法,以及它具有哪些使其在生产场景中具备操作准备的附加功能。