向量数据库专为存储和索引高维向量嵌入而设计,支持高效相似性搜索、 CRUD操作、元数据过滤及水平扩展。在AI革命背景下,它成为支撑大语言模型、 生成式AI与语义搜索的核心基础设施,能够处理传统标量数据库难以应对的复杂嵌入数据, 为AI系统提供理解语义和维持长期记忆所需的高性能检索与分析能力。
-
1、什么是向量数据库? -
2、向量索引和向量数据库之间有什么区别? -
3、向量数据库是如何工作的? -
4、无服务器向量数据库 -
5、算法 -
5.1、随机投影 -
5.2、乘积量化 -
5.3、局部敏感哈希 -
5.4、分层可导航小世界(HNSW) -
6、相似性度量 -
7、过滤 -
8、数据库操作 -
8.1、性能和容错 -
8.2、监控 -
8.3、访问控制 -
8.4、备份和集合 -
8.5、API 和 SDK -
9、总结
整理自:https://www.pinecone.io/learn/vector-database/
、什么是向量数据库?
向量数据库为向量嵌入建立索引并存储,用于快速检索和相似性搜索, 具有 CRUD 操作、元数据过滤、水平扩展和无服务器等功能。
我们正处于 AI 革命的浪潮中。它正在颠覆所触及的每个行业,承诺带来巨大的创新——但也带来了新的挑战。 对于涉及大型语言模型、生成式 AI 和语义搜索的应用程序来说,高效的数据处理变得比以往任何时候都更加重要。
所有这些新应用程序都依赖于向量嵌入,这是一种向量数据表示类型, 其中包含对 AI 获得理解和维持长期记忆至关重要的语义信息,它们可以在执行复杂任务时调用。
嵌入是由 AI 模型(如大型语言模型)生成的,具有许多属性或特征, 使其表示具有挑战性。在 AI 和机器学习的背景下,这些特征代表了数据的不同维度, 这对于理解模式、关系和底层结构至关重要。
这就是为什么我们需要专门为处理这种数据类型而设计的专用数据库。 向量数据库通过为嵌入提供优化的存储和查询功能来满足这一要求。 向量数据库具有独立向量索引中缺失的传统数据库功能,以及传统标量数据库所缺乏的处理向量嵌入的专业化能力。
处理向量数据的挑战在于,传统的基于标量的数据库无法跟上此类数据的复杂性和规模,使得难以提取见解和执行实时分析。 这就是向量数据库发挥作用的地方——它们专门设计用于处理这种类型的数据,并提供您充分利用数据所需的性能、可扩展性和灵活性。
我们看到下一代向量数据库引入了更复杂的架构来处理智能的高效成本和扩展。 这种能力由无服务器向量数据库处理,可以分离存储和计算的成本,为 AI 提供低成本的知识支持。
通过向量数据库,我们可以为我们的 AI 添加知识,如语义信息检索、长期记忆等。 下图让我们更好地理解向量数据库在这类应用程序中的作用:
让我们分解一下:
- 首先,我们使用嵌入模型为我们想要索引的内容创建向量嵌入。
- 向量嵌入被插入到向量数据库中,并引用创建嵌入的原始内容。
- 当应用程序发出查询时,我们使用相同的嵌入模型为查询创建嵌入,并使用这些嵌入查询数据库中相似的向量嵌入。如前所述,这些相似的嵌入与用于创建它们的原始内容相关联。
、向量索引和向量数据库之间有什么区别?
像 FAISS(Facebook AI 相似性搜索)这样的独立向量索引可以显著改善向量嵌入的搜索和检索,但它们缺乏任何数据库中存在的功能。另一方面,向量数据库是专门为管理向量嵌入而构建的,与使用独立向量索引相比提供了几个优势:
数据管理: 向量数据库为数据存储提供了众所周知且易于使用的功能,如插入、删除和更新数据。这使得管理和维护向量数据比使用像 FAISS 这样的独立向量索引更容易,后者需要额外的工作来与存储解决方案集成。
元数据存储和过滤: 向量数据库可以存储与每个向量条目相关联的元数据。然后用户可以使用额外的元数据过滤器查询数据库,进行更细粒度的查询。
可扩展性: 向量数据库设计为随着不断增长的数据量和用户需求进行扩展,为分布式和并行处理提供更好的支持。独立向量索引可能需要定制解决方案来实现类似的可扩展性水平(例如在 Kubernetes 集群或其他类似系统上部署和管理它们)。现代向量数据库还使用无服务器架构来优化大规模成本。
实时更新: 向量数据库通常支持实时数据更新,允许动态更改数据以保持结果的新鲜性,而独立向量索引可能需要完整的重新索引过程来合并新数据,这可能耗时且计算成本高昂。高级向量数据库可以使用通过索引重建提供的性能升级,同时保持新鲜性。
备份和集合: 向量数据库处理存储在数据库中的所有数据的例行备份操作。现代向量数据库还允许用户选择性地选择可以以"集合"形式备份的特定索引,这些集合存储该索引中的数据以供以后使用。
生态系统集成: 向量数据库可以更容易地与数据处理生态系统的其他组件集成,如 ETL 管道(如 Spark)、分析工具(如 Tableau 和 Segment)和可视化平台(如 Grafana)——简化数据管理工作流程。它还能够与其他 AI 相关工具轻松集成,如 LangChain、LlamaIndex、Cohere 等等。
数据安全和访问控制: 向量数据库通常提供内置的数据安全功能和访问控制机制来保护敏感信息,这在独立向量索引解决方案中可能不可用。通过命名空间的多租户功能允许用户完全分区其索引,甚至在自己的索引内创建完全隔离的分区。
简而言之,向量数据库通过解决独立向量索引的限制(如可扩展性挑战、繁琐的集成过程、缺乏实时更新和内置安全措施)为处理向量嵌入提供了优越的解决方案,确保更有效和简化的数据管理体验。
、向量数据库是如何工作的?
我们都知道传统数据库是如何工作的(或多或少)——它们将字符串、数字和其他类型的标量数据存储在行和列中。另一方面,向量数据库操作向量,因此它的优化和查询方式截然不同。
在传统数据库中,我们通常查询数据库中值通常与我们的查询完全匹配的行。在向量数据库中,我们应用相似性度量来找到与我们的查询最相似的向量。
向量数据库使用不同算法的组合,这些算法都参与近似最近邻(ANN)搜索。这些算法通过哈希、量化或基于图的搜索来优化搜索。
这些算法被组装成一个管道,提供查询向量邻居的快速准确检索。由于向量数据库提供近似结果,我们考虑的主要权衡是准确性和速度之间的平衡。结果越准确,查询就越慢。然而,一个好的系统可以提供近乎完美准确性的超快搜索。
以下是向量数据库的常见管道:
- 索引: 向量数据库使用 PQ、LSH 或 HNSW 等算法(下面将详细介绍)对向量进行索引。这一步将向量映射到一个数据结构,该结构将支持更快的搜索。
- 查询: 向量数据库将索引的查询向量与数据集中的索引向量进行比较,以找到最近邻(应用该索引使用的相似性度量)
- 后处理: 在某些情况下,向量数据库从数据集中检索最终的最近邻并对其进行后处理以返回最终结果。此步骤可能包括使用不同的相似性度量重新排名最近邻。
、无服务器向量数据库
无服务器代表向量数据库的下一个演进。上述架构让我们达到了准确、快速、可扩展,但昂贵的向量数据库架构。这种架构是我们在第一代向量数据库中看到的。随着 AI 用例的兴起,成本和弹性变得越来越重要,需要第二代无服务器向量数据库。
第一代向量数据库有三个关键痛点,无服务器向量数据库可以解决:
- 存储与计算分离: 为了优化成本,计算应该仅在需要时使用。这意味着将索引存储与查询分离,并且仅搜索所需的内容——当涉及延迟时,这变得越来越困难。
- 多租户: 在索引中处理命名空间,确保不经常查询的命名空间不会增加成本。
- 新鲜性: 向量数据库需要提供新鲜数据,意味着在插入新数据后的几秒钟内,它是可查询的。注意,对于某些无服务器架构,在插入大量数据时新鲜性可能会延迟。
为了分离存储和计算,高度复杂的几何分区算法可以将索引分解为子索引,允许我们将搜索集中在特定分区上:
搜索空间的分区
通过这些分区,查询的搜索空间可以专注于向量索引的几个部分,而不是完整的搜索空间。典型的搜索行为将显示某些分区比其他分区访问更频繁,允许我们在计算成本和冷启动时间之间进行调整,以找到成本和延迟之间的最佳平衡。
当我们进行这种分区时,我们解决了计算和存储分离问题。然而,几何分区在索引构建时是一个较慢的过程。意味着我们可能遇到新鲜性问题,因为我们必须等待新数据正确存储在索引中。
为了解决这个问题,向量数据库需要另一个单独的层,称为新鲜性层。新鲜性层充当可以查询的向量的临时"缓存"。同时,我们等待索引构建器将新向量放入几何分区索引中。
新鲜性层保持我们的数据最新,以便我们可以快速开始查询。
在此过程中,查询路由器可以将查询发送到索引和新鲜性层——解决新鲜性问题。然而,值得注意的是,新鲜性层存在于计算实例中,因此我们无法在那里存储完整的索引。相反,我们等待新向量插入到索引中——一旦完成,它们就从新鲜性层中删除。
最后,还有多租户问题。许多第一代向量数据库处理多租户,并且已经这样做了很长时间。然而,无服务器架构中的多租户更加复杂。
我们必须避免在同一硬件上将不同类型的用户放在一起,以保持低成本和低延迟。如果我们有用户 A,几乎每天都会进行 20 次查询,与用户 B 在同一硬件上,而用户 B 每月进行 20 次查询,用户 B 将被困在 24/7 的计算硬件上,因为这是用户 A 需要的持续低延迟所必需的。
为了解决这个问题,向量数据库必须能够识别具有相似使用情况的用户并将他们放在一起,同时保持它们之间的完全分离。同样,这可以基于用户使用指标和基于使用情况的热/冷基础设施自动分配来完成。
将第一代向量数据库与存储和计算分离、多租户和新鲜性相结合,为我们提供了新一代的现代向量数据库。这种架构(与向量数据库基础知识配对)是现代 AI 堆栈的首选。
在接下来的章节中,我们将讨论向量数据库基础知识背后的一些算法,并解释它们如何对我们数据库的整体性能做出贡献。
、算法
几种算法可以促进向量索引的创建。它们的共同目标是通过创建可以快速遍历的数据结构来实现快速查询。它们通常将原始向量的表示转换为压缩形式以优化查询过程。
然而,现代向量数据库的用户无需担心这些各种算法的复杂性和选择。优秀的向量数据库旨在在幕后处理所有复杂性和算法决策,确保您获得最佳性能和结果,无任何麻烦。通过利用向量数据库的专业知识,您可以专注于真正重要的事情——提取有价值的见解和提供强大的 AI 解决方案。
以下章节将探讨几种算法及其处理向量嵌入的独特方法。这些知识将使您能够做出明智的决策,并理解现代向量数据库的无缝性能。
5.1、随机投影
随机投影背后的基本思想是使用随机投影矩阵将高维向量投影到较低维空间。我们创建一个随机数矩阵。矩阵的大小将是我们想要的目标低维值。然后我们计算输入向量和矩阵的点积,这将产生一个投影矩阵,该矩阵具有比我们原始向量更少的维度,但仍保持其相似性。
当我们查询时,我们使用相同的投影矩阵将查询向量投影到较低维空间。然后,我们将投影的查询向量与数据库中的投影向量进行比较,以找到最近邻。由于数据的维度减少了,搜索过程比搜索整个高维空间要快得多。
只需记住,随机投影是一种近似方法,投影质量取决于投影矩阵的特性。一般来说,投影矩阵越随机,投影质量就越好。但是生成真正随机的投影矩阵在计算上可能很昂贵,特别是对于大型数据集。了解更多关于随机投影的信息。
5.2、乘积量化
构建索引的另一种方法是乘积量化(PQ),这是一种用于高维向量(如向量嵌入)的有损压缩技术。它获取原始向量,将其分解为更小的块,通过为每个块创建代表性"代码"来简化每个块的表示,然后将所有块重新组合在一起——而不丢失对相似性操作至关重要的信息。PQ 的过程可以分解为四个步骤:分割、训练、编码和查询。
- 分割 - 向量被分解为段。
- 训练 - 我们为每个段构建一个"代码本"。简单地说——算法生成可以分配给向量的潜在"代码"池。实际上——这个"代码本"由通过对向量的每个段执行 k-means 聚类创建的聚类中心点组成。我们在段代码本中的值数量将与我们用于 k-means 聚类的值相同。
- 编码 - 算法为每个段分配一个特定代码。实际上,在训练完成后,我们在代码本中找到与每个向量段最近的值。我们段的 PQ 代码将是代码本中相应值的标识符。我们可以使用任意多的 PQ 代码,这意味着我们可以从代码本中选择多个值来表示每个段。
- 查询 - 当我们查询时,算法将向量分解为子向量,并使用相同的代码本对它们进行量化。然后,它使用索引代码来找到与查询向量最近的向量。
代码本中代表性向量的数量是表示准确性和搜索代码本计算成本之间的权衡。代码本中的代表性向量越多,子空间中向量表示就越准确,但搜索代码本的计算成本就越高。相反,代码本中的代表性向量越少,表示就越不准确,但计算成本越低。了解更多关于 PQ 的信息。
5.3、局部敏感哈希
局部敏感哈希(LSH)是在近似最近邻搜索上下文中的索引技术。它针对速度进行了优化,同时仍然提供近似的、非穷尽的结果。LSH 使用一组哈希函数将相似向量映射到"桶"中,如下所示:
为了找到给定查询向量的最近邻,我们使用用于将相似向量"分桶"到哈希表中的相同哈希函数。查询向量被哈希到特定表,然后与该表中的其他向量进行比较以找到最接近的匹配。这种方法比搜索整个数据集要快得多,因为每个哈希表中的向量远少于整个空间中的向量。
重要的是要记住 LSH 是一种近似方法,近似质量取决于哈希函数的特性。一般来说,使用的哈希函数越多,近似质量就越好。然而,使用大量哈希函数在计算上可能很昂贵,对于大型数据集可能不可行。了解更多关于 LSH 的信息。
5.4、分层可导航小世界(HNSW)
HNSW 创建一个分层的树状结构,其中树的每个节点代表一组向量。节点之间的边代表向量之间的相似性。算法首先创建一组节点,每个节点都有少量向量。这可以随机完成,也可以通过使用 k-means 等算法对向量进行聚类来完成,其中每个聚类成为一个节点。
然后算法检查每个节点的向量,并在该节点和具有与其拥有的向量最相似的向量的节点之间绘制边。
当我们查询 HNSW 索引时,它使用这个图来浏览树,访问最可能包含与查询向量最接近的向量的节点。了解更多关于 HNSW 的信息。
、相似性度量
基于前面讨论的算法,我们需要理解相似性度量在向量数据库中的作用。这些度量是向量数据库如何比较和识别给定查询的最相关结果的基础。
相似性度量是用于确定向量空间中两个向量相似程度的数学方法。相似性度量在向量数据库中用于比较存储在数据库中的向量,并找到与给定查询向量最相似的向量。
可以使用几种相似性度量,包括:
- 余弦相似度: 测量向量空间中两个向量之间角度的余弦。它的范围从 -1 到 1,其中 1 表示相同向量,0 表示正交向量,-1 表示截然相对的向量。
- 欧几里得距离: 测量向量空间中两个向量之间的直线距离。它的范围从 0 到无穷大,其中 0 表示相同向量,更大的值表示越来越不相似的向量。
- 点积: 测量两个向量的幅度和它们之间角度的余弦的乘积。它的范围从 -∞ 到 ∞,其中正值表示指向同一方向的向量,0 表示正交向量,负值表示指向相反方向的向量。
相似性度量的选择将对从向量数据库获得的结果产生影响。还要注意的是,每种相似性度量都有其自身的优缺点,根据用例和要求选择正确的度量很重要。了解更多关于相似性度量的信息。
、过滤
存储在数据库中的每个向量也包括元数据。除了查询相似向量的能力之外,向量数据库还可以基于元数据查询过滤结果。为了做到这一点,向量数据库通常维护两个索引:向量索引和元数据索引。然后它在向量搜索本身之前或之后执行元数据过滤,但在任何一种情况下,都有导致查询过程变慢的困难。
过滤过程可以在向量搜索本身之前或之后执行,但每种方法都有其自身的挑战,可能会影响查询性能:
- 预过滤: 在这种方法中,元数据过滤在向量搜索之前完成。虽然这有助于减少搜索空间,但它也可能导致系统忽略不匹配元数据过滤条件的相关结果。此外,广泛的元数据过滤可能由于增加的计算开销而减慢查询过程。
- 后过滤: 在这种方法中,元数据过滤在向量搜索之后完成。这有助于确保考虑所有相关结果,但它也可能引入额外的开销并减慢查询过程,因为搜索完成后需要过滤掉不相关的结果。
为了优化过滤过程,向量数据库使用各种技术,如利用元数据的高级索引方法或使用并行处理来加速过滤任务。平衡搜索性能和过滤准确性之间的权衡对于在向量数据库中提供高效和相关的查询结果至关重要。了解更多关于向量搜索过滤的信息。
、数据库操作
与向量索引不同,向量数据库配备了一套功能,使它们更有资格在高规模生产环境中使用。让我们看看参与数据库操作的组件的整体概述。
8.1、性能和容错
性能和容错紧密相关。我们拥有的数据越多,所需的节点就越多——发生错误和故障的机会就越大。与其他类型的数据库一样,我们希望确保即使某些底层节点失败,查询也能尽可能快地执行。这可能是由于硬件故障、网络故障或其他类型的技术错误。这种故障可能导致停机甚至错误的查询结果。
为了确保高性能和容错,向量数据库使用分片和复制应用以下内容:
分片 - 跨多个节点分区数据。有不同的方法来分区数据——例如,它可以按不同数据聚类的相似性进行分区,使得相似向量存储在同一分区中。当进行查询时,它被发送到所有分片,检索并组合结果。这被称为"分散-聚集"模式。
复制 - 跨不同节点创建数据的多个副本。这确保即使特定节点失败,其他节点也能够替换它。有两种主要的一致性模型:最终一致性和强一致性。最终一致性允许数据的不同副本之间的临时不一致,这将提高可用性并减少延迟,但可能导致冲突甚至数据丢失。另一方面,强一致性要求在写操作被认为完成之前更新数据的所有副本。这种方法提供更强的一致性,但可能导致更高的延迟。
8.2、监控
为了有效管理和维护向量数据库,我们需要一个强大的监控系统来跟踪数据库性能、健康状况和整体状态的重要方面。监控对于检测潜在问题、优化性能和确保顺利的生产操作至关重要。监控向量数据库的一些方面包括以下内容:
- 资源使用 - 监控资源使用,如 CPU、内存、磁盘空间和网络活动,能够识别可能影响数据库性能的潜在问题或资源约束。
- 查询性能 - 查询延迟、吞吐量和错误率可能表示需要解决的潜在系统问题。
- 系统健康 - 整体系统健康监控包括各个节点的状态、复制过程和其他关键组件。
8.3、访问控制
访问控制是管理和调节用户对数据和资源访问的过程。它是数据安全的重要组成部分,确保只有授权用户才能查看、修改或与存储在向量数据库中的敏感数据交互。
访问控制很重要,原因如下:
- 数据保护: 由于 AI 应用程序通常处理敏感和机密信息,实施严格的访问控制机制有助于保护数据免受未经授权的访问和潜在泄露。
- 合规性: 许多行业,如医疗保健和金融,都受到严格的数据隐私法规的约束。实施适当的访问控制有助于组织遵守这些法规,保护它们免受法律和财务后果。
- 问责制和审计: 访问控制机制使组织能够维护向量数据库内用户活动的记录。这些信息对于审计目的至关重要,当发生安全泄露时,它有助于追溯任何未经授权的访问或修改。
- 可扩展性和灵活性: 随着组织的成长和发展,它们的访问控制需求可能会发生变化。强大的访问控制系统允许无缝修改和扩展用户权限,确保在组织成长过程中数据安全保持完整。
8.4、备份和集合
当一切都失败时,向量数据库提供依赖定期创建的备份的能力。这些备份可以存储在外部存储系统或基于云的存储服务上,确保数据的安全性和可恢复性。在数据丢失或损坏的情况下,这些备份可以用于将数据库恢复到以前的状态,最大限度地减少停机时间和对整个系统的影响。许多向量数据库允许用户选择备份特定索引并将它们保存为"集合",这些集合以后可以用于填充新索引。
8.5、API 和 SDK
这是橡胶遇到路面的地方:与数据库交互的开发人员希望使用易于使用的 API,使用熟悉和舒适的工具集。通过提供用户友好的界面,向量数据库 API 层简化了高性能向量搜索应用程序的开发。
除了 API 之外,向量数据库通常还会提供特定编程语言的 SDK 来封装 API。SDK 使开发人员在其应用程序中与数据库交互变得更加容易。这允许开发人员专注于他们的特定用例,如语义文本搜索、生成式问答、混合搜索、图像相似性搜索或产品推荐,而无需担心底层基础设施的复杂性。
、总结
向量嵌入在 NLP、计算机视觉和其他 AI 应用等领域的指数级增长导致了向量数据库作为计算引擎的出现,使我们能够在应用程序中有效地与向量嵌入交互。
向量数据库是专门构建的数据库,专门用于解决在生产场景中管理向量嵌入时出现的问题。因此,它们比传统的基于标量的数据库和独立向量索引具有显著优势。
在这篇文章中,我们回顾了向量数据库的关键方面,包括它如何工作、它使用什么算法,以及使其在生产场景中操作就绪的附加功能。我们希望这有助于您理解向量数据库的内部工作原理。幸运的是,现代向量数据库处理所有这些复杂的考虑(甚至更多),让您专注于应用程序的其余部分。
转自:超级前端
本文仅用于学术分享,如有侵权,请联系后台作删文处理

