Cassandra 文档

版本

您正在查看预发布版本的文档。

数据建模

在使用向量搜索开发 AI 和机器学习 (ML) 应用程序时,以下是一些数据建模注意事项。这些因素有助于有效地利用向量搜索,在您的应用程序中生成准确高效的搜索响应。

数据表示

向量搜索依赖于将数据点表示为高维向量。向量表示的选择取决于数据的性质。

对于由文本文档组成的数据,可以使用词嵌入(例如,Word2Vec)或文档嵌入(例如,Doc2Vec)等技术将文本转换为向量。更复杂的模型也可以使用大型语言模型 (LLM)(如 OpenAI GPT-4Meta LLaMA 2)来生成嵌入。Word2Vec 是一种相对简单的模型,它使用浅层神经网络来学习基于词语上下文信息的词语嵌入。关键概念是 Word2Vec 为每个词语生成一个固定的向量,无论词语使用的上下文如何。LLM 是更复杂的模型,它们使用深度神经网络(特别是 Transformer 架构)来学习基于词语上下文信息的词语嵌入。与 Word2Vec 不同,这些模型生成上下文嵌入,这意味着同一个词语可以根据其使用的上下文具有不同的嵌入。

可以使用深度学习技术(如 卷积神经网络 (CNN))或预训练模型(如 对比语言图像预训练 (CLIP))来表示图像。选择能够捕获数据基本特征的向量表示。

数据集维度

向量搜索仅在向量具有相同维度时才有效,因为向量运算(如 点积余弦相似度)要求向量具有相同数量的维度。

对于向量搜索,至关重要的是所有嵌入都在同一个向量空间中创建。这意味着嵌入应该遵循相同的原则和规则,以实现正确的比较和分析。使用相同的嵌入库可以保证这种兼容性,因为该库以特定定义的方式一致地将数据转换为向量。例如,比较 Word2Vec 嵌入和 BERT(LLM)嵌入可能会出现问题,因为这些模型具有不同的架构,并且以根本不同的方式创建嵌入。

因此,向量数据类型是固定长度的浮点数向量。维度值由您使用的嵌入模型定义。一些机器学习库会告诉您维度值,但您必须使用嵌入模型来定义它。为您的数据集选择一个嵌入模型,该模型通过确保相关对象在嵌入空间中彼此靠近来创建良好的结构非常重要。您可能需要测试不同的嵌入模型,以确定哪个模型最适合您的数据集。

预处理嵌入向量

规范化是关于缩放数据,使其长度为 1。这通常通过将向量中的每个元素除以向量的长度来完成。

标准化是关于移动(减去均值)和缩放(除以标准差)数据,使其均值为零,标准差为 1。

需要注意的是,在嵌入向量上下文中,标准化和规范化并不相同。正确的预处理方法(标准化、规范化,甚至其他方法)取决于数据的具体特征以及您希望通过机器学习模型实现的目标。预处理步骤可能包括清理和标记化文本、调整图像大小和规范化图像,或处理缺失值。

规范化嵌入向量

规范化嵌入向量是一个过程,它确保向量空间中的每个嵌入向量都具有长度(或范数)为 1。这是通过将向量的每个元素除以向量的长度(也称为其欧几里得范数或L2范数)来完成的。

例如,查看来自 向量搜索快速入门 的嵌入向量及其规范化对应物,其中所有向量都使用了一致的长度

  • 原始

  • 规范化

[0.1, 0.15, 0.3, 0.12, 0.05]
[0.45, 0.09, 0.01, 0.2, 0.11]
[0.1, 0.05, 0.08, 0.3, 0.6]
[0.27, 0.40, 0.80, 0.32, 0.13]
[0.88, 0.18, 0.02, 0.39, 0.21]
[0.15, 0.07, 0.12, 0.44, 0.88]

在处理嵌入时规范化向量的主要原因是,它使向量之间的比较更有意义。通过规范化,您可以确保比较不受向量尺度的影响,并且仅基于它们的方向。这对于计算向量之间的余弦相似度特别有用,其中重点是向量之间的角度(方向关系),而不是它们的幅度。

规范化嵌入向量是一种标准化高维数据的方法,这样向量之间的比较更有意义,并且受原始向量尺度的影响更小。由于点积和余弦对于规范化向量是等效的,但点积算法速度快 50%,因此建议开发人员使用点积作为相似度函数。

但是,如果嵌入没有规范化,那么点积会静默地返回毫无意义的查询结果。因此,点积不是向量搜索中的默认相似度函数。

