~/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 memory | 0.9962 | 0.9962 | 0.0876 |
| 2 | #2 Protect Ollama with nginx and a password | 0.4037 | 0.4037 | 1.0921 |
| 3 | #3 Tomorrow's weather forecast | 0.0100 | 0.0100 | 1.4071 |
餘弦相似度矩陣
每個儲存格是該列的向量與該欄的向量之間的比較結果。
| #0 | #1 | #2 | #3 | |
|---|---|---|---|---|
| #0 | 1.000 | 0.996 | 0.404 | 0.010 |
| #1 | 0.996 | 1.000 | 0.475 | -0.005 |
| #2 | 0.404 | 0.475 | 1.000 | -0.377 |
| #3 | 0.010 | -0.005 | -0.377 | 1.000 |
向量
| 文字 | 維度 | 長度(L2 範數) | 單位長度 |
|---|---|---|---|
| #0 How do I keep a model loaded in Ollama? | 4 | 1.000000 | 是 |
| #1 keep_alive controls how long the model stays in memory | 4 | 1.000000 | 是 |
| #2 Protect Ollama with nginx and a password | 4 | 1.000001 | 是 |
| #3 Tomorrow's weather forecast | 4 | 1.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 模型,看哪一個更清楚地區分相關與不相關的文字
- 在為向量資料庫選擇距離度量之前,先檢查已儲存的向量是否為單位長度,以及維度是否如你預期
使用方法
- 用一次請求把文字送給你的模型,例如 curl http://localhost:11434/api/embed -d '{"model": "embeddinggemma", "input": ["question", "passage 1", "passage 2"]}',然後貼上完整的 JSON 回應。
- 也可以依輸入的順序,每行寫一個標籤,這樣結果就會顯示文字而不是編號。
- 選擇要拿來比較的向量(預設為 #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 或任何其他伺服器;對模型發出請求是由你自己操作。