什么是向量数据库


什么是向量数据库

我们正处于 AI 智能革命的中期。向量数据库引导了伟大的创新,并正在颠覆任何与之相关的行业,但是它也带了新的挑战。对于涉及大型语言模型、生成式人工智能和语义搜索的应用程序来说,高效的数据处理变得比以往任何时候都更加重要。

所有这些新兴的应用程序都依赖于向量嵌入(vector embeddings)。这是一种数据表示形式,其中包含语义信息,这有助于人工智能获得、理解并维持能够应用在复杂任务上的长期记忆。

嵌入是由人工智能模型(如大型语言模型)生成的,并且具有大量属性或特性,这使得它们难以被表示。在人工智能和机器学习的背景下,这些特征代表了数据的不同维度,如何“精准”地表示它们,这取决于数据库的理解模式、关系和底层结构。

这就是为什么我们需要专门为处理此类数据而设计的专用数据库。像 Pinecone 这样的向量数据库通过为嵌入提供优化的存储和查询功能来满足这一要求。向量数据库不仅传统标量数据库所没有的专门处理向量嵌入的能力,还具有独立向量索引的能力。

使用向量嵌入的挑战在于,传统的基于标量的数据库无法跟上此类数据的复杂性和规模,所以难以捕捉关键语义并进行实时分析。这恰巧就是向量数据库的优势——它们专门为高效、灵活地处理此类数据而生。

借助向量数据库,我们可以为人工智能添加更高级的功能,比如语义信息检索、长期记忆等等。下图能够让我们更好地理解向量数据库在此类应用中的作用:

向量数据库的应用

让我们来分析一下:

  1. 首先,我们使用嵌入模型为我们想要索引的内容创建向量嵌入
  2. 参考创建嵌入的原始内容,将向量嵌入写入到向量数据库中。
  3. 应用程序发出查询时,我们使用相同的嵌入模型为查询创建嵌入,并使用这些嵌入在数据库中查询类似的向量嵌入。如前所述,这些类似的嵌入与用于创建它们的原始内容相关联

向量索引和向量数据库的区别是什么

像 FAISS(Facebook AI 相似性搜索)这样的独立向量索引可以显著改善向量嵌入的搜索和检索,但它们缺乏数据库所具备的基础能力,例如存储。另一方面,向量数据库是专门为管理向量嵌入而构建的,与使用独立向量索引相比具有以下优势:

  1. 数据管理:向量数据库提供简单易用的数据存储功能,例如插入、删除和更新数据。这使得管理和维护向量数据比使用 FAISS 等独立向量索引更容易,后者需要额外的工作才能与存储解决方案集成。

  2. 元数据存储和过滤:向量数据库可以存储与每个向量条目关联的元数据。然后,用户可以使用附加的元数据过滤器来查询数据库,以进行更细粒度的查询。

  3. 可扩展性:向量数据库能够随着数据量和用户需求的增长而扩展,为分布式和并行处理提供更好的支持。独立向量索引可能需要定制解决方案来实现类似级别的可扩展性(例如在 Kubernetes 集群或其他类似系统上部署和管理它们)。

  4. 实时更新:向量数据库通常支持实时数据更新,允许对数据进行动态更改,而独立向量索引可能需要完整的重新索引过程来合并新数据,这可能非常耗时且计算成本高昂。

  5. 备份和收集:对于向量数据库来说,处理备份数据库中存储的所有数据是常规操作。Pinecone 还允许用户选择特定的索引,采用“集合”的形式进行数据备份。

  6. 生态系统集成:向量数据库可以更轻松地与数据处理生态系统的其他组件集成,例如 ETL 管道(如 Spark)、分析工具(如Tableau 和 Segment)和可视化平台(如 Grafana),从而简化数据管理工作流程。它还可以与其他人工智能相关工具(例如LangChain、LlamaIndex 和 ChatGPT 的插件)轻松集成。

  7. 数据安全和访问控制:向量数据库通常提供内置数据安全功能和访问控制机制来保护敏感信息,这在独立的向量索引解决方案中可能无法实现。

简而言之,向量数据库解决了独立向量指数的局限性(例如可扩展性挑战、繁琐的集成过程以及缺乏实时更新和内置安全措施),从而为处理向量嵌入提供了一个优越的解决方案,确保更有效和更精简的数据管理经验。

向量数据库是如何工作的

我们都或多或少地了解传统数据库的工作原理,它们在行和列中存储字符串、数字和其他类型的标量数据。但是,向量数据库对向量进行操作,因此其优化和查询的方式和传统数据库有很大的不同。

在传统数据库中,我们通常在数据库中检索与查询值完全匹配的行;但在向量数据库中,我们应用相似性度量来查找与我们的查询最相似的向量。

向量数据库使用不同算法的组合,这些算法都参与了近似最近邻 (ANN) 搜索。这些算法通过散列、量化或基于图的搜索来优化搜索。

这些算法组合成一个流水线,可以快速准确地检索所查询向量的邻居。由于向量数据库提供近似结果,因此主要权衡是精度和速度。结果越准确,查询的速度就越慢。然而,一个好的系统可以提供近乎完美的精度超快搜索。

这是向量数据库的常见流程:

向量数据库常见流程

  1. 索引(indexing):向量数据库使用 PQ、LSH 或 HNSW 等算法对向量进行索引(更多内容见下文)。此步骤将向量映射到能够更快搜索的数据结构中。

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

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

下面,我们将更详细地讨论这些算法,并解释它们如何提升向量数据库的整体性能。

算法

有很多算法可以促进向量索引的创建。他们的共同目标是通过创建可快速遍历的数据结构来实现快速查询。它们通常会将原始向量的表示形式转换为压缩形式,以优化查询过程。

然而,作为 Pinecone 的用户,您无需担心这些各种算法的复杂性和选择。Pinecone 旨在处理幕后的所有复杂性和算法决策,确保您轻松获得最佳性能和结果。通过利用 Pinecone 的专业知识,您可以专注于真正重要的事情——提取有价值的见解并提供强大的 AI 解决方案。

以下部分将探讨几种算法及其处理向量嵌入的独特方法。

随即投影

随机投影背后的基本思想是使用随机投影矩阵将高维向量投影到低维空间。我们创建一个随机数矩阵。矩阵的大小将是我们想要的目标低维值。然后我们计算输入向量和矩阵的点积,这会产生一个投影矩阵,其维度比原始向量少,但仍保留它们的相似性。

随记投影算法

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

请记住,随机投影是一种近似方法,投影质量取决于投影矩阵的属性。一般来说,投影矩阵越随机,投影的质量就越好。但生成一个真正随机的投影矩阵的计算成本可能很高,尤其是对于大型数据集。

乘积量化

另一种建立索引的方法是乘积量化(product quulization,PQ) ,这是一种用于高维向量(如向量嵌入)的有损数据压缩技术。它获取原始向量,将其分解成更小的块,通过为每个块创建一个代表性的”编码”来简化每个块的表示,然后将所有块放回到一起——而不会丢失对相似性操作至关重要的信息。PQ 的过程可以分为四个步骤: 拆分、训练、编码和查询。

乘积量化算法

  1. 拆分:向量被分成多个片段。
  2. 训练:我们为每个片段建立一个“编码本”。简单地说,就是该算法会生成一个可以分配给向量的潜在“编码”池。实际上,这个“编码本”是由对每个向量片段的执行 K 均值算法而创建的聚类中心点组成。我们在片段编码本中值数量与 K 均值算法中使用的值的数量相同。
  3. 编码:算法为每个片段分配指定的编码。实际上,我们在训练完成后会在编码本中找到与每个向量段最接近的值。该片段的 PQ 编码将是编码本中相应值的标识符。我们可以使用任意数量的 PQ 编码,这意味着我们可以从编码本中选择多个值来表示每个段。
  4. 查询:当我们查询时,算法会将查询向量分解成多个子向量,并使用相同的编码本对它们进行量化。然后,使用索引编码来查找最接近查询向量的向量。

编码本中代表向量的数目是表示的准确性和搜索编码本的计算成本之间的权衡。编码本中的具有代表性的向量越多,子空间中向量的表示就越精准,但是搜索编码本的计算成本就越高。反之,编码本中的代表向量越少,表示的精度越低,但计算成本越低。

局部敏感哈希

局部敏感哈希(LSH)是一种在近似最近邻搜索上下文中建立索引的技术。它不仅优化了查询速度,还能提供一个近似的、非详尽的结果。LSH 使用一组哈希函数将相似的向量映射道“桶”中,如下图所示:

局部敏感哈希算法

为了找到给定查询向量的最近邻,我们使用与将相似向量“存储”到哈希表中相同的哈希函数。查询向量被散列到特定的表中,然后与同一表中的其他向量进行比较,以找到最接近的匹配。这种方法比搜索整个数据集要快得多,因为每个哈希表中的向量比整个空间中的向量要少得多。

但是 LSH 是一种近似方法,近似的质量取决于哈希函数的属性。一般来说,使用的哈希函数越多,近似质量就越好。但是,使用大量哈希函数的计算成本可能很高,并且 LSH 对于大型数据集可能不可行。

分层可导航小世界(HNSW)

HNSW 创建了一个分层的树状结构,其中树的每个节点代表一组向量。节点直接的边代表向量之间的相似度。该算法首先创建一组节点,每个节点都具有少量的向量;这可以是随即完成,也可以通过使用 k 均值等算法对向量进行聚类来完成,其中每个聚类都成为一个节点。

聚类节点

然后,该算法检查每个节点的向量,并在该节点和具有最相似向量的节点之间绘制一条边。

聚类树

当我们查询 HNSW 索引时,它使用此图在树中导航,访问最有可能包含与查询向量最接近的向量的节点。

