你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure DocumentDB 中矢量搜索的产品量化

产品量化(PQ)是 Azure DocumentDB 中的一种强大技术,可显著压缩矢量搜索中使用的高维矢量嵌入。 此压缩可减少内存使用量并加快最接近的邻居搜索速度,从而提高大型矢量数据集的效率。 虽然 PQ 为速度和规模提供了优势,但它可能以牺牲准确性为代价。

优点

  • 减少存储: 与全精度(float32)向量相比,PQ 极大地降低了矢量索引所需的存储,从而大幅节省大型数据集的成本。
  • 更快的搜索: 使用压缩向量,系统可以更快速地计算距离并查找可能的最近邻居,比使用全精度向量要快得多。
  • 改进了可伸缩性: 较低的内存开销使缩放矢量搜索能够处理群集中的更大和更高维嵌入。

工作原理

产品量化将高维向量空间划分为多个低维子空间。 然后,每个子空间使用聚类分析算法(通常为 k-means)独立量化。 每个分类的中心表示其中的所有向量。 然后,每个原始向量由它所属的每个子空间中的群集 ID 的简短代码表示。

使用产品量化

要使用 Product 量化来创建矢量索引,请使用createIndexes命令并指定cosmosSearchOptions"compression": "pq""kind" : "vector-diskann"

{
    "createIndexes": "<collection_name>",
    "indexes": [
        {
            "name": "<index_name>",
            "key": {
                "<path_to_property>": "cosmosSearch"
            },
            "cosmosSearchOptions": {
                "kind": "vector-diskann",
                "similarity": "<string_value>", // "COS", "L2"
                "dimensions": <integer_value>, // Max 16,000
                "compression": "pq",
                "pqCompressedDims": <integer_value>, // Dimensions after compression (< original)
                "pqSampleSize": <integer_value>    // Samples for centroid generation
            }
        }
    ]
}
字段 类型 Description
compression 字符串 "pq"设置为“启用产品量化”。
pqCompressedDims 整数 PQ 压缩后的维度(必须小于原始维度)。 如果省略,则自动计算。 范围:1-8000。
pqSampleSize 整数 PQ 质心训练的样本向量数量。 较高的价值意味着质量更好,但生成时间更长。 默认值:1000。 范围:1000-100000。

注释

产品量化技术目前仅支持vector-diskann索引类型。

注释

为了获得最佳结果,请在集合包含数据后创建 PQ 索引。 如果集合为空,系统将随机向量用于初始质心。 如果文档数小于 pqSampleSize,则训练数据将在现有向量数据范围内用随机数据进行填充。

如何设置压缩维度

如果未指定 pqCompressedDims,它将根据原始向量 dimensions自动确定:

原始维度范围 pqCompressedDims
[0 - 32) 尺寸 / 2
[32 - 64) 16
[64 - 128) 32
[128 - 512) 64
[512 - 1536) 96
高于 1536 128

创建 PQ 索引

db.runCommand(
{
    "createIndexes": "your_vector_collection",
    "indexes": [
        {
            "key": { "v": "cosmosSearch" },
            "name": "diskann_pq_index",
            "cosmosSearchOptions": {
                "kind": "vector-diskann",
                "similarity": "COS",
                "dimensions": 1536,
                "compression": "pq",
                "pqCompressedDims": 96,
                "pqSampleSize": 2000
            }
        }
    ]
} )

使用过度采样改进搜索

PQ 压缩可能会导致距离计算中的精度损失。 为了减少这种情况,Azure DocumentDB 提供 oversampling 参数在运算符 $search 中。

因子 oversampling (一个至少为 1 的浮点数)指定要从压缩索引中检索的候选向量数量比 k (所需结果数)多。 这些额外的候选项用于使用原始的全精准率向量优化搜索,从而提高最终前 k 准确度。 例如,若要获取最相似的前 10 个(k=10)向量, 最佳做法 可能是设置为 oversampling1.52.0 等值。 通过 "oversampling": 1.5,系统将首先从索引中获取 15 个候选项,然后使用全精度数据优化前 10 名。

{
    "$search": {
        "cosmosSearch": {
            "vector": <vector_to_search>,
            "path": "<path_to_property>",
            "k": <num_results_to_return>,
            "oversampling": <float_value> 
        },
    }
}

此代码片段演示了使用 $search 运算符进行产品量化的矢量搜索。 它将queryVector作为输入,在v字段中搜索。 该查询使用 2.0 的 oversampling 因子请求前 10 个最相似的文档 (k: 10),这将检索 20 个候选项,从而提高对压缩索引的搜索的准确度。

db.your_vector_collection.aggregate([
    {
        $search: {
            "cosmosSearch": {
                "vector": [0.1, 0.5, 0.9, ...],
                "path": "v",
                "k": 10,
                "oversampling": 2.0 // Retrieve 2 * 10 = 20 candidates for reranking
            },
            "returnStoredSource": true
        }
    }
])

半精准率与产品量化

Azure DocumentDB 中的 半精度 和产品量化(PQ)压缩矢量索引,但它们在实现压缩和影响搜索的方式上有所不同:

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

产品量化注意事项

  • 精度与压缩: 更高的 PQ 压缩会导致较小的索引和更快的搜索,但更高的精度损失。 试验 pqCompressedDimsoversampling 以找到正确的平衡。
  • 索引生成时间: 由于质心训练过程的影响 pqSampleSize,PQ 索引创建可能需要更长的时间。
  • 数据分布: 当矢量数据具有清晰的分类结构时,PQ 最有效。

后续步骤