Azure AI 搜尋支援純量和二進位量化,以減少搜尋索引中的向量大小。 建議量化,因為它可減少 float16 和 float32 內嵌的記憶體和磁碟記憶體。 若要抵消失真壓縮的影響,您可以新增過度取樣和重新評分。
若要使用內建量化,請遵循下列步驟:
- 從向量欄位和
vectorSearch設定開始以至索引 - 新增
vectorSearch.compressions - 新增
scalarQuantization或binaryQuantization組態,並為其提供名稱 - 設定選擇性屬性,以減輕編製索引失真的影響
- 建立使用具名組態的新向量設定檔
- 建立具有新向量設定檔的新向量欄位
- 透過您定義的組態,使用 float32 或 float16 資料載入已在編製索引期間量化的索引
- 選擇性地,使用 oversampling 參數 查詢量化數據 。 如果向量欄位未在其定義中指定過度取樣,您可以在查詢時間新增。
小提示
Azure AI 搜尋:使用新的壓縮技術將向量成本降到 92.5% ,會比較壓縮策略,並說明儲存和成本的節省。 它也包含根據標準化折扣累積收益 (NDCG) 測量相關性的計量,示範您可以壓縮數據而不犧牲搜尋品質。
先決條件
-
搜尋索引中的向量欄位,其
vectorSearch設定會指定階層式導覽小型世界 (HNSW) 或詳盡的 K-最接近像素 (KNN) 演算法,以及新的向量設定檔。
支援的量化技術
量化適用於接收浮點數型向量的向量欄位。 在本文中的範例中,欄位的資料類型為 Collection(Edm.Single),適用於傳入 float32 內嵌,但也支援 float16。 在設定壓縮的欄位上收到向量時,引擎會執行量化,以減少記憶體和磁碟上的向量數據的使用量。
支援兩種類型的量化:
純量量化會將浮點數值壓縮成較精簡的資料類型。 AI 搜尋目前支援 int8,也就是 8 位元,可減少向量索引大小四倍。
二進位量化會將浮點數轉換成二進位位元,這需要 1 位元。 這可減少最多 28 倍的向量索引大小。
附註
雖然免費服務支援量化,但由於記憶體配額有限,因此不會示範完整的記憶體節省。
純量量化在 Azure AI 搜尋服務中的運作方式
純量量化可減少每個向量內嵌中各個數字的解析度。 純量量化會使用 8 位數的整數,而不是將每個數字描述為 16 位元或 32 位元的浮點數。 純量量化會識別數字範圍 (通常是第 99 個百分位數下限和上限),並分割成有限數目的層級或間隔,並且為每個間隔指派識別碼。 在 8 位元的純量量化中,有 2^8 或 256 個可能的間隔。
向量的每個元件都會對應至這一組量化層級內最接近的代表值,其過程類似於將實數四捨五入為最接近的整數。 在量化的 8 位數向量中,識別碼編號會取代原始值。 量化之後,每個向量都會以其元件所屬間隔的識別碼陣列表示。 相較於原始向量,這些量化向量所需的儲存間隔少很多,因此可減少儲存需求和磁碟使用量。
二進位量化在 Azure AI 搜尋服務中的運作方式
二進位量化會藉由將每個元件表示為單一位元 0 或 1 來壓縮高維度向量。 此方法可大幅減少記憶體使用量,並加速向量比較作業,這對搜尋和擷取工作至關重要。 效能評定測試顯示向量索引大小最多可減少96%。
對於維度大於 1024 的內嵌特別有效。 針對較小的維度,建議您改為測試二進位量化的品質,或改為嘗試純量。 此外,我們發現當內嵌以零為中心時,二進位量化效能非常好。 OpenAI、Cohere 和 Mistral 提供的最受歡迎的嵌入模型都以零為中心。
支援的重新評分技術
重新評分是一種可選技術,用於抵消由於向量量化而導致的資訊遺失。 在查詢執行期間,它會使用過度取樣來挑選額外的向量,並使用補充資訊來重新評分查詢找到的初始結果。 補充資訊可以是未壓縮的原始全精確度向量,或對於只進行二進位量化的情況,您可以選擇針對查詢向量使用二進位量化的文件候選項目進行重新評分。
只有 HNSW 圖形允許重新評分。 詳盡的 KNN 不支援重新評分,因為根據定義,所有向量都會在查詢時掃描,這使得重新評分和過度取樣變得無關緊要。
重新評分選項會在索引中指定,但您可以新增過度取樣查詢參數,在查詢時呼叫重新評分。
| 物體 | 屬性 |
|---|---|
| Index | 在矢量壓縮部分添加 RescoringOptions。 本文中的範例使用 RescoringOptions。 |
| Query | 在oversampling或RawVectorQuery定義上新增VectorizableTextQuery。 新增 oversampling 會在查詢時呼叫重新評分。 |
附註
重新評分參數名稱在過去數個版本中已變更。 如果您使用較舊的預覽 API,請檢閱 升級指示 以解決重大變更。
重新評分的通用程序為:
- 向量查詢會透過壓縮的向量欄位執行。
- 向量查詢會傳回前 k 個過度取樣的候選項目。
- 使用未壓縮的原始向量進行純量量化,或使用二進位量化的點積對過度取樣的 k 個候選項進行重新評分。
- 重新評分之後,結果會進行調整,讓更具相關性的匹配項目優先顯示。
純量量化向量的過採樣需要原始全精度向量的可用性。 二進位量化向量的過取樣可以使用全精度向量 (preserveOriginals) 或二進位向量的點積 (discardOriginals)。 如果您要最佳化向量儲存,請務必將全精確度向量保留在索引中,以進行重新評分。 如需詳細資訊,請參閱 從儲存體中移除可選擇的向量執行個體。
將「壓縮」新增至搜尋索引
本節說明如何在索引中指定 vectorsSearch.compressions 區段。 下列範例顯示部分索引定義,其中包含包含向量字段的 fields 集合。
壓縮範例包含 scalarQuantization 或 binaryQuantization。 您可以視需要指定盡可能多的壓縮組態,然後將您想要的壓縮組態指派給向量設定檔。
vectorSearch.Compressions 的語法在穩定和預覽 REST API 之間有所不同,而預覽版本增加了更多的儲存優化選項,並且現有語法有所變更。 回溯相容性會透過內部 API 對應保留,但我們建議在以 2024-11-01-preview 和未來的版本為目標的程式代碼中採用較新的屬性。
使用 [建立索引] 或 [建立或更新索引] REST API 來設定壓縮設定。
POST https://[servicename].search.windows.net/indexes?api-version=2025-09-01
{
"name": "my-index",
"description": "This is a description of this 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": [
{
"name": "vector-profile-1",
"algorithm": "use-hnsw",
"compression": "use-scalar"
}
],
"algorithms": [
{
"name": "use-hnsw",
"kind": "hnsw",
"hnswParameters": { },
"exhaustiveKnnParameters": null
}
],
"compressions": [
{
"scalarQuantizationParameters": {
"quantizedDataType": "int8"
},
"name": "mySQ8",
"kind": "scalarQuantization",
"rescoringOptions": {
"enableRescoring": true,
"defaultOversampling": 10,
"rescoreStorageMethod": "preserveOriginals"
},
"truncationDimension": 2
},
{
"name": "myBQC",
"kind": "binaryQuantization",
"rescoringOptions": {
"enableRescoring": true,
"defaultOversampling": 10,
"rescoreStorageMethod": "discardOriginals"
},
"truncationDimension": 2
}
]
},
}
重點:
kind必須設定為scalarQuantization或binaryQuantization。rescoringOptions是屬性集合,使用在量化之前存在的原始完元精確度向量來重新評分查詢結果,以抵消失真壓縮。 若要重新評分才能運作,您必須有提供此內容的向量執行個體。 將rescoreStorageMethod設定為discardOriginals可防止您使用enableRescoring或defaultOversampling。 如需向量儲存體的詳細資訊,請參閱從儲存體中排除選用向量執行個體。"rescoreStorageMethod": "preserveOriginals"會使用原始完全精確度向量來重新評分向量搜尋結果,這樣可能會導致搜尋分數和排名有所調整,進而提升重新評分步驟所決定的更多相關相符項目。 對於二進位量化,您可以將rescoreStorageMethod設為discardOriginals以進一步減少儲存空間,而不會降低品質。 二進位量化不需要原始向量。defaultOversampling會考慮一組更廣泛的潛在結果,以克服量化資訊減少的問題。 潛在結果的公式包含查詢中的k,以及過度取樣乘數。 例如,如果查詢指定k(總計 5),且過度取樣為 20,則查詢會有效要求 100 份文件用於重新排名,並針對該目的使用原始未壓縮的向量。 系統只會傳回前k大重新排名的結果。 這是選用屬性。 預設值為 4。quantizedDataType是選擇性的,且僅適用於純量量化。 如果您新增它,則必須設定為int8。 這是目前唯一支援純量量化的基本資料類型。 預設值為int8。truncationDimension利用 text-embedding-3 模型的固有功能來「以不同的粒度對資訊進行編碼,並允許單一嵌入適應下游任務的計算限制」(參見 Matryoshka Representation Learning)。 不論是否有重新評分選項,您都可以使用截斷的維度。 如需如何在 Azure AI 搜尋中實作這項功能的詳細資訊,請參閱使用 MRL 壓縮截斷維度。
新增向量搜尋演算法
您可以在 2024-11-01-preview REST API 或更新版本中使用 HNSW 或 eKNN 演算法。 針對穩定版本,只使用 HNSW。 如果您想要重新評分,您必須選擇 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。
使用過度取樣查詢量化向量欄位
壓縮或量化向量欄位的查詢語法與非壓縮向量欄位相同,除非您想要覆寫與過度取樣和重新記錄相關聯的參數。 您可以新增 oversampling 參數,以在查詢時叫用過度取樣和重新評分。
請使用搜尋文件來進行請求。
回想一下,索引中的向量壓縮定義具有 enableRescoring、rescoreStorageMethod 和 defaultOversampling 的設定,以降低失真壓縮的影響。 您可以覆寫預設值,以在查詢時間改變行為。 例如,如果 defaultOversampling 為 10.0,您可以將其變更為查詢要求中的其他值。
即使索引沒有明確的重新評分選項或 defaultOversampling 定義,您也可以設定過度取樣參數。 在查詢時間提供 oversampling 會覆寫該查詢的索引設定,並以有效的 enableRescoring 為 true 來執行查詢。
POST https://[service-name].search.windows.net/indexes/demo-index/docs/search?api-version=2025-09-01
{
"vectorQueries": [
{
"kind": "vector",
"vector": [8, 2, 3, 4, 3, 5, 2, 1],
"fields": "myvector",
"oversampling": 12.0,
"k": 5
}
]
}
重點:
過度取樣適用於進行向量壓縮的向量欄位 (根據向量設定檔指派)。
查詢中的過度取樣會覆寫索引中的
defaultOversampling值,或在查詢時啟用過度取樣和重新計分,即使索引的壓縮組態未指定過度取樣或重排序選項也一樣。