Настройка Facebook AI Similarity Search (FAISS)
Привет, технические энтузиасты! Сегодня мы отправляемся в путешествие, чтобы изучить инструмент, который наделал много шума в искусственном интеллекте: поиска сходства (FAISS) от Facebook AI. Предположим, вы задавались вопросом, как Spotify находит песни, которые жутковато похожи на ваши любимые, или как Google Photos удается группировать фотографии одного и того же человека. В таком случае вы вот-вот раскроете эту тайну.
Поиск сходства, или поиск ближайшего соседа, — это важнейший аспект многих приложений ИИ и машинного обучения. Суть в том, чтобы находить точки данных, наиболее похожие на заданную точку запроса. Например, когда вы ищете песню в Spotify, системе нужно найти песни, наиболее «похожие» на ваш поисковый запрос, — отсюда и поиск сходства.
Как бы впечатляюще ни звучал этот эффективный поиск сходства, есть один нюанс. Традиционные методы поиска сходства могут становиться ужасно медленными при больших объемах данных. Именно здесь на сцену выходит FAISS и устраняет ограничения традиционных поисковых систем запросов. Это библиотека для эффективного поиска сходства, разработанная Facebook AI, которая предоставляет надежные решения для задач поиска сходства, особенно при работе с крупномасштабными данными.
Но хватит болтовни! Эта статья в блоге проведет вас через настройку FAISS, запуск и демонстрацию его возможностей с помощью примера программы поиска сходства. Так что пристегните ремни, потому что мы собираемся глубоко погрузиться в увлекательный мир эффективного поиска сходства с FAISS. Будет весело!
Понимание FAISS (Facebook AI Similarity Search)
Теперь, когда мы разожгли аппетит кратким введением, давайте глубже разберемся в FAISS. FAISS, или Facebook AI Similarity Search, — это библиотека алгоритмов для поиска сходства векторов и кластеризации плотных векторов. Это детище команды Facebook AI, которая спроектировала ее для эффективной работы с большими базами данных.
FAISS в основном работает на концепции «векторного сходства». Говоря простыми словами, векторы — это по сути список чисел, а сходство означает, насколько похожи два вектора. Представьте, что вы пытаетесь найти песню, которая соответствует настроению вашей текущей любимой композиции. Векторы могут представлять обе песни, при этом разные элементы похожих векторов представляют разные характеристики песен. Вы можете сравнить «сходство» между этими песнями, сравнив расстояние между их векторами в многомерном пространстве. Евклидово расстояние играет ключевую роль в измерении этого сходства между векторами.
Вот где FAISS демонстрирует свою мощь. Он предоставляет способ быстро и точно сравнивать миллионы или даже миллиарды этих векторов. Это как иметь сверхмощную поисковую систему, которая может в мгновение ока просканировать огромную музыкальную библиотеку, точно определив песни, наиболее похожие на вашу любимую. Индексированные векторы необходимы в этом процессе, поскольку они позволяют системе эффективно искать ближайшие совпадения для заданного вектора запроса.
Но магия FAISS не ограничивается музыкальными рекомендациями. FAISS используется во многих приложениях — от распознавания изображений и поиска текста до кластеризации и анализа данных. Всякий раз, когда у вас есть большой объем данных и вам нужно быстро находить похожие элементы, FAISS может стать вашим основным инструментом.
Настройка FAISS
Этот раздел поможет вам настроить FAISS в системе Linux.
Установка Conda
Перед установкой FAISS вам необходимо установить Conda в вашей системе. Conda — это система управления пакетами и средами с открытым исходным кодом, которая работает на Windows, macOS и Linux.
Выполните следующие шаги, чтобы установить Conda в системе Linux:
Загрузите установщик Miniconda для Linux с официального сайта.
Проверьте хэши вашего установщика.
Откройте окно терминала и выполните следующую команду, чтобы начать установку:
bash Miniconda3-latest-Linux-x86_64.sh
Когда установщик запустится, он задаст вам несколько вопросов. Если вы в чём-то не уверены, выбирайте параметры по умолчанию. Вы всегда сможете изменить настройки позже.
После завершения установки закройте окно терминала и откройте его снова. Это гарантирует, что внесённые вами изменения будут активированы.
Теперь нужно проверить, правильно ли всё установлено. Для этого введите conda list в окне терминала или Anaconda Prompt и нажмите Enter. Если всё работает правильно, вы увидите список установленных пакетов.
Установка FAISS
Вы можете установить FAISS через Conda. Пакет FAISS имеет две версии: версию только для CPU (faiss-cpu) и версию, включающую индексы как для CPU, так и для GPU (faiss-gpu). В зависимости от ваших потребностей вы можете установить любую из этих версий.
Рекомендуемый способ установки FAISS — через канал PyTorch Conda. Ниже приведены команды для установки последнего стабильного выпуска FAISS.
Для версии CPU:
conda install -c pytorch faiss-cpu
Для версии GPU:
conda install -c pytorch faiss-gpu
Кроме того, FAISS упакован conda-forge — управляемой сообществом экосистемой упаковки для Conda. Вы можете установить FAISS из conda-forge с помощью следующих команд. Для версии только для CPU:
conda install -c conda-forge faiss-cpu
Для версии GPU:
conda install -c conda-forge faiss-gpu
Пошаговый разбор примера кода с использованием SQuAD
Вы можете проверить, из какого канала поступают ваши пакеты Conda, с помощью команды conda list.
Давайте используем Stanford Question Answering Dataset (SQuAD) для этой демонстрации. SQuAD — популярный набор данных для обработки естественного языка (NLP) и отличный способ показать, как работает FAISS. Этот набор данных содержит пары вопрос-ответ, где ответ на каждый вопрос представляет собой фрагмент текста, или «span», из соответствующего текста для чтения. В процессе поиска векторы запросов используются для нахождения наиболее релевантных ответов путём сравнения их с набором данных.
Прежде чем перейти к коду, давайте сначала загрузим и подготовим набор данных SQuAD:
Загрузите набор данных SQuAD: Вы можете загрузить набор данных с сайта SQuAD. Для простоты мы будем использовать SQuAD 1.1. Вы можете загрузить набор данных по следующей ссылке: SQuAD 1.1 Train. Загрузите и сохраните JSON-файл (train-v1.1.json) в вашем рабочем каталоге.
Прочитайте JSON-файл: Теперь вы можете использовать библиотеку Python JSON для загрузки данных:
with open('train-v1.1.json', 'r') as file: squad_data = json.load(file)
Числовые векторы необходимы в индексе FAISS, поскольку они позволяют эффективно измерять расстояния и выполнять запросы внутри IndexFlatL2.
Импорт необходимых библиотек
Первый шаг — импортировать все необходимые библиотеки. Нам понадобится numpy для числовых операций, Faiss для поиска по сходству векторов, JSON для загрузки нашего набора данных и nltk для токенизации нашего текста.
import numpy as np
import faiss
import json
from nltk.tokenize import word_tokenize
Загрузка и предварительная обработка данных
Давайте загрузим набор данных SQuAD. Это JSON-файл, поэтому мы можем использовать функцию load модуля JSON.
with open('train-v1.1.json', 'r') as file:
squad_data = json.load(file)
Предположим, что объект JSON является словарём, содержащим ключ data и список словарей. Каждый словарь в списке представляет статью, содержащую ключ paragraph со списком абзацев.
Теперь предварительно обработаем данные. Мы токенизируем каждый абзац с помощью функции word_tokenize из nltk, которая разбивает предложение на отдельные слова. Затем мы представим каждое слово в виде one-hot закодированного вектора.
vocabulary = set(word for article in squad_data['data'] for paragraph in article['paragraphs'] for word in word_tokenize(paragraph['context']))
word_to_index = {word: index for index, word in enumerate(vocabulary)}
def convert_text_to_vector(text):
words = word_tokenize(text)
bow_vector = np.zeros(len(vocabulary))
for word in words:
word in word_to_index:
bow_vector[word_to_index[word]] = 1
return bow_vector
paragraph_vectors = [convert_text_to_vector(paragraph['context']) for article in squad_data['data'] for paragraph in article['paragraphs']]
Создание индекса
Теперь, когда наши данные представлены в правильном формате, мы можем создать наш индекс FAISS. Мы будем использовать тип индекса IndexFlatL2, базовый индекс расстояния L2.
dimension = len(vocabulary)
index = faiss.IndexFlatL2(dimension)
# Преобразуем наш список массивов NumPy в один двумерный массив
paragraph_vectors = np.stack(paragraph_vectors).astype('float32')
index.add(paragraph_vectors)
Тип IndexFlatL2 требует, чтобы мы указали размерность наших данных. Поскольку каждый из наших векторов закодирован one-hot-кодированием, размерность равна размеру нашего словаря.
Затем мы добавляем наши данные в индекс с помощью метода add, которому требуется двумерный массив NumPy.
Выполнение векторного поиска FAISS
Когда наш индекс полностью настроен, мы можем сыграть в детектива и найти в нашем наборе данных абзацы, которые наиболее близко соответствуют нашему поисковому запросу.
Вот наша функция поиска:
def search_for_paragraphs(search_term, num_results):
search_vector = convert_text_to_vector(search_term)
search_vector = np.array([search_vector]).astype('float32')
distances, indexes = index.search(search_vector, num_results)
for i, (distance, index) in enumerate(zip(distances[0], indexes[0])):
print(f"Result {i+1}, Distance: {distance}")
print(squad_data['data'][index]['paragraphs'][0]['context'])
print()
Наш поисковый запрос — "What is the capital of France?", и мы хотим найти 5 результатов:
search_term = "What is the capital of France?"
search_for_paragraphs(search_term, 5)
search_for_paragraphs() сначала преобразует наш поисковый запрос в закодированный вектор. Затем мы используем это векторное представление как метод поиска в нашем индексе. Для этого нужен двумерный массив, поэтому мы добавляем дополнительную размерность к нашему поисковому вектору.
Метод поиска по сходству также требует указать, сколько результатов мы хотим получить (для этого используется num_results). Метод search возвращает нам два двумерных массива: один для расстояний ближайших результатов, а другой для их индексов. Мы можем использовать эти индексы, чтобы найти фактические абзацы в нашем наборе данных. Затем мы выводим ранг каждого результата, расстояние сходства и текст абзаца.
Вот и всё! Это базовый пример использования FAISS для поиска похожих текстовых данных. Конечно, FAISS умеет выполнять гораздо более сложные задачи, например поиск в многомерных векторных пространствах. Однако этот пример должен дать вам хорошую отправную точку для использования FAISS.
Рекомендации и советы
Есть данные? Познакомьтесь с ними: Прежде чем использовать FAISS, уделите немного времени знакомству со своими данными. Задайте такие вопросы: Они заполнены большими числами? В них много пропусков или они насыщены информацией? Понимание ваших данных поможет вам выбрать правильный тип индекса FAISS и определить лучший способ подготовить данные.
Предобработка — ключевой этап: То, как вы подготавливаете данные, может существенно повлиять на то, насколько хорошо работает FAISS. Для текстовых данных подумайте об использовании более умных способов преобразования слов в числа, например TF-IDF или Word2Vec, вместо простого one-hot-кодирования. Для изображений попробуйте использовать признаки из свёрточной нейронной сети (CNN).
Выберите лучший индекс для себя: FAISS предлагает различные типы индексов, каждый со своими сильными сторонами. Некоторые отлично подходят для работы с данными с большим количеством измерений, другие идеально подходят для бинарных векторов, а некоторые созданы для обработки очень больших данных. Поэтому убедитесь, что вы выбрали тот, который лучше всего подойдет для ваших задач.
Объединяйте запросы в пакеты: если у вас слишком много запросов для выполнения к вашему индексу, эффективнее объединить их в пакет и выполнить все сразу. FAISS оптимизирован для пакетной обработки.
Настраивайте параметры: в FAISS есть несколько настраиваемых параметров, например количество кластеров на этапе индексирования и количество проб на этапе поиска векторного сходства. Не ограничивайтесь значениями по умолчанию; экспериментируйте с разными настройками, чтобы понять, что лучше всего работает с вашими данными.
Векторные базы данных vs FAISS
FAISS — отличное решение для ANN search. Кроме того, FAISS предоставляет вспомогательный код, который предлагает дополнительные функциональные возможности для оценки и настройки параметров, связанных с поиском сходства и кластеризацией плотных векторов. Тем не менее у него есть некоторые ограничения, когда у вас десятки миллионов векторов для хранения и извлечения и одновременно требуются ответы в реальном времени или расширенные функции, связанные с векторами запросов.
По сравнению с FAISS, специализированные векторные базы данных, такие как Milvus и Zilliz Cloud, могут решать упомянутые выше задачи и обладают более продвинутыми возможностями в области:
Базовых функциональных возможностей, таких как поддержка CRUD, согласованность данных и поиск с фильтрацией
Доступности системы с надежной персистентностью данных и более эффективным аварийным восстановлением
Масштабируемости системы с поддержкой балансировки нагрузки, распределенной архитектурой, разделяющей вычисления и хранение, а также более удобным использованием
RBAC с поддержкой multi-tenant, SDK для различных языков программирования, restful API и системы мониторинга.
Milvus — первая в мире и самая популярная open-source векторная база данных для поиска сходства в масштабе миллиардов и AI-приложений. Milvus может хранить, индексировать и управлять более чем миллиардом векторных эмбеддингов, сгенерированных глубокими нейронными сетями и другими моделями машинного обучения (ML). Чтобы сделать векторные базы данных доступными для каждого разработчика и организации, Zilliz передала Milvus в LF AI & Data Foundation как проект на стадии инкубации, и в июне 2021 года он перешел в статус выпускного проекта.
Milvus Lite — облегченная версия Milvus, которая запускается локально внутри вашего Python-приложения. Основанный на популярной open-source векторной базе данных Milvus, Milvus Lite повторно использует основные компоненты для векторного индексирования и разбора запросов, удаляя при этом элементы, предназначенные для высокой масштабируемости в распределенных системах. Такой дизайн делает его компактным и эффективным решением, идеальным для сред с ограниченными вычислительными ресурсами, таких как ноутбуки, Jupyter Notebooks, а также мобильные или edge-устройства.
Zilliz Cloud — полностью управляемый сервис векторной базы данных, построенный на Milvus. С Zilliz Cloud извлечение векторов выполняется в десять раз быстрее, а развертывание и масштабирование приложений векторного поиска стало проще, чем когда-либо. Zilliz Cloud также предлагает free tier, предоставляя каждому разработчику доступ к этой передовой технологии без каких-либо финансовых обязательств.
Заключение
Вот и всё! Вместе мы прошли по захватывающему миру Facebook AI Similarity Search, или FAISS. От понимания того, что это такое и как оно работает, до настройки в вашей системе, разбора примера кода с набором данных SQuAD и того, чем он отличается от специализированных векторных баз данных, — мы охватили многое.
Помните, FAISS — невероятно мощный инструмент, разработанный для того, чтобы сделать поиск по огромным объемам данных не только возможным, но и эффективным. Его универсальность в работе с различными типами и размерами данных свидетельствует о продуманности его дизайна.
Продвигаясь вперед, вооруженные этими знаниями, помните о лучших практиках и советах, которые мы обсудили. Понимание ваших данных, выбор правильного индекса, эффективная предобработка данных, пакетная обработка ваших запросов и настройка параметров — все эти шаги могут значительно улучшить ваши результаты.
Но не останавливайтесь на этом. Продолжайте исследовать, экспериментировать и учиться. Будь то более глубокое погружение в различные типы индексов, которые предлагает FAISS, изучение более сложных техник предобработки данных или эксперименты с более продвинутыми вариантами использования — всегда есть чему учиться.
Этот пост написан Keshav Malik, высококвалифицированным и увлеченным инженером по безопасности. Keshav увлечен автоматизацией, хакингом и изучением различных инструментов и технологий. Он любит находить инновационные решения сложных проблем и постоянно ищет новые возможности для профессионального роста и совершенствования. Он стремится быть на шаг впереди и всегда ищет самые новые и лучшие инструменты и технологии.
Читать далее

Zilliz Cloud Now Available in AWS Europe (Ireland)
Zilliz Cloud launches in AWS eu-west-1 (Ireland) — bringing low-latency vector search, EU data residency, and full GDPR-ready infrastructure to European AI teams. Now live across 30 regions on five cloud providers.

What Exactly Are AI Agents? Why OpenAI and LangChain Are Fighting Over Their Definition?
AI agents are software programs powered by AI that can perceive their environment, make decisions, and take actions to achieve a goal—often autonomously.

Bringing AI to Legal Tech: The Role of Vector Databases in Enhancing LLM Guardrails
Discover how vector databases enhance AI reliability in legal tech, ensuring accurate, compliant, and trustworthy AI-powered legal solutions.



