SQL Vector 向量相似度搜尋

存入向量資料後,最核心的應用就是進行「相似度比對」。在向量世界裡,搜尋是基於數學距離計算的區域檢索。由於各家資料庫(如 PostgreSQL、MySQL、SQL Server)的實作方式不同,本章將詳細解析不同系統下的搜尋語法。

相似度計算的三大指標 (Distance Metrics)

選擇正確的距離指標會直接影響搜尋結果。以下是主流資料庫支持的三大算法:

1. 餘弦相似度 (Cosine Similarity)

  • 原理:計算兩個向量在夾角的餘弦值。它只關注「語義方向」,最適合文字搜尋。
  • 指標:數值越小代表越接近。

2. 歐基里德距離 (Euclidean / L2 Distance)

  • 原理:兩點之間的直線距離。適合影像識別或考量數值絕對大小的場景。

3. 內積 (Inner Product)

  • 原理:向量元素相乘後加總。當資料已正規化時,運算速度最快。

跨資料庫語法對照表

功能PostgreSQL (pgvector)MySQL 8.4+Azure SQL / SQL Server
餘弦距離<=>VECTOR_DISTANCE(..., 'COSINE')VECTOR_DISTANCE(..., 'cosine')
L2 距離<->VECTOR_DISTANCE(..., 'EUCLIDEAN')VECTOR_DISTANCE(..., 'euclidean')
內積<#> (負內積)VECTOR_DISTANCE(..., 'DOT')VECTOR_DISTANCE(..., 'dot')

PostgreSQL (pgvector) 專屬語法

PostgreSQL 透過關鍵運算子來簡化搜尋邏輯,這在處理複合查詢時非常強大。

使用運算子排序

-- 找出最相關的 前 5 筆部落格文章
SELECT title, summary
FROM articles
ORDER BY embedding <=> '[0.12, -0.45, 0.88, ...]' 
LIMIT 5;

使用內建函數(輔助)

雖然運算子較常用,但你也可以直接調用函數來計算數值:

SELECT title, cosine_distance(embedding, @query_vector) AS score
FROM articles;

MySQL 8.4+:VECTOR_DISTANCE 函數

MySQL 採用更具解釋性的函數風格,適合習慣標準 SQL 函數的使用者。

核心範例

SELECT product_name, 
       VECTOR_DISTANCE(p_vec, @query_vec, 'COSINE') AS dist
FROM products
WHERE category = 'Home'
ORDER BY dist ASC
LIMIT 3;
MySQL 的 VECTOR_DISTANCE 也支援 DOT (內積) 與 EUCLIDEAN,參數名稱需為大寫字串。

Azure SQL / SQL Server:新一代向量函數

微軟在 Azure SQL 與 SQL Server 近期版本中引入了內建支援,其語法設計與 MySQL 相似。

相似度檢索範例

SELECT TOP 5 ID, Title,
       VECTOR_DISTANCE(v_col, CAST(@json_vector AS VECTOR(1536)), 'cosine') AS score
FROM Documents
ORDER BY score ASC;

優點:VECTOR_NORM

SQL Server 還提供了 VECTOR_NORM 函數,用來計算向量的長度(模長),這在進行資料前處理或手動校驗正規化時非常方便。

在真實世界的應用中,通常需要結合「業務過濾」與「語義排序」。

範例:篩選 + 向量排序

場景:在「台北市」的「餐廳」中,尋找「與義大利麵相關」的前 3 名。

SELECT r.name, r.address
FROM restaurants r
WHERE r.city = 'Taipei' 
  AND r.cuisine_type = 'Italian'
ORDER BY r.menu_vector <=> @search_vector
LIMIT 3;

效能與最佳實務

  1. 資料庫優化器:SQL 資料庫會根據 WHERE 條件自動決定要先執行「索引過濾」還是「向量排序」。這比起獨立的向量資料庫更具靈活性。
  2. CAST 的必要性:在 SQL Server 或 MySQL 中,有時需要手動將輸入的 JSON 字串 CASTVECTOR 型態以確保計算精準。
  3. HNSW 索引:無論哪種資料庫,資料量大於 1 萬筆時,請務必建立向量索引,否則 ORDER BY 會引發緩慢的全表掃描。

總結

  • PostgreSQL:語法最簡潔 (運算子導向),功能最豐富。
  • MySQL:標準函數化語法,8.4 版本後效能大幅提升。
  • SQL Server:結合強大的 CASTVECTOR_DISTANCE,與雲端 AI 生態整合緊密。

理解了各家搜尋語法的差異後,最後一塊拼圖就是處理大規模數據的向量索引實作