Что это такое
Faiss — библиотека для поиска похожих плотных векторов и кластеризации. Она разработана преимущественно в исследовательской группе Meta FAIR и написана на C++ с полноценными обертками для Python и NumPy.
Проект нужен там, где объект представлен числовым вектором: текст, изображение, аудио, пользовательский профиль или товар. Поиск становится задачей: найти в большом наборе векторы, ближайшие к запросу.
Faiss поддерживает разные методы поиска, включая варианты для очень больших наборов, которые не помещаются целиком в оперативную память. Часть полезных алгоритмов реализована для GPU.
Что внутри
Базовая модель Faiss проста: каждому вектору соответствует целочисленный идентификатор, а близость измеряется L2-расстоянием или скалярным произведением. Косинусная близость тоже поддерживается через нормализованные векторы.
Внутри есть точные индексы, приближенные индексы, квантование, сжатые представления, средства оценки и настройки параметров. Это не только функция `search`, а целый набор инженерных компромиссов между скоростью, памятью и точностью.
Python-слой делает библиотеку удобной для экспериментов, а C++-ядро важно для производительности. Поэтому Faiss часто встречается и в исследовательских прототипах, и в производительных поисковых системах.
Как используют
Типичный сценарий начинается с эмбеддингов: модель превращает документы или объекты в векторы, затем Faiss строит индекс и быстро возвращает ближайшие элементы для нового запроса.
В небольшом проекте можно использовать точный индекс и получить понятное поведение. В большом наборе чаще выбирают приближенный поиск, чтобы сэкономить память и время ответа.
Ограничение Faiss в том, что он не решает весь поиск целиком. Нужно отдельно получать качественные векторы, хранить исходные документы, обновлять индекс и проверять качество ответов на реальных запросах.
Минимальный поиск
Пример показывает базовую механику: создать индекс по размерности, добавить векторы и найти ближайшие элементы для запроса.
Сильные стороны и ограничения
Сильная сторона Faiss — зрелый набор индексов и высокая скорость. Библиотека дает инженеру контроль над точностью, памятью и временем ответа.
Слабое место — сложность настройки. Неправильно выбранный индекс может быть либо слишком медленным, либо слишком неточным, поэтому нужны измерения на своих данных.
Faiss подойдет для семантического поиска, рекомендаций, поиска дублей, кластеризации и мультимедийных коллекций. Если данных мало, иногда достаточно простого перебора или возможностей базы данных.
Пример
Поиск ближайших векторов
Пример использует точный L2-индекс: он прост для проверки идеи, хотя для больших наборов часто выбирают другие индексы.
import faiss
import numpy as np
vectors = np.random.random((1000, 128)).astype("float32")
queries = np.random.random((3, 128)).astype("float32")
index = faiss.IndexFlatL2(128)
index.add(vectors)
distances, ids = index.search(queries, 5)
print(ids)