本頁面說明查詢向量嵌入的不同方式。如要概略瞭解 ANN 和 KNN 相似度搜尋,請參閱向量搜尋。
搜尋近似最鄰近項目 (ANN)
如要執行 ANN 搜尋,請在 SELECT
和 ORDER 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_vector
或vector_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 查詢。
- 生成向量嵌入。您可以手動建立向量嵌入,也可以使用所選的文字嵌入 API。如需使用 Vertex AI 的範例,請參閱「根據列資料生成向量嵌入」。
在 Cloud SQL 中建立資料表,其中包含三維的向量嵌入欄。
CREATE TABLE books( id INTEGER PRIMARY KEY AUTO_INCREMENT, title VARCHAR(60), embedding VECTOR(3) USING VARBINARY);
在資料欄中插入向量嵌入。
INSERT INTO books VALUES ((1, 'book title', string_to_vector('[1,2,3]')));
修訂變更。
commit;
使用
L2_squared
函式建立向量索引,以測量距離。CREATE VECTOR INDEX vectorIndex ON dbname.books(embeddings) USING SCANN QUANTIZER = SQ8 DISTANCE_MEASURE = l2_squared;
請使用下列語法執行 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_vector
或 vector_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;
後續步驟
- 請參閱 Cloud SQL 向量搜尋總覽。
- 瞭解如何在執行個體上啟用及停用向量嵌入。
- 瞭解如何生成向量嵌入。
- 瞭解如何建立向量索引。
- 瞭解如何對向量嵌入執行搜尋。