Гайд · TNWS AI
Как выбрать cosine или dot для нормализованных embeddings в Sentence Transformers
Проверяем единичную норму, сопоставляем две метрики и понимаем, когда dot меняет ранжирование: таблица проверяемых сценариев.
Задача и применимость
Поисковый запрос: «как выбрать cosine или dot для нормализованных embeddings». Ниже одна практическая задача для Python с библиотекой Sentence Transformers 6.1.0, опубликованной 18 сентября 2026 года, и checkpoint sentence-transformers/all-MiniLM-L6-v2. Пример на английских предложениях выбран потому, что поддержка русского выбранной демонстрационной моделью не должна подразумеваться автоматически. Для реального русского корпуса подберите подтверждённую карточкой языков модель и повторите оценку. Внешний поиск, генерация LLM и принятие бизнес-решения остаются отдельными этапами.
Фактическая основа: Документация называет cosine метрикой по умолчанию; dot — скалярным произведением. Если embeddings нормализованы до единичной нормы, dot математически равен cosine для каждой пары, а повторная нормализация в cosine может быть избыточной. Без нормализации dot зависит и от длины вектора. Точный прогноз значений векторных оценок без запуска весов модели не обещается. Примеры кода ниже сверены с текущей официальной документацией и проверены на синтаксис Python; в этом окружении сами веса не загружались. При обновлении модели или зависимости сначала повторите контрольный пример.
Нумерованная инструкция
- Выберите одну и ту же модель для вопроса и корпуса.
- Получите векторы с normalize_embeddings=True.
- Для одной пары посчитайте cosine и dot, сравните их численно с разумным допуском.
- Повторите вычисление на ненормализованных векторах.
- Перед сменой метрики индекса проверьте ранжирование и качество на размеченном наборе.
Подготовьте изолированное окружение и установите зафиксированный пакет: pip install "sentence-transformers==6.1.0". Библиотека потребует подходящих зависимостей и свободной памяти под выбранные веса; установка пакета не скачивает заранее любую модель. Перед тестом напечатайте установленную версию и зафиксируйте имя checkpoint. Не отправляйте в примеры клиентские имена, закрытые документы или ключи доступа.
Готовый шаблон
from sentence_transformers import SentenceTransformer, util
import numpy as np
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
texts = ["A parcel arrived late.", "The delivery was delayed."]
vec = model.encode(texts, normalize_embeddings=True)
cosine = float(util.cos_sim(vec[0], vec[1])[0, 0])
dot = float(util.dot_score(vec[0], vec[1])[0, 0])
print(np.linalg.norm(vec, axis=1), cosine, dot)
assert abs(cosine - dot) < 1e-4
Запускайте первый раз на очень маленьком обезличенном наборе. Для каждой строки и документа сохраняйте стабильный ID: иначе невозможно выяснить, почему нейросеть выбрала конкретную запись. Если вывод отличается от ожидаемой формы, сначала проверьте состав входа, затем конфигурацию модели и только после этого настройки ранжирования. Не маскируйте ошибки ручной подстановкой заранее «правильного» ответа.
Конкретный вход и ожидаемый результат
Вход — два сообщения о задержке доставки, embeddings двух строк после нормализации. Ожидаются две нормы, близкие к 1, и оценки cosine/dot с малой вычислительной разницей; их точные значения зависят от модели. Если предварительно не нормализовать векторы, проверка равенства уже не обоснована.
Проверяйте структуру отдельно от смысла. Массив верного размера не означает хорошего поиска, а высокий score не удостоверяет факт в документе. Сохраните реальные выводы программы и сопоставьте их с заранее размеченными эталонными ID. При переносе на другой корпус обновите проверочные данные; простая замена входного предложения в коде не доказывает обобщения метода.
Разбор метода и ограничений
Метрика должна соответствовать способу формирования и хранения векторов. Нормализация превращает каждый ненулевой вектор в единичный по L2-норме, убирая влияние масштаба при dot. Но если часть документов сохранена нормализованной, а часть нет, сортировка станет непредсказуемой. Заведите версию схемы индекса с флагом нормализации и проверяйте его при записи; смена настройки может потребовать полной пересборки. Косинусная мера сравнивает направление, скалярное произведение у ненормализованных векторов учитывает амплитуду. Это не вопрос предпочтения автора статьи: ориентируйтесь на рекомендации карточки вашей модели и результаты размеченного поиска.
Дополнительный сценарий проверки
Измерьте на десяти вопросах top-10 в четырёх комбинациях только на копии индекса: вход нормализован или нет, cosine или dot. При равномерной нормализации cosine и dot должны давать одинаковый порядок с точностью до численной погрешности; при несовпадающих настройках проверьте ошибки. Заранее зафиксируйте baseline recall, время вычисления и объём хранилища. Нельзя объявлять скорость dot выше без измерения на вашем backend, даже если локальная формула проще. Если используете vector database, её distance и формат хранения могут отличаться от numpy-функций из примера: проверьте контракт конкретного продукта. Для нулевого вектора нормализация требует осторожности — исследуйте причины появления пустого входа прежде, чем индексировать его.
| Сценарий | Проверяемое свойство | Практический вывод |
|---|---|---|
| Оба вектора L2-нормированы | dot ≈ cosine | Можно выбирать dot после теста backend |
| Вектора не нормированы | dot учитывает длину; cosine пересчитывает норму | Сравнить качество по gold-набору |
| Смешанный индекс | Документы обработаны разными правилами | Пересчитать корпус в одной схеме |
Критерии принятия
- Оба нормализованных вектора имеют норму около 1.
- Для них cosine и dot близки в заданном допуске.
- Смена метрики оценена на одинаковой выборке, а не на одной паре.
Если один пункт не проходит, настройка не готова для массового применения. При перезапуске сервиса повторно прогоните контрольный запрос и сверяйте ID, а не только наличие числовой оценки. Разделяйте ошибки получения embeddings, поиска кандидатов, фильтрации доступа и формирования финального ответа; хорошая метрика одного этапа не подтверждает работу остальных.
Типичные ошибки и что не делать
- Не смешивать нормализованные и исходные embeddings в одном индексе.
- Не утверждать равенство dot и cosine без условия нормализации.
- Не обещать ускорение без измерения backend.
Не обещайте точность и экономию ресурсов без измерений на своём оборудовании и корпусе. Не подменяйте документ нейросетевым выводом при объяснении решения пользователю. Помните о правах на доступ к исходным материалам: embedding не является анонимизацией приватного текста. При изменении модели, языка или способа подготовки данных повторите тесты до переключения рабочего трафика.
FAQ
Когда dot равен cosine?
Для ненулевых векторов с единичной нормой.
Какова метрика по умолчанию?
В указанной документации SentenceTransformer — cosine.
Требуется ли переиндексация?
При смене схемы хранения нормализацию старых векторов нужно согласовать.
Официальные источники
Частые вопросы
Когда dot равен cosine?
Для ненулевых векторов с единичной нормой.
Какова метрика по умолчанию?
В указанной документации SentenceTransformer — cosine.
Требуется ли переиндексация?
При смене схемы хранения нормализацию старых векторов нужно согласовать.
Читайте также
Как квантовать embeddings в int8 через SentenceTransformer.encode
Сравниваем тип и размер массива float32/int8, объясняем необходимость калибровки и измерения recall перед заменой хранилища.
Как найти релевантный фрагмент через semantic_search в Sentence Transformers
Кодируем вопрос и документы, связываем corpus_id с текстом, проверяем top_k и строим отказ при отсутствии подходящего источника.
Как найти смысловые дубли вопросов через paraphrase_mining
Ищем пары похожих вопросов, читаем позиции и score, исключаем отрицания и цифры ручной проверкой до объединения записей.
Комментарии
Пока тихо. Скажите первое слово