Гайд · TNWS AI

Как выбрать cosine или dot для нормализованных embeddings в Sentence Transformers

5 мин—

Проверяем единичную норму, сопоставляем две метрики и понимаем, когда 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; в этом окружении сами веса не загружались. При обновлении модели или зависимости сначала повторите контрольный пример.

Нумерованная инструкция

  1. Выберите одну и ту же модель для вопроса и корпуса.
  2. Получите векторы с normalize_embeddings=True.
  3. Для одной пары посчитайте cosine и dot, сравните их численно с разумным допуском.
  4. Повторите вычисление на ненормализованных векторах.
  5. Перед сменой метрики индекса проверьте ранжирование и качество на размеченном наборе.

Подготовьте изолированное окружение и установите зафиксированный пакет: 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.

Требуется ли переиндексация?

При смене схемы хранения нормализацию старых векторов нужно согласовать.

Читайте также

Комментарии

Пока тихо. Скажите первое слово