Обещанный пост про векторные индексы
✨ Что за зверь такой ваш этот векторный индекс? Ну все просто: есть у вас, допустим, эмбеддинги товаров и вы хотите их где-нибудь хранить. А потом чтоб еще и пробежаться по ним можно было шустро и, например, найти наиболее похожие вектора (товары)
Для таких задач и существует так называемый векторный индекс и очень часто в этом контексте всплывает библиотечка FAISS. Какие же варианты структуры индекса предоставляет эта библиотека и какие еще там есть трюки? Обсудим самые популярные варианты
1⃣ PQ - Product Quantization (фото 1-2)
Позволяет сжать вектора. Метод заключается в том, что каждый вектор разбивается на подвектора, подвектора кластеризуются и формируется новый вектор, состоящий из номеров кластеров.
2⃣ IVF - Inverted File Index (фото 3)
Метод предлагает разбить векторное пространство на кластеры и к каждому кластеру вычислить его "центроиду". Далее сами кластеры будут храниться на диске, а маппинг центроид с кластерами в ОЗУ. Таким образом, когда вы будете искать ближайший вектор, вы сравните его с векторами центроид и для ближайшей центроиды возьмете ее кластер с векторами.
3⃣ NSW / HNSW - Hierarchical Navigable Small World graphs (фото 4)
Можно сказать, SOTA метод приближенного поиска ближайших соседей, основывающийся на жадном обходе графа (по сути, как правило 7 рукопожатий. Как до любого человека можно добраться через 7 рукопожатий, так и до похожего вектора можно добраться через N прыжков по графу, где каждый вектор - это узел)
✨ Прелесть FAISS'a в том, что он позволяет изящно комбинировать все эти подходы для создания оптимальной векторной базы и дальнейших манипуляций с ней (подробнее что происходит с памятью https://habr.com/ru/companies/avito/articles/488658/ )
Рекомендуемые базовые конфигурации:
1млн - 10млн векторов : IVF65535_HNSW32 (Т.е. 65535 центроид и 32 слоя графов)
10млн-100млн векторов : IVF262144_HNSW32
Самостоятельно также советую изучить подходы K-D Tree, LSH и ANNOY
Где это можно применять?
Например, мой коллега Андрей, админ канала @awesome_dl , выпустил свежий пост, где создал бота для Q&A по курсу диффузионных моделей. И чтобы улучшить его планирует добавить механизм памяти, как раз через векторный индекс более чем применим. Очень полезный кейс, обязательно к прочтению. Еще рекомендую два поста про то как разобраться с диффузионными моделями и диффузионными моделями в видеогенерации
😎 Надеюсь, этот пост был полезен и теперь все вектора будут храниться и обрабатываться эффективно
#Ботаем



