共用方式為


Cosmos DB 中的索引向量資料 在 Fabric 中

Cosmos DB 在 Fabric 中現已提供高效的向量索引與搜尋功能。 這項功能的設計目的是要處理多模式高維度向量,以在任何規模上啟用有效率且精確的向量搜尋。 您現在可以將向量和資料直接儲存在文件中。 您資料庫中的每份文件不僅可以包含傳統的無架構數據,還可以包含多模式高維度向量做為檔的其他屬性。 此資料與向量共置可讓您有效率地編製索引和搜尋,因為向量會儲存在與其代表資料相同的邏輯單元中。 將向量和資料放在一起可簡化資料管理、AI 應用程式架構,以及向量型作業的效率。

Fabric 中的 Cosmos DB 提供選擇向量索引方法時所提供的彈性:

  • 「扁平」或 K 最近鄰項目精確搜尋 (有時稱為暴力密碼破解) 可以提供 100% 的擷取重新叫用,以便進行範圍較小的焦點式向量搜尋。 特別是在結合查詢篩選和分區鍵時。

  • 量化扁平索引,使用 DiskANN 型量化方法來壓縮向量,以提升 kNN 搜尋的效率。

  • DiskANN 是一套由 Microsoft Research 開發的最先進的向量索引演算法,在任何規模上提供高效、高精確度的多模式向量搜尋。

Cosmos DB 中的向量搜尋可以結合所有其他支援的 NoSQL 查詢篩選和索引,並使用 WHERE 子句。 此組合可讓您的向量搜尋成為應用程式最相關的數據。

這項功能可增強 Cosmos DB 的核心功能,使其在 AI 應用程式中處理向量數據和搜尋需求時更有彈性。

什麼是向量存放區?

向量存放區或向量資料庫是設計用來儲存和管理向量內嵌的資料庫,這是高維度空間中數據的數學表示法。 在此空間中,每個維度各對應至資料的一個特徵,且有數萬個維度可用來代表複雜的資料。 向量在此空間中的位置代表其特性。 單字、片語或整份文件、影像、音訊和其他類型的資料,全都可以向量化。

向量存放區如何運作?

在向量儲存庫中,向量搜尋演算法被用來對嵌入向量進行索引和查詢。 一些已知的向量搜尋演算法包括階層式導覽小型世界 (HNSW)、反轉檔案 (IVF)、DiskANN 等。向量搜尋方法可協助您根據資料性質來尋找類似的項目,而不是根據屬性欄位尋找完全相符的項目。 此技術適用於搜尋類似文字、尋找相關影像、提出建議,甚至偵測異常這類應用程式。 其運作方式是利用內嵌 API 的機器學習模型,查詢您所建立的資料向量內嵌。 內嵌 API 的範例是 Azure OpenAI 內嵌Hugging Face on Azure。 向量搜尋會測量資料向量與查詢向量之間的距離。 最接近查詢向量的資料向量就是所找到語意最類似的資料向量。

在 Fabric 中 Cosmos DB 的整合向量資料庫中,內嵌可以與原始數據一起儲存、編製索引及查詢。 此方法可讓您在複寫個別純向量資料庫中的資料時,無需支付額外的成本。 此外,此結構會一併保存向量內嵌和原始資料,進一步簡化多模資料作業,並提高資料一致性、規模和效能。

容器向量原則

在 Fabric 中使用 Cosmos DB 執行向量搜尋,需要您定義容器的向量原則。 此原則會提供資料庫引擎的重要資訊,以針對容器檔中找到的向量進行有效率的相似性搜尋。 此設定也會通知向量索引編製原則必要的資訊,如果您選擇指定一個。 容器向量原則中包含下列資訊:

  • path:包含向量的屬性(必要)。

  • datatype:向量屬性的數據類型。 支援的型別為 float32 (預設值)、 int8uint8

  • dimensions:路徑中每個向量的維度或長度。 路徑中的所有向量都應具有相同的維度數。 (預設值 1536)。

  • distanceFunction:用來計算距離/相似性的計量。 支援的計量如下:

    • cosine,其值從 $-1$ (最低相似) 到 $+1$ (最類似)。

    • dot product,其值從 $-\infty$ (最不類似) 到 $+\infty$ (最類似)。

    • euclidean,其值從 $0$ (最類似) 到 $+\infty$ (最低相似)。

備註

每個唯一路徑最多可以有一個原則。 不過,如果多個原則都以不同的路徑為目標,則可以指定多個原則。

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

備註

索引 quantizedFlatdiskANN 要求必須插入至少 1,000 個向量。 此最小值是確保量化程序的精確度。 如果少於 1,000 個向量,則會改為執行完整掃描,並導致向量搜尋查詢的 RU 費用較高。

請注意以下幾點:

  • flatquantizedFlat 索引類型會使用 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/?"
    },
    {
      "path": "/vector1/*",
    },
    {
      "path": "/vector2/*",
    }
  ],
  "vectorIndexes": [
    {
      "path": "/vector1",
      "type": "quantizedFlat"
    },
    {
      "path": "/vector2",
      "type": "diskANN"
    }
  ]
}

這很重要

新增至 excludedPaths 索引策略區段的向量路徑,確保優化插入效能。 未將向量路徑新增至excludedPaths,將導致請求計算單位的費用增加及向量插入延遲加長。

這很重要

向量原則或向量索引目前不支援通配符 (*[]) 。

使用查詢進行向量搜尋VECTORDISTANCE

一旦您建立具有所需向量原則的容器,並將向量數據插入容器中,您就可以使用查詢中的 VECTORDISTANCE 建函 式來執行向量搜尋。 NoSQL 查詢的範例,示範如何投射相似度分數作為別名 score,並依照最類似到最不類似的順序排序:

SELECT TOP 10
  c.title,
  VECTORDISTANCE(c.contentVector, [1,2,3]) AS score 
FROM
  container c
ORDER BY
  VECTORDISTANCE(c.contentVector, [1,2,3])   

這很重要

一律在查詢的 TOP N 陳述式中使用 SELECT 子句。 否則,向量搜尋會嘗試提供更多結果,導致查詢耗費更多請求單位(RU),並且延遲比必要更高。