Как эффективно искать похожие эмбеддинги среди миллионов товаров с помощью Faiss или других индексов
Что проверяют
Понимаете ли вы компромисс между точностью, скоростью и памятью в приближённом поиске ближайших соседей и умеете ли выбрать индекс под объём. Следом обычно спрашивают, как измерить качество индекса и как совместить векторный поиск с фильтрами вроде категории и наличия товара.
Как отвечать
Начните с арифметики: 10 млн векторов размерности 768 во float32 занимают около 30 ГБ. Отсюда выбор:
IndexFlatIP/IndexFlatL2: точный перебор. Годится как эталон для замеров и для сотен тысяч векторов, на миллионах упирается в задержку;IndexIVFFlat: векторы делятся наnlistкластеров, поиск идёт только поnprobeближайшим. Требуетtrain()на репрезентативной выборке, аnprobeменяет баланс полноты и скорости прямо при запросе;IndexIVFPQ: то же плюс продуктовое квантование, вектор сжимается до десятков байт. Десятки миллионов векторов помещаются в несколько гигабайт ценой потери точности;IndexHNSWFlat: граф без обучения, высокая полнота при малой задержке, параметрыM,efConstruction,efSearch. Минусы: много памяти и нет удаления.
Удобно собирать через faiss.index_factory, например строкой IVF4096,PQ64. Для косинусной близости векторы нормализуют faiss.normalize_L2 и ищут по скалярному произведению. Свои ID товаров привязывают через IndexIDMap и add_with_ids.
Качество меряют recall@k относительно точного поиска на отложенных запросах, плюс задержка p95/p99 и расход памяти. Рабочая схема: ANN достаёт от 100 до 500 кандидатов, затем их переранжирует точная метрика или модель ранжирования, а бизнес-фильтры применяются к кандидатам. Если фильтров много и каталог часто меняется, векторная база (Qdrant, Milvus, pgvector) может оказаться удобнее голой библиотеки.
Где спотыкаются
Называют IndexFlatL2 быстрым индексом. Это полный перебор: он точный, но время растёт линейно с числом векторов.
Обучают IVF на маленькой или нерепрезентативной выборке. Кластеры получаются перекошенными, и полнота падает при любом nprobe.
Не думают об обновлениях. Товары появляются и исчезают каждый день, а HNSW в Faiss удалять не умеет, значит нужна плановая пересборка индекса или фильтрация удалённых ID.