共用方式為


向量資料庫

向量資料庫會以向量的形式儲存和管理資料,這是資料點的數值陣列。

使用向量可讓您進行複雜的查詢和分析,因為可以使用向量相似度搜尋、量化和群集等進階技術來比較和分析向量。 傳統資料庫不適合處理資料分析中越來越常見的高維度資料。 不過,向量資料庫的設計目的是要藉由以向量表示,來處理高維度資料,例如文字、影像和音訊。 向量資料庫適用於機器學習、自然語言處理和影像辨識等工作,其目標是識別大型資料集中的模式或類似性。

本文章提供向量資料庫的一些背景,並在概念上解釋您可以如何在 Microsoft Fabric 即時智慧中使用作為向量資料庫的 Eventhouse。 如需實用範例,請參閱 教學課程:使用 Eventhouse 作為向量資料庫

重要概念

下列重要概念有在向量資料庫中使用:

向量相似度

向量相似性是量測兩個或多個向量的不同 (或相似) 之處。 向量相似性搜尋是用來在資料集中尋找相似向量的技術。 向量會使用距離計量進行比較,例如 Euclidean 距離餘弦相似性。 兩個向量越接近就越相似。

Embeddings

內嵌是以向量格式表示資料,以向量格式表示資料,以用於向量資料庫中的常見方式。 內嵌是資料片段的數學表示法,例如文字、文字檔或影像,其設計目的是擷取其語意意義。 內嵌是使用演算法來建立的,這些演算法會分析資料並產生一組代表其主要特徵的數值。 例如,文字的內嵌可能代表其意義、其內容,以及與其他單字的關聯性。 建立內嵌的程序很簡單。 雖然可以使用標準 Python 套件來建立它們(例如 spaCy、sent2vec、Gensim)、大型語言模型(LLM)產生語意文字搜尋的最高品質內嵌。 例如,您可以將文字傳送至 Azure OpenAI 中的內嵌模型,並產生可儲存以供分析的向量表示法。 如需詳細資訊,請參閱 瞭解 Azure OpenAI 服務中的內嵌。

一般工作流程

如何內嵌、儲存及查詢儲存為向量之文字的圖解。

使用向量資料庫的一般工作流程如下所示:

  1. 內嵌資料:使用內嵌模型將資料轉換成向量格式。 例如,您可以使用 OpenAI 模型內嵌文字資料。
  2. 儲存向量:將內嵌向量儲存在向量資料庫中。 您可以將內嵌資料傳送至 Eventhouse,以儲存和管理向量。
  3. 內嵌查詢:使用用來內嵌預存資料的相同內嵌模型,將查詢資料轉換成向量格式。
  4. 查詢向量:使用向量相似度搜尋來尋找資料庫中類似查詢的專案。

Eventhouse 作為向量資料庫

向量相似性搜尋的核心是能夠儲存、編製索引和查詢向量資料。 Eventhouses 提供處理和分析大量資料的解決方案,特別是在需要即時分析和探索的案例中,使其成為儲存和搜尋向量的絕佳選擇。

的下列元件可讓您使用 Eventhouse 向量資料庫:

  • 動態資料類型,可儲存非結構化資料,例如數位和屬性包。 因此,建議使用資料類型來儲存向量值。 您可以將與原始物件相關的元資料儲存為資料表中的個別資料行,以進一步增強向量值。
  • 編碼類型Vector16,其設計目的是將浮點數的向量儲存在16位精確度中,這會使用 Bfloat16 ,而不是預設的64位。 建議使用此編碼來儲存 ML 向量嵌入,因為它可以將儲存需求降低四倍並加速向量處理功能,例如依數量級排序的 series_dot_product()series_cosine_similarity()
  • series_cosine_similarity函式,可在儲存在 Eventhouse 的向量頂端執行向量相似度搜尋。

經最佳化以調整規模

如需優化向量相似性搜尋的詳細資訊,請閱讀部落

若要最大化效能和產生的搜尋時間,請遵循下列步驟:

  1. 將內嵌資料行的編碼設定為 Vector16,這是向量係數的 16 位編碼方式(而不是預設的 64 位)。
  2. 將內嵌向量資料表儲存在每個處理器至少有一個分區的所有叢集節點上,由下列步驟完成:
    1. 藉由改變分區化原則的 ShardEngineMaxRowCount,限制每個分區的內嵌向量數目。 分區化原則會平衡每個節點多個範圍的所有節點上的資料,讓搜尋可以使用所有可用的處理器。
    2. 變更合併原則RowCountUpperBoundForMerge。 需要合併原則,才能在擷取之後隱藏合併範圍。

範例優化步驟

在下列範例中,會定義靜態向量資料表來儲存 1M 向量。 內嵌原則定義為 Vector16,而分區化和合併原則會設定為將資料表優化,以便進行向量相似度搜尋。 為此,假設叢集有 20 個節點,每個節點有 16 個處理器。 資料表的分區最多應該包含1000000/(20*16)=3125個資料列。

  1. 下列 KQL 命令會逐一執行,以建立空白資料表,並設定必要的原則和編碼:

    .create table embedding_vectors(vector_id:long, vector:dynamic)                                  //  This is a sample selection of columns, you can add more columns
    
    .alter column embedding_vectors.vector policy encoding type = 'Vector16'                         // Store the coefficients in 16 bits instead of 64 bits accelerating calculation of dot product, suppress redundant indexing
    
    .alter-merge table embedding_vectors policy sharding '{ "ShardEngineMaxRowCount" : 3125 }'       // Balanced data on all nodes and, multiple extents per node so the search can use all processors 
    
    .alter-merge table embedding_vectors policy merge '{ "RowCountUpperBoundForMerge" : 3125 }'      // Suppress merging extents after ingestion
    
  2. 將資料內嵌至上一個步驟中建立和定義的資料表。

後續步驟