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

使用标量或二进制量化压缩矢量

Azure AI 搜索支持标量和二进制量化,以减少搜索索引中矢量的大小。 建议使用量化来减少矢量大小,因为这可以降低 float16 和 float32 嵌入的内存和磁盘存储消耗量。 若要抵消有损压缩的影响,可以对未压缩的矢量添加过度采样和重新评分。

若要使用内置量化,请执行以下步骤:

  • 矢量字段和索引的 vectorSearch 配置开始
  • 添加 vectorSearch.compressions
  • 添加 scalarQuantizationbinaryQuantization 配置,并为其命名
  • 设置可选属性以减轻有损索引的影响
  • 创建使用命名配置的新矢量配置文件
  • 创建具有新向量配置文件的新向量字段
  • 使用使用定义的配置进行索引编制期间量化的 float32 或 float16 数据加载索引
  • (可选)如果要重写默认值,请使用过度采样参数查询量化数据

先决条件

  • 具有 vectorSearch 配置的搜索索引中的矢量字段,使用分层可导航小世界 (HNSW) 或详尽的 K 最近邻域 (eKNN) 算法和新的矢量配置文件。

支持的量化技术

量化适用于接收浮点类型向量矢量的向量字段。 在本文中的示例中,字段的数据类型对于传入 float32 嵌入为 Collection(Edm.Single),但也支持 float16。 在配置了压缩的字段中接收矢量时,引擎会自动执行量化以减少内存中和磁盘上的向量数据的占用空间。

支持两种类型的量化:

  • 标量量化将浮点值压缩为更窄的数据类型。 AI 搜索目前支持 int8,即 8 位,减少了向量索引大小四倍。

  • 二进制量化将浮点转换为二进制位,其占用 1 位。 这会导致矢量索引大小减少多达 28 倍。

将“压缩”添加到搜索索引

以下示例显示了包含矢量字段的字段集合和 vectorSearch.compressions 节的部分索引定义。

包括 scalarQuantizationbinaryQuantization。 可以根据需要指定任意数量的压缩配置,然后将所需配置分配给矢量配置文件。

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 必须设置为 scalarQuantizationbinaryQuantization

  • 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。

  1. 在同一索引定义中,创建新的矢量配置文件,并添加压缩属性和算法。 下面是两个配置文件,每种量化方法更一个。

    "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> ] 
    }
    
  2. 将向量配置文件分配给的向量字段。 字段的数据类型为 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",
    }
    
  3. 使用用于拉取模型索引的索引器或用于推送模型索引的 API 加载索引

标量量化降低了每个向量嵌入中每个数字的分辨率。 它没有将每个数字描述为 16 位或 32 位浮点数,而是使用 8 位整数。 它标识一系列数字(通常是第 99 个百分位数的最小值和最大值),将它们划分为有限数量的级别或容器,并为每个容器分配一个标识符。 在 8 位标量量化中,有 2^8 或 256 个可能的 bin。

向量的每个分量都被映射到这组量化级别内最接近的代表值,其过程类似于将实数舍入到最接近的整数。 在量化的 8 位向量中,标识符号代替原始值。 量化后,每个向量都由其分量所属的 bin 的标识符数组表示。 与原始向量相比,这些量化向量需要存储的位数要少得多,从而减少所需存储和内存占用。

二进制量化通过将每个组件表示为一个位(0 或 1)来压缩高维向量。 此方法可大幅减少内存占用,并加速矢量比较操作,这对于搜索和检索任务至关重要。 基准测试的矢量索引大小最多可减少 96%。

这对于维度大于 1024 的嵌入尤其有效。 对于较小的维度,我们建议测试二进制量化的质量,或改为尝试标量。 此外,我们发现,当嵌入以零为中心时,BQ 表现非常出色。 最常见的嵌入模型,如 OpenAI、Cohere 和 Mistral 都是以零为中心的。

使用过采样查询量化向量字段

压缩或量化矢量字段的查询语法与非压缩矢量字段的语法相同,除非想要重写与原始矢量的过度采样或重新评分关联的参数。

回想一下,索引中的矢量压缩定义具有用于 rerankWithOriginalVectorsdefaultOversampling 的设置,以缓解有损压缩的影响。 可以重写默认值,以在查询时改变行为。 例如,如果 defaultOversampling 为 10.0,可以在查询请求中将其更改为其他值。

即使索引没有显式 rerankWithOriginalVectorsdefaultOversampling 定义,也可以设置过采样参数。 在查询时提供过采样会替代该查询的索引设置,并将 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 值或引入过采样。