二进制量化
从版本 2.17 开始,OpenSearch 支持 Faiss 引擎的二进制量化 (BQ) 和二进制向量。BQ 将向量压缩为二进制格式(0 和 1),从而在内存使用方面效率极高。您可以根据所需的精度选择使用 1、2 或 4 位表示每个向量维度。使用 BQ 的优点之一是训练过程在索引期间自动处理。这意味着不需要单独的训练步骤,这与 PQ 等其他量化技术不同。
使用 BQ
要为 Faiss 引擎配置 BQ,请定义一个 knn_vector
字段并将 mode
指定为 on_disk
。此配置默认为 1 位 BQ,并且 ef_search
和 ef_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_construction
、encoder
和位数(可以是 1
、2
或 4
)来进一步微调配置。
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_search
和 oversample_factor
参数来微调搜索。 oversample_factor
参数控制搜索在对候选向量进行排序之前进行过采样的因子。使用更高的过采样因子意味着在排序之前会考虑更多候选向量,从而提高准确性但也会增加搜索时间。选择 oversample_factor
值时,请权衡准确性和效率。例如,将 oversample_factor
设置为 2.0
会使排序阶段考虑的候选向量数量翻倍,这可能有助于获得更好的结果。
以下请求指定了 ef_search
和 oversample_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