Azure Cosmos DB for MongoDB (vCore) 中的半精度向量索引编制

什么是 Half-Precision 向量索引?

半精度向量索引允许使用 16 位浮点数而不是标准 32 位浮点数来存储和索引向量嵌入。 这种优化可大幅减少内存使用量和存储成本,使处理较大的数据集和更高维向量更加可行。 此外,通过优化数据密度,它有助于改善许多矢量搜索方案中的查询性能。

主要优势

  • 增加维度支持: 使用半精度,现在可以为最多 4,000 个维度 的向量编制索引(比前一个限制 2,000 个增加)。
  • 减少了存储占用量: 与全精度向量相比,以 16 位格式存储向量会显著减少所需的存储量。 这可以节省大量成本,尤其是大规模矢量数据库。
  • 可配置的性能与精度: 为了微调搜索结果,我们在查询执行期间提供 过度采样 参数。 这样,就可以控制检索速度与降低精度的潜在影响之间的权衡。

创建 Half-Precision 向量索引

定义集合的向量索引时,可以通过在集合中"compression": "half"指定cosmosSearchOptions选项来启用半精度压缩。

db.runCommand({
  "createIndexes": "<vector_collection_name>",
  "indexes": [
    {
      "key": { "<vector_field_name>": "cosmosSearch" },
      "name": "<index_name>",
      "cosmosSearchOptions": {
        "kind": "vector-hnsw", // or vector-ivf
        "similarity": "cos",
        "dimensions": integer_value, // max 4000
        "compression": "half"
      }
    }
  ]
});

使用过度采样改进搜索

查询利用半精度压缩的向量索引时,可以使用 oversampling 聚合阶段中的 $search 参数。 此参数有助于缓解 16 位表示形式引入的任何可能的精度损失。

通过 oversampling 因子,可以从半精度索引中检索比所需的最终结果数 (k) 更多的最近的邻域。 然后,使用原始全精度向量对这些候选项进行比较,以确保最终排名结果更加准确。

例如,若要获取最相似的前 10 个(k=10)向量, 最佳做法 可能是设置为 oversampling1.52.0 等值。 通过 "oversampling": 1.5,系统将首先从半精度索引中获取 15 个候选项,然后使用全精度数据优化前 10 个候选项。

db.collection.aggregate([
  {
    "$search": {
      "cosmosSearch": {
        "vector": query_vector,
        "path": path_to_property,
        "k":  num_results_to_return,
        "oversampling": double_value
      }
    }
  },
  {
    "$project": {
      "similarityScore": { "$meta": "searchScore" },
      "_id": 0
    }
  }
]);

注释

oversampling 因子必须是一个双精度值,且最小值为 1.0。 此因素仅与使用 "compression": "half" 创建的矢量索引相关。

Half-Precision 与产品量子化

Azure Cosmos DB for MongoDB(vCore)中的 Half-Precision 和 产品量化(PQ) 压缩矢量索引,但它们在实现压缩和影响搜索的方式上有所不同:

功能 / 特点 半精准率 产品量化(PQ)
压缩方法 将每个向量维度减少到 16 位。 将向量空间划分为子空间并量化每个空间。
最大维度 最大 4,000 最多 16,000
精度更改 由于位深度较低而略有损失。 损失可能更大,可通过 pqCompressedDims 配置。
搜索速度 由于索引较小,速度适度增加。 由于高度压缩的矢量,速度显著增加。
索引生成时间 相对较快。 由于质心训练 (pqSampleSize),可能更长。
索引支持 HNSW、IVF。 DiskANN。
配置 简单,启用 compression: "half" 更多参数: pqCompressedDimspqSampleSize
过度采样使用 有助于减少轻微的精度损失。 对于从更大的压缩恢复准确度至关重要。
理想的用例 适度减少内存,增加维度,可接受的精准率权衡。 大型数据集、高维度、快速搜索优先、通过过度采样管理精准率。

后续步骤