2023-What is a Vector Database?

原文地址

What is a Vector Database?

我们正处于人工智能革命的中期。它正在颠覆它所触及的任何行业,有望带来巨大的创新 - 但它也带来了新的挑战。对于涉及大型语言模型、生成性人工智能和语义搜索的应用来说,高效的数据处理已经变得比以往任何时候都更加关键。所有这些新的应用都依赖于矢量嵌入(vector embeddings),这是一种数据表示方式,其中含有语义信息,对人工智能获得理解和保持长期记忆至关重要,它们可以在执行复杂任务时加以利用。

Embeddings 是由人工智能模型(如大型语言模型)生成的,具有大量的属性或特征,使得它们的表示方法在管理上具有挑战性。在人工智能和机器学习的背景下,这些特征代表了数据的不同维度,对于理解模式、关系和基本结构至关重要。这就是为什么我们需要一个专门为处理这种类型的数据而设计的专门数据库。矢量数据库通过为嵌入物提供优化的存储和查询能力来满足这一要求。矢量数据库具有传统数据库所没有的独立矢量索引的能力,以及处理矢量嵌入的专业性,这是传统的基于标量的数据库所缺乏的。

处理矢量嵌入的挑战是,传统的基于标量的数据库无法跟上此类数据的复杂性和规模,因此难以提取洞察力并进行实时分析。这就是矢量数据库发挥作用的地方–它们被有意设计为处理这种类型的数据,并提供你需要的性能、可扩展性和灵活性,以充分利用你的数据。

有了矢量数据库,我们可以为我们的人工智能添加高级功能,如语义信息检索、长期记忆等。下图让我们更好地了解矢量数据库在这种类型的应用中的作用:

矢量查询流程

让我们来分析一下这个问题:

  1. 首先,我们使用嵌入模型来为我们想要索引的内容创建矢量嵌入。
  2. 矢量嵌入被插入到矢量数据库中,并对嵌入所创建的原始内容进行一些参考。
  3. 当应用程序发出查询时,我们使用相同的嵌入模型为查询创建嵌入,并使用这些嵌入来查询数据库中的类似矢量嵌入。如前所述,这些类似的嵌入与用于创建它们的原始内容有关。

矢量索引和矢量数据库之间有什么区别?

像 FAISS(Facebook AI Similarity Search)这样的独立矢量指数可以大大改善矢量嵌入的搜索和检索,但它们缺乏任何数据库中存在的能力。另一方面,矢量数据库是专门为管理矢量嵌入而建立的,与使用独立的矢量索引相比,它有几个优势:

  1. 数据管理:矢量数据库为数据存储提供了众所周知且易于使用的功能,如插入、删除和更新数据。这使得管理和维护矢量数据比使用独立的矢量索引(如 FAISS)更容易,后者需要额外的工作来与存储解决方案整合。
  2. 元数据存储和过滤:矢量数据库可以存储与每个矢量条目相关的元数据。然后,用户可以使用额外的元数据过滤器查询数据库,以进行更细粒度的查询。
  3. 可扩展性:矢量数据库的设计可以随着数据量和用户需求的增长而扩展,为分布式和并行处理提供更好的支持。独立的矢量索引可能需要定制解决方案,以实现类似的可扩展性水平(如在 Kubernetes 集群或其他类似系统上部署和管理它们)。
  4. 实时更新:矢量数据库通常支持实时数据更新,允许数据的动态变化,而独立的矢量索引可能需要一个完整的重新索引过程,以纳入新的数据,这可能是耗时和计算成本。
  5. 备份和收集:矢量数据库处理备份数据库中存储的所有数据的常规操作。Pinecone 还允许用户有选择地选择特定的索引,以 “集合 “的形式进行备份,将数据存储在该索引中供以后使用。
  6. 生态系统整合:矢量数据库可以更容易地与数据处理生态系统的其他组件集成,如 ETL 管道(如 Spark)、分析工具(如 Tableau 和 Segment)和可视化平台(如 Grafana)–简化数据管理工作流程。它还能与其他人工智能相关工具轻松整合,如 LangChain、LlamaIndex 和 ChatGPT 的插件。
  7. 数据安全和访问控制:矢量数据库通常提供内置的数据安全功能和访问控制机制,以保护敏感信息,这可能是独立的矢量索引解决方案所不具备的。

简而言之,矢量数据库为处理矢量嵌入提供了一个卓越的解决方案,它解决了独立的矢量指数的局限性,如可扩展性挑战、繁琐的整合过程,以及缺乏实时更新和内置安全措施,确保了更有效和简化的数据管理体验。

How does a vector database work?

