使用向量嵌入搜尋及篩選

本頁面說明查詢向量嵌入的不同方式。如要概略瞭解 ANN 和 KNN 相似度搜尋,請參閱向量搜尋

搜尋近似最鄰近項目 (ANN)

如要執行 ANN 搜尋,請在 SELECTORDER BY 子句中使用 approx_distance 函式。您必須在 ANN 搜尋中使用 LIMIT 子句。您也可以將 approx_distance 放入 SELECT 清單,取得距離值。

ANN 查詢的語法如下:

# Ordering by distance
SELECT title
FROM books
ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=l2_squared')
LIMIT 4;

# Selecting the distance value
SELECT
  approx_distance(
    embedding_name,
    string_to_vector('[1,2,3]'),
    'distance_measure=cosine,num_leaves_to_search=3')
    dist
FROM table
ORDER BY dist
LIMIT limit_value;

approx_distance 函式會使用下列選項:

  • embedding:使用主資料表的向量嵌入資料欄名稱。
  • string_to_vectorvector_to_string:將向量轉換為字串,並將字串轉換為向量,讓向量可供使用者閱讀。
  • distance_measure:指定用於向量相似度搜尋的距離測量方式。這個值必須與您建立索引時在 distance_measure 參數中設定的值相符。此為必要參數。這個參數可能的值包括:
    • COSINE
    • L2_SQUARED
    • DOT_PRODUCT
  • num_leaves_to_search:選用。指定要探查的葉節點數量,用於 ANN 向量相似度搜尋。如未指定葉節點數量,Cloud SQL 會根據資料表大小、向量索引中的葉節點數量和其他因素,產生一個值。您可以在 information_schema.innodb_vector_indexes 中查看這個值。建議您微調 num_leaves_to_search,在特定工作負載的搜尋品質和效能之間取得最佳平衡。如果增加,會影響效能,但可提升召回率。

以下範例說明如何使用 approx_distance,透過 l2_squared 距離測量找出前 K 個最接近的資料列,並依距離排序結果。

# Ordering by distance
SELECT title
FROM books
ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'),
                         'distance_measure=l2_squared')
LIMIT 4;

# Selecting the distance value
SELECT
    approx_distance
        (embedding, string_to_vector('[1,2,3]'),
         'distance_measure=l2_squared') dist
FROM table
ORDER BY dist
LIMIT 4;

篩選 approx_distance 查詢的結果

您可以使用 approx_distance 函式和 WHERE 條件,透過非向量述詞篩選查詢結果,執行後續篩選作業。系統會先評估 approx_distance 函式,再套用篩選器,因此傳回的結果數量不確定。

舉例來說,如果查詢如下:

SELECT id FROM products WHERE price < 100
ORDER BY approx(embedding, @query_vector,'distance_measure=cosine')
LIMIT 11;

approx_distance 函式會傳回查詢向量的 11 個最近鄰,不論價格為何。在後續篩選中,系統會選取價格 < 100 的產品。最鄰近的項目可能全都有價格 < 100,因此查詢會傳回 11 個結果。或者,如果最接近的鄰居都沒有價格 < 100,則會傳回 0 個資料列。

如果您預期 WHERE 條件中的篩選器會非常嚴格,建議使用精確搜尋 (KNN),確保傳回足夠的資料列。

查看 ANN 搜尋的備援狀態

在某些情況下,ANN 搜尋會改用 KNN 搜尋。包括:

  • 基礎資料表沒有向量索引。
  • 主資料表上有向量索引,但使用的距離測量方式與搜尋選項中的 distance_measure 參數不同。approx_distance
  • 向量索引已損毀,或目前交易無法存取。
  • 指定的 LIMIT 大於 10000。
  • 未指定 LIMIT
  • 目前的查詢在同一個基本資料表上涉及多個 approx_distance 呼叫。
  • 最佳化工具計算後,認為使用 KNN 更有效率。

在上述所有情況中,系統都會向用戶端發出警告,指出已執行精確搜尋,並說明原因。

在 mysql 用戶端中執行下列指令,即可查看備援狀態:

SHOW global status LIKE '%cloudsql_vector_knn_fallback%';

如果想使用 ANN,但系統改用 KNN,查詢速度可能會變慢。 您應找出回溯原因,並評估是否要進行變更,改用 ANN。

範例:建立向量索引並執行 ANN 查詢

下列逐步操作範例說明如何在 Cloud SQL 中建立向量索引,並執行 ANN 查詢。

  1. 生成向量嵌入。您可以手動建立向量嵌入,也可以使用所選的文字嵌入 API。如需使用 Vertex AI 的範例,請參閱「根據列資料生成向量嵌入」。
  2. 在 Cloud SQL 中建立資料表,其中包含三維的向量嵌入欄。

    CREATE TABLE books(
    id INTEGER PRIMARY KEY AUTO_INCREMENT, title VARCHAR(60), embedding VECTOR(3) USING VARBINARY);
    
  3. 在資料欄中插入向量嵌入。

    INSERT INTO books VALUES ((1, 'book title', string_to_vector('[1,2,3]')));
    
  4. 修訂變更。

    commit;
    
  5. 使用 L2_squared 函式建立向量索引,以測量距離。

    CREATE
      VECTOR INDEX vectorIndex
    ON dbname.books(embeddings)
    USING SCANN QUANTIZER = SQ8 DISTANCE_MEASURE = l2_squared;
    
  6. 請使用下列語法執行 ANN 搜尋,並取得 4 個搜尋結果的 LIMIT

    SELECT title
    FROM books
    ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=l2_squared')
    LIMIT 4;
    
    SELECT approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=cosine') dist
    FROM books
    ORDER BY dist
    LIMIT 4;
    

搜尋 K 近鄰 (KNN)

如要執行 K 近鄰搜尋,請在 SELECT 陳述式中使用vector_distance 函式,並搭配距離度量選項和向量轉換函式 (string_to_vectorvector_to_string)。請使用下列語法:

SELECT vector_distance(string_to_vector('[1,2,3]'),
                      string_to_vector('[1,2,3]'),
                      'Distance_Measure=dot_product');

將 [1,2,3] 值替換為資料的嵌入值。

下列範例說明如何搭配使用這項查詢與 cosine_distance 函式和 string_to_vector 向量轉換函式。

SELECT id,cosine_distance(embedding, string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY distance
LIMIT 10;

在 KNN 查詢中取得餘弦距離

使用 Cloud SQL 的 cosine_distance 函式,以餘弦計算距離。

SELECT cosine_distance(embedding, string_to_vector('[3,1,2]')) AS distance FROM books WHERE id = 10;

在 KNN 查詢中取得點積距離

使用 Cloud SQL dot_product 函式,透過點積計算距離。

SELECT dot_product(embedding, string_to_vector('[3,1,2]')) AS distance FROM books WHERE id = 10;

在 KNN 查詢中取得 L2 平方距離

使用 Cloud SQL 的 l2_squared_distance 函式,以 L2 平方計算距離。

SELECT
  l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
    AS distance
FROM books
WHERE id = 10;

後續步驟