← 返回

向量相似度度量:L2 、餘弦及內積

拖曳查詢點並切換度量單位,以觀察最近鄰向量如何變化。

Top-5 最近鄰(數值越低表示越接近)

#1P1842.1
#2P1074.0
#3P17111.6
#4P14122.8
#5P13126.9
相似度度量
L2
顯示值
歐幾里得距離

L2 (歐幾里得距離)

測量兩點之間的直線距離。同心圓顯示等距區域——同一圓上的所有點與查詢向量的「距離」皆相等。

何謂度量?

度量(metric)僅是一個函數,它接受兩個向量並返回一個數值,用以表示它們有多相似(或多不同)。向量搜尋的核心在於「找出針對我的查詢,度量分數最高的 K 個向量」。 其餘的一切——索引、叢集、圖——都只是為了避免針對資料庫中的每個向量計算此分數而進行的輔助管理。

您選擇的度量標準決定了「相似」對您的資料而言代表什麼。兩個嵌入向量在某個度量標準下可能「接近」,但在另一個度量標準下卻可能「遙遠」——相同的資料,卻得出不同的結果。這就是為什麼必須在建立索引之前就做出這個選擇。

實務中常見的這三種情況

  • L2 (歐幾里得):直線距離。數值越低越好。適用於方向與大小皆重要的情境——例如影像嵌入、地理座標、原始感測器讀數。此為多數電腦視覺模型的預設值。
  • 餘弦:向量之間的夾角,不考慮長度。數值越高越好。僅在方向是唯一考量時使用——例如文字嵌入(BERT 、OpenAI 等),以及向量「人氣」不應佔主導地位的推薦系統。
  • 內積(IP ):點積,同時考量向量對齊度與模長。數值越高越好。應與明確針對IP 進行正規化的模型搭配使用(DPR ,許多檢索模型皆屬此類)。當向量長度為單位長度時,數學上等同於餘弦值。

兩條實用規則

  • 請將評估指標與模型相匹配。嵌入式模型是在特定評估指標的考量下進行訓練的。若在搜尋時使用不同的評估指標,將會在不知不覺中破壞您的召回率。選擇前請先檢查模型卡片。
  • 保持一致性。集合中的所有向量必須使用相同的度量標準。您不能在單一索引內混用不同度量標準,且無法對不同度量標準下的分數進行有意義的比較。

試試看:將查詢點拖曳至原點附近,在餘弦相似度和 L2 之間切換。觀察餘弦相似度如何只關注查詢向量的方向——位於原點另一側的點,在 L2 下可能很近,在餘弦相似度下卻可能很遠。這就是這個概念的直觀呈現。

在Milvus

在《Milvus 》中,度量值是透過 `metric_type ` 針對每個索引進行設定—— L2, IP,或 COSINE (針對密集向量)——於建立索引時設定。此後針對該集合的每次搜尋,皆會使用您剛才在上方操作過的相同函式。最可靠的單一規則是:使用您嵌入式模型所訓練的度量標準,該標準幾乎列於每張模型卡上。

兩個實用的捷徑。大多數現代文字嵌入 API(OpenAI 、Cohere 、Voyage 以及大多數句子轉換器)所產生的向量皆適用於餘弦相似度。若您的向量已歸一化為單位長度,則餘弦相似度與內積所返回的排名結果將完全相同——因此 IP 對歸一化向量進行計算,是 COSINE的常見替代方案,且運算成本略低。

常見問題

對於OpenAI 或其他文字嵌入,我應該使用哪種相似度度量?

請使用餘弦相似度(度量類型:COSINE ,詳見Milvus )。幾乎所有現代文本嵌入模型——包括OpenAI 的 text-embedding-3 系列——皆是針對餘弦相似度進行訓練的。由於OpenAI 中的嵌入向量已歸一化為單位長度,內積(IP )可產生相同的排序結果,因此是合適的替代方案。

餘弦相似度與內積有何區別?

餘弦相似度僅測量兩個向量之間的夾角,忽略其長度。內積(點積)同時考量方向對齊與大小,因此指向相同方向且較長的向量得分較高。對於單位歸一化的向量,這兩者在數學上等價。

在Milvus 中建立索引後,我可以變更度量單位類型嗎?

不。該度量標準是在建立索引時預先嵌入其中的。若要切換度量標準,請先刪除索引,再使用新的 metric_type 重新建立。不同度量標準的評分彼此之間亦無法相互比較,因此在後處理結果時請勿將它們混用。

度量標準的選擇會影響召回率或搜尋速度嗎?

運算速度基本上完全相同——L2 、IP 以及 cosine 皆只需對向量進行一次遍歷。關鍵在於召回率:若使用與嵌入模型訓練時不同的度量標準進行搜尋,會悄無聲息地降低結果品質,且往往降幅劇烈。

深入了解:請閱讀《相似度指標》文件,以查看Milvus 支援的完整指標清單,包括二進位向量的漢明(Hamming)與雅卡德(Jaccard)指標,以及全文檢索的 BM25 指標。

繼續探索