Обзор векторных БД: индексы, профили и эксплуатация в продакшне

Векторные базы данных стали «рабочей лошадкой» современного семантического поиска и систем с дополненной генерацией. Они хранят и индексируют эмбеддинги — плотные векторы, в которых расстояние отражает смысловую близость объектов. На этих примитивах строятся контуры поиска фактов, рекомендации, дедупликация, кластеризация и, главное, retrieval для RAG-пайплайнов. Краткие основы см. в термине «Векторная база данных» и материале про эмбеддинги; здесь — технический обзор: какие индексы использовать, как их настраивать под объём/затраты/SLA, как строить гибридный поиск и эксплуатацию в проде.

Обзор векторных БД: индексы, профили и эксплуатация в продакшне

Целевая аудитория — инженеры поиска и платформенных решений, которые отвечают за качество извлечения (Recall/NDCG), задержки (P95), экономику ($/1k запросов) и устойчивость индекса при росте коллекций.

Зачем отдельная векторная БД и где её место в архитектуре

Векторная БД решает задачу приближённого поиска ближайших соседей (ANN) по большим коллекциям. «Лобовой» перебор по L2/косинусу даёт точные ответы, но масштабируется плохо: O(N·d). Специализированные индексы сокращают сложность и память ценой небольшой аппроксимации. В архитектуре RAG векторная БД живёт между подсистемой индексации и сборкой контекста, принимая на вход запрос-вектор и возвращая top-k кандидатов с метаданными (источник, язык, ACL, даты). Подробную «сцену действий» см. в RAG-pipeline.

Пара важных причин выделять отдельный слой:

  • Метаданные и фильтры: поиск не только по вектору, но и по языку/дате/разделу/ролям.
  • Эксплуатация: инкрементальные вставки, soft-delete, TTL, реплика/шардирование, бэкапы и аудит кандидатов.
  • Наблюдаемость: Recall@k/NDCG@k, P50/P95, цена/1k запросов — на постоянном мониторинге.

Модель данных: (vector, id, metadata) и договорённости

Минимальный артефакт — тройка (vector, id, metadata).

  • vector: L2-нормированный массив чисел длины *d* (часто 384–1024).
  • id: стабильный идентификатор фрагмента (чанка).
  • metadata: язык (lang), раздел (section), источник (source_id), временные метки (ts, version), права (acl), тип контента.

Договорённости, которые экономят месяцы:

  • Версионирование: хранить embedding_model, index_version и «дату сборки».
  • Нормализация: L2-норма = 1 для стабильного косинуса/dot.
  • Размер чанка: 500–1000 токенов + 10–20% overlap — хороший старт для извлечения фактов.
  • Единая модель эмбеддингов для индекса и запроса.

Метрики расстояния: косинус, L2 и dot-product

Метрика влияет на совместимость с индексами и стабильность ранжирования:

Метрика Плюсы Минусы Где уместна
Косинусная близость Устойчива к масштабу, хорошо работает с L2-нормой Требует нормализации Текстовые эмбеддинги, поиск по смыслу
L2 (евклид) Геометрически интерпретируема Чувствительна к масштабу Кластеризация, индексы с L2
Скалярное произведение (dot) Быстро для MIPS Зависит от нормы Приемлемо с нормализацией

Практика: нормируйте векторы и используйте косинус или dot (с нормой) — так легче переносить профили индексов.

Индексы ANN: как выбрать под объём и SLA

Главный дизайн-выбор — структура индекса. Ниже — «шпаргалка» по профилям.

Индекс Идея Плюсы Минусы Рекомендуемое применение
HNSW (граф «малых миров») Навигация по многоуровневому графу Высокий Recall при малых задержках; инкрементальные вставки Память ↑, требуется тюнинг M/ef Кластеры до десятков млн векторов, акцент на качество
IVF (coarse quantizer) Разбиение на кластеры, поиск в nprobe Скорость на больших N; память ↓ Зависимость от nlist/nprobe Крупные индексы с равномерным распределением
PQ / IVF-PQ Квантование компонент вектора Сжатие ×10–16 и I/O ↓ Потеря точности, калибровка Огромные коллекции при жёстком бюджете RAM
Flat (brute-force) Полный перебор (CPU/SIMD, GPU) Точная метрика, дебаг Медленно при N≫ Малые коллекции, контроль и A/B
Disk-ориентированные (DiskANN/Hybrid) Данные/индекс частично на диске Масштаб «за пределы RAM» Сложность I/O Связка с дешёвым сториджем, холодные шард-пулы

