MongoDB Vector Search 支持浮点向量嵌入的自动量化(32 位和 64 位)。它还支持从某些嵌入模型中提取预量化的标量和二进制向量并索引。
关于量化
量化是将全保真向量压缩为更少位数的进程。它通过对简化的表示向量索引减少在MongoDB Vector Search索引中存储每个向量所需的主内存量。这样可以存储更多向量或更高维度的向量。因此,量化可减少资源消耗并提高速度。我们建议对具有大量向量(例如超过 100、000)的应用程序进行量化。
标量量化
标量量化涉及首先识别索引向量每个维度的最小值和最大值,以确定维度的值范围。然后,将该范围划分为大小相等的间隔或分箱。最后,将每个浮点值映射到一个 bin,以将连续浮点值转换为离散整数。在MongoDB Vector Search 中,这种量化将向量嵌入的RAM费用降低到量化前费用的大约四分之一 (1/3.75)。
二进制量化
二进制量化涉及假设每个维度的中点为 0,这通常适用于归一化为长度 1 的嵌入,例如 OpenAI 的 text-embedding-3-large。然后,将向量中的每个值与中点进行比较,如果大于中点,则为其分配二进制值 1;如果小于或等于中点,则为其分配二进制值 0。在MongoDB Vector Search 中,这种量化可将向量嵌入的RAM费用降低至量化前费用的二十四分之一 (1/24)。它不是1/32 是因为包含与向量值分开的分层可导航小世界 图表本身的数据结构未压缩。
当您运行查询时, MongoDB Vector Search 会使用相同的中点将查询向量中的浮点值转换为二进制向量,以便在查询向量和索引二进制向量之间进行有效比较。然后,它会使用与二进制索引结果相关的原始浮点值,重新评估二进制比较中已识别的候选值,从而进行重新评分,从而进一步完善结果。全保真向量存储在磁盘上自己的数据结构中,仅在重新评分期间配置二进制量化或对二进制或标量量化向量执行精确搜索时引用。
提示
要求
下表显示了自动量化和摄取量化向量的要求。
注意
Atlas 在内部将所有浮点值存储为 double 数据类型;因此,32 位和 64 位嵌入都与无需转换的自动量化兼容。
要求 | 对于 int1 引入 | 对于 int8 引入 | 对于自动标量量化 | 对于自动二进制量化 |
|---|---|---|---|---|
需要索引定义设置 | No | No | 是 | 是 |
需要 BSON | 是 | 是 | No | No |
mongod上的存储 |
|
| binData(float32)array(double) | binData(float32)array(double) |
支持的相似度方法 |
| cosineeuclideandotProduct | cosineeuclideandotProduct | cosineeuclideandotProduct |
支持的维度数 | 8 的倍数 | 1 改为 8192 | 1 改为 8192 | 1 改为 8192 |
支持近似最近邻 (ANN) 和精确最近邻 (ENN) 搜索 | 是 | 是 | 是 | 是 |
如何启用向量的自动量化
您可以将MongoDB Vector Search 配置为自动将集合中的浮点向量嵌入量化为简化的表示形式类型,例如向量索引中的 int8(标量)和 binary。
要设置或更改量化类型,请在索引定义中指定 quantization 字段值为 scalar 或 binary。与任何其他索引定义更改类似,这会触发索引重建。所指定的量化类型在查询时适用于所有索引向量和查询向量。您无需更改查询,因为查询向量会自动量化。
对于大多数嵌入模型,我们建议使用重新评分的二进制量化。 如果要使用非 QAT 的较低维度模型,请使用标量量化,因为它的表征损失较小,因此表征容量损失也较小。
收益分析
MongoDB Vector Search 提供标量量化以及带重新评分的二进制量化的原生功能。自动量化可减少高效处理所需的计算资源,从而提高应用程序的可扩展性并节省费用。自动量化会将 mongot 的RAM减少 3.75 倍(标量)和 24 倍(二进制);向量值分别缩小 4x 和 32x,但“分层可导航小世界”图表本身不会缩小。即使在最高数量和扩展,这也能提高性能。
用例
如果您有大量全保真向量(通常超过 100,000 个向量),我们建议使用自动量化。量化后,您可以对简化的表示向量进行索引,而不会影响检索向量时的准确性。
步骤
要启用自动量化:
指定您希望在MongoDB Vector Search索引中使用的量化类型。
在新的或现有的MongoDB Vector Search索引中,在fields.quantization 索引定义的 字段中指定以下量化类型之一:
scalar:从浮点输入向量生成字节向量。binary:从浮点输入向量生成位向量。
如果您对不是浮点值大量的数据指定自动量化, MongoDB Vector Search 会默默地忽略该向量而不是对其索引,并且会跳过这些向量。由于Atlas在内部将浮点值(32 位和 64 位)存储为 double 类型,因此输出任一精度的模型的嵌入将使用自动量化。
创建或更新索引。
构建索引大约需要一分钟时间。在建立索引时,索引处于初始同步状态。 构建完成后,您可以开始查询集合中的数据。
所指定的量化类型在查询时适用于所有索引向量和查询向量。
Considerations
当您在Atlas 用户界面中查看量化索引时,索引大小可能看起来比未经量化的索引大。这是因为 Size 指标表示存储的总数据,其中包括“可分层导航的小世界”图表(在内存中)、量化向量(在内存中)和全保真向量(在磁盘上)。要估计索引在查询时使用的内存量,请参阅 Required Memory 指标。
如何摄取预量化向量
MongoDB Vector Search 还支持从某些嵌入模型中摄取标量和二进制量化向量并索引。如果您还没有量化向量,则可以将嵌入转换为具有 float32、int1 或 子类型的BSON BinDataint8 向量。
用例
我们建议针对以下用例摄取量化的 BSON binData向量:
您需要对嵌入模型中量化向量输出进行索引。
您有大量浮点向量,并且希望减少
mongod中的存储和 WiredTiger 占用空间(例如磁盘和内存使用量)。
收益分析
BinData 是一种 BSON 数据类型,用于存储二进制数据。它压缩了您的向量嵌入,与使用标准 float32 数组的嵌入相比,在集群中所需的磁盘空间减少了大约三倍。要了解详情,请参阅向量压缩。
此子类型还允许您使用备用类型(例如 int1 或 int8 向量)对向量索引,从而减少为集合构建MongoDB Vector Search索引所需的内存。它将 mongot 的RAM减少了 3.75 倍(标量)和 24 倍(二进制);向量值分别缩小 4x 和 32x,但分层可导航小世界图表本身不会缩小。
如果您还没有 binData 向量,则可在将数据写入集合之前,使用任何支持的驱动程序将嵌入向量转换为此格式。以下过程将指导您将嵌入转换为带有 float32、int8 和 int1 子类型的 BinData 向量。
支持的驱动程序
BSON 以下驱动程序支持具有 float32、int1 和 int8 子类型的 BinData 向量:
C++ 驱动程序 v4.1.0 或更高版本
C#/.NET 驱动程序 v3.2.0 或更高版本
Go驱动程序v2.1.0 或更高版本
PyMongo 驱动程序 v4.10 或更高版本
Node.js 驱动程序 v6.11 或更高版本
Java 驱动程序 v5.3.1 或更高版本
先决条件
此过程中的示例会使用新数据或现有数据,以及使用 Voyage AI 的 voyage-3-large 模型所生成的嵌入。新数据的示例会使用示例文本字符串,而您可将其替换为自己的数据。现有数据的示例则使用来自 sample_airbnb 数据库中 listingsAndReviews 集合的部分文档(不带任何嵌入),而您可将其替换为自己的数据库和集合(可附带或不带任何嵌入)。
使用下面的 Data Source 下拉菜单选择是要对新数据还是集群中已有数据的 binData 向量进行量化。还要选择您首选的编程语言。
评估查询结果
您可以通过评估 ANN 搜索结果与 ENN 搜索结果与您的量化向量的匹配程度来衡量MongoDB Vector Search查询的准确性。也就是说,您可以将相同查询条件的 ANN 搜索结果与 ENN 搜索结果进行比较,并测量 ANN 搜索结果在 ENN 搜索结果中包含最近邻的频率。