本頁說明如何從 Spanner 提供的向量距離函式中選擇,用來測量向量嵌入之間的相似度。
從 Spanner 資料產生嵌入後,您可以使用向量距離函式執行相似度搜尋。下表說明 Spanner 中的向量距離函式。
函式 | 說明 | 公式 | 與相似度提高的關係 |
---|---|---|---|
點積 | 計算角度 \(\theta\) 的餘弦,再乘以對應向量大小的乘積。 | \(a_1b_1+a_2b_2+...+a_nb_n\) \(=|a||b|cos(\theta)\) | 增加 |
餘弦距離 | 餘弦距離函式會從 1 減去餘弦相似度 (cosine_distance() = 1 - cosine similarity )。餘弦相似度會測量兩個向量之間的角度餘弦值 \(\theta\) 。
|
1 - \(\frac{a^T b}{|a| \cdot |b|}\) | 減少 |
歐幾里得距離 | 測量兩個向量之間的直線距離。 | \(\sqrt{(a_1-b_1)^2+(a_2-b_2)^2+...+(a_N-b_N)^2}\) | 減少 |
選擇相似度測量指標
視所有向量嵌入是否已正規化而定,您可以決定要使用哪種相似度測量方式來尋找相似度。正規化向量嵌入的量值 (長度) 剛好為 1.0。
此外,如果您知道模型訓練時使用的距離函式,請使用該函式測量向量嵌入之間的相似度。
正規化資料
如果資料集中的所有向量嵌入都經過正規化,這三種函式提供的語意搜尋結果就會相同。基本上,雖然每個函式會傳回不同的值,但這些值會以相同方式排序。當嵌入內容經過正規化處理後,DOT_PRODUCT()
通常是運算效率最高的做法,但大多數情況下,兩者差異微不足道。不過,如果應用程式對效能非常敏感,DOT_PRODUCT()
可能有助於調整效能。
未標準化的資料
如果資料集中的向量嵌入內容未經過正規化,則使用 DOT_PRODUCT()
做為距離函式在數學上並不正確,因為點積函式不會測量距離。視嵌入項目的產生方式和偏好的搜尋類型而定,COSINE_DISTANCE()
或 EUCLIDEAN_DISTANCE()
函式產生的搜尋結果,主觀上會比另一個函式更好。您可能需要透過 COSINE_DISTANCE()
或 EUCLIDEAN_DISTANCE()
進行實驗,才能判斷哪一個最適合您的用途。
不確定資料是否經過正規化
如果您不確定資料是否已正規化,但想使用 DOT_PRODUCT()
,建議改用 COSINE_DISTANCE()
。COSINE_DISTANCE()
類似於 DOT_PRODUCT()
,但內建正規化功能。相似度是使用 COSINE_DISTANCE()
測量,範圍從 0
到 2
。結果越接近 0
,表示向量越相似。
後續步驟
- 進一步瞭解如何找出 k 個最鄰近的項目來執行向量搜尋。
- 瞭解如何將嵌入內容匯出至 Vertex AI Vector Search。
- 進一步瞭解 GoogleSQL
COSINE_DISTANCE()
、EUCLIDEAN_DISTANCE()
和DOT_PRODUCT()
函式。 - 進一步瞭解 PostgreSQL
spanner.cosine_distance()
、spanner.euclidean_distance(), and spanner.dot_product()
函式。