~/tools / 嵌入與搜尋(RAG) / Embedding Similarity Calculator

Embedding Similarity Calculator — 比較 Ollama /api/embed 的向量:餘弦相似度、內積

貼上 Ollama 的 /api/embed 或與 OpenAI 相容的 /v1/embeddings 端點的回應,即可比較向量:以餘弦相似度、內積與歐幾里得距離,對你所選的向量進行排名,並提供相似度矩陣。它也會顯示每個向量的維度與長度,讓你看出向量是否已正規化、是否來自同一個模型。資料不會離開你的瀏覽器。

範例使用虛構的 4 維單位長度向量,方便閱讀。實際的 embedding 有數百或數千個維度。

已視為Ollama /api/embed 的回應讀取:共 4 個向量,維度為 4。 所有向量的長度都是 1,因此餘弦相似度與內積相等。

依餘弦相似度排名

與 #0 How do I keep a model loaded in Ollama? 比較。數值越高越相似。

名次文字餘弦內積距離
1#1 keep_alive controls how long the model stays in memory0.99620.99620.0876
2#2 Protect Ollama with nginx and a password0.40370.40371.0921
3#3 Tomorrow's weather forecast0.01000.01001.4071

餘弦相似度矩陣

每個儲存格是該列的向量與該欄的向量之間的比較結果。

#0#1#2#3
#01.0000.9960.4040.010
#10.9961.0000.475-0.005
#20.4040.4751.000-0.377
#30.010-0.005-0.3771.000

向量

文字維度長度(L2 範數)單位長度
#0 How do I keep a model loaded in Ollama?41.000000是
#1 keep_alive controls how long the model stays in memory41.000000是
#2 Protect Ollama with nginx and a password41.000001是
#3 Tomorrow's weather forecast41.000000是

依據 Ollama 的 embeddings 文件與 API 參考文件,於 2026-11-04 確認。 Ollama: Embeddings / Ollama API: Generate embeddings

所有計算都在你的瀏覽器中完成,不會傳送到任何地方。

embedding 模型會把一段文字轉成一串數字,也就是向量。Ollama 的文件說明了如何把這些向量用於以餘弦相似度進行的語意搜尋,以及 RAG。在寫搜尋程式之前,先看看這些數字會很有幫助:問題真的與能回答它的段落最接近嗎?本工具可讀取 Ollama 從 /api/embed 回傳的 JSON({"embeddings": [[…], …]})、/v1/embeddings 與 OpenAI 相容的格式({"data": [{"embedding": […]}]}),或單純的向量陣列。它會以餘弦相似度,對你選定的向量排出所有向量的名次,並同時顯示內積與歐幾里得距離。Ollama 的文件指出,/api/embed 會回傳經 L2 正規化(長度為 1)的向量;對這樣的向量來說,餘弦相似度與內積是同一個數字,而本工具會顯示每個向量的長度,方便你確認。文件也指出,建立索引與查詢時要使用同一個 embedding 模型。維度數不同的向量完全無法比較,工具一旦發現就會顯示錯誤並停止。計算結果已與另外用 Python 算出的數值核對。

這個工具的核心邏輯以 MIT 授權開放原始碼。 github.com/seigo5555/toolkitbox-lib/src/embedding-similarity.ts

使用情境

  • 在建置搜尋之前,用一次 /api/embed 請求為一個問題與幾個候選段落產生 embedding,看哪個段落排第一
  • 用同一批句子,一次一個模型地比較兩個 embedding 模型,看哪一個更清楚地區分相關與不相關的文字
  • 在為向量資料庫選擇距離度量之前,先檢查已儲存的向量是否為單位長度,以及維度是否如你預期

使用方法

  1. 用一次請求把文字送給你的模型,例如 curl http://localhost:11434/api/embed -d '{"model": "embeddinggemma", "input": ["question", "passage 1", "passage 2"]}',然後貼上完整的 JSON 回應。
  2. 也可以依輸入的順序,每行寫一個標籤,這樣結果就會顯示文字而不是編號。
  3. 選擇要拿來比較的向量(預設為 #0,也就是第一筆輸入)。表格會依餘弦相似度對其他向量排名;向量數在 10 個以內時,矩陣會顯示每一對的結果。

FAQ

我該用哪一種相似度?

Ollama 的 embeddings 頁面指出,大多數語意搜尋的情境要使用餘弦相似度。餘弦相似度比較的是兩個向量的方向,不考慮長度;1 代表方向相同。工具也會顯示內積與歐幾里得距離,因為向量資料庫通常讓你在這幾種之間選擇。

為什麼餘弦相似度和內積會一樣?

因為向量的長度是 1。Ollama 的文件指出,/api/embed 會回傳經 L2 正規化、長度為 1 的向量,而對單位長度的向量來說,餘弦相似度等於內積。工具會顯示每個向量的長度,並說明是否所有向量都是單位長度(誤差在 0.001 以內)。

工具說維度不符,是什麼意思?

兩個向量必須有相同的數字個數才能比較。長度取決於模型,文件指出通常是 384 到 1024 維,而 /api/embed 請求也可以使用 dimensions 欄位。長度不同,通常表示這些向量來自不同的模型或設定。文件指出,建立索引與查詢時要使用同一個 embedding 模型。

可以貼上含有 base64 embedding 的回應嗎?

不行。本工具只讀取數字。如果你呼叫的是與 OpenAI 相容的 /v1/embeddings 端點,請要求回傳浮點數形式的 embedding,而不是 base64。

相似度 0.8 算高嗎?

沒有固定的門檻。數值取決於模型與你的文字,所以請比較同一個模型下相關與不相關段落的分數,而不要只憑單一數字下判斷。

我的資料會被傳送到任何地方嗎?

不會。計算都在你的瀏覽器中進行。本工具不會呼叫 Ollama 或任何其他伺服器;對模型發出請求是由你自己操作。

相關文章

相關工具