適用於 NoSQL 的 Azure Cosmos DB 現在提供有效率的向量索引編製和搜尋。 這項功能的設計目的是要處理多模式高維度向量,以在任何規模上啟用有效率且精確的向量搜尋。 您現在可以將向量和資料直接儲存在文件中。 您資料庫中的每份文件不僅可以包含傳統的無架構數據,還可以包含多模式高維度向量做為檔的其他屬性。 此資料與向量共置可讓您有效率地編製索引和搜尋,因為向量會儲存在與其代表資料相同的邏輯單元中。 將向量和資料放在一起可簡化資料管理、AI 應用程式架構,以及向量型作業的效率。
適用於 NoSQL 的 Azure Cosmos DB 可讓您選擇向量索引方法,以提供彈性:
- 「扁平」或 K 最近鄰項目精確搜尋 (有時稱為暴力密碼破解) 可以提供 100% 的擷取重新叫用,以便進行範圍較小的焦點式向量搜尋。 特別是在結合查詢篩選和分區鍵時。
- 量化扁平索引,使用 DiskANN 型量化方法來壓縮向量,以提升 kNN 搜尋的效率。
- DiskANN 是一套由 Microsoft Research 開發的最先進的向量索引演算法,在任何規模上提供高效、高精確度的多模式向量搜尋。
若要深入瞭解向量索引,請參閱 向量索引。
在 Azure Cosmos DB 中,您可以透過 WHERE 子句,將向量搜尋與所有其他支援的 Azure Cosmos DB NoSQL 查詢篩選和索引結合。 這可讓您的向量搜尋為您的應用程式提供最相關的資料。
這項功能可增強 Azure Cosmos DB 的核心功能,使其在 AI 應用程式中更靈活地處理向量資料和搜尋需求。
附註
對超高通量向量搜尋功能有興趣嗎? Azure Cosmos DB 正在開發針對大型向量資料集搭配超高通量插入與搜尋的強化向量搜尋功能。 它能以可預測、低延遲及無與倫比的成本效益,容納數百萬次每秒查詢(QPS)。 註冊以了解更多搶先體驗機會,並在這些功能開放時收到通知。
什麼是向量存放區?
向量存放區或向量資料庫是用來儲存及管理向量內嵌的資料庫,這是高維度空間中資料的數學表示法。 在此空間中,每個維度各對應至資料的一個特徵,且有數萬個維度可用來代表複雜的資料。 向量在此空間中的位置代表其特性。 單字、片語或整份文件、影像、音訊和其他類型的資料,全都可以向量化。
向量存放區如何運作?
在向量儲存庫中,向量搜尋演算法被用來對嵌入向量進行索引和查詢。 一些著名的向量搜尋演算法包括分層可導航小世界 (HNSW)、倒置檔案 (IVF) 和 DiskANN。 向量搜尋是一種幫助您根據資料特性而非屬性欄位的完全匹配來尋找相似項目的方法。
此技術適用於搜尋類似文字、尋找相關影像、提出建議,甚至偵測異常這類應用程式。 其運作方式是利用內嵌 API 的機器學習模型,查詢您所建立的資料向量內嵌。 內嵌 API 的範例是 Azure OpenAI 內嵌或 Hugging Face on Azure。
向量搜尋會測量資料向量與查詢向量之間的距離。 最接近查詢向量的資料向量就是所找到語意最類似的資料向量。
在適用於 NoSQL 的 Azure Cosmos DB 中的整合式向量資料庫中,內嵌可以與原始資料一起儲存、編製索引和查詢。 此方法可讓您在複寫個別純向量資料庫中的資料時,無需支付額外的成本。 此外,此結構會一併保存向量內嵌和原始資料,進一步簡化多模資料作業,並提高資料一致性、規模和效能。
啟用向量索引和搜尋功能
若要針對適用於 NoSQL 的 Azure Cosmos DB 啟用此功能,請遵循下列步驟:
- 移至適用於 NoSQL 的 Azure Cosmos DB 資源頁面。
- 在左窗格的 [設定] 底下,選取 [功能]。
- 選取 NoSQL API 的向量搜尋。
- 閱讀該功能的說明以確認您要啟用它。
- 選取 [啟用] 以在適用於 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、float16、int8、uint8和 。 -
dimensions:路徑中每個向量的維度或長度。 路徑中的所有向量都應具有相同的維度數。 預設值為1536。 -
distanceFunction:用來計算距離/相似度的度量。 支援的計量為:
附註
每個唯一路徑最多可以有一個原則。 不過,如果多個原則都以不同的路徑為目標,則可以指定它們。
附註
許多嵌入模型會用 float32來表示向量的元素。 改用 float16 可減少向量的儲存空間50%,但可能會降低準確度。
容器向量原則可以描述成 JSON 物件。 以下是有效容器向量原則的兩個範例:
使用單一向量路徑的原則
{
"vectorEmbeddings": [
{
"path":"/vector1",
"dataType":"float32",
"distanceFunction":"cosine",
"dimensions":1536
}
]
}
使用兩個向量路徑的原則
{
"vectorEmbeddings": [
{
"path":"/vector1",
"dataType":"float32",
"distanceFunction":"cosine",
"dimensions":1536
},
{
"path":"/vector2",
"dataType":"float16",
"distanceFunction":"dotproduct",
"dimensions":100
}
]
}
向量索引原則
向量索引可提高使用系統函數執行 VectorDistance 向量搜尋時的效率。 使用向量索引時,向量搜尋的延遲較低、輸送量較高,且 RU 耗用量較少。 您可以指定下列類型的向量索引原則:
| 類型 | 描述 | 維度數上限 |
|---|---|---|
flat |
將向量儲存在其他索引屬性的相同索引上。 | 505 |
quantizedFlat |
量化 (壓縮) 向量,再儲存在索引上。 這樣可以改善延遲和輸送量,代價是精確度降低。 | 4096 |
diskANN |
根據 DiskANN 建立索引,進行快速且有效率的近似搜尋。 | 4096 |
附註
和quantizedFlatdiskANN索引需要插入至少 1,000 個向量。 這是為了確保量化程序的正確性。 如果向量少於 1,000 個,則會改為執行完整掃描,導致向量搜尋查詢的 RU 費用較高。
需要考慮的幾點:
flat和quantizedFlat索引類型會在執行向量搜尋時,使用 Azure Cosmos DB 的索引來儲存和讀取每個向量。 使用flat索引的向量搜尋是暴力搜尋,並能達到 100% 的精確性或召回率。 亦即,保證在資料集中尋找最類似的向量。 不過,扁平索引上的向量有505維度限制。quantizedFlat索引會將量化 (壓縮) 向量儲存在索引上。 使用quantizedFlat索引的向量搜尋也是暴力密碼破解搜尋,但其精確度可能略低於 100%,因為向量在加入至索引之前會先量化。 不過,使用quantized flat的向量搜尋相較於flat索引上的向量搜尋,其延遲應該會較低、輸送量更高,且 RU 成本較少。 這是一個不錯的選項,適用於較小的案例或是以下案例:您要使用查詢篩選條件,將向量搜尋的範圍縮小到相對較小向量集。 當需要為每個實體分割區編制索引的向量數目大約是 50,000 或更少時,建議使用quantizedFlat。 不過,這隻是一般指導方針,而且實際效能應該經過測試,因為每個案例可能不同。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/?"
}
],
"vectorIndexes": [
{
"path": "/vector1",
"type": "quantizedFlat"
},
{
"path": "/vector2",
"type": "diskANN"
}
]
}
重要
在向量原則或向量索引中,目前不支援萬用字元 (*、[]) 以及內嵌在陣列內的向量路徑。
使用 VectorDistance 使用查詢執行向量搜尋
建立具有所需向量政策的容器,並將向量資料插入容器後,您可以在查詢中使用 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 個維度。 - 向量插入的速率應受到限制。 在短時間內大量擷取(超過 500 萬個向量)可能需要更多索引建置時間。
- 現有容器目前不支援向量搜尋功能。 若要使用它,必須建立新的容器,而且必須指定容器層級向量內嵌原則。
- 不支援共用輸送量資料庫。
- 目前,擁有共享吞吐量的帳號不支援向量索引和搜尋功能。
- 一旦容器啟用向量索引和搜尋功能,就無法再關閉。
相關內容
- DiskANN + Azure Cosmos DB - Microsoft Mechanics 視頻
- .NET - 如何編製索引和查詢向量資料
- Python - 如何索引和查詢向量資料
- Java - 如何索引和查詢向量資料
- VectorDistance 系統函數
- 向量索引概觀
- 向量索引原則
- 向量索引政策範例
- 整合: