共用方式為


Azure Cosmos DB for NoSQL 中的向量搜尋 (預覽)

適用於:NoSQL

Azure Cosmos DB for NoSQL 現在提供預覽版的向量索引和搜尋。 這項功能的設計目的是處理高維度向量,讓您有效且精確地對任何規模進行向量搜尋。 您現在可以將向量和資料直接儲存在文件中。 這表示資料庫中的每份文件不僅可以包含傳統的無結構描述資料,還可以包含高維度向量作為文件的其他屬性。 此資料與向量共置可讓您有效率地編製索引和搜尋,因為向量會儲存在與其代表資料相同的邏輯單元中。 這可簡化資料管理、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 的整合向量資料庫中,內嵌可以與原始資料一起儲存、編製索引和查詢。 此方法可讓您在複寫個別純向量資料庫中的資料時,無需支付額外的成本。 此外,此結構會一併保存向量內嵌和原始資料,進一步簡化多模資料作業,並提高資料一致性、規模和效能。

註冊向量搜尋預覽功能

Azure Cosmos DB for NoSQL 的向量搜尋需要在 Azure Cosmos DB 功能頁面中進行預覽功能註冊。 請遵循下列步驟進行註冊:

  1. 瀏覽至您的 Azure Cosmos DB for NoSQL 資源頁面。

  2. 選取 [設定] 功能表項目下的 [功能] 窗格。

  3. 選取 [Azure Cosmos DB for NoSQL 中的向量搜尋]。

  4. 閱讀功能的描述,以確認您要註冊預覽。

  5. 選取 [啟用] 以註冊預覽。

注意

註冊要求將會自動獲得核准,不過可能需要幾分鐘的時間才會生效。

注意

DiskANN 適用於早期限制的預覽版,且需要填寫此表單。 當資源已上線以使用 DiskANN 索引時,Azure Cosmos DB 小組的成員將會連絡您。

提示

或者,使用 Azure CLI 來更新您的帳戶的功能以支援 NoSQL 向量搜尋。

az cosmosdb update \
     --resource-group <resource-group-name> \
     --name <account-name> \
     --capabilities EnableNoSQLVectorSearch

容器向量原則

執行 Azure Cosmos DB for NoSQL 的向量搜尋需要您定義容器的向量原則。 這會提供資料庫引擎的基本資訊,以針對容器文件中找到的向量進行有效率的相似度搜尋。 這也會告知向量索引編製原則所需的資訊,您應該選擇並指定屬性。 自主向量原則包含下列資訊:

  • “path”:含有向量的屬性 (必要)。
  • “datatype”:向量屬性的資料類型 (預設值 Float32)。 
  • “dimensions”:路徑中每個向量的維度性或長度。 路徑中的所有向量都應具有相同的維度數。 (預設 1536)。
  • “distanceFunction”:用來計算距離/相似度的計量。 支援的計量為:
    • cosine,具有從 -1 (相似度最低) 到 +1 (相似度最高) 的值。
    • dotproduct,其值從 -inf (最不類似) 到 +inf (最類似)。
    • euclidean,其值從 0 (最類似) 到 +inf (最不類似)。

注意

每個唯一路徑最多可以有一個原則。 不過,您可以指定多個原則,前提是所有原則都以不同的路徑為目標。

容器向量原則可以描述成 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

請注意以下幾點:

  • flatquantizedFlat 索引類型會在執行向量搜尋時,使用 Azure Cosmos DB 索引來儲存和讀取每個向量。 使用 flat 索引的向量搜尋是暴力密碼破解搜尋,且會產生 100% 精確性或重新叫用。 亦即,保證在資料集中尋找最類似的向量。 不過,扁平索引上的向量有 505 維度限制。

  • quantizedFlat 索引會將量化 (壓縮) 向量儲存在索引上。 使用 quantizedFlat 索引的向量搜尋也是暴力密碼破解搜尋,但其精確度可能略低於 100%,因為向量在加入至索引之前會先量化。 不過,使用 quantized flat 的向量搜尋相較於 flat 索引上的向量搜尋,其延遲應該會較低、輸送量更高,且 RU 成本較少。 這是一個不錯的選項,適用於較小的案例或是以下案例:您要使用查詢篩選條件,將向量搜尋的範圍縮小到相對較小向量集。 當容器中存在至少 1,000 個向量和少於 100,000 個向量時,應該使用 quantizedFlat

  • diskANN 索引是不同的索引,專門針對使用 DiskANN 的向量定義,這是由 Microsoft Research 開發的高效能向量索引演算法套件。 DiskANN 索引可以提供最低延遲、最高輸送量和最低 RU 成本查詢,同時還能維持高精確度。 不過,由於 DiskANN 是近似最近鄰項目 (ANN) 索引,因此精確度可能低於 quantizedFlatflat。 DiskANN 適用於早期限制的預覽版,且需要填寫此表單

以下是有效向量索引原則的範例:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/_etag/?"
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector1",
            "type": "quantizedFlat"
        }
    ]
}
{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/_etag/?"
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector1",
            "type": "quantizedFlat"
        },
        {
            "path": "/vector2",
            "type": "DiskANN"
        }
    ]
}

注意

量化平面和 DiskANN 索引需要插入至少 1,000 個向量。 這是為了確保量化程序的正確性。 如果少於 1,000 個向量,則會改為執行完整掃描,而這麼做會提高向量搜尋查詢的 RU 費用。

重要

此時在向量搜尋預覽中,不會在向量原則的路徑中使用巢狀路徑或萬用字元。 目前不支援對向量原則的取代作業。

在查詢中使用 VectorDistance() 執行向量搜尋

在您建立具有所需向量原則的容器,並將向量資料插入容器後,您就可以在查詢中使用向量距離系統函數來執行向量搜尋。 以下是 NoSQL 查詢範例,示範如何投設相似度分數作為別名 SimilarityScore,並依照最類似到最不類似的順序排序:

SELECT c.title, VectorDistance(c.contentVector, [1,2,3]) AS SimilarityScore   
FROM c  
ORDER BY VectorDistance(c.contentVector, [1,2,3])   

目前限制和條件約束

Azure Cosmos DB for NoSQL 中的向量索引和搜尋有一些限制,不過僅限在公開預覽的早期階段。

  • 您在向量索引原則中最多可以為每個路徑指定一個索引類型
  • 每個容器最多可以指定一個 DiskANN 索引類型
  • 只有新容器才支援向量索引。
  • 使用 flat 索引類型的向量索引最多可以有 505 個維度。 使用 quantizedFlatDiskANN 索引類型的向量索引最多可以有 4,096 個維度。
  • quantizedFlat 使用與 DiskANN 相同的量化方法,目前無法設定。
  • 共用輸送量資料庫目前無法使用向量搜尋預覽功能。
  • 使用 DiskANN 的早期預覽時,擷取速率應受到限制。

後續步驟