向量資料庫會以向量的形式儲存和管理資料,這是資料點的數值陣列。
向量的使用允許複雜的查詢與分析,因為你可以透過進階技術來比較和分析向量,這些技術用於尋找相似項目,並將資料組織成群組,包括分群、量化和向量相似度搜尋。
傳統資料庫並不適合處理日益普遍的資料分析中高維度資料。 不過,向量資料庫的設計目的是要藉由以向量表示,來處理高維度資料,例如文字、影像和音訊。 向量資料庫適用於機器學習、自然語言處理和影像辨識等工作,其目標是識別大型資料集中的模式或類似性。
本文將介紹向量資料庫的背景,並概念上說明如何在 Real-Time Intelligence in Microsoft Fabric 中使用 Eventhouse 作為向量資料庫。 如需實用範例,請參閱 教學課程:使用 Eventhouse 作為向量資料庫。
重要概念
下列重要概念有在向量資料庫中使用:
向量相似度
向量相似性是量測兩個或多個向量的不同 (或相似) 之處。 向量相似性搜尋是用來在資料集中尋找相似向量的技術。 你可以用距離度量來比較向量,例如歐 幾里得距離 或 餘弦相似度。 兩個向量越接近就越相似。
嵌入式表示
嵌入表示是一種以向量格式表示資料的常見方式,用於向量資料庫。 內嵌是資料片段的數學表示法,例如文字、文字檔或影像,其設計目的是擷取其語意意義。 你透過演算法分析資料並產生一組代表關鍵特徵的數值來建立嵌入。 例如,文字的內嵌可能代表其意義、其內容,以及與其他單字的關聯性。 建立內嵌的程序很簡單。 雖然你可以使用標準 Python 套件(例如 spaCy、sent2vec、Gensim)來建立它們,但大型語言模型(LLM)能為語意文本搜尋生成最高品質的嵌入資料。 例如,你可以將文字傳送到 Azure OpenAI 的嵌入模型,並產生一個向量表示,供你儲存用於分析。 更多資訊請參見 Understand embeddings in Azure OpenAI Service。
一般工作流程
使用向量資料庫的一般工作流程如下所示:
- 內嵌資料:使用內嵌模型將資料轉換成向量格式。 例如,您可以使用 OpenAI 模型內嵌文字資料。
- 儲存向量:將內嵌向量儲存在向量資料庫中。 您可以將內嵌資料傳送至 Eventhouse,以儲存和管理向量。
- 內嵌查詢:使用用來內嵌預存資料的相同內嵌模型,將查詢資料轉換成向量格式。
- 查詢向量:使用向量相似度搜尋來尋找資料庫中類似查詢的專案。
Eventhouse 作為向量資料庫
向量相似性搜尋的核心在於能夠儲存、索引及查詢向量資料。 Eventhouses 提供處理和分析大量數據的解決方案,特別是在需要即時分析和探索的案例中。 此功能使 Eventhouse 成為儲存與搜尋向量的絕佳選擇。
Eventhouse 的以下元件讓你能將其用作向量資料庫:
- 動態資料類型,可儲存非結構化資料,例如數位和屬性包。 使用此資料型態來儲存向量值。 您可以將與原始物件相關的元資料儲存為資料表中的個別資料行,以進一步增強向量值。
- 這種 編碼 類型
Vector16設計用於以 16 位元精度儲存浮點數向量。 此編碼使用Bfloat16而非預設的 64 位元。 使用此編碼來儲存機器學習的向量嵌入,因為它將儲存需求減少為原來的四分之一,並以數個數量級加速例如 series_dot_product() 和 series_cosine_similarity() 等向量處理函數。 - series_cosine_similarity 功能,你可以用它在 Eventhouse 裡儲存的向量上進行向量相似性搜尋。
為擴展進行最佳化
欲了解更多優化向量相似性搜尋的資訊,請參閱 部落格。
為了最大化效能及搜尋時間,請遵循以下步驟:
- 將內嵌資料行的編碼設定為 Vector16,這是向量係數的 16 位編碼方式(而不是預設的 64 位)。
- 將嵌入向量表儲存在所有叢集節點上,每個處理器至少有一個分片。 要達成這個目標,請遵循以下步驟:
- 藉由改變分區化原則的 ShardEngineMaxRowCount,限制每個分區的內嵌向量數目。 此設定將資料分散到所有可用的運算資源,以加快搜尋速度。
- 變更合併原則的RowCountUpperBoundForMerge。 需要合併原則,以防止在資料引入後合併範圍。
範例優化步驟
在以下範例中,你定義了一個靜態向量表來儲存 1M 向量。 你將嵌入策略定義為 Vector16,並設定分片與合併策略以優化表格以進行向量相似度搜尋。 在此範例中,假設叢集有 20 個節點,每個節點有 16 個處理器。 資料表的分片最多應包含 1,000,000/(20*16)=3,125 列。
請依序執行以下 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將資料內嵌至上一個步驟中建立和定義的資料表。