索引建好之後,今天要來理解檢索階段最核心的數學原理:向量之間的「相似度」到底是怎麼算出來的,以及為什麼大規模資料下不能用暴力比對。
最常見的三種距離/相似度計算方式:
計算兩個向量之間的「夾角」,只關心方向是否相近,不受向量長度影響。數值介於 -1 到 1,越接近 1 代表越相似。
cosine_similarity(A, B) = (A · B) / (‖A‖ × ‖B‖)
這是 Embedding 檢索最常用的相似度指標,因為多數 Embedding 模型訓練時就是針對「方向」的語意相近性做優化。
計算兩點之間的直線距離,數值越小代表越相似。會同時受方向與長度影響。
如果向量已經正規化(長度為 1),內積結果會等同於餘弦相似度,但計算量更小,因此在效能敏感的場景常被使用。
-- pgvector 支援的三種距離運算子
embedding <-> query_vector -- 歐氏距離
embedding <#> query_vector -- 負內積
embedding <=> query_vector -- 餘弦距離
暴力比對(Brute-force)是指查詢時,把資料庫裡「每一筆」向量都跟查詢向量算一次距離,再排序取出最相近的 K 筆。
為了解決大規模搜尋的效能問題,業界發展出 ANN(Approximate Nearest Neighbor,近似最近鄰) 演算法——犧牲一點點精準度(不保證找到絕對最相近的結果),換取大幅提升的查詢速度。
常見的 ANN 索引結構:
| 演算法 | 原理簡述 | 特色 |
|---|---|---|
| IVF(Inverted File) | 先把向量分群,查詢時只搜尋最相近的幾個群 | 建置快、查詢速度中等 |
| HNSW(Hierarchical Navigable Small World) | 建立多層次的圖結構,查詢時沿著圖快速逼近目標 | 查詢速度快、召回率高,是目前業界主流 |
| PQ(Product Quantization) | 把高維向量壓縮成較短的編碼,節省儲存空間 | 適合超大規模、記憶體有限的場景 |
ANN 演算法通常會提供一些可調參數(例如 HNSW 的 ef_search),讓開發者在「查詢速度」與「召回精準度」之間做取捨:
-- 調整 HNSW 查詢時的搜尋範圍(數值越大越精準,但越慢)
SET hnsw.ef_search = 100;
實務上建議先用暴力比對建立一個「正確答案基準」,再調整 ANN 參數,確認在可接受的速度下,召回率沒有明顯下降。
理解相似度計算與 ANN 索引的原理,能幫助我們在遇到「檢索結果怪怪的」問題時,知道該從哪個環節(距離公式選錯?索引參數不對?)開始排查。明天我們要動手實作第一個可以查詢的向量資料庫,把這幾天的理論串起來看看實際效果。