当您使用 OpenAI、PaLM 或 Simsce 生成嵌入时,它们默认情况下是规范化的。如果您使用其他库,您需要规范化向量并将相似度函数设置为点积。请参阅 向量搜索快速入门 中如何设置相似度函数。

规范化并非所有向量搜索示例都必需。

标准化嵌入向量

标准化嵌入向量通常指的是类似于统计学中使用的方法,其中数据被标准化为具有零均值和一个标准差。标准化的目标是转换嵌入向量,使其具有标准正态高斯分布的属性。

如果您使用的是使用点之间距离的机器学习模型(如最近邻或任何使用欧几里得距离或余弦相似度的模型),标准化可以确保所有特征对距离计算的贡献相同。如果没有标准化,较大尺度的特征可能会主导距离计算。

例如,在神经网络的上下文中,具有类似尺度的输入值可以帮助网络更有效地学习,因为它确保没有特定特征仅仅因为其尺度而主导学习过程。

索引和存储

SAI 索引和存储机制专为向量搜索等大型数据集量身定制。目前,SAI 使用 JVector,这是一种用于近似最近邻 (ANN) 搜索的算法,与分层可导航小世界 (HNSW) 非常相似。

像 JVector 这样的 ANN 搜索算法的目标是在数据集中找到与给定查询点最接近(或最相似)的数据点。但是,找到精确的最近邻在计算上可能很昂贵,尤其是在处理高维数据时。因此,ANN 算法旨在近似地找到最近邻,优先考虑速度和效率,而不是精确度。

JVector 通过创建图形层次结构来实现这一目标,其中层次结构的每个级别对应于一个可导航的小世界图形。它受到 DiskANN(一个磁盘支持的 ANN 库)的启发,将图形存储在磁盘上。对于图形中的任何给定节点(数据点),很容易找到通往任何其他节点的路径。层次结构的较高级别具有较少的节点,用于粗略导航,而较低级别具有更多节点,用于精细导航。这种索引结构通过将搜索空间缩小到潜在匹配项来实现快速检索。

JVector 还使用 Panama SIMD API 来加速索引构建和查询。

相似度度量

向量搜索依赖于计算向量之间的相似度或距离来识别相关匹配。选择合适的相似度度量至关重要,因为不同的度量可能更适合特定类型的数据。常见的相似度度量包括余弦相似度、欧几里得距离或杰卡德相似度。度量选择的应与数据的特征和所需的搜索行为相一致。

向量搜索支持三种相似度度量:余弦相似度点积欧几里得距离。向量搜索索引的默认相似度算法是余弦相似度。建议在大多数应用中使用点积对归一化嵌入进行计算,因为点积余弦相似度快 50%。

可扩展性和性能

随着数据集的扩展,可扩展性是一个关键的考虑因素。向量搜索算法应该被设计为能够高效地处理大规模数据集。您的使用向量搜索的 Cassandra 数据库能够高效地分配数据并使用并行处理访问这些数据,从而提高性能。

评估和迭代

持续评估和迭代数据,以根据已知事实和用户反馈来优化搜索结果。这也有助于识别改进的领域。迭代地优化向量表示、相似度度量、索引技术或预处理步骤可以带来更好的搜索性能和用户满意度。

用例

具有良好优化嵌入的向量数据库允许以新的方式搜索和关联数据,生成传统数据库以前无法实现的结果。

示例

  • 搜索与给定项目相似的项目,而无需知道确切的项目名称或 ID

  • 根据上下文和内容的相似性检索文档,而不是精确的字符串或关键字匹配

  • 扩展跨不同项目的搜索结果,例如搜索产品并从不同类别中检索上下文相关的产品

  • 执行词语相似度搜索,并向用户建议重新措辞查询或段落的方式

  • 将文本、图像、音频或视频编码为查询,并检索在概念上、视觉上、听觉上或上下文上与输入相似的媒体

  • 通过自动为数据生成关联来减少在元数据和整理上花费的时间

  • 通过自动识别和删除重复项来提高数据质量

最佳实践

  • 将有关向量的相关元数据存储在表中的其他列中。例如,如果您的向量是图像,请将原始图像存储在同一表中。

  • 根据您需要对数据库进行的查询选择预训练模型。

局限性

虽然向量嵌入可以替代或增强传统数据库的某些功能,但向量嵌入不能替代其他数据类型。由于存在局限性,嵌入最好作为现有数据的补充。

  • 向量嵌入不是人类可读的。当需要直接从表中检索数据时,不建议使用嵌入。

  • 模型可能无法捕获数据中的所有相关信息,从而导致结果不正确或不完整。