什么是 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)向量, 最佳做法 可能是设置为 oversampling
1.5 或 2.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" 。 |
更多参数: pqCompressedDims , pqSampleSize 。 |
过度采样使用 | 有助于减少轻微的精度损失。 | 对于从更大的压缩恢复准确度至关重要。 |
理想的用例 | 适度减少内存,增加维度,可接受的精准率权衡。 | 大型数据集、高维度、快速搜索优先、通过过度采样管理精准率。 |