我们或多或少知道传统数据库是如何工作的,它们在行和列中存储字符串、数字和其他类型的标量数据。另一方面,矢量数据库对矢量进行操作,所以它的优化和查询方式是完全不同的。

在传统数据库中,我们通常是查询数据库中的行,其中的值通常与我们的查询完全匹配。在矢量数据库中,我们应用一个相似度指标来找到与我们的查询最相似的矢量。

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

这些算法被组装成一个管道,提供快速和准确地检索被查询矢量的邻居。由于矢量数据库提供了近似的结果,我们考虑的主要权衡是准确性和速度之间的关系。结果越准确,查询的速度就越慢。然而,一个好的系统可以提供超快的搜索和近乎完美的准确性。

下面是一个矢量数据库的常见管道:

矢量数据库流程

  • 编制索引:矢量数据库使用 PQ、LSH 或 HNSW 等算法对矢量进行索引(下文有更多介绍)。这一步将向量映射到一个数据结构中,以实现更快的搜索。
  • 查询:向量数据库将索引的查询向量与数据集中的索引向量进行比较,以找到最近的邻居(应用该索引所使用的相似度量)。
  • 后期处理:在某些情况下,矢量数据库从数据集中检索出最终的近邻,并对其进行后处理以返回最终结果。这一步可以包括使用不同的相似性度量对最近的邻居进行重新排序。

在下面的章节中,我们将更详细地讨论这些算法中的每一种,并解释它们如何对矢量数据库的整体性能作出贡献。

Algorithms

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

然而,作为 Pinecone 的用户,你不需要担心这些不同算法的错综复杂和选择问题。Pinecone 旨在处理所有的复杂问题和幕后的算法决策,确保你获得最佳的性能和结果,而不需要任何麻烦。通过利用 Pinecone 的专业知识,你可以专注于真正重要的事情–提取有价值的见解并提供强大的 AI 解决方案。

下面的章节将探讨几种算法及其处理矢量嵌入的独特方法。这些知识将使你能够做出明智的决定,并在你释放应用程序的全部潜力时欣赏 Pinecone 提供的无缝性能。

Random Projection

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

随机投影

Product Quantization

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

Product Quantization

  • 分割:向量被分割成段。
  • 训练:我们为每个分段建立一个 “编码本”。简单地说–该算法产生了一个潜在的 “编码 “库,可以分配给一个向量。在实践中–这个 “编码本 “是由通过对向量的每个分段进行 k-means 聚类而产生的聚类中心点组成的。我们将在段编码簿中拥有与我们用于 k-means 聚类的值相同的数量。
  • 编码:该算法为每个段分配了一个特定的编码。在实践中,我们在训练完成后,在编码簿中找到与每个向量段最接近的值。我们对该段的 PQ 代码将是编码库中相应数值的标识符。我们可以使用任意多的 PQ 代码,这意味着我们可以从编码库中挑选多个值来代表每个段。
  • 查询:当我们查询时,算法将向量分解为子向量,并使用相同的编码本对其进行量化。然后,它使用索引编码来寻找与查询向量最近的向量。

编码本中的代表性向量的数量是在表示的准确性和搜索编码本的计算成本之间的权衡。编码库中的代表性向量越多,子空间中的向量表示就越准确,但搜索编码库的计算成本就越高。相比之下,编码本中有代表性的向量越少,表示就越不准确,但计算成本就越低。

Locality-sensitive hashing

定位敏感哈希(LSH)是一种在近似近邻搜索的背景下进行索引的技术。它对速度进行了优化,同时仍然提供一个近似的、非详尽的结果。LSH 使用一组散列函数将相似的向量映射到 “桶 “中,如下图所示:

LSH

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

重要的是要记住,LSH 是一种近似的方法,而近似的质量取决于哈希函数的属性。一般来说,使用的哈希函数越多,近似的质量就越好。然而,使用大量的哈希函数在计算上是很昂贵的,对于大型数据集来说可能不可行。

Hierarchical Navigable Small World (HSNW)

HSNW 创建了一个分层的树状结构,树上的每个节点代表一组向量。节点之间的边代表了向量之间的相似性。该算法首先创建一组节点,每个节点有少量的向量。这可以随机进行,也可以通过 k-means 等算法对向量进行聚类,其中每个聚类成为一个节点。

三个向量

然后,该算法检查每个节点的向量,并在该节点和与它的向量最相似的节点之间画一条边。

连线

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

Similarity Measures

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

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

