Qdrant - Vector Database
Метрики расстояния
При создании коллекции виден выбор: Cosine, Dot Product, Euclid, Manhattan. Это решение принимается один раз - изменить метрику потом нельзя без полного переиндексирования. Разберём как не ошибиться.
- **Семантический поиск:** Cosine с OpenAI text-embedding-3 - стандартный и проверенный выбор
- **Рекомендации Netflix/Spotify:** Dot Product - длина вектора кодирует популярность контента
- **Face ID / биометрия:** Euclid (FaceNet) - абсолютное расстояние в embedding пространстве
Предварительные знания
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 |
| Координаты, GPS | Euclid | Физическое пространство |
| Числовые ML-признаки (нормализованные) | Euclid | Абсолютные расстояния важны |
| Рекомендации с весами популярности | Dot Product | Длина вектора = «вес» айтема |
| Bioinformatics, signal processing | Manhattan | Специализированные задачи |
**Быстрая шпаргалка:** Текст + 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? Придумайте гипотетический пример данных.