К содержимому
MoranaLabs
Поиск / AI-инфраструктура — 09 июн. 2026 г.

Семантический поиск по миллиардам векторов с p99 в единицы мс 

На миллиардах векторов recall, задержка и память образуют треугольник, из которого нельзя взять все три угла сразу. Считаем на пальцах: сырой индекс на 3,4 млрд векторов занял бы больше десяти терабайт оперативки — с этой арифметики и начинается проект.

3,4 млрд
векторов в индексе
6 мс
p99 поиска
96 %
recall@10
стенд · запускается здесь

Стенд: память, точность и хвост — одна поверхность

Три числа, которые продают по отдельности, связаны жестко. Двигайте размер базы, глубину обхода и представление вектора — два других поедут сами.

НИЖНЯЯ ГРАНИЦА ВЫДАЧИ 95 %обход 32обход 384100 %75 %
recall@10 p99 поиска: от 1,9 до 15,5 мс
1 147 байт на вектор: 768 измерений по 1 Б плюс 256 Б ссылок графа плюс накладные структуры
представление вектора

скалярное квантование

95,9 %
recall@10: доля верных соседей в выдаче
3 632 ГБ
памяти под индекс · 38 шардов по 96 ГБ
6,10 мс
p99 поиска при бюджете 8 мс
875
запросов в секунду с одного шарда
Сжатие вектора до int8 экономит 75 % памяти и стоит 1,2 % recall; PQ экономит вчетверо больше и стоит 5,5 %. Потерянное возвращается глубиной обхода — но уже за счет хвоста. Бесплатной ручки на этой поверхности нет.

Размер базы и бюджет памяти узла синтетические, порядок — поисковый индекс миллиардного масштаба. Формулы памяти графа и роста recall — настоящие.

Арифметика, с которой начинается проект

Прежде чем выбирать библиотеку индекса, полезно посчитать на салфетке. Пусть эмбеддинг — 768 чисел одинарной точности, это 3 килобайта на вектор. Умножаем на 3,4 миллиарда и получаем больше десяти терабайт только на сырые векторы, без служебных структур индекса.

Такой объем в оперативной памяти — это стойка серверов под задачу, которая должна отвечать за миллисекунды. Отсюда первый и главный вывод: проект не про выбор алгоритма поиска, а про сжатие представления. При сжатии вектора до десятков байт тот же индекс укладывается в сотни гигабайт, и разговор из области фантастики переходит в область бюджета.

Треугольник, из которого не выбраться

ХотимЧем платим
Выше recallБольше кандидатов на проверку, выше задержка; либо слабее сжатие, больше памяти
Ниже задержкаМеньше кандидатов, ниже recall; либо больше реплик, выше стоимость
Меньше памятиАгрессивнее сжатие, ниже точность расстояний, ниже recall

Никакая библиотека этот треугольник не отменяет. Работа инженера — выбрать точку в нем осознанно и вместе с заказчиком, а не унаследовать ее от настроек по умолчанию.

Наша точка: 96% recall@10 при 6 мс на девяносто девятом перцентиле. Оставшиеся четыре процента — это случаи, когда один из десяти выданных документов не входит в идеальную десятку полного перебора. Для рекомендаций и подсказок это незаметно, для юридического поиска — неприемлемо, и такие задачи мы бы считали иначе.

Как вообще узнать свой recall

Recall нельзя измерить приближенно тем же приближенным методом. Нужен эталон: на случайной выборке запросов честно считается полный перебор по всей базе. Медленно, дорого, зато это истина, с которой сравнивается быстрый индекс.

Эталон пересчитывается регулярно, потому что база меняется. Проект, где recall измерили один раз на старте и вписали в презентацию, через полгода живет с цифрой, не имеющей отношения к реальности.

Хвост задержки живет в шардах

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

Что помогло:

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

Индекс, который обновляется на ходу

Данные приходят непрерывно, а перестроение индекса на миллиардах векторов — это часы. Останавливать поиск нельзя.

Поэтому индекс разделен на две части: большой основной, перестраиваемый по расписанию, и небольшой свежий, куда попадают новые векторы и который перестраивается быстро. Запрос идет в обе части, результаты сливаются. Периодически свежий слой вливается в основной. Удаления обрабатываются отметками, физически вычищаются при перестроении.

Схема известная и скучная. Ее главный враг — рост свежего слоя: если он раздувается быстрее, чем успевает вливаться, задержка ползет вверх. За этим следит отдельный сигнал мониторинга.

Фильтры ломают геометрию поиска

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

Мы разложили частые фильтры в структуру индекса: узкие и стабильные признаки стали отдельными разделами индекса, редкие остались постфильтрацией с автоматическим расширением числа кандидатов. Правило простое: если фильтр отсекает больше девяноста процентов базы, он обязан работать до поиска, иначе задержка и recall уезжают одновременно.

Что мы советуем считать до старта

  1. Размерность вектора и число объектов — прямо в терабайты, до всяких библиотек.
  2. Требуемый recall, названный бизнесом в терминах его задачи, а не в процентах ради процентов.
  3. Бюджет задержки для конечного пользователя, из которого поиску достается лишь часть.
  4. Темп поступления новых данных и допустимую задержку их появления в поиске.

Четыре числа определяют архитектуру и стоимость. Все остальное — детали реализации.

Направление целиком — векторный поиск; типичный потребитель такого индекса — локальный RAG; эксплуатация под нагрузкой — MLOps.

3,4 млрд
векторов в распределенном индексе
  • vector search
  • ANN
  • distributed
  • inference opt
  • RAG
заказчик

Поиск / AI-инфраструктура · детали под NDA

СтендПроверить расчет руками ↑

Те же цифры, но с ручками: порог, нагрузка, объем.

НаправлениеСемантический поиск и векторные базы

Что мы делаем в этом направлении и сколько это стоит.

Комментарий инженера

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

Опишите задачу  ответим как инженеры. 

Оставьте имя и Telegram — остальное обсудим. Без брифов на 40 слайдов и звонков по три раза.

Отвечаем за пару часовотвечает инженер, а не отдел продажNDA до передачи данных

Любой один канал — куда удобнее, туда и ответим

Или сразу написать в Telegram

Без спама и звонков-роботов. Нажимая кнопку, вы соглашаетесь с политикой конфиденциальности и обработкой персональных данных.