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