Поиск ближайших соседей в проде
Вопрос
Нужно искать 10 похожих товаров по эмбеддингам среди 50 млн товаров за десятки миллисекунд. Как это сделать?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Точный перебор 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 ошибок.