共用方式為


向量資料庫

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

向量的使用允許複雜的查詢與分析,因為你可以透過進階技術來比較和分析向量,這些技術用於尋找相似項目,並將資料組織成群組,包括分群、量化和向量相似度搜尋。

傳統資料庫並不適合處理日益普遍的資料分析中高維度資料。 不過,向量資料庫的設計目的是要藉由以向量表示,來處理高維度資料,例如文字、影像和音訊。 向量資料庫適用於機器學習、自然語言處理和影像辨識等工作,其目標是識別大型資料集中的模式或類似性。

本文將介紹向量資料庫的背景,並概念上說明如何在 Real-Time Intelligence in Microsoft Fabric 中使用 Eventhouse 作為向量資料庫。 如需實用範例,請參閱 教學課程:使用 Eventhouse 作為向量資料庫

重要概念

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

向量相似度

向量相似性是量測兩個或多個向量的不同 (或相似) 之處。 向量相似性搜尋是用來在資料集中尋找相似向量的技術。 你可以用距離度量來比較向量,例如歐 幾里得距離餘弦相似度。 兩個向量越接近就越相似。

嵌入式表示

嵌入表示是一種以向量格式表示資料的常見方式,用於向量資料庫。 內嵌是資料片段的數學表示法,例如文字、文字檔或影像,其設計目的是擷取其語意意義。 你透過演算法分析資料並產生一組代表關鍵特徵的數值來建立嵌入。 例如,文字的內嵌可能代表其意義、其內容,以及與其他單字的關聯性。 建立內嵌的程序很簡單。 雖然你可以使用標準 Python 套件(例如 spaCy、sent2vec、Gensim)來建立它們,但大型語言模型(LLM)能為語意文本搜尋生成最高品質的嵌入資料。 例如,你可以將文字傳送到 Azure OpenAI 的嵌入模型,並產生一個向量表示,供你儲存用於分析。 更多資訊請參見 Understand embeddings in Azure OpenAI Service

一般工作流程

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

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

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

Eventhouse 作為向量資料庫

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

Eventhouse 的以下元件讓你能將其用作向量資料庫:

  • 動態資料類型,可儲存非結構化資料,例如數位和屬性包。 使用此資料型態來儲存向量值。 您可以將與原始物件相關的元資料儲存為資料表中的個別資料行,以進一步增強向量值。
  • 這種 編碼 類型 Vector16 設計用於以 16 位元精度儲存浮點數向量。 此編碼使用 Bfloat16 而非預設的 64 位元。 使用此編碼來儲存機器學習的向量嵌入,因為它將儲存需求減少為原來的四分之一,並以數個數量級加速例如 series_dot_product()series_cosine_similarity() 等向量處理函數。
  • series_cosine_similarity 功能,你可以用它在 Eventhouse 裡儲存的向量上進行向量相似性搜尋。

為擴展進行最佳化

欲了解更多優化向量相似性搜尋的資訊,請參閱 部落格

為了最大化效能及搜尋時間,請遵循以下步驟:

  1. 將內嵌資料行的編碼設定為 Vector16,這是向量係數的 16 位編碼方式(而不是預設的 64 位)。
  2. 將嵌入向量表儲存在所有叢集節點上,每個處理器至少有一個分片。 要達成這個目標,請遵循以下步驟:
    1. 藉由改變分區化原則的 ShardEngineMaxRowCount,限制每個分區的內嵌向量數目。 此設定將資料分散到所有可用的運算資源,以加快搜尋速度。
    2. 變更合併原則RowCountUpperBoundForMerge。 需要合併原則,以防止在資料引入後合併範圍。

範例優化步驟

在以下範例中,你定義了一個靜態向量表來儲存 1M 向量。 你將嵌入策略定義為 Vector16,並設定分片與合併策略以優化表格以進行向量相似度搜尋。 在此範例中,假設叢集有 20 個節點,每個節點有 16 個處理器。 資料表的分片最多應包含 1,000,000/(20*16)=3,125 列。

  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. 將資料內嵌至上一個步驟中建立和定義的資料表。

後續步驟