Qdrant - Vector Database

Метрики расстояния

При создании коллекции виден выбор: Cosine, Dot Product, Euclid, Manhattan. Это решение принимается один раз - изменить метрику потом нельзя без полного переиндексирования. Разберём как не ошибиться.

  • **Семантический поиск:** Cosine с OpenAI text-embedding-3 - стандартный и проверенный выбор
  • **Рекомендации Netflix/Spotify:** Dot Product - длина вектора кодирует популярность контента
  • **Face ID / биометрия:** Euclid (FaceNet) - абсолютное расстояние в embedding пространстве

Предварительные знания

  • First Search: Search API

Cosine Similarity: угол важнее длины

**Cosine similarity** - угол между двумя векторами в многомерном пространстве. Формула: `cos(a, b) = (a · b) / (|a| × |b|)`. Результат от -1 до 1, где 1 = одно направление (похожи), 0 = перпендикулярны (несвязаны), -1 = противоположные.

**Большинство embedding-моделей оптимизированы под Cosine.** OpenAI (text-embedding-3-*), Cohere, Sentence Transformers, BGE - все они обучались с Cosine similarity loss. Это дефолтный выбор для текстовых задач.

Два документа: первый 'Кошки - домашние животные' (короткий), второй 'Кошки - домашние животные, они умны, игривы и независимы' (длинный). Их embedding векторы имеют одинаковое направление, но разную длину. Какая метрика правильно определит их как похожие?

Dot Product: когда важен масштаб

**Dot Product (скалярное произведение):** `a · b = Σ(aᵢ × bᵢ)`. В отличие от Cosine, **учитывает длину векторов**. Вектор большей длины «сильнее» влияет на результат. Это нужно когда длина вектора несёт смысловую нагрузку.

Задача: рекомендательная система. Длина embedding вектора товара отражает его рейтинг. Нужно чтобы популярные товары ранжировались выше при похожем направлении. Какую метрику выбрать?

Euclid и Manhattan: геометрическое расстояние

**Euclidean distance (L2)** - «прямая линия» в многомерном пространстве: `√Σ(aᵢ - bᵢ)²`. Чем меньше - тем похожее. Используется когда важно абсолютное расстояние между точками, а не только их направление.

**Для Euclid и Manhattan score_threshold работает наоборот:** меньше = лучше, поэтому qdrant вернёт точки с score НИЖЕ threshold. При Cosine threshold 0.75 = «достаточно похоже», для Euclid это совсем другое число - зависит от масштаба данных.

Задача: найти пользователей с похожими числовыми профилями [возраст, доход, активность_дней, средний_чек]. Числа нормализованы через StandardScaler. Какая метрика подходит лучше?

Как выбрать метрику: практическое руководство

**Главное правило:** используйте ту метрику, с которой обучалась embedding-модель. Модели явно указывают в документации рекомендуемую метрику - всегда проверяйте её.

Задача / МодельМетрикаПочему
OpenAI text-embedding-3-*Cosine или DotВекторы нормализованы (|v|=1), оба идентичны
Sentence Transformers (all-MiniLM, bge-m3)CosineОбучены с Cosine loss
ColBERT, SPLADE (sparse)Dot ProductЯвно требуют Dot Product
FaceNet, ArcFace (лица)EuclidОбучены с L2 loss
Координаты, GPSEuclidФизическое пространство
Числовые ML-признаки (нормализованные)EuclidАбсолютные расстояния важны
Рекомендации с весами популярностиDot ProductДлина вектора = «вес» айтема
Bioinformatics, signal processingManhattanСпециализированные задачи

**Быстрая шпаргалка:** Текст + NLP → **Cosine**. Рекомендации с весами → **Dot Product**. Числовые данные / изображения (FaceNet) → **Euclid**. Manhattan - экзотика, нужна редко. Если модель нормализует векторы - Cosine и Dot дают одинаковый ранкинг.

«Буду использовать Cosine - это стандарт и всегда правильно»

Метрика зависит от модели. Для ColBERT/SPLADE нужен Dot Product. Для FaceNet - Euclid. Для числовых данных - Euclid. Cosine - хороший дефолт только для текстовых NLP моделей.

Метрика - часть обучения модели. Авторы ColBERT обучали модель с Dot Product loss. Использование Cosine даст другой (хуже!) ранкинг, потому что вектора не нормализованы и длина несёт семантику

Используется модель Nomic Embed Text v1.5. Документация говорит: 'matryoshka embeddings with Cosine similarity'. Коллекция создана с distance: 'Dot'. Что произойдёт?

Ключевые идеи

  • **Cosine:** угол между векторами, не зависит от длины. Дефолт для текстовых NLP моделей. Score: 1=идентично, -1=противоположно
  • **Dot Product:** учитывает длину вектора. Идентичен Cosine если |v|=1. Нужен для ColBERT/SPLADE и рекомендаций с весами
  • **Euclid (L2):** геометрическое расстояние. Для координат, числовых данных, FaceNet. Меньше score = ближе
  • **Manhattan (L1):** сумма абсолютных разностей. Редко нужен, специализированные задачи
  • **Главное правило:** читайте документацию модели. Метрика задаётся при создании коллекции и не меняется

Что дальше

Метрика определяет как сравниваются векторы. Следующий уровень - payload-индексы для быстрой фильтрации по метаданным.

  • Payload индексы — Быстрая фильтрация по категориям, датам, геолокации - работает совместно с метриками
  • Sparse Vectors: BM42 и SPLADE — SPLADE использует Dot Product - теперь понятно почему
  • HNSW: Как работает индекс — Метрика определяет как HNSW строит граф связей

Вопросы для размышления

  • Если модель нормализует векторы (|v|=1), почему документация всё равно указывает конкретную метрику? Есть ли разница между Cosine и Dot в этом случае?
  • Коллекция создана с Cosine, а нужна Euclid. Какие варианты действий есть?
  • В каком случае Manhattan дала бы лучший recall чем Euclid? Придумайте гипотетический пример данных.

Связанные уроки

  • la-02-dot-product
Метрики расстояния

0

1

Войти