向量搜尋

本頁說明如何在 MySQL 適用的 Cloud SQL 執行個體上實作向量搜尋。Cloud SQL 可讓您儲存向量嵌入、建立向量索引,以及搭配其他儲存的資料執行向量搜尋

向量嵌入儲存空間

您可以在符合完整性、一致性、獨立性和耐用性 (ACID) 屬性的表格中儲存向量嵌入。與資料表中的其他關聯資料一樣,您可以使用現有的交易語意,存取資料表中的向量嵌入。

如要在資料表列和向量表示法之間建立對應關係,您需要在資料表中建立資料欄來儲存向量嵌入。資料欄必須使用 Cloud SQL VECTOR 資料類型,並指出嵌入空間所需的維度數量。向量嵌入資料欄只能儲存向量嵌入,且這些向量嵌入使用的維度必須與您定義資料欄時指定的維度完全相同。

資料表只能有一個向量嵌入資料欄。資料表中的資料列數沒有限制。

為區分向量嵌入資料欄和其他資料欄,Cloud SQL 會在資料欄中加入特殊符號 COMMENTCONSTRAINT。輸入內容驗證需要使用限制條件,向量嵌入資料欄註解會顯示為 COMMENT。您無法修改或刪除註解或限制。

如果 Cloud SQL 執行個體有足夠的儲存空間和記憶體,您可以建立多個資料表,並各自包含向量嵌入資料欄。

資料複製的運作方式與其他 MySQL InnoDB 資料欄相同,適用於向量嵌入資料欄。

如要查看向量嵌入資料表、資料欄和 DML 陳述式的限制,請參閱限制

向量索引

您必須使用向量索引,對向量嵌入執行 ANN 相似度搜尋。Cloud SQL 會使用可擴充最鄰近 (ScANN) 演算法建立向量索引。

向量索引必須符合下列規定:

  • 每個資料表只能建立一個向量索引。
  • 如果執行個體有多個含有向量嵌入的資料表,您可以為每個資料表建立向量索引。
  • 如果您要建立向量索引,就無法為索引資料表的主鍵新增限制。

為提升搜尋品質,請在將大量資料載入基本資料表後,再建立向量索引。如果基礎資料表中的嵌入內容少於 1000 個,索引建立作業就會失敗。

決定是否要建立向量索引時,如果資料列數量不多,請考慮是否改為執行 KNN 搜尋。決定使用 KNN 或 ANN 搜尋時,也取決於向量嵌入的維度數量。如果嵌入數量較多,可能需要向量索引。

如需向量索引的限制清單,請參閱「限制」。如要瞭解如何建立向量索引,請參閱「建立及管理向量索引」。

向量索引更新

Cloud SQL 會即時更新向量索引。對基礎資料表執行資料操縱語言 (DML) 作業的任何交易,也會將變更傳播至相關聯的向量索引。向量索引的行為與資料表上的任何其他次要索引相同。向量索引完全符合交易一致性和 ACID 規範,如果回溯交易,向量索引也會發生相應的回溯變更。

複製向量索引

Cloud SQL 會將向量索引複製到所有唯讀備用資源,包括串聯式複製。從具有向量嵌入項目的主要執行個體建立新的唯讀備用資源時,唯讀備用資源會繼承主要執行個體的向量嵌入項目設定。如果是現有的唯讀備用資源,則必須在每個資源上啟用向量嵌入支援。

就複製延遲的影響而言,建立及維護向量索引的運作方式與一般 MySQL 索引相同。

持續性、關機和對維護的影響

向量索引的保存方式與基本資料表相同,且完全支援 ACID。向量索引一律會與基本資料表資料保持同步,並具有相同的可見度、隔離和當機安全性。執行個體關閉或維護時,向量索引不會受到影響。

索引維護作業

在基礎資料表上執行大量 DML 作業後,您根據初始資料訓練的向量索引 (建立索引時) 可能無法反映新狀態。這可能會影響搜尋品質。

索引分為兩部分:

  • 索引樹狀結構。這項功能是透過現有資料訓練而建構而成。在索引的生命週期內,這項設定不會變更。
  • 索引葉節點。這些檔案包含所有資料列。索引葉節點永遠不會失去同步。

執行大量 DML 陳述式後,資料列會從一個葉節點移至另一個葉節點,導致索引樹狀結構效率降低。如要重新整理索引樹狀結構,必須重建索引。

對含有向量索引的資料表執行不支援的 DDL 作業

  • 變更需要複製演算法的資料表作業。
  • 需要重建資料表的 ALTER TABLE 作業。
  • 捨棄或變更主鍵。
  • 將資料表移至一般表空間。

