適用於 NoSQL 的 Azure Cosmos DB 中的向量搜尋
適用於 NoSQL 的 Azure Cosmos DB 現在提供有效率的向量索引編製和搜尋。 這項功能的設計目的是處理高維度向量,讓您有效且精確地對任何規模進行向量搜尋。 您現在可以將向量和資料直接儲存在文件中。 資料庫中的每份文件不僅可以包含傳統的無結構描述資料,還可以包含高維度向量作為文件的其他屬性。 此資料與向量共置可讓您有效率地編製索引和搜尋,因為向量會儲存在與其代表資料相同的邏輯單元中。 將向量和資料放在一起可簡化資料管理、AI 應用程式架構,以及向量型作業的效率。
Azure Cosmos DB for NoSQL 讓您可以彈性選擇向量索引方法:
- 「扁平」或 K 最近鄰項目精確搜尋 (有時稱為暴力密碼破解) 可以提供 100% 的擷取重新叫用,以便進行範圍較小的焦點式向量搜尋。 特別是結合查詢篩選和資料分割索引鍵時。
- 量化扁平索引,使用 DiskANN 型量化方法來壓縮向量,以提升 kNN 搜尋的效率。
- DiskANN,Microsoft Research 開發的一套最先進的向量索引演算法,可以提高任何規模的高效、高精確度向量搜尋。
您可以使用 WHERE
子句,結合 Azure Cosmos DB 中的向量搜尋與所有其他支援的 Azure Cosmos DB NoSQL 查詢篩選和索引。 這可讓您的向量搜尋成為應用程式的最相關資料。
這項功能可增強 Azure Cosmos DB 的核心功能,使其在 AI 應用程式中更靈活地處理向量資料和搜尋需求。
什麼是向量存放區?
向量存放區或向量資料庫是用來儲存及管理向量內嵌的資料庫,這是高維度空間中資料的數學表示法。 在此空間中,每個維度各對應至資料的一個特徵,且有數萬個維度可用來代表複雜的資料。 向量在此空間中的位置代表其特性。 單字、片語或整份文件、影像、音訊和其他類型的資料,全都可以向量化。
向量存放區如何運作?
在向量存放區中,向量搜尋演算法可用來編製索引和查詢內嵌。 一些已知的向量搜尋演算法包括階層式導覽小型世界 (HNSW)、反轉檔案 (IVF)、DiskANN 等。向量搜尋方法可協助您根據資料性質來尋找類似的項目,而不是根據屬性欄位尋找完全相符的項目。 此技術適用於搜尋類似文字、尋找相關影像、提出建議,甚至偵測異常這類應用程式。 其運作方式是利用內嵌 API 的機器學習模型,查詢您所建立的資料向量內嵌。 內嵌 API 的範例是 Azure OpenAI 內嵌或 Hugging Face on Azure。 向量搜尋會測量資料向量與查詢向量之間的距離。 最接近查詢向量的資料向量就是所找到語意最類似的資料向量。
在 Azure Cosmos DB for NoSQL 的整合向量資料庫中,內嵌可以與原始資料一起儲存、編製索引和查詢。 此方法可讓您在複寫個別純向量資料庫中的資料時,無需支付額外的成本。 此外,此結構會一併保存向量內嵌和原始資料,進一步簡化多模資料作業,並提高資料一致性、規模和效能。
啟用向量索引和搜尋功能
在適用於 NoSQL 的 Azure Cosmos DB 中,向量編製索引和搜尋需要在 Azure Cosmos DB 的功能頁面上啟用。 請遵循下列步驟註冊:
瀏覽至您的 Azure Cosmos DB for NoSQL 資源頁面。
選取 [設定] 功能表項目下的 [功能] 窗格。
選取 [適用於 NoSQL 的 Azure Cosmos DB 中的向量搜尋] 功能。
閱讀功能的描述,以確認您想要啟用此功能。
選取 [啟用] 以開啟向量索引和搜尋功能。
提示
或者,使用 Azure CLI 來更新您的帳戶的功能以支援 NoSQL 向量搜尋。
az cosmosdb update \ --resource-group <resource-group-name> \ --name <account-name> \ --capabilities EnableNoSQLVectorSearch
注意
註冊要求將會自動核准;不過,可能需要15分鐘的時間才能在帳戶上完全啟用。
容器向量原則
執行 Azure Cosmos DB for NoSQL 的向量搜尋需要您定義容器的向量原則。 這會提供資料庫引擎的基本資訊,以針對容器文件中找到的向量進行有效率的相似度搜尋。 這也會告知向量索引編製原則所需的資訊,您應該選擇並指定屬性。 自主向量原則包含下列資訊:
- “path”:含有向量的屬性 (必要)。
- “datatype”:向量屬性的資料類型 (預設值 Float32)。
- “dimensions”:路徑中每個向量的維度性或長度。 路徑中的所有向量都應具有相同的維度數。 (預設 1536)。
- “distanceFunction”:用來計算距離/相似度的計量。 支援的計量為:
注意
每個唯一路徑最多可以有一個原則。 不過,您可以指定多個原則,前提是所有原則都以不同的路徑為目標。
容器向量原則可以描述成 JSON 物件。 以下是有效容器向量原則的兩個範例:
使用單一向量路徑的原則
{
"vectorEmbeddings": [
{
"path":"/vector1",
"dataType":"float32",
"distanceFunction":"cosine",
"dimensions":1536
}
]
}
使用兩個向量路徑的原則
{
"vectorEmbeddings": [
{
"path":"/vector1",
"dataType":"float32",
"distanceFunction":"cosine",
"dimensions":1536
},
{
"path":"/vector2",
"dataType":"int8",
"distanceFunction":"dotproduct",
"dimensions":100
}
]
}
向量索引原則
向量索引若使用 VectorDistance
系統函數執行向量搜尋時,則可以提高效率。 使用向量索引時,向量搜尋的延遲較低、輸送量較高,且 RU 耗用量較少。 您可以指定下列類型的向量索引原則:
類型 | 描述 | 維度數上限 |
---|---|---|
flat |
將向量儲存在其他索引屬性的相同索引上。 | 505 |
quantizedFlat |
量化 (壓縮) 向量,再儲存在索引上。 這樣可以改善延遲和輸送量,代價是精確度降低。 | 4096 |
diskANN |
根據 DiskANN 建立索引,進行快速且有效率的近似搜尋。 | 4096 |
注意
quantizedFlat
和 diskANN
索引需要插入至少 1,000 個向量。 這是為了確保量化程序的正確性。 如果少於 1,000 個向量,則會改為執行完整掃描,而這麼做會提高向量搜尋查詢的 RU 費用。
請注意以下幾點:
flat
和quantizedFlat
索引類型會在執行向量搜尋時,使用 Azure Cosmos DB 索引來儲存和讀取每個向量。 使用flat
索引的向量搜尋是暴力密碼破解搜尋,且會產生 100% 精確性或重新叫用。 亦即,保證在資料集中尋找最類似的向量。 不過,扁平索引上的向量有505
維度限制。quantizedFlat
索引會將量化 (壓縮) 向量儲存在索引上。 使用quantizedFlat
索引的向量搜尋也是暴力密碼破解搜尋,但其精確度可能略低於 100%,因為向量在加入至索引之前會先量化。 不過,使用quantized flat
的向量搜尋相較於flat
索引上的向量搜尋,其延遲應該會較低、輸送量更高,且 RU 成本較少。 這是一個不錯的選項,適用於較小的案例或是以下案例:您要使用查詢篩選條件,將向量搜尋的範圍縮小到相對較小向量集。quantizedFlat
當要編制索引的向量數目大約是每個實體分割區的 50,000 或更少時,建議使用 。 不過,這隻是一般指導方針,而且實際效能應該經過測試,因為每個案例可能不同。diskANN
索引是不同的索引,專門針對使用 DiskANN 的向量定義,這是由 Microsoft Research 開發的高效能向量索引演算法套件。 DiskANN 索引可以提供最低延遲、最高輸送量和最低 RU 成本查詢,同時還能維持高精確度。 一般而言,如果每個實體分割區有超過50,000個向量,DiskANN是所有索引類型中效能最高的。
以下是有效向量索引原則的範例:
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*"
}
],
"excludedPaths": [
{
"path": "/_etag/?"
},
{
"path": "/vector1/*"
}
],
"vectorIndexes": [
{
"path": "/vector1",
"type": "diskANN"
}
]
}
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*"
}
],
"excludedPaths": [
{
"path": "/_etag/?"
},
{
"path": "/vector1/*",
},
{
"path": "/vector2/*",
}
],
"vectorIndexes": [
{
"path": "/vector1",
"type": "quantizedFlat"
},
{
"path": "/vector2",
"type": "diskANN"
}
]
}
重要
已新增至索引編製原則的 "excludedPaths" 區段以確保插入效能最佳化的向量路徑。 若未將向量路徑新增至 "excludedPaths",將會導致向量插入的 RU 費用和延遲較高。
重要
向量原則或向量索引目前不支援通配符 (*, []) 。
在查詢中使用 VectorDistance() 執行向量搜尋
一旦您建立了具有所需向量原則的容器,並將向量資料插入至容器,您就可以在查詢中使用向量距離系統函數來執行向量搜尋。 NoSQL 查詢的範例,示範如何投射相似度分數作為別名 SimilarityScore
,並依照最類似到最不類似的順序排序:
SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3]) AS SimilarityScore
FROM c
ORDER BY VectorDistance(c.contentVector, [1,2,3])
重要
一律在查詢的語句中使用 TOP N
SELECT
子句。 否則,向量搜尋會嘗試傳回更多結果,而查詢會花費更多 RU,且延遲比必要還要高。
目前的限制
適用於 NoSQL 的 Azure Cosmos DB 中的向量索引編製和搜尋有一些限制。
quantizedFlat
和diskANN
索引需要至少 1,000 個向量編製索引,以確保量化正確無誤。 如果編製索引的向量少於1,000個,則會改用完整掃描,RU費用可能會更高。- 使用
flat
索引類型的向量索引最多可以有 505 個維度。 使用quantizedFlat
或DiskANN
索引類型的向量索引最多可以有 4,096 個維度。 - 索引
quantizedFlat
會使用與 DiskANN 相同的量化方法。 - 向量插入的速率應受到限制。 非常大的擷取(超過5M向量)可能需要額外的索引建置時間。
- 不支援共用輸送量資料庫。
- 目前,分析存放區 (和 Synapse Link) 和共用輸送量的帳戶不支援向量索引編製和搜尋。
- 在容器上啟用向量索引和搜尋之後,就無法停用。
相關內容
- DiskANN + Azure Cosmos DB - Microsoft Mechanics 影片
- .NET - 如何編製索引和查詢向量資料
- Python - 如何編製索引和查詢向量資料
- Java - 如何編製索引和查詢向量資料
- VectorDistance 系統函數
- 向量索引概觀
- 向量索引原則
- 管理索引
- 整合: