你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用标量或二进制量化压缩矢量
Azure AI 搜索支持标量和二进制量化,以减少搜索索引中矢量的大小。 建议使用量化来减少矢量大小,因为这可以降低 float16 和 float32 嵌入的内存和磁盘存储消耗量。 若要抵消有损压缩的影响,可以对未压缩的矢量添加过度采样和重新评分。
若要使用内置量化,请执行以下步骤:
- 从 矢量字段和索引的
vectorSearch
配置开始 - 添加
vectorSearch.compressions
- 添加
scalarQuantization
或binaryQuantization
配置,并为其命名 - 设置可选属性以减轻有损索引的影响
- 创建使用命名配置的新矢量配置文件
- 创建具有新向量配置文件的新向量字段
- 使用使用定义的配置进行索引编制期间量化的 float32 或 float16 数据加载索引
- (可选)如果要重写默认值,请使用过度采样参数查询量化数据
先决条件
- 具有
vectorSearch
配置的搜索索引中的矢量字段,使用分层可导航小世界 (HNSW) 或详尽的 K 最近邻域 (eKNN) 算法和新的矢量配置文件。
支持的量化技术
量化适用于接收浮点类型向量矢量的向量字段。 在本文中的示例中,字段的数据类型对于传入 float32 嵌入为 Collection(Edm.Single)
,但也支持 float16。 在配置了压缩的字段中接收矢量时,引擎会自动执行量化以减少内存中和磁盘上的向量数据的占用空间。
支持两种类型的量化:
标量量化将浮点值压缩为更窄的数据类型。 AI 搜索目前支持 int8,即 8 位,减少了向量索引大小四倍。
二进制量化将浮点转换为二进制位,其占用 1 位。 这会导致矢量索引大小减少多达 28 倍。
将“压缩”添加到搜索索引
以下示例显示了包含矢量字段的字段集合和 vectorSearch.compressions
节的部分索引定义。
包括 scalarQuantization
或 binaryQuantization
。 可以根据需要指定任意数量的压缩配置,然后将所需配置分配给矢量配置文件。
vectorSearch.Compressions
的语法在稳定版和预览版 REST API 之间有所不同,预览版添加了用于存储优化的新选项,以及对现有语法的更改。 后向兼容性通过内部 API 映射加以保留,但你应在面向 2024-11-01-preview 和将来版本的代码中采用新语法。
使用创建索引或创建或更新索引 REST API 配置压缩设置。
POST https://[servicename].search.windows.net/indexes?api-version=2024-07-01
{
"name": "my-index",
"fields": [
{ "name": "Id", "type": "Edm.String", "key": true, "retrievable": true, "searchable": true, "filterable": true },
{ "name": "content", "type": "Edm.String", "retrievable": true, "searchable": true },
{ "name": "vectorContent", "type": "Collection(Edm.Single)", "retrievable": false, "searchable": true, "dimensions": 1536,"vectorSearchProfile": "vector-profile-1"},
],
"vectorSearch": {
"profiles": [ ],
"algorithms": [ ],
"compressions": [
{
"name": "use-scalar",
"kind": "scalarQuantization",
"scalarQuantizationParameters": {
"quantizedDataType": "int8"
},
"rerankWithOriginalVectors": true,
"defaultOversampling": 10
},
{
"name": "use-binary",
"kind": "binaryQuantization",
"rerankWithOriginalVectors": true,
"defaultOversampling": 10
}
]
}
}
要点:
kind
必须设置为scalarQuantization
或binaryQuantization
。rerankWithOriginalVectors
使用原始的未压缩矢量来重新计算相似性,并对初始搜索查询返回的最匹配的结果重新排名。 即使stored
为 false,未压缩的向量也存在于搜索索引中。 此属性是可选的。 默认值为 true。defaultOversampling
将考虑更广泛的潜在结果,以抵消量化导致的信息减少。 潜在结果的公式由查询中的k
和过采样乘数组成。 例如,如果查询指定k
为 5,并且过采样为 20,则查询实际上会请求 100 个文档用于重新排序,并为此使用原始未压缩向量。 仅返回前k
个重新排序的结果。 此属性是可选的。 默认值为 4。quantizedDataType
是可选的,仅适用于标量量化。 如果添加它,则必须将其设置为int8
。 这是目前唯一支持标量量化的基元数据类型。 默认值为int8
。
添加矢量搜索算法
可以在 2024-11-01-preview REST API 中使用 HNSW 算法或详尽的 KNN。 对于稳定版,请仅使用 HNSW。
"vectorSearch": {
"profiles": [ ],
"algorithms": [
{
"name": "use-hnsw",
"kind": "hnsw",
"hnswParameters": {
"m": 4,
"efConstruction": 400,
"efSearch": 500,
"metric": "cosine"
}
}
],
"compressions": [ <see previous section>]
}
创建并分配新的矢量配置文件
若要使用新的量化配置,必须创建新的矢量配置文件。 要在内存中构建压缩索引,必须创建新的向量配置文件。 新配置文件使用 HNSW。
在同一索引定义中,创建新的矢量配置文件,并添加压缩属性和算法。 下面是两个配置文件,每种量化方法更一个。
"vectorSearch": { "profiles": [ { "name": "vector-profile-hnsw-scalar", "compression": "use-scalar", "algorithm": "use-hnsw", "vectorizer": null }, { "name": "vector-profile-hnsw-binary", "compression": "use-binary", "algorithm": "use-hnsw", "vectorizer": null } ], "algorithms": [ <see previous section> ], "compressions": [ <see previous section> ] }
将向量配置文件分配给新的向量字段。 字段的数据类型为 float32 或 float16。
在 Azure AI 搜索中,float32 和 float16 类型的实体数据模型 (EDM) 等效项分别
Collection(Edm.Single)
和Collection(Edm.Half)
。{ "name": "vectorContent", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": true, "dimensions": 1536, "vectorSearchProfile": "vector-profile-hnsw-scalar", }
使用用于拉取模型索引的索引器或用于推送模型索引的 API 加载索引。
标量量化在 Azure AI 搜索中的工作原理
标量量化降低了每个向量嵌入中每个数字的分辨率。 它没有将每个数字描述为 16 位或 32 位浮点数,而是使用 8 位整数。 它标识一系列数字(通常是第 99 个百分位数的最小值和最大值),将它们划分为有限数量的级别或容器,并为每个容器分配一个标识符。 在 8 位标量量化中,有 2^8 或 256 个可能的 bin。
向量的每个分量都被映射到这组量化级别内最接近的代表值,其过程类似于将实数舍入到最接近的整数。 在量化的 8 位向量中,标识符号代替原始值。 量化后,每个向量都由其分量所属的 bin 的标识符数组表示。 与原始向量相比,这些量化向量需要存储的位数要少得多,从而减少所需存储和内存占用。
二进制量化在 Azure AI 搜索中的工作原理
二进制量化通过将每个组件表示为一个位(0 或 1)来压缩高维向量。 此方法可大幅减少内存占用,并加速矢量比较操作,这对于搜索和检索任务至关重要。 基准测试的矢量索引大小最多可减少 96%。
这对于维度大于 1024 的嵌入尤其有效。 对于较小的维度,我们建议测试二进制量化的质量,或改为尝试标量。 此外,我们发现,当嵌入以零为中心时,BQ 表现非常出色。 最常见的嵌入模型,如 OpenAI、Cohere 和 Mistral 都是以零为中心的。
使用过采样查询量化向量字段
压缩或量化矢量字段的查询语法与非压缩矢量字段的语法相同,除非想要重写与原始矢量的过度采样或重新评分关联的参数。
回想一下,索引中的矢量压缩定义具有用于 rerankWithOriginalVectors
和 defaultOversampling
的设置,以缓解有损压缩的影响。 可以重写默认值,以在查询时改变行为。 例如,如果 defaultOversampling
为 10.0,可以在查询请求中将其更改为其他值。
即使索引没有显式 rerankWithOriginalVectors
或 defaultOversampling
定义,也可以设置过采样参数。 在查询时提供过采样会替代该查询的索引设置,并将 oversampling
设置为 rerankWithOriginalVectors
来执行查询。
POST https://[service-name].search.windows.net/indexes/demo-index/docs/search?api-version=2024-07-01
{
"vectorQueries": [
{
"kind": "vector",
"vector": [8, 2, 3, 4, 3, 5, 2, 1],
"fields": "myvector",
"oversampling": 12.0,
"k": 5
}
]
}
要点:
适用于根据向量配置文件分配进行矢量压缩的向量字段。
即使索引的压缩配置未指定过采样或重新排名选项,也会在查询时替代
defaultOversampling
值或引入过采样。