数据建模
在使用向量搜索开发 AI 和机器学习 (ML) 应用程序时,以下是一些数据建模注意事项。这些因素有助于有效地利用向量搜索,在您的应用程序中生成准确高效的搜索响应。
数据表示
向量搜索依赖于将数据点表示为高维向量。向量表示的选择取决于数据的性质。
对于由文本文档组成的数据,可以使用词嵌入(例如,Word2Vec)或文档嵌入(例如,Doc2Vec)等技术将文本转换为向量。更复杂的模型也可以使用大型语言模型 (LLM)(如 OpenAI GPT-4 或 Meta 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 数据库能够高效地分配数据并使用并行处理访问这些数据,从而提高性能。