向量搜尋

Cloud SQL 提供向量距離函式,可用於在執行個體上執行近似近鄰 (ANN) 和 K 近鄰 (KNN) 向量相似度搜尋。執行查詢時,系統會將查詢向量與資料集中的向量進行比較。距離函式會使用餘弦等相似度指標,計算向量之間的距離。向量間的距離越短,相似度就越高,並會顯示在搜尋結果中。

執行 ANN 和 KNN 向量搜尋時,Cloud SQL 會使用下列函式測量向量搜尋中向量之間的距離:

  • 餘弦: 測量兩個向量間角度的餘弦值。值越小,表示向量之間的相似度越高。
  • 內積: 計算角度的餘弦值,再乘以對應向量大小的乘積。
  • L2 平方距離:測量兩個向量之間的歐氏距離,方法是將每個維度的平方距離相加。

如需精確結果或想新增選擇性篩選條件,建議使用 KNN 向量搜尋。KNN 搜尋會計算查詢向量與資料集中每個嵌入項目的距離,找出最近鄰。Cloud SQL 中的 KNN 搜尋功能可提供完美召回率。 KNN 搜尋不會使用向量索引,因此適合處理較小的資料集。

如要執行 KNN 搜尋,請使用 vector_distance 函式,該函式會將兩個向量做為輸入內容:查詢向量 (您要搜尋的內容) 和資料集中的候選向量。並計算這兩個向量之間的距離。 您會在 SELECT 陳述式中使用 vector_distance。詳情請參閱「搜尋 K 近鄰 (KNN)」。

如果發現 KNN 成效不佳,您可以稍後再建構向量索引,並繼續在應用程式中使用 approx_distance 進行 ANN 搜尋。

如果擔心查詢效率,建議使用 ANN 向量搜尋。這項功能會計算查詢向量與資料集中部分向量之間的距離,加快相似度搜尋速度。為此,Cloud SQL 會將資料整理成叢集或分割區,然後將搜尋範圍集中在最接近查詢的叢集。ANN 搜尋需要向量索引。這些索引會優先考量搜尋速度,而非完美回想。在 Cloud SQL 中,TREE_SQ 索引類型用於 ANN 搜尋。

如要執行 ANN 搜尋,請使用 approx_distance 函式和距離測量選項。您可以在 ORDER BYSELECT 清單中使用 approx_distance,並允許 LIMIT 子句限制搜尋結果。您也可以加入 WHERE 子句,對搜尋結果進行後續篩選。詳情請參閱搜尋近似最鄰近項目 (ANN)

在某些情況下,ANN 搜尋會改用 KNN 搜尋。詳情請參閱「檢查 ANN 搜尋的備援狀態」。

需求條件

如要新增向量嵌入項目,請先使用 cloudsql_vector 標記在執行個體上啟用向量嵌入項目。詳情請參閱「在執行個體上啟用及停用向量嵌入」。

限制

含有向量嵌入資料欄的資料表有下列限制:

  • 每個資料表只能有一個向量嵌入資料欄。
  • 每個表格只能有一個向量索引。
  • 向量嵌入的維度上限為 16,000。
  • 向量嵌入資料欄不得為產生的資料欄。
  • 含有向量嵌入資料欄的資料表不支援資料表層級的分區。
  • 向量索引不支援使用 BITBINARYVARBINARYJSONBLOBTEXT 資料型別或空間資料的主鍵。複合主鍵也不得包含上述任何類型。
  • 如果有向量索引,您就無法在基本資料表的主鍵中新增限制。
  • 如果資料表有向量索引,您就無法執行某些 DDL 作業。詳情請參閱不支援對含有向量索引的資料表執行 DDL 作業

向量搜尋查詢有以下限制:

  • approx_distance 函式只能用於 ORDER BYSELECT 清單。
  • 涉及主資料表的述詞可與 ORDER BYSELECT 清單中的 approx_distance 運算式搭配使用,並納入 WHERE 條件。WHERE 條件述詞會在評估 approx_distance 向量函式後評估。

使用向量索引的最佳做法

本節說明使用向量索引的最佳做法。每個工作負載都不盡相同,因此您可能需要進行相應調整。

  • 執行重大 DML 作業後,建議重建索引。
  • 一般來說,讓 Cloud SQL 計算要使用的葉節點數量即可。如果您想指定葉節點數量,建議每個葉節點至少要有 100 個向量,才能獲得最佳召回率。

後續步驟