向量搜尋

本頁說明如何在 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 作業

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

向量搜尋

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 向量搜尋。這項演算法會計算查詢向量與資料集中部分向量之間的距離,藉此加快相似度搜尋速度。為此,Cloud SQL 會將資料分組成叢集或區隔,然後將搜尋重點放在與查詢最接近的叢集上。ANN 搜尋需要向量索引。這些索引會將搜尋速度視為優先,而非完美回憶。在 Cloud SQL 中,TREE_SQ 索引類型會用於 ANN 搜尋。

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

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

需求條件

在 Cloud SQL 中,您必須先使用 cloudsql_vector 標記在執行個體上啟用向量嵌入功能,才能新增向量嵌入項目。詳情請參閱「在執行個體上啟用及停用向量嵌入」。

限制

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

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

以下是向量搜尋查詢的限制:

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

使用向量索引的最佳做法

本節將說明使用向量索引的最佳做法。每項工作負載都不同,您可能需要視情況調整。

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

後續步驟