Lucene 标量量化

UDB-SX 支持 Lucene 引擎的内建标量量化功能。与字节向量需要在文档摄入之前对向量进行量化不同,Lucene 标量量化器是在 UDB-SX 的数据摄入过程中对输入向量进行量化的。Lucene 标量量化器使用基于 confidence_interval 参数计算出的最小和最大分位数,将 32 位浮点输入向量转换为每个段中的 7 位整数向量。在搜索期间,查询向量会使用每个段的最小和最大分位数在各段中进行量化,以计算查询向量与该段量化后的输入向量之间的距离。

量化可以将内存占用减少至原来的四分之一,但会损失一定的召回率。此外,量化会略微增加磁盘使用量,因为它需要同时存储原始输入向量和量化后的向量。

使用 Lucene 标量量化

要使用 Lucene 标量量化器,请在创建向量索引时将 k-NN 向量字段的 method.parameters.encoder.name 设置为 sq

PUT /test-index
{
  "settings": {
    "index": {
      "knn": true
    }
  },
  "mappings": {
    "properties": {
      "my_vector1": {
        "type": "knn_vector",
        "dimension": 2,
        "space_type": "l2",
        "method": {
          "name": "hnsw",
          "engine": "lucene",
          "parameters": {
            "encoder": {
              "name": "sq"
            },
            "ef_construction": 256,
            "m": 8
          }
        }
      }
    }
  }
}

置信区间

您可以选择在 method.parameters.encoder 对象中指定 confidence_interval 参数。confidence_interval 用于计算量化向量的最小和最大分位数:

  • 如果将 confidence_interval 设置在 0.91.0 之间(含),则分位数是静态计算的。例如,将 confidence_interval 设置为 0.9 表示基于中间 90% 的向量值计算最小和最大分位数,排除最小的 5% 和最大的 5% 的值。

  • confidence_interval 设置为 0 表示动态计算分位数,这涉及到对输入数据进行过采样和额外的计算。

  • 当未设置 confidence_interval 时,会根据向量维度 $$d$$ 使用公式 $$max(0.9, 1 - \frac{1}{1 + d})$$ 计算其值。

请注意:Lucene 标量量化仅适用于 float 向量。如果在映射 k-NN 向量时将 data_type 参数的默认值从 float 更改为 byte 或任何其他类型,请求将被拒绝。

以下示例方法定义指定了 Lucene sq 编码器,并将 confidence_interval 设置为 1.0。这个 confidence_interval 表示在计算最小和最大分位数时考虑所有输入向量。默认情况下,向量被量化为 7 位:

PUT /test-index
{
  "settings": {
    "index": {
      "knn": true
    }
  },
  "mappings": {
    "properties": {
      "my_vector1": {
        "type": "knn_vector",
        "dimension": 2,
        "space_type": "l2",
        "method": {
          "name": "hnsw",
          "engine": "lucene",
          "parameters": {
            "encoder": {
              "name": "sq",
              "parameters": {
                "confidence_interval": 1.0
              }
            },
            "ef_construction": 256,
            "m": 8
          }
        }
      }
    }
  }
}

对于输入向量的摄入、查询映射和值范围没有额外限制。

内存估算

在理想情况下,Lucene 标量量化器创建的 7 位向量所需内存仅为 32 位向量所需内存的 25%。

HNSW 内存估算

分层可导航小世界图所需的内存可以估算为 1.1 * (维度 + 8 * m) 字节/向量,其中 m 是在图构建过程中为每个元素创建的最大双向链接数。

举例说明,假设您有 100 万个向量,维度为 256,M 值为 16。内存需求估算如下:

1.1 * (256 + 8 * 16) * 1,000,000  0.4 GB