Qdrant - Vector Database
Named Vectors: Несколько эмбеддингов
У продукта есть фото и описание. У документа - заголовок и текст. Зачем хранить их раздельно? Named vectors позволяют держать всё в одной точке и искать по любой модальности - без дублирования данных.
- **Visual search в e-commerce:** CLIP embeddings для изображений + text embeddings для описаний, поиск по фото или тексту
- **Multilingual документы:** вектор на каждый язык, поиск на любом языке без перевода
- **Медиа-архив:** transcript (Whisper) + audio features + video frames - три вектора, одна точка
Предварительные знания
Зачем несколько векторов на точку
**Named vectors** позволяют хранить несколько векторов в одной точке. Каждый вектор представляет разную модальность или модель: текстовое описание, изображение, аудио, short title, long body - всё в одной точке данных.
**Пример: e-commerce продукт.** У продукта есть название, описание и фото. Без named vectors нужно три отдельные коллекции или три отдельные точки. С named vectors - одна точка с тремя векторами.
| Сценарий | Векторы | Описание |
|---|---|---|
| Multimodal поиск | text + image | Ищите по тексту ИЛИ по изображению в одной коллекции |
| Multilingual поиск | en + ru + de | Каждый язык - своя embedding модель |
| Многоуровневый текст | title + body | title: быстрая small-модель, body: точная large-модель |
| Аудио-видео архив | transcript + audio + frames | Разные модели для разных модальностей |
У вас есть новостные статьи. Хотите искать как по заголовку (быстро, точно), так и по полному тексту (семантически). Как лучше организовать данные?
Настройка коллекции с named vectors
**Создание коллекции с named vectors** - вместо одного объекта vectors передаём словарь, где ключи - имена векторов.
**Важно:** у каждого named vector независимый HNSW индекс. Можно настраивать hnsw_config отдельно для каждого - например, более точный индекс для text, менее точный для вспомогательного image.
**Нельзя добавить новый named vector в существующую коллекцию** без пересоздания. Спроектируйте схему заранее. Если нужно добавить вектор позже - создайте новую коллекцию и перемигрируйте данные.
Вы создали коллекцию с named vector 'text'. Теперь хотите добавить 'image' вектор. Что делать?
Upsert с несколькими векторами
**Upsert с named vectors** - передаём объект вместо массива в поле `vector`. Ключи объекта - имена векторов.
**Частичный upsert:** можно обновить только один вектор, не трогая остальные. Полезно когда изображение продукта изменилось, но текст - нет. Просто не передавайте неизменяемые векторы.
У вас 10 000 продуктов. Генерация text embedding занимает 0.1с, image embedding - 0.5с. Как минимизировать время индексации?
Поиск по named vectors и cross-modal search
**Поиск по конкретному named vector** - указываем `using` параметр. Это выбирает, в каком векторном пространстве искать.
**Cross-modal search** - ищем по одной модальности, получаем результаты с другой. Например: пользователь загружает фото, мы находим продукты и возвращаем их текстовые описания.
**CLIP для true cross-modal:** модели CLIP (ViT-B/32, ViT-L/14) проецируют текст и изображения в ОДНО общее пространство. Это позволяет искать по тексту в image-векторах и наоборот. Обычные text embeddings (OpenAI, BGE) несовместимы с image embeddings.
Пользователь загружает фото собаки и ищет похожих животных в базе. Какой named vector использовать для поиска?
Ключевые идеи
- **Named vectors** - несколько векторов разных размерностей и метрик в одной точке
- **Схема фиксируется при создании** - нельзя добавить vector после создания коллекции
- **Upsert с named vectors** - передать объект `{name1: vec1, name2: vec2}` в поле vector
- **Поиск** - указать `using: 'vector-name'` для выбора пространства
- **Cross-modal search** - возможен только при совместимых пространствах (CLIP)
- Помните hook? Одна точка = весь продукт - без дублирования, с поиском по любой модальности
Что дальше
Named vectors настроены. Теперь - точечная фильтрация результатов через Filter API.
- Filter API — must/should/must_not - фильтровать по category, price, date
- Гибридный поиск — Объединить named dense + sparse через prefetch и RRF
- Группировка результатов — Дедупликация по документу при поиске по чанкам
Вопросы для размышления
- Какие модальности данных в вашем проекте могут выиграть от named vectors?
- Как выбрать, какой named vector использовать по умолчанию для вашего основного сценария поиска?
- Какие trade-offs у хранения image vector в памяти vs на диске при большой коллекции?