产品量化(PQ)是 Azure Cosmos DB for MongoDB vCore 中的一种强大技术,可显著压缩矢量搜索中使用的高维矢量嵌入。 此压缩可减少内存使用量并加快最接近的邻居搜索速度,从而提高大型矢量数据集的效率。 虽然 PQ 为速度和规模提供了优势,但它可能以牺牲准确性为代价。
优点
- 减少存储: 与全精度(float32)向量相比,PQ 极大地降低了矢量索引所需的存储,从而大幅节省大型数据集的成本。
- 更快的搜索:使用压缩向量可以让系统更快速地计算距离,并更快地找到比使用全精度向量更有效的潜在最近邻。
- 改进了可伸缩性: 较低的内存开销使缩放矢量搜索能够处理群集中的更大和更高维嵌入。
工作原理
产品量化将高维向量空间划分为多个低维子空间。 然后,每个子空间使用聚类分析算法(通常为 k-means)独立量化。 每个分类的中心表示其中的所有向量。 然后,每个原始向量由它所属的每个子空间中的群集 ID 的简短代码表示。
使用产品量化
若要通过产品量化创建矢量索引,请使用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 Cosmos DB for MongoDB (vCore)在$search
运算符中提供了oversampling
参数。
因子 oversampling
(至少为 1 的浮点数)指定从压缩索引中检索到的候选向量数量,比 k
(所需结果数)多多少。 这些额外的候选项用于使用原始的全精准率向量优化搜索,从而提高最终前 k
准确度。 例如,若要获取最相似的前 10 个(k
=10)向量, 最佳做法 可能是设置为 oversampling
1.5 或 2.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
}
}
])
Half-Precision 与产品量化
Azure Cosmos DB for MongoDB(vCore)中的 半精度 和产品量化(PQ)压缩矢量索引,但它们在实现压缩和影响搜索的方式上有所不同:
功能 / 特点 | 半精准率 | 产品量化(PQ) |
---|---|---|
压缩方法 | 将每个向量维度减少到 16 位。 | 将向量空间划分为子空间并量化每个空间。 |
最大维度 | 最大 4,000 | 最多 16,000 |
精度更改 | 由于位深度较低而略有损失。 | 损失可能更大,可通过 pqCompressedDims 配置。 |
搜索速度 | 由于索引较小,速度适度增加。 | 由于高度压缩的矢量,速度显著增加。 |
索引生成时间 | 相对较快。 | 由于质心训练 (pqSampleSize ),可能更长。 |
索引支持 | HNSW、IVF。 | DiskANN。 |
配置 | 简单,启用 compression: "half" 。 |
更多参数: pqCompressedDims , pqSampleSize 。 |
过度采样使用 | 有助于减少轻微的精度损失。 | 对于从更大的压缩恢复准确度至关重要。 |
理想的用例 | 适度减少内存,增加维度,可接受的精准率权衡。 | 大型数据集、高维度、快速搜索优先、通过过度采样管理精准率。 |
产品量化注意事项
- 精度与压缩: 更高的 PQ 压缩会导致较小的索引和更快的搜索,但更高的精度损失。 试验
pqCompressedDims
和oversampling
以找到正确的平衡。 - 索引生成时间: 由于质心训练过程的影响
pqSampleSize
,PQ 索引创建可能需要更长的时间。 - 数据分布: 当矢量数据具有清晰的分类结构时,PQ 最有效。