本頁說明如何使用 ANN 距離函式,找出近似最近鄰 (ANN) 並查詢向量嵌入。
如果資料集很小,可以使用 K 近鄰 (KNN) 找出精確的 k 個最鄰近向量。不過,隨著資料集擴大,KNN 搜尋的延遲時間和費用也會增加。您可以使用 ANN 找出近似的 k 個最鄰近項目,大幅降低延遲和成本。
在 ANN 搜尋中,傳回的 k 個向量並非真正的 k 個最鄰近項目,因為 ANN 搜尋會計算近似距離,且可能不會查看資料集中的所有向量。有時會傳回幾個不在前 k 個最鄰近項目中的向量。這就是所謂的「召回率損失」。 可接受的喚回度損失量取決於應用實例,但在大多數情況下,為了提升資料庫效能而損失部分喚回度,是可接受的取捨。
如要進一步瞭解 Spanner 支援的近似距離函式,請參閱下列 GoogleSQL 參考頁面:
查詢向量嵌入
Spanner 會使用向量索引,加快近似最鄰近 (ANN) 向量搜尋的速度。您可以使用向量索引查詢向量嵌入。如要查詢向量嵌入,您必須先建立向量索引。接著,您可以使用任一項近似距離函式來尋找 ANN。
使用概略距離函式時的限制包括:
- 近似距離函式必須計算嵌入資料欄和常數運算式 (例如參數或常值) 之間的距離。
- 概略距離函式輸出內容必須在
ORDER BY
子句中做為唯一的排序鍵,且ORDER BY
後方必須指定LIMIT
。 - 查詢必須明確篩除未建立索引的資料列。在大多數情況下,這表示查詢必須包含與向量索引定義相符的
WHERE <column_name> IS NOT NULL
子句,除非資料欄已在表格定義中標示為NOT NULL
。
如需詳細的限制清單,請參閱概略距離函式參考頁面。
範例
假設 Documents
資料表含有 DocContents
位元組資料欄中預先計算的文字嵌入 DocEmbedding
資料欄,以及從其他來源填入的 NullableDocEmbedding
資料欄 (可能為空值)。
CREATE TABLE Documents (
UserId INT64 NOT NULL,
DocId INT64 NOT NULL,
Author STRING(1024),
DocContents BYTES(MAX),
DocEmbedding ARRAY<FLOAT32> NOT NULL,
NullableDocEmbedding ARRAY<FLOAT32>,
WordCount INT64
) PRIMARY KEY (UserId, DocId);
如要搜尋最接近 [1.0, 2.0, 3.0]
的 100 個向量,請按照下列步驟操作:
SELECT DocId
FROM Documents
WHERE WordCount > 1000
ORDER BY APPROX_EUCLIDEAN_DISTANCE(
ARRAY<FLOAT32>[1.0, 2.0, 3.0], DocEmbedding,
options => JSON '{"num_leaves_to_search": 10}')
LIMIT 100
如果嵌入資料欄可為空值:
SELECT DocId
FROM Documents
WHERE NullableDocEmbedding IS NOT NULL AND WordCount > 1000
ORDER BY APPROX_EUCLIDEAN_DISTANCE(
ARRAY<FLOAT32>[1.0, 2.0, 3.0], NullableDocEmbedding,
options => JSON '{"num_leaves_to_search": 10}')
LIMIT 100
後續步驟
進一步瞭解 Spanner 向量索引。
進一步瞭解 GoogleSQL
APPROXIMATE_COSINE_DISTANCE()
、APPROXIMATE_EUCLIDEAN_DISTANCE()
、APPROXIMATE_DOT_PRODUCT()
函式。進一步瞭解 GoogleSQL
VECTOR INDEX
陳述式。進一步瞭解向量索引最佳做法。
如需使用 ANN 的逐步範例,請參閱「開始使用 Spanner 向量搜尋」。