Ответ вслух Middle kNN и SVM обновлено

Поиск ближайших соседей в проде

Вопрос

Нужно искать 10 похожих товаров по эмбеддингам среди 50 млн товаров за десятки миллисекунд. Как это сделать?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Точный перебор 50 млн векторов размерности 256 на каждый запрос это десятки миллиардов операций, в латентность не влезет. Использую приближённый поиск ближайших соседей.

Что должно прозвучать в ответе

  • Точный перебор O(n·d) слишком дорог

  • Приближённый поиск: HNSW, IVF, product quantization

  • Компромисс recall и скорости, параметры индекса (ef, nprobe)

  • Нормировка векторов и косинус через скалярное произведение

  • Инструменты: Faiss, векторные БД, обновление индекса и фильтры

Что могут спросить следом

  • Как измерить качество приближённого поиска?
  • Как быть с фильтрами вроде «только в наличии»?

Разбор

Точный перебор 50 млн векторов размерности 256 на каждый запрос это десятки миллиардов операций, в латентность не влезет. Использую приближённый поиск ближайших соседей. HNSW строит многоуровневый граф близости и даёт отличный recall при малой задержке, но ест память. IVF делит пространство на кластеры и ищет только в нескольких ближайших, а product quantization сжимает векторы, чтобы всё влезло в память. Векторы нормирую, тогда косинус равен скалярному произведению. Параметры индекса (ef_search для HNSW, nprobe для IVF) задают компромисс между recall и скоростью, его меряю как recall@10 относительно точного поиска на выборке запросов. Технически это Faiss или векторная база вроде Qdrant или Milvus. Отдельно продумываю обновление индекса при появлении товаров и фильтры по наличию: фильтровать до поиска или брать больше кандидатов и фильтровать после.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме