Зачем нужна векторная база данных

Почему обычной таблицы мало и зачем понадобился отдельный класс баз данных.

Векторная база данных — хранилище, специально заточенное под хранение эмбеддингов и быстрый поиск ближайших к запросу векторов.

Задача поиска ближайших соседей

В RAG на каждый запрос нужно найти несколько чанков, чьи векторы ближе всего к вектору вопроса. Это задача k ближайших соседей (k-NN). Со ста чанками её решает обычный цикл. С миллионами — уже нет.

Почему полный перебор не масштабируется

Наивный поиск сравнивает запрос с каждым вектором в базе. Сложность линейная: O(N·d), где N — число чанков, d — размерность. Прикинем, во что это выливается.

def comparisons(num_vectors, dim):
    # примерно столько умножений на один запрос при полном переборе
    return num_vectors * dim

for n in (1_000, 1_000_000, 100_000_000):
    ops = comparisons(n, dim=768)
    print(f"{n:>12,} векторов -> {ops:>18,} операций/запрос")

Вывод:

       1,000 векторов ->            768,000 операций/запрос
   1,000,000 векторов ->        768,000,000 операций/запрос
 100,000,000 векторов ->     76,800,000,000 операций/запрос

На большой базе полный перебор — это десятки миллиардов операций на каждый вопрос пользователя. Слишком медленно и дорого. Нужен индекс, который ищет приближённо, но за доли миллисекунды.

Память — это ещё не всё

Можно возразить: подержим все векторы в обычном списке в памяти и переберём циклом. Для прототипа на тысячах чанков так и делают — это нормально. Но в проде появляются требования, которых простой список не закрывает: данные не должны теряться при перезапуске, векторы постоянно добавляются и удаляются, поиск должен идти параллельно для сотен пользователей, а к близости нужно примешивать фильтры по метаданным. Именно ради этого набора требований и выделился отдельный класс систем — векторные базы данных. Они берут на себя и хранение на диске, и индексацию, и конкурентный доступ.

Что умеет векторная БД

  • Хранит векторы вместе с метаданными (id документа, текст чанка, теги).
  • Индексирует их структурой для быстрого приближённого поиска (ANN).
  • Ищет top-k ближайших за миллисекунды даже на миллионах записей.
  • Фильтрует по метаданным (например, только документы за 2024 год).
  • Обновляется: добавление/удаление векторов без полной перестройки.

Векторная БД vs обычная

Обычная БДВекторная БД
точное совпадение, WHERE по полямблизость по смыслу, поиск ближайших
индекс B-tree по значениямANN-индекс (HNSW, IVF) по векторам
«найди строку с id=5»«найди 5 самых похожих по смыслу»

Итог

  • RAG-поиск — это задача k ближайших соседей в пространстве эмбеддингов.
  • Полный перебор линеен по N и не тянет миллионы векторов.
  • Векторная БД хранит, индексирует и быстро ищет ближайших + фильтрует по метаданным.
Проверьте себя
1. Какую задачу решает векторная база данных в RAG?
AХранит SQL-таблицы пользователей
BБыстро находит ближайшие по смыслу векторы (k-NN)
CКомпилирует модель эмбеддингов
DПереводит текст между языками
2. Почему полный перебор плохо масштабируется?
AОн требует GPU
BЕго сложность линейна по числу векторов — на миллионах слишком медленно
CОн не умеет считать косинус
DОн работает только с целыми числами
3. Чем поиск в векторной БД отличается от запроса в обычной реляционной БД?
AНичем, это синонимы
BВекторная БД ищет близость по смыслу, а не точное совпадение значений
CВекторная БД не хранит данные на диске
DОбычная БД быстрее ищет ближайших соседей
Поддержать проект