相似度量

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

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

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

  • 余弦相似度:计算向量空间中两个向量之间夹角的余弦。取值范围是 -1 到 1,其中 1 表示相同的向量,0 表示正交向量,-1 表示完全相反的向量。
  • 欧式距离:计算向量空间内两个向量之间的直线距离。它的范围是从 0 到无穷大,其中 0 表示相同的向量,越大的值表示越不相似的向量。
  • 点积:计算两个向量的大小玉他们之间夹角的乘积。范围为 -∞ 到 ∞,其中正值表示指向相同方向的向量,0 表示正交向量,负值表示指向相反方向的向量。

相似性度量的选择会对从向量数据库获得的结果产生影响。还需要注意的是,每种相似性度量都有其自身的优点和缺点,因此根据用例和需求选择正确的相似性度量非常重要。

过滤

数据库中存储的每个向量还包括元数据。除了能够查询相似的向量之外,向量数据库还可以基于元数据查询过滤结果。为此,向量数据库通常维护两个索引: 向量索引和元数据索引。然后,在向量搜索本身之前或之后执行元数据过滤,但是在这两种情况下,都会导致查询过程变慢。

预过滤

后过滤

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

  1. 预过滤:在这种方法中,元数据过滤是在向量搜索之前完成的。虽然这有助于减少搜索空间,但也可能导致系统忽略与元数据过滤条件不匹配的相关结果。此外,广泛的元数据过滤可能会由于增加的计算开销而减慢查询过程。
  2. 后过滤:在这种方法中,元数据过滤是在向量搜索之后完成的。这可以确保考虑所有相关结果,但因为搜索完成后需要过滤掉不相关的结果,可能会带来额外的开销并减慢查询过程,

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

数据库操作

与向量索引不同,向量数据库配备了一组功能,使其更适于大规模生产环境。让我们看一下操作数据库所涉及的组件的总体概述。

数据库操作

性能与容错

性能与容错密切相关。我们拥有的数据越多,需要的节点就越多,出现错误和失败的可能性也就越大。与其他类型的数据库一样,我们希望确保即使某些底层节点发生故障,查询也能尽快执行。这可能是由于硬件故障、网络故障或其他类型的技术错误造成的。这种故障可能导致停机,甚至查询结果不正确。

为了确保高性能和容错能力,向量数据库使用分片和副本:

  1. 分片:将数据分片,并存储到多个节点。有不同的方法来划分数据,例如可以通过不同数据簇的相似性进行分片,以便将相似的向量存储在同一分片中。当进行查询时,它会被发送到所有分片,并检索和组合结果。这称为“分散-聚集”模式。
  2. 副本:跨不同节点创建数据的多个副本。这确保即使特定节点发生故障,其他节点也能够替代它。一致性模型主要有两种:最终一致性和强一致性。最终一致性允许不同数据副本之间出现临时不一致,这将提高可用性并减少延迟,但可能会导致冲突甚至数据丢失;强一致性要求在写入操作被视为完成之前更新所有数据副本,这种方法提供了更强的一致性,但可能会导致更高的延迟。

监控

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

  1. 资源使用情况:监视资源使用情况,如 CPU、内存、磁盘空间和网络活动,可以识别可能影响数据库性能的潜在问题或资源限制。
  2. 查询性能:查询延迟、吞吐量和错误率可能表明需要解决的潜在系统问题。
  3. 系统运行状况:整个系统健康状况监视包括各个节点的状态、复制过程和其他关键组件。

访问控制

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

访问控制很重要,原因如下:

  1. 数据保护:由于人工智能应用程序经常处理敏感和机密信息,实施严格的访问控制机制有助于保护数据免遭未经授权的访问和潜在的泄露。
  2. 合规性:许多行业,例如医疗保健和金融,都受到严格的数据隐私法规的约束。实施适当的访问控制有助于组织遵守这些法规,保护他们免受法律和财务影响。
  3. 问责制和审计:访问控制机制使组织能够在向量数据库中维护用户活动的记录。此信息对于审核目的至关重要,当发生安全漏洞时,它有助于追踪任何未经授权的访问或修改。
  4. 可扩展性和灵活性:随着组织的成长和发展,他们的访问控制需求可能会发生变化。强大的访问控制系统允许无缝修改和扩展用户权限,确保数据安全在组织的整个发展过程中保持完整。

备份和收藏

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

API 和 SDKs

这就是橡胶与道路相遇的地方:与数据库交互的开发人员希望通过易于使用的 API、使用熟悉且舒适的工具集来完成此操作。通过提供用户友好的界面,向量数据库 API 层简化了高性能向量搜索应用程序的开发。

除了 API 之外,向量数据库通常还会提供包装 API 的特定于编程语言的 SDK。SDK 使开发人员可以更轻松地在应用程序中与数据库进行交互。这使得开发人员能够专注于他们的特定用例,例如语义文本搜索、生成问答、混合搜索、图像相似性搜索或产品推荐,而不必担心底层基础设施的复杂性。

概况

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

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

在这篇文章中,我们回顾了向量数据库的关键方面,包括它的工作原理、它使用的算法以及使其为生产场景做好操作准备的附加功能。我们希望这可以帮助您了解向量数据库的内部工作原理。

参考链接


文章作者: Pudding
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Pudding !
  目录