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 函數,用來計算向量的長度(模長),這在進行資料前處理或手動校驗正規化時非常方便。
混合搜尋實戰 (Hybrid Search)
在真實世界的應用中,通常需要結合「業務過濾」與「語義排序」。
範例:篩選 + 向量排序
場景:在「台北市」的「餐廳」中,尋找「與義大利麵相關」的前 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;
效能與最佳實務
- 資料庫優化器:SQL 資料庫會根據
WHERE條件自動決定要先執行「索引過濾」還是「向量排序」。這比起獨立的向量資料庫更具靈活性。 - CAST 的必要性:在 SQL Server 或 MySQL 中,有時需要手動將輸入的 JSON 字串
CAST為VECTOR型態以確保計算精準。 - HNSW 索引:無論哪種資料庫,資料量大於 1 萬筆時,請務必建立向量索引,否則
ORDER BY會引發緩慢的全表掃描。
總結
- PostgreSQL:語法最簡潔 (運算子導向),功能最豐富。
- MySQL:標準函數化語法,8.4 版本後效能大幅提升。
- SQL Server:結合強大的
CAST與VECTOR_DISTANCE,與雲端 AI 生態整合緊密。
理解了各家搜尋語法的差異後,最後一塊拼圖就是處理大規模數據的向量索引實作。