Link Search Menu Expand Document Documentation Menu

二进制量化

从版本 2.17 开始,OpenSearch 支持 Faiss 引擎的二进制量化 (BQ) 和二进制向量。BQ 将向量压缩为二进制格式(0 和 1),从而在内存使用方面效率极高。您可以根据所需的精度选择使用 1、2 或 4 位表示每个向量维度。使用 BQ 的优点之一是训练过程在索引期间自动处理。这意味着不需要单独的训练步骤,这与 PQ 等其他量化技术不同。

使用 BQ

要为 Faiss 引擎配置 BQ,请定义一个 knn_vector 字段并将 mode 指定为 on_disk。此配置默认为 1 位 BQ,并且 ef_searchef_construction 都设置为 100

PUT my-vector-index
{
  "settings" : {
    "index": {
      "knn": true
    }
  },
  "mappings": {
    "properties": {
      "my_vector_field": {
        "type": "knn_vector",
        "dimension": 8,
        "space_type": "l2",
        "data_type": "float",
        "mode": "on_disk"
      }
    }
  }
}

为了进一步优化配置,您可以指定额外的参数,例如压缩级别,并微调搜索参数。例如,您可以覆盖 ef_construction 值或定义压缩级别,这对应于用于量化的位数。

  • 1 位量化实现 32 倍压缩
  • 2 位量化实现 16 倍压缩
  • 4 位量化实现 8 倍压缩

这使得内存使用和召回性能得到更好的控制,提供了在精度和存储效率之间进行平衡的灵活性。

要指定压缩级别,请设置 compression_level 参数。

PUT my-vector-index
{
  "settings" : {
    "index": {
      "knn": true
    }
  },
  "mappings": {
    "properties": {
      "my_vector_field": {
        "type": "knn_vector",
        "dimension": 8,
        "space_type": "l2",
        "data_type": "float",
        "mode": "on_disk",
        "compression_level": "16x",
        "method": {
          "name": "hnsw",
          "engine": "faiss",
          "parameters": {
              "ef_construction": 16
          }
        }
      }
    }
  }
}

以下示例通过定义 ef_constructionencoder 和位数(可以是 124)来进一步微调配置。

PUT my-vector-index
{
  "settings" : {
    "index": {
      "knn": true
    }
  },
  "mappings": {
    "properties": {
      "my_vector_field": {
        "type": "knn_vector",
        "dimension": 8,
        "method": {
            "name": "hnsw",
            "engine": "faiss",
            "space_type": "l2",
            "parameters": {
              "m": 16,
              "ef_construction": 512,
              "encoder": {
                "name": "binary",
                "parameters": {
                  "bits": 1 
                }
              }
            }
        }
      }
    }
  }
}

使用二进制量化向量进行搜索

您可以通过提供向量并指定要返回的最近邻居数 (k) 来对索引执行向量搜索。

GET my-vector-index/_search
{
  "size": 2,
  "query": {
    "knn": {
      "my_vector_field": {
        "vector": [1.5, 5.5, 1.5, 5.5, 1.5, 5.5, 1.5, 5.5],
        "k": 10
      }
    }
  }
}

您还可以通过提供 ef_searchoversample_factor 参数来微调搜索。 oversample_factor 参数控制搜索在对候选向量进行排序之前进行过采样的因子。使用更高的过采样因子意味着在排序之前会考虑更多候选向量,从而提高准确性但也会增加搜索时间。选择 oversample_factor 值时,请权衡准确性和效率。例如,将 oversample_factor 设置为 2.0 会使排序阶段考虑的候选向量数量翻倍,这可能有助于获得更好的结果。

以下请求指定了 ef_searchoversample_factor 参数。

GET my-vector-index/_search
{
  "size": 2,
  "query": {
    "knn": {
      "my_vector_field": {
        "vector": [1.5, 5.5, 1.5, 5.5, 1.5, 5.5, 1.5, 5.5],
        "k": 10,
        "method_parameters": {
            "ef_search": 10
        },
        "rescore": {
            "oversample_factor": 10.0
        }
      }
    }
  }
}

HNSW 内存估算

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

例如,假设您有 100 万个维度为 256、m 为 16 的向量。以下部分提供了各种压缩值所需的内存估算。

1 位量化(32 倍压缩)

在 1 位量化中,每个维度使用 1 位表示,相当于 32 倍压缩因子。内存需求估算如下:

Memory = 1.1 * ((256 * 1 / 8) + 8 * 16) * 1,000,000
       ~= 0.176 GB

2 位量化(16 倍压缩)

在 2 位量化中,每个维度使用 2 位表示,相当于 16 倍压缩因子。内存需求估算如下:

Memory = 1.1 * ((256 * 2 / 8) + 8 * 16) * 1,000,000
       ~= 0.211 GB

4 位量化(8 倍压缩)

在 4 位量化中,每个维度使用 4 位表示,相当于 8 倍压缩因子。内存需求估算如下:

Memory = 1.1 * ((256 * 4 / 8) + 8 * 16) * 1,000,000
       ~= 0.282 GB

后续步骤

剩余 350 字符

有问题?

想贡献吗?