~/tools / Эмбеддинги и поиск (RAG) / Embedding Similarity Calculator
Embedding Similarity Calculator — Сравнение векторов эмбеддингов из Ollama /api/embed: косинусное сходство, расстояние
Вставьте ответ /api/embed от Ollama или эндпоинта /v1/embeddings, совместимого с OpenAI, и сравните векторы: косинусное сходство, скалярное произведение и евклидово расстояние, упорядоченные относительно выбранного вектора, а также матрицу сходства. Инструмент показывает и размерность, и длину каждого вектора, так что видно, нормализованы ли векторы и получены ли они одной моделью. Данные не покидают ваш браузер.
В примере используются выдуманные векторы единичной длины с 4 измерениями, чтобы их можно было прочитать. У настоящих эмбеддингов сотни или тысячи измерений.
Прочитано как ответ 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 об эмбеддингах и справочнику API, проверено 2026-11-04. Ollama: Embeddings / Ollama API: Generate embeddings
Всё вычисляется в вашем браузере. Ничего никуда не отправляется.
Модель эмбеддингов превращает фрагмент текста в список чисел — вектор. В документации Ollama описано, как использовать эти векторы для семантического поиска по косинусному сходству и для RAG. Прежде чем писать код поиска, полезно взглянуть на числа: действительно ли вопрос оказывается ближе всего к фрагменту, который на него отвечает? Этот инструмент читает JSON, который Ollama возвращает из /api/embed ({"embeddings": [[…], …]}), форму, совместимую с OpenAI, из /v1/embeddings ({"data": [{"embedding": […]}]}) или простой массив векторов. Он упорядочивает каждый вектор по косинусному сходству с выбранным вами вектором, а также показывает скалярное произведение и евклидово расстояние. В документации Ollama сказано, что /api/embed возвращает векторы, нормализованные по L2 (единичной длины); для таких векторов косинусное сходство и скалярное произведение — одно и то же число, а инструмент показывает длину каждого вектора, чтобы вы могли это проверить. В документации сказано также использовать одну и ту же модель эмбеддингов для индексации и для запросов. Векторы с разным числом измерений сравнить невозможно вовсе, и инструмент останавливается с ошибкой, если находит такие. Вычисления проверены по значениям, отдельно посчитанным в Python.
Основная логика этого инструмента открыта под лицензией MIT. github.com/seigo5555/toolkitbox-lib/src/embedding-similarity.ts
Когда пригодится
- Создать одним запросом /api/embed эмбеддинги вопроса и нескольких возможных фрагментов и увидеть, какой фрагмент окажется первым, прежде чем строить поиск
- Сравнить две модели эмбеддингов на одних и тех же предложениях, по одной модели за раз, чтобы увидеть, какая чётче разделяет связанные и несвязанные тексты
- Проверить, что сохранённые векторы имеют единичную длину и ожидаемую размерность, прежде чем выбирать метрику расстояния для векторной базы данных
Как пользоваться
- Отправьте тексты своей модели одним запросом, например curl http://localhost:11434/api/embed -d '{"model": "embeddinggemma", "input": ["question", "passage 1", "passage 2"]}', и вставьте весь ответ JSON.
- При желании напишите по одной подписи в строке, в том же порядке, что и ввод, чтобы в результатах были тексты вместо номеров.
- Выберите, с каким вектором сравнивать (по умолчанию #0, первый ввод). Таблица упорядочивает остальные по косинусному сходству; матрица показывает каждую пару, если векторов 10 или меньше.
Вопросы
Какое сходство использовать?
На странице Ollama об эмбеддингах сказано использовать косинусное сходство для большинства случаев семантического поиска. Косинусное сходство сравнивает направление двух векторов и игнорирует их длину; 1 означает одно и то же направление. Инструмент показывает также скалярное произведение и евклидово расстояние, потому что векторные базы данных часто позволяют выбирать между ними.
Почему косинусное сходство и скалярное произведение совпадают?
Потому что длина векторов равна 1. В документации Ollama сказано, что /api/embed возвращает векторы, нормализованные по L2, единичной длины, а для векторов единичной длины косинусное сходство равно скалярному произведению. Инструмент показывает длину каждого вектора и сообщает, все ли они единичной длины (с точностью до 0.001).
Инструмент пишет, что размерности не совпадают. Что это значит?
Два вектора можно сравнить, только если в них одинаковое количество чисел. Длина зависит от модели, которую документация, как правило, указывает как от 384 до 1024 измерений, а запрос /api/embed принимает также поле dimensions. Разная длина обычно означает, что векторы получены разными моделями или с разными настройками. В документации сказано использовать одну и ту же модель эмбеддингов для индексации и для запросов.
Можно ли вставить ответ с эмбеддингами в base64?
Нет. Инструмент читает только числа. Если вы обращаетесь к эндпоинту /v1/embeddings, совместимому с OpenAI, запрашивайте эмбеддинги в виде чисел с плавающей точкой, а не base64.
Хорошо ли сходство 0.8?
Фиксированного порога нет. Значения зависят от модели и ваших текстов, поэтому сравнивайте оценки связанных и несвязанных фрагментов, полученные одной моделью, а не судите об одном числе отдельно.
Отправляются ли мои данные куда-либо?
Нет. Вычисления выполняются в вашем браузере. Инструмент никогда не обращается ни к Ollama, ни к какому-либо другому серверу; запрос к своей модели вы отправляете сами.
Похожие статьи
- Эмбеддинги в Ollama: основы поиска и RAGСоздание эмбеддингов через /api/embed в Ollama: модели и их размеры, truncate и dimensions, векторы единичной длины и косинусное сходство, по официальной документации.
- Хранение и поиск эмбеддингов Ollama в PostgreSQL с помощью pgvectorЭмбеддинги Ollama в PostgreSQL с pgvector, поиск через HNSW или IVFFlat и передача результатов в /api/chat, чтобы ответ ссылался на источники.