共用方式為


使用純量或二進位量化壓縮向量

Azure AI 搜尋支援純量和二進位量化,以減少搜尋索引中的向量大小。 建議量化以減少向量大小,因為它會降低 float16 和 float32 內嵌的記憶體和磁碟記憶體耗用量。 若要抵消遺失壓縮的影響,您可以新增過度取樣,並重新記錄未壓縮的向量。

若要使用內建量化,請遵循下列步驟:

  • 向量欄位和 vectorSearch 索引的設定 開始
  • 新增 vectorSearch.compressions
  • 新增 scalarQuantizationbinaryQuantization 組態,並為其提供名稱
  • 設定選擇性屬性,以減輕編製索引失真的影響
  • 建立使用具名組態的新向量設定檔
  • 建立具有新向量設定檔的新向量欄位
  • 透過您定義的組態,使用 float32 或 float16 資料載入已在編製索引期間量化的索引
  • 如果您想要覆寫預設值,請選擇性地使用過度取樣參數查詢量化資料

必要條件

  • 搜尋索引 中的向量字段搭配組 vectorSearch 態,使用階層式導覽小型世界 (HNSW) 或詳盡的 K 近鄰 (eKNN) 演算法和新的向量配置檔。

支援的量化技術

量化適用於接收浮點數型向量的向量欄位。 在本文中的範例中,欄位的資料類型為 Collection(Edm.Single),適用於傳入 float32 內嵌,但也支援 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。

純量量化可減少每個向量內嵌中各個數字的解析度。 純量量化會使用 8 位數的整數,而不是將每個數字描述為 16 位元或 32 位元的浮點數。 純量量化會識別數字範圍 (通常是第 99 個百分位數下限和上限),並分割成有限數目的層級或間隔,並且為每個間隔指派識別碼。 在 8 位元的純量量化中,有 2^8 或 256 個可能的間隔。

向量的每個元件都會對應至這一組量化層級內最接近的代表值,其過程類似於將實數四捨五入為最接近的整數。 在量化的 8 位數向量中,識別碼編號會取代原始值。 量化之後,每個向量都會以其元件所屬間隔的識別碼陣列表示。 相較於原始向量,這些量化向量所需的儲存間隔少很多,因此可減少儲存需求和磁碟使用量。

二進位量化會藉由將每個元件表示為單一位元 0 或 1 來壓縮高維度向量。 此方法可大幅減少記憶體使用量,並加速向量比較作業,這對搜尋和擷取工作至關重要。 效能評定測試顯示向量索引大小最多可減少96%。

對於維度大於 1024 的內嵌特別有效。 針對較小的維度,建議您改為測試二進位量化的品質,或改為嘗試純量。 此外,我們發現 BQ 在內嵌以零為中心時表現非常好。 最熱門的內嵌模型,例如 OpenAI、Cohere 和 Mistral 都以零為中心。

使用過度取樣查詢量化向量欄位

壓縮或量化向量欄位的查詢語法與非壓縮向量欄位相同,除非您想要覆寫與原始向量過度取樣或重新取樣相關聯的參數。

回想一下,索引中的向量壓縮定義具有 和 defaultOversampling rerankWithOriginalVectors 的設定,以減輕遺失壓縮的影響。 您可以覆寫預設值,以在查詢時間改變行為。 例如,如果 defaultOversampling 為 10.0,您可以將其變更為查詢要求中的其他值。

即使索引沒有明確的 rerankWithOriginalVectorsdefaultOversampling 定義,您也可以設定過度取樣參數。 在查詢時間提供 oversampling 會覆寫該查詢的索引設定,並以有效的 rerankWithOriginalVectors 為 true 來執行查詢。

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 值,或在查詢時引入過度取樣,即使索引的壓縮設定未指定過度取樣或重新排名選項也一樣。