AlloyDB 篩選向量搜尋功能簡介

AlloyDB for PostgreSQL 的篩選向量搜尋功能可讓您在單一查詢中,結合向量相似度搜尋與結構化 SQL 篩選條件。將查詢向量與中繼資料述詞配對,即可將相似度結果縮小至相符的資料子集,AlloyDB 查詢最佳化工具則會自動選取最有效率的篩選策略。

篩選選項

AlloyDB 查詢最佳化工具在判斷向量搜尋最有效率的篩選策略時,扮演著至關重要的角色。

為估算不同執行方案的費用,查詢最佳化工具會分析查詢,並考量篩選條件選擇性、資料分配和索引可用性等因素。

最佳化工具會根據成本預估值,從下列項目中選擇最佳篩選策略:

預先篩選

預先篩選是一種查詢最佳化策略,AlloyDB 會使用篩選器找出符合條件的一小組項目,而不是搜尋整個資料集。然後,AlloyDB 會對該較小的群組執行向量搜尋。

舉例來說,如果您想尋找類似的藍色襯衫,AlloyDB 會先找出所有藍色襯衫,然後在該群組中搜尋類似的項目。

這項策略會對縮減後的資料集執行需要大量運算資源的向量相似度搜尋,因此能提升成效。

事後篩選

如果篩選條件無法大幅縮小結果範圍,AlloyDB 會採用事後篩選策略。AlloyDB 不會先篩選,而是根據向量搜尋結果,先找出類似項目的廣泛清單。接著,系統會根據篩選條件檢查結果,產生最終清單。

舉例來說,如果您搜尋類似電影,並使用非常廣泛的篩選器 (例如 genre = drama),AlloyDB 會先找出大量與搜尋內容相似的電影,然後依類型篩選,因為大多數電影可能都是劇情片。

如果您預期許多結果會符合篩選條件,這個策略就很有效率。

內嵌篩選

內嵌篩選是一種查詢最佳化策略,AlloyDB 會同時使用向量和其他次要索引,執行向量搜尋和篩選評估。 AlloyDB 會搜尋向量索引,找出相似的向量,並檢查每個向量是否符合中繼資料篩選條件,同時利用 B-tree、GIN 或 GiST 等索引快速評估這些條件。

舉例來說,如果您搜尋類似的鞋子,並依 color = black 篩選,內嵌篩選功能會讓 AlloyDB 只檢查黑色鞋子的相似度。這比先檢查所有鞋子的相似度,然後依顏色篩選,或是先依顏色篩選所有鞋子,然後檢查相似度更有效率。

如果篩選器會適度縮小結果範圍,則適合使用內嵌篩選。

瞭解查詢計畫

查詢計畫會提供查詢執行程序的完整檢視畫面,並在「執行策略」欄位中顯示 AlloyDB 為向量掃描作業選擇的篩選策略。

內嵌篩選的查詢計畫

如要進行內嵌篩選,AlloyDB 會使用「自訂掃描」計畫節點 (又稱向量掃描),該節點會依賴「點陣圖索引掃描」計畫節點,為篩選子句提供點陣圖。

向量掃描只會計算符合篩選條件的資料列距離。

下列查詢示範如何對 shoes 搜尋結果進行內嵌篩選,並依 color = black 篩選

EXPLAIN
SELECT *
FROM products
WHERE color = 'black'
ORDER BY embedding <=> embedding('text-embedding-005', 'shoes')::vector
LIMIT 10;

以下範例查詢計畫說明如何使用內嵌篩選條件,最佳化向量搜尋:

Limit (actual rows=10)
  ->  Custom Scan (vector scan) on products
      Execution Strategy: Bitmap assisted vector Scan on products_embedding_index
      Order By: (embedding <=> '[...]')::vector)
      Limit: 10
      ->  Bitmap Index Scan on products (color_index)
          Index Cond: (color = 'black')

在範例查詢計畫中,Limit (actual rows=10) 表示查詢使用 SQL LIMIT 10; 子句來限制輸出內容。actual rows=10 表示這個節點在執行查詢期間傳回 10 個資料列。

-> Custom Scan (vector scan) on products 節點代表向量搜尋作業。這是自訂掃描,因為是向量資料的特殊掃描,且在 products 資料表上運作。內嵌篩選的查詢計畫範例在「Execution Strategy」(執行策略) 欄位中顯示 Bitmap assisted vector Scan on products_embedding_index,表示向量掃描會使用點陣圖建立資料列候選清單,並對這些資料列執行相似度搜尋。點陣圖索引掃描用於根據 color = 'black' 條件篩選資料。

Order By: (embedding <=> '[...]')::vector 屬性表示結果會依向量相似度排序,並使用運算式 (embedding <=> '[...]')::vector 計算,其中 embedding 是指向量資料欄,<=> 代表最鄰近的項目運算子,[...] 是查詢向量,::vector 則會將類型轉換為向量資料類型。

-> Bitmap Index Scan on products (color_index) 節點代表 colors_index 的點陣圖索引掃描。點陣圖索引掃描會使用點陣圖選取符合篩選條件的資料列,並使用 color_index 進行篩選。

Index Cond: (color = 'black') 屬性會指定 color = 'black' 索引掃描從查詢的 WHERE 子句使用的篩選條件。

篩選向量搜尋的最佳做法

如果向量搜尋查詢包含篩選器,無論您使用 ScaNN、HNSW 或 IVFFlat 向量索引,都建議在這些篩選器使用的資料欄上建立 B 樹狀結構索引。

後續步驟