iT邦幫忙

2026 iThome 鐵人賽

DAY 13
0
AI Engineering

從零打造 RAG 系統:檢索、生成與落地全紀錄系列 第 13 篇

[Day 13] 相似度搜尋原理(Cosine Similarity、ANN 演算法)

  • 分享至 

  • xImage
  •  

前言

索引建好之後,今天要來理解檢索階段最核心的數學原理:向量之間的「相似度」到底是怎麼算出來的,以及為什麼大規模資料下不能用暴力比對。

向量相似度怎麼算?

最常見的三種距離/相似度計算方式:

1. 餘弦相似度(Cosine Similarity)

計算兩個向量之間的「夾角」,只關心方向是否相近,不受向量長度影響。數值介於 -1 到 1,越接近 1 代表越相似。

cosine_similarity(A, B) = (A · B) / (‖A‖ × ‖B‖)

這是 Embedding 檢索最常用的相似度指標,因為多數 Embedding 模型訓練時就是針對「方向」的語意相近性做優化。

2. 歐氏距離(Euclidean Distance)

計算兩點之間的直線距離,數值越小代表越相似。會同時受方向與長度影響。

3. 內積(Dot Product)

如果向量已經正規化(長度為 1),內積結果會等同於餘弦相似度,但計算量更小,因此在效能敏感的場景常被使用。

-- pgvector 支援的三種距離運算子
embedding <-> query_vector   -- 歐氏距離
embedding <#> query_vector   -- 負內積
embedding <=> query_vector   -- 餘弦距離

為什麼不能用暴力比對?

暴力比對(Brute-force)是指查詢時,把資料庫裡「每一筆」向量都跟查詢向量算一次距離,再排序取出最相近的 K 筆。

  • 資料量小(例如幾千筆):暴力比對速度可接受,實作也最簡單
  • 資料量大(例如百萬筆以上):每次查詢都要算幾百萬次距離,延遲會明顯上升,無法滿足即時互動的需求

ANN(近似最近鄰)演算法

為了解決大規模搜尋的效能問題,業界發展出 ANN(Approximate Nearest Neighbor,近似最近鄰) 演算法——犧牲一點點精準度(不保證找到絕對最相近的結果),換取大幅提升的查詢速度。

常見的 ANN 索引結構:

演算法 原理簡述 特色
IVF(Inverted File) 先把向量分群,查詢時只搜尋最相近的幾個群 建置快、查詢速度中等
HNSW(Hierarchical Navigable Small World) 建立多層次的圖結構,查詢時沿著圖快速逼近目標 查詢速度快、召回率高,是目前業界主流
PQ(Product Quantization) 把高維向量壓縮成較短的編碼,節省儲存空間 適合超大規模、記憶體有限的場景

精準度 vs 速度的取捨

ANN 演算法通常會提供一些可調參數(例如 HNSW 的 ef_search),讓開發者在「查詢速度」與「召回精準度」之間做取捨:

-- 調整 HNSW 查詢時的搜尋範圍(數值越大越精準,但越慢)
SET hnsw.ef_search = 100;

實務上建議先用暴力比對建立一個「正確答案基準」,再調整 ANN 參數,確認在可接受的速度下,召回率沒有明顯下降。

小結

理解相似度計算與 ANN 索引的原理,能幫助我們在遇到「檢索結果怪怪的」問題時,知道該從哪個環節(距離公式選錯?索引參數不對?)開始排查。明天我們要動手實作第一個可以查詢的向量資料庫,把這幾天的理論串起來看看實際效果。


上一篇
[Day 12] 建立索引:從文字到向量的完整流程
下一篇
[Day 14] 動手實作:建立第一個可查詢的向量資料庫
系列文
從零打造 RAG 系統:檢索、生成與落地全紀錄 共 15 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
eating11111
iT邦新手 4 級 ‧ 2026-09-27 18:16:59

好期待明天的實作!!!!!!!

我要留言

立即登入留言