可以使用几种相似性措施,包括:

  • 余弦相似性:测量向量空间中两个向量之间的角度的余弦。它的范围是-1 到 1,其中 1 代表相同的向量,0 代表正交的向量,而-1 代表截然相反的向量。
  • 欧几里得距离:测量向量空间中两个向量之间的直线距离。它的范围从 0 到无穷大,其中 0 代表相同的向量,较大的数值代表越来越不相似的向量。
  • 点积:测量两个向量的大小与它们之间角度的余弦的乘积。它的范围从-∞ 到 ∞,正值代表指向同一方向的向量,0 代表正交向量,负值代表指向相反方向的向量。

相似性度量的选择将对从矢量数据库中获得的结果产生影响。还需要注意的是,每种相似度量都有自己的优点和缺点,根据使用情况和要求选择合适的相似度量是很重要的。

Filtering

存储在数据库中的每个矢量还包括元数据。除了能够查询类似的矢量外,矢量数据库还可以根据元数据查询来过滤结果。为了做到这一点,矢量数据库通常维护两个索引:一个矢量索引和一个元数据索引。然后,它在矢量搜索本身之前或之后执行元数据过滤,但无论哪种情况,都会有困难,导致查询过程变慢。

过滤

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

  • 预过滤:在这种方法中,元数据过滤是在矢量搜索之前进行的。虽然这有助于减少搜索空间,但它也可能导致系统忽略那些不符合元数据过滤标准的相关结果。此外,由于增加了计算开销,大量的元数据过滤可能会减慢查询过程。
  • 后过滤:在这种方法中,元数据过滤是在矢量搜索之后进行的。这有助于确保所有相关的结果都被考虑在内,但它也可能引入额外的开销并减慢查询过程,因为不相关的结果需要在搜索完成后被过滤掉。

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

Database Operations

与矢量索引不同,矢量数据库配备了一系列能力,使其更有资格用于大规模的生产环境。让我们看一下操作数据库所涉及的组件的总体概况。

Pinecone 架构

Performance and Fault tolerance

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

为了确保高性能和容错性,矢量数据库使用分片和复制的方式适用于以下情况:

  1. 分片:在多个节点上对数据进行分区。有不同的方法对数据进行分区–例如,可以通过不同数据簇的相似性进行分区,以便将相似的向量存储在同一分区。当进行查询时,它被发送到所有的分片上,结果被检索和合并。这被称为 “分散收集 “模式。
  2. 复制:在不同的节点上创建数据的多个副本。这确保了即使某个节点发生故障,其他节点也能替代它。有两种主要的一致性模式:最终一致性和强一致性。最终一致性允许数据的不同副本之间存在暂时的不一致,这将提高可用性并减少延迟,但可能导致冲突甚至数据丢失。另一方面,强一致性要求在写操作被认为完成之前,所有的数据副本都被更新。这种方法提供了更强的一致性,但可能会导致更高的延迟。

Monitoring

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

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

Access-control

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

访问控制之所以重要,有几个原因:

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

Backups and collections

当其他一切都失败时,矢量数据库提供了依靠定期创建的备份的能力。这些备份可以存储在外部存储系统或基于云的存储服务中,确保数据的安全性和可恢复性。在数据丢失或损坏的情况下,这些备份可以用来将数据库恢复到以前的状态,最大限度地减少停机时间和对整个系统的影响。通过 Pinecone,用户可以选择同时备份特定的索引,并将其保存为 “集合”,以后可用于填充新索引。

API and SDKs

这就是橡胶与道路的结合点:与数据库互动的开发者希望通过一个易于使用的 API,使用一个熟悉和舒适的工具集来实现。通过提供一个用户友好的界面,矢量数据库 API 层简化了高性能矢量搜索应用程序的开发。

除了 API 之外,矢量数据库通常会提供包裹 API 的特定编程语言的 SDKs。这些 SDK 使开发者更容易在他们的应用程序中与数据库互动。这使开发者能够集中精力于他们的特定用例,如语义文本搜索、生成性问题回答、混合搜索、图像相似性搜索或产品推荐,而不必担心底层基础设施的复杂性。

Summary

矢量嵌入在 NLP、计算机视觉和其他人工智能应用等领域的指数级增长,导致了矢量数据库的出现,作为计算引擎,使我们能够在应用中与矢量嵌入有效互动。

矢量数据库是专门为解决生产场景中管理矢量嵌入时出现的问题而建立的数据库。由于这个原因,它们比传统的基于标量的数据库和独立的矢量索引具有显著的优势。

在这篇文章中,我们回顾了矢量数据库的关键方面,包括它是如何工作的,它使用什么算法,以及使它可以在生产场景中运行的额外功能。我们希望这能帮助你理解矢量数据库的内部运作。幸运的是,这并不是你使用 Pinecone 必须知道的东西。Pinecone 处理了所有这些考虑因素(还有一些),让你可以专注于你的应用程序的其他部分。