Spanner Omni 向量搜尋總覽

Spanner Omni 中的向量搜尋是內建的高效能功能,可對高維度向量資料執行語意搜尋和相似度比對。Spanner Omni 直接在交易資料庫中儲存及建立向量嵌入索引,因此不需要另外使用向量資料庫,也不需要複雜的擷取、轉換和載入 (ETL) 管道。

這份文件中的主題適用於 Spanner Omni,與適用於 Spanner 的主題相同。

Vector Search 可將資料表示為數值向量 (嵌入),藉此找出語意相似的項目。Spanner Omni 支援兩種主要搜尋方法:

  • K 近鄰 (KNN):計算查詢與資料集中每個向量之間的距離,執行精確搜尋。這種方法可提供最高召回率,但處理大型資料集時,運算費用可能相當高昂。

  • 近似最鄰近項目 (ANN):使用向量索引,在大型資料集中快速尋找相符項目。雖然準確度 (召回率) 會稍微降低,但速度和擴充性會有所提升。

向量搜尋與其他功能搭配使用時,效果特別顯著:

組合 效益
使用 SQL 篩選器進行向量搜尋 有效結合向量搜尋與篩選器 (例如「尋找類別為『鞋子』且價格低於 100 的類似圖片」)。
向量搜尋 + 全文搜尋 使用相互排序融合 (RRF) 結合語意相似度和關鍵字精確度,提高搜尋關聯性。
向量 + 圖形 使用向量搜尋在屬性圖中尋找相關的進入點 (節點),然後遍歷複雜的關係。

詳情請參閱 Spanner 說明文件中的「Spanner 向量搜尋總覽」。

Spanner Omni 支援使用內建距離函式進行 K 近鄰 (KNN) 搜尋。您可以提供向量嵌入做為輸入 參數,找出 N 維度空間中最鄰近的向量。

可用的距離函式如下:

  • COSINE_DISTANCE():測量兩個向量間角度的餘弦值

  • EUCLIDEAN_DISTANCE():測量兩個向量之間最短的直線距離

  • DOT_PRODUCT():計算角度的餘弦值,並乘以向量大小的乘積 (適用於正規化資料)

詳情請參閱 Spanner 說明文件中的「執行向量相似度搜尋,找出 K 近鄰」。

選擇最佳向量距離函式

選取適當的距離函式取決於資料和用於產生嵌入內容的模型。

函式 說明 與提高相似度的關係
點積 計算角度的餘弦,並乘以對應向量大小的乘積。 增加
餘弦距離 測量兩個向量之間的餘弦角 (1 - 餘弦相似度)。 減少
歐幾里得距離 測量兩個向量之間的直線距離。 減少

如果嵌入內容已正規化 (大小 = 1.0),通常會有效率地選擇 DOT_PRODUCT()。如果是未經過正規化的資料,請嘗試使用 COSINE_DISTANCE() 或 EUCLIDEAN_DISTANCE(),找出最適合您用途的結果。

詳情請參閱 Spanner 說明文件中的「選擇向量距離函式」。

近似最鄰近 (ANN)

ANN 搜尋功能適用於非常龐大的資料集,因為精確的 KNN 搜尋會變得太慢或太昂貴。這項功能會使用向量索引,以較小的喚回率代價,提供快速結果。

如果沒有專屬的運算工作站,Spanner Omni 中的 ANN 搜尋最多支援 100 萬個向量的資料集,且向量長度最多為 128 個維度。如果向量的維度較多,支援的向量數量就會成比例減少。部署 worker 來建構向量索引時,Spanner Omni 支援較大的表格。詳情請參閱「建立及管理向量索引」。

如要執行 ANN 搜尋,請使用近似距離函式,例如 APPROX_COSINE_DISTANCE()、APPROX_EUCLIDEAN_DISTANCE() 或 APPROX_DOT_PRODUCT()。這些函式需要:

  • 嵌入資料欄的現有向量索引。

  • 使用概略距離函式的 ORDER BY 子句。

  • 指定結果數量的 LIMIT 子句。

詳情請參閱 Spanner 說明文件中的「尋找近似最鄰近 (ANN) 項目並查詢向量嵌入」。

建立及管理向量索引

建立向量索引時,請指定嵌入欄的 vector_length,並使用 STORING 子句納入其他資料欄,加快篩選速度。

以下範例說明如何建立向量索引:

CREATE VECTOR INDEX INDEX_NAME
  ON TABLE_NAME(EMBEDDING_COLUMN)
  OPTIONS (distance_type = 'DISTANCE_TYPE', tree_depth = 2, num_leaves = 1000);

詳情請參閱 Spanner 說明文件中的「建立及管理向量索引」。

在超過近似最鄰近項目 (ANN) 限制的大型資料表上建立向量索引時,需要專屬的運算工作站,才能將處理作業從 Spanner Omni 伺服器卸載。詳情請參閱「部署及管理工作人員」。

建立向量索引時使用取樣

對於大型資料集 (例如數千萬列以上的資料表),您可以指定取樣百分比,縮短向量索引建立時間。在 CREATE VECTOR INDEX 陳述式中使用 clustering_sampling_percentage 選項,在建構初始索引樹狀結構時,對資料集子集進行取樣。

一般而言,每個葉節點至少應有 50 個取樣資料列。舉例來說,如果資料集有 1,000 萬列和 10,000 個葉節點,5% 的取樣率 (clustering_sampling_percentage = 5) 會取樣 50 萬列,或每個葉節點 50 列,如下例所示:

CREATE VECTOR INDEX VectorIndex
  ON BaseTable(Embedding)
  WHERE Embedding IS NOT NULL
  OPTIONS (
    tree_depth = 3,
    num_leaves = 10000,
    num_branches = 100,
    leaf_scatter_factor = 32,
    distance_type = 'COSINE',
    min_branch_splits = 10,
    min_leaf_splits = 10,
    clustering_sampling_percentage = 5
  );

與未取樣的完整資料集建立索引相比,取樣會增加查詢延遲時間,並提高相同目標召回率的每筆查詢 CPU 使用率。提高取樣百分比會增加建立索引的時間,但可縮短查詢延遲時間,並降低每次查詢的 CPU 成本。根據可用於建立索引的運算資源,選擇可兼顧索引建立時間和查詢效能的取樣百分比。

向量索引最佳做法

如要維持高搜尋效能和召回率,請採取下列做法:

  • 調整索引選項:根據資料大小和效能需求調整 num_leaves 和 num_leaves_to_search。

  • 定期重建:如果向量分布隨時間大幅變動,請重建索引。

  • 有效使用篩選功能:將經常篩選的資料欄儲存在索引中,提升搜尋效率。

詳情請參閱 Spanner 說明文件中的「向量索引最佳做法」。