~/tools / 埋め込みと検索(RAG) / Embedding Similarity Calculator
Embedding Similarity Calculator — Ollama の埋め込みベクトルを比較する
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のドキュメントとリファレンスをもとに、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正規化された(単位長の)ベクトルを返すと書かれています。そのようなベクトルでは、コサイン類似度と内積は同じ数値になり、ツールは各ベクトルの長さも表示するので確認できます。ドキュメントには、インデックス作成にも検索クエリにも同じembeddingモデルを使うようにも書かれています。次元数が異なるベクトルは比べられないため、見つかった場合はツールがエラーを出して止まります。計算は、Pythonで別に計算した値と照らして確認しました。
このツールの計算部分は、オープンソース(MIT ライセンス)で公開しています。 github.com/seigo5555/toolkitbox-lib/src/embedding-similarity.ts
こんな時に使う
- 質問と候補の文章を1回の /api/embed リクエストでembeddingにして、検索を作る前に、どの文章が1位になるかを確認する
- 同じ文章で2つのembeddingモデルを、1つずつ比べて、関連する文章と無関係な文章をどちらがはっきり分けられるかを見る
- ベクトルデータベースの距離指標を選ぶ前に、保存したベクトルが単位長で、想定した次元数になっているかを確認する
使い方
- テキストをまとめて1回のリクエストでモデルに送り(例: curl http://localhost:11434/api/embed -d '{"model": "embeddinggemma", "input": ["question", "passage 1", "passage 2"]}')、JSONレスポンス全体を貼り付けます。
- 必要なら、入力と同じ順番で1行に1つずつラベルを書くと、結果に番号の代わりにテキストが表示されます。
- どのベクトルを基準に比べるかを選びます(デフォルトは #0、つまり最初の入力です)。表では、残りのベクトルがコサイン類似度の順に並びます。ベクトルが10個以下のときは、行列にすべての組み合わせが表示されます。
FAQ
どの類似度を使えばよいですか?
Ollamaのembeddingsのページには、ほとんどのセマンティック検索ではコサイン類似度を使うように書かれています。コサイン類似度は2つのベクトルの向きを比べ、長さは無視します。1は同じ向きを意味します。ベクトルデータベースではこれらを選べることが多いので、ツールは内積とユークリッド距離も表示します。
コサイン類似度と内積が同じになるのはなぜですか?
ベクトルの長さが1だからです。Ollamaのドキュメントには、/api/embed はL2正規化された単位長のベクトルを返すと書かれており、単位長のベクトルではコサイン類似度は内積と等しくなります。ツールは各ベクトルの長さを表示し、すべてが単位長(0.001以内)かどうかも示します。
次元数が一致しないと表示されました。どういう意味ですか?
2つのベクトルを比べられるのは、数値の個数が同じときだけです。長さはモデルによって決まり、ドキュメントでは通常384〜1024次元とされています。また、/api/embed のリクエストには dimensions フィールドも指定できます。長さが違う場合は、たいてい別のモデルや別の設定で作られたベクトルです。ドキュメントには、インデックス作成にも検索クエリにも同じembeddingモデルを使うように書かれています。
base64のembeddingを含むレスポンスも貼れますか?
いいえ。このツールが読めるのは数値だけです。OpenAI互換の /v1/embeddings エンドポイントを呼ぶときは、embeddingをbase64ではなくfloatで指定してください。
類似度0.8は高いのですか?
決まった基準はありません。値はモデルや文章によって変わるため、1つの数値だけで判断せず、同じモデルで関連する文章と無関係な文章のスコアを比べてください。
データはどこかに送信されますか?
いいえ。計算はブラウザの中で行われます。このツールがOllamaやほかのサーバーを呼び出すことはなく、モデルへのリクエストはご自身で送ります。