Практический маршрут миграции: Стартуйте с HNSW (быстрый сильный baseline). С ростом объёма/ограничений памяти переходите на IVF-PQ для кратного снижения RAM при умеренной потере точности. Для сверхкрупных архивов добавляйте диск-ориентированные профили.

Параметры индексов: от чего зависит качество и P95

Параметр Что делает Типовые ориентиры Комментарии
Размерность *d* Сколько признаков в векторе 256–1024 Слишком большие *d* ухудшают память/шум
efConstruction (HNSW) Глубина построения графа 100–400 Больше — лучше Recall, дороже по RAM/времени
M (HNSW) Степень вершин 16–48 Баланс ширины графа и памяти
nlist (IVF) Число кластеров 4k–32k Пропорционально объёму данных
nprobe (IVF) Сколько кластеров сканить 8–64 Больше — точнее, но дороже
Кодбуки PQ Глубина/кол-во подпространств 8×8, 16×8 Тюнинг под вашу *d* и бюджет

Всегда держите baseline кривые Recall@k ↔ P95 ↔ цена/1k запросов на своём корпусе.

Гибридный поиск: keyword + вектор + rerank

Векторный поиск устойчив к перефразировкам, но проигрывает на редких терминах и артикулах. Поэтому прод-стек строится как гибрид:

  • Pre-filter keyword/BM25 и метаданные — чтобы отсечь очевидно нерелевантные разделы.
  • ANN-кандидаты — 50–200 документов по вектору.
  • Fusion списков (весовое объединение).
  • Rerank компактной моделью или LLM-судьёй до top-k = 3–8 для подачи в генератор.

Гибрид повышает стабильность и объяснимость; производственные аспекты покрыты в RAG-pipeline.

Метаданные и фильтры: половина успеха в проде

Хорошая схема metadata — такой же «индекс качества», как и ANN.

  • Язык, раздел, свежесть — фильтруйте *до* или *во время* ANN, а не после.
  • ACL — фильтрация прав доступа в индексе, иначе есть риск утечек.
  • Версии и источники — облегчает аудит и регрессионные тесты.
  • Типы фрагментов — текст/таблица/код для профилированного rerank и сборки контекста.

Многоязычные и мультимодальные индексы

Лучший приём — шардирование: отдельные профили для языков и модальностей. Для мультимодальных моделей храните векторы в общем пространстве (текст↔картинка). Если пространства разные — делайте объединение на уровне fusion.

Стоимость и производительность: где живут узкие места

Главные бюджеты: память, I/O и вычисления. Инженерные рычаги:

  • Размерность и нормализация векторов — контролируют RAM и стабильность.
  • Квантование весов/векторов/кэшей — даёт ×2–4 экономию памяти/трафика; детали в «Квантовании».
  • Batch-запросы и SIMD/GPU для Flat и rerank.
  • Кэш кандидатов и результатов top-k.
  • Сетевые задержки — держите индекс ближе к генератору; P95 часто «съедается» сетью.

Масштабирование и отказоустойчивость

  • Шардирование по доменам/языкам/версиям; маршрутизация запроса к профилю.
  • Репликация чтения для трафика и экспериментов.
  • UPSERT/soft-delete/TTL — операции жизненного цикла фрагментов.
  • Миграции эмбеддингов — период двойного индекса (старый+новый) и атомарное переключение.
  • Бэкапы — снимки индексов и payload; проверка восстановления в регламенте.
  • Наблюдаемость — трассировки, логи кандидатов, версии конфигов.

Качество поиска: офлайн и онлайн-оценка

Этап Метрики Цель/примечания
ANN (кандидаты) Recall@k, MRR Найти «правильные» фрагменты без rerank
Ранжирование NDCG@k Порядок кандидатов по полезности
Сквозной RAG Faithfulness, Citation@k Верность источникам в ответах
Производство P50/P95, цена/1k запросов SLA и экономика

Держите golden-наборы из реального трафика и A/B-тесты на сквозном сценарии. Чисто офлайн-метрики легко «перетюнить».

Профили выбора индекса: экспресс-решения под объём

Объём коллекции RAM SLA Индекс Комментарии
≤ 1 млн векторов Не ограничена Ригорозный Recall HNSW Простой тюнинг, быстрый rollout
1–50 млн Средняя Баланс IVF / IVF-HNSW Тонкая настройка nlist/nprobe
50 млн+ Жёсткие лимиты «Приемлемый» Recall IVF-PQ ×10–16 экономия памяти
100 млн+ и архив Ограничена Высокий P95 Диск-ориентированные Профили с I/O и кэшем

Таблица: эффекты параметров и практические ориентиры

Рычаг Влияние на Recall Влияние на P95 Цена
ef (HNSW, запрос) ↑ ↑ CPU/RAM
nprobe (IVF) ↑ ↑ сканируемых кластеров
PQ: кодбуки глубже ↑ память кодбуков
d (размерность) ↓ ↓/≈ ↓ RAM/IO
Квантование векторов ↓ умеренно ↓ RAM/IO значительно

Ориентируйтесь на собственные кривые компромисса — они сильно зависят от корпуса и задач.

Инженерные паттерны и анти-паттерны

Делайте так

  • Гибрид первым делом: pre-filter keyword+метаданные → ANN → fusion → rerank.
  • Отдельные шарды на языки/домены; общий API маршрутизации.
  • Версионирование эмбеддингов и индексов, журналы кандидатов.
  • Малое top-k (3–8) для сквозного RAG; сжатие выдержек вместо «простыней».
  • Нормализация векторов и фиксированная модель эмбеддингов для индекса и запроса.

Избегайте

  • «Вектор — и точка»: без keyword/метаданных редкие термины теряются.
  • Гигантских чанков: падает точность извлечения.
  • Единых глобальных шкал для квантования: используйте per-channel/group-wise (см. квантование).
  • Отсутствия трассировок: без логов кандидатов невозможно разбирать инциденты.

Чек-лист запуска векторной БД

  • Определите сценарий: семантический поиск, RAG, рекомендации.
  • Согласуйте метрики: Recall@k, NDCG@k, P95, цена/1k запросов.
  • Выберите модель эмбеддингов и *d*; включите L2-норму.
  • Настройте индекс (HNSW/IVF/IVF-PQ) и baseline-кривые.
  • Включите гибрид (keyword/метаданные/fusion) и rerank.
  • Введите наблюдаемость и версии: trace-id, журналы кандидатов, конфиги.
  • Продумайте миграции эмбеддингов: двойной индекс, атомарное переключение.
  • Оптимизируйте стоимость: кэш, батч, квантование векторов и кэшей.
  • Задокументируйте инциденты и откаты.

Часто задаваемые вопросы (FAQ)

Можно ли обойтись без HNSW и сразу идти в IVF-PQ? Да, если у вас сразу большой объём и жёсткие ограничения по памяти. Но без baseline на HNSW сложнее понимать «цену» компромисса.

Нужен ли GPU для векторной БД? Не всегда. CPU+SIMD закрывают много профилей. GPU полезен для Flat/переранжирования или когда вы делаете много параллельных запросов. Главный лимит — память и сеть.

Сколько внутренних ссылок/цитат отдавать в RAG? Обычно 3–8 фрагментов (top-k), но сжатых до фактов. Большие списки увеличивают стоимость и ухудшают ответ.

Что выбрать: косинус или L2? При L2-норме косинус стабилен и хорошо переносится между реализациями. L2 удобен для некоторых индексов и кластеризации.

Как понять, что индекс «устал»? Растут P95 и падает Recall@k/NDCG@k без изменения корпуса. Проверьте размеры шарда, кэш/сеть, обновите параметры ef/nprobe, пересоберите индекс.

Как квантование векторов влияет на качество? INT8-представления обычно дают умеренную потерю Recall@k; выигрыш в памяти/IO часто окупает компромисс. Подробности — в статье о квантовании.

Словарь терминов

  • ANN (Approximate Nearest Neighbors) — приближённый поиск ближайших соседей.
  • HNSW/IVF/PQ — семейства индексов и квантования для ускорения и сжатия.
  • Recall@k/NDCG@k — полнота извлечения и качество ранжирования.
  • Fusion — слияние списков результатов keyword и ANN.
  • Rerank — доранжирование компактной моделью/LLM.
  • ACL — контроль доступа на уровне индекса.
  • Chunking — разбиение документов на фрагменты.
  • P50/P95 — медиана/95-й перцентиль задержки.
  • IVF-PQ — инвертированный файл с квантованием по подпространствам.

См. также

Task Runner