Configuration avec Facebook AI Similarity Search (FAISS)
Bonjour, passionnés de technologie ! Aujourd’hui, nous nous lançons dans un voyage pour explorer un outil qui fait beaucoup parler de lui dans l’intelligence artificielle : Similarity Search (FAISS) de Facebook AI. Supposons que vous vous soyez déjà demandé comment Spotify trouve des chansons qui ressemblent étrangement à vos préférées, ou comment Google Photos parvient à regrouper les photos de la même personne. Dans ce cas, vous êtes sur le point de percer le mystère.
La recherche de similarité, ou recherche du plus proche voisin, est un aspect crucial de nombreuses applications d’IA et d’apprentissage automatique. Il s’agit de trouver les points de données les plus similaires à un point de requête donné. Par exemple, lorsque vous recherchez une chanson sur Spotify, le système doit trouver les chansons les plus « similaires » à votre requête de recherche — d’où une recherche de similarité.
Aussi impressionnante que puisse paraître cette recherche de similarité efficace, il y a un hic. Les méthodes traditionnelles de recherche de similarité peuvent devenir terriblement lentes avec de grandes quantités de données. C’est là que FAISS intervient et résout les limites des moteurs de recherche de requêtes traditionnels. Il s’agit d’une bibliothèque de recherche de similarité efficace développée par Facebook AI, qui fournit des solutions fiables aux problèmes de recherche de similarité, en particulier lorsqu’il s’agit de données à grande échelle.
Mais assez bavardé ! Cet article de blog vous guidera dans la configuration de FAISS, sa mise en route, et démontrera sa puissance à travers un exemple de programme de recherche de similarité. Alors attachez vos ceintures, car nous sommes sur le point de plonger au cœur du monde fascinant de la recherche de similarité efficace avec FAISS. Ça va être une aventure amusante !
Comprendre FAISS (Facebook AI Similarity Search)
Maintenant que nous nous sommes mis en appétit avec une brève introduction, approfondissons FAISS. FAISS, ou Facebook AI Similarity Search, est une bibliothèque d’algorithmes pour la recherche de similarité vectorielle et le clustering de vecteurs denses. C’est le fruit du travail de l’équipe IA de Facebook, qui l’a conçue pour gérer efficacement de grandes bases de données.
FAISS fonctionne principalement sur le concept de « similarité vectorielle ». En termes simples, les vecteurs sont essentiellement une liste de nombres, et la similarité concerne le degré de ressemblance entre deux vecteurs. Imaginez que vous essayiez de trouver une chanson qui corresponde à l’ambiance de votre chanson préférée actuelle. Les vecteurs peuvent représenter les deux chansons, différents éléments de vecteurs similaires représentant différentes caractéristiques des chansons. Vous pouvez comparer la « similarité » entre ces chansons en comparant la distance de leurs vecteurs dans un espace à haute dimension. La distance euclidienne joue un rôle crucial dans la mesure de cette similarité entre vecteurs.
C’est là que FAISS montre toute sa puissance. Il fournit un moyen de comparer rapidement et précisément des millions, voire des milliards, de ces vecteurs. C’est comme disposer d’un moteur de recherche surpuissant capable de parcourir une immense bibliothèque musicale en un clin d’œil, en repérant les chansons les plus similaires à votre préférée. Les vecteurs indexés sont essentiels dans ce processus, car ils permettent au système de rechercher efficacement les correspondances les plus proches d’un vecteur de requête donné.
Mais la magie de FAISS ne s’arrête pas aux recommandations musicales. De nombreuses applications utilisent FAISS, de la reconnaissance d’images et de la recherche de texte au clustering et à l’analyse de données. Chaque fois que vous disposez d’une grande quantité de données et que vous devez trouver rapidement des éléments similaires, FAISS pourrait être votre outil de prédilection.
Configurer FAISS
Cette section vous guidera sur la manière de configurer FAISS sur un système Linux.
Installer Conda
Avant d’installer FAISS, vous devez avoir Conda installé sur votre système. Conda est un système open source de gestion de paquets et d’environnements qui fonctionne sous Windows, macOS et Linux.
Suivez ces étapes pour installer Conda sur un système Linux :
Téléchargez l’installateur Miniconda pour Linux depuis le site officiel.
Vérifiez les hachages de votre programme d’installation.
Ouvrez une fenêtre de terminal et exécutez la commande suivante pour démarrer l’installation :
bash Miniconda3-latest-Linux-x86_64.sh
Lorsque le programme d’installation démarre, il vous posera quelques questions. Si vous n’êtes pas sûr de quelque chose, choisissez les options par défaut. Vous pourrez toujours modifier les choses plus tard.
Une fois l’installation terminée, fermez votre fenêtre de terminal et rouvrez-la. Cela garantira que toutes les modifications que vous apportez sont activées.
Maintenant, vous voudrez vérifier que tout est correctement installé. Pour ce faire, tapez conda list dans votre fenêtre de terminal ou Anaconda Prompt et appuyez sur Entrée. Si tout fonctionne correctement, vous verrez une liste des paquets installés.
Installation de FAISS
Vous pouvez installer FAISS via Conda. Le paquet FAISS existe en deux versions : une version uniquement CPU (faiss-cpu) et une version qui inclut à la fois les index CPU et GPU (faiss-gpu). Selon vos besoins, vous pouvez installer l’une ou l’autre de ces versions.
La méthode recommandée pour installer FAISS est d’utiliser le canal Conda de PyTorch. Voici les commandes pour installer la dernière version stable de FAISS.
Pour la version CPU :
conda install -c pytorch faiss-cpu
Pour la version GPU :
conda install -c pytorch faiss-gpu
De plus, FAISS est empaqueté par conda-forge, qui est un écosystème de packaging communautaire pour Conda. Vous pouvez installer FAISS depuis conda-forge en utilisant les commandes suivantes. Pour la version uniquement CPU :
conda install -c conda-forge faiss-cpu
Pour la version GPU :
conda install -c conda-forge faiss-gpu
Présentation pas à pas d’un exemple de code avec SQuAD
Vous pouvez vérifier de quel canal proviennent vos paquets Conda en utilisant la commande conda list.
Utilisons le Stanford Question Answering Dataset (SQuAD) pour cette démonstration. SQuAD est un jeu de données populaire pour le traitement automatique du langage naturel (NLP) et un excellent moyen d’illustrer le fonctionnement de FAISS. Ce jeu de données contient des paires question-réponse, où la réponse à chaque question est un segment de texte, ou « span », provenant du passage de lecture correspondant. Dans le processus de recherche, des vecteurs de requête sont utilisés pour trouver les réponses les plus pertinentes en les comparant au jeu de données.
Avant de nous plonger dans le code, commençons par télécharger et préparer le jeu de données SQuAD :
Téléchargez le jeu de données SQuAD : Vous pouvez télécharger le jeu de données depuis le site web de SQuAD. Pour simplifier, nous utiliserons SQuAD 1.1. Vous pouvez télécharger le jeu de données en utilisant le lien suivant : SQuAD 1.1 Train. Téléchargez et enregistrez le fichier JSON (train-v1.1.json) dans votre répertoire de travail.
Lisez le fichier JSON : Vous pouvez maintenant utiliser la bibliothèque JSON de Python pour charger les données :
with open('train-v1.1.json', 'r') as file: squad_data = json.load(file)
Les vecteurs numériques sont essentiels dans l’index FAISS, car ils permettent des mesures de distance et des requêtes efficaces au sein de l’IndexFlatL2.
Importation des bibliothèques nécessaires
La première étape consiste à importer toutes les bibliothèques nécessaires. Nous aurons besoin de numpy pour les opérations numériques, de Faiss pour notre recherche de similarité vectorielle, de JSON pour charger notre jeu de données et de nltk pour segmenter notre texte en tokens.
import numpy as np
import faiss
import json
from nltk.tokenize import word_tokenize
Chargement et prétraitement des données
Chargeons le jeu de données SQuAD. C’est un fichier JSON, nous pouvons donc utiliser la fonction load du module JSON.
with open('train-v1.1.json', 'r') as file:
squad_data = json.load(file)
Nous supposerons que l’objet JSON est un dictionnaire contenant une clé data et une liste de dictionnaires. Chaque dictionnaire de la liste représente un article contenant une clé paragraph avec une liste de paragraphes.
Maintenant, prétraitons les données. Nous allons segmenter chaque paragraphe en tokens à l’aide de la fonction word_tokenize de nltk, qui découpe une phrase en mots individuels. Nous représenterons ensuite chaque mot sous forme de vecteur encodé 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']]
Construction de l’index
Maintenant que nos données sont au bon format, nous pouvons construire notre index FAISS. Nous utiliserons le type d’index IndexFlatL2, un index de distance L2 de base.
dimension = len(vocabulary)
index = faiss.IndexFlatL2(dimension)
# Convert our list of NumPy arrays to a single 2D array
paragraph_vectors = np.stack(paragraph_vectors).astype('float32')
index.add(paragraph_vectors)
Le type IndexFlatL2 exige que nous spécifiions la dimension de nos données. Comme chacun de nos vecteurs est encodé en one-hot, la dimension correspond à la taille de notre vocabulaire.
Nous ajoutons ensuite nos données à l’index à l’aide de la méthode add, qui nécessite un tableau NumPy 2D.
Réalisation d’une recherche vectorielle FAISS
Une fois notre index entièrement configuré, nous pouvons maintenant jouer les détectives et trouver les paragraphes de notre jeu de données qui correspondent le plus étroitement à notre requête de recherche.
Voici notre fonction de recherche :
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()
Notre terme de recherche est "What is the capital of France?" et nous voulons trouver 5 résultats :
search_term = "What is the capital of France?"
search_for_paragraphs(search_term, 5)
La fonction search_for_paragraphs() transforme d’abord notre terme de recherche en un vecteur encodé. Nous utilisons ensuite cette représentation vectorielle comme méthode de recherche sur notre index. Cela nécessite un tableau 2D, nous ajoutons donc une dimension supplémentaire à notre vecteur de recherche.
La méthode de recherche de similarité nécessite également que nous indiquions combien de résultats nous voulons (c’est à cela que sert num_results). La méthode search nous donne deux tableaux 2D : l’un pour les distances des résultats les plus proches et l’autre pour leurs index. Nous pouvons utiliser ces index pour trouver les paragraphes réels dans notre jeu de données. Ensuite, nous affichons le classement de chaque résultat, la distance de similarité et le texte du paragraphe.
Et voilà ! Ceci est un exemple de base d’utilisation de FAISS pour trouver des données textuelles similaires. Bien sûr, FAISS peut faire des choses bien plus complexes, comme rechercher dans des espaces vectoriels de grande dimension. Cependant, cet exemple devrait vous donner un bon point de départ pour utiliser FAISS.
Bonnes pratiques et conseils
Vous avez vos données ? Apprenez à les connaître : Avant d’utiliser FAISS, prenez un moment pour vous familiariser avec vos données. Posez-vous des questions comme celles-ci : sont-elles remplies de grands nombres ? Sont-elles pleines de lacunes ou riches en informations ? Connaître vos données vous aidera à choisir le bon type d’index FAISS et à déterminer la meilleure façon de préparer vos données.
Le prétraitement est essentiel : La façon dont vous préparez vos données peut avoir un impact significatif sur l’efficacité de FAISS. Pour les données textuelles, envisagez d’utiliser des méthodes plus intelligentes pour transformer les mots en nombres, comme TF-IDF ou Word2Vec, au lieu d’un simple encodage one-hot. Pour les images, essayez d’utiliser des caractéristiques issues d’un réseau de neurones convolutif (CNN).
Choisissez l’index qui vous convient le mieux : FAISS propose différents types d’index, chacun avec des atouts particuliers. Certains sont excellents pour traiter des données comportant de nombreuses dimensions, d’autres sont parfaits pour les vecteurs binaires, et certains sont conçus pour gérer de très, très grands volumes de données. Assurez-vous donc de choisir celui qui répondra le mieux à vos besoins.
Regroupez vos requêtes en lots : Si vous avez trop de requêtes à exécuter sur votre index, il est plus efficace de les regrouper et de les exécuter toutes en une seule fois. FAISS est optimisé pour le traitement par lots.
Ajustez vos paramètres : FAISS dispose de plusieurs paramètres configurables, comme le nombre de clusters lors de l’étape d’indexation et le nombre de sondes lors de l’étape de recherche de similarité vectorielle. Ne vous contentez pas des valeurs par défaut ; testez différents réglages pour voir ce qui fonctionne le mieux avec vos données.
Bases de données vectorielles vs FAISS
FAISS est une excellente solution pour la recherche ANN. De plus, FAISS fournit du code de support qui offre des fonctionnalités supplémentaires pour l’évaluation et l’ajustement des paramètres liés à la recherche de similarité et au clustering de vecteurs denses. Néanmoins, il présente certaines limites lorsque vous avez des dizaines de millions de vecteurs à stocker et à récupérer, tout en exigeant simultanément des réponses en temps réel ou des fonctionnalités avancées liées aux vecteurs de requête.
Par rapport à FAISS, les bases de données vectorielles spécialement conçues comme Milvus et Zilliz Cloud peuvent relever les défis mentionnés ci-dessus et disposent de capacités plus avancées dans les domaines suivants :
Fonctionnalités de base telles que la prise en charge CRUD, la cohérence des données et la recherche avec filtres
Disponibilité du système avec une forte persistance des données et une meilleure reprise après sinistre
Évolutivité du système avec prise en charge de l’équilibrage de charge, une architecture distribuée qui sépare le calcul et le stockage, et une meilleure facilité d’utilisation
RBAC avec prise en charge du multi-tenant, des SDK pour divers langages de programmation, une API restful et un système de surveillance.
Milvus est la première et la plus populaire base de données vectorielle open-source au monde pour la recherche de similarité à l’échelle du milliard et les applications d’IA. Milvus peut stocker, indexer et gérer plus d’un milliard d’embeddings de vecteurs générés par des réseaux neuronaux profonds et d’autres modèles de machine learning (ML). Pour rendre les bases de données vectorielles accessibles à chaque développeur et organisation, Zilliz a contribué Milvus à la LF AI & Data Foundation en tant que projet en phase d’incubation, et il a été diplômé en juin 2021.
Milvus Lite est une version légère de Milvus qui s’exécute localement au sein de votre application Python. Basé sur la populaire base de données vectorielle open-source Milvus, Milvus Lite réutilise les composants de base pour l’indexation vectorielle et l’analyse des requêtes tout en supprimant les éléments conçus pour une forte évolutivité dans les systèmes distribués. Cette conception en fait une solution compacte et efficace, idéale pour les environnements disposant de ressources informatiques limitées, tels que les ordinateurs portables, les Jupyter Notebooks et les appareils mobiles ou en périphérie.
Zilliz Cloud est un service de base de données vectorielle entièrement géré, construit sur Milvus. Avec Zilliz Cloud, la récupération vectorielle est dix fois plus rapide, et le déploiement et la mise à l’échelle des applications de recherche vectorielle sont plus faciles que jamais. Zilliz Cloud propose également une offre gratuite, donnant à chaque développeur accès à cette technologie de pointe sans aucun engagement financier.
Conclusion
Et voilà ! Ensemble, nous avons parcouru l’univers passionnant de Facebook AI Similarity Search, ou FAISS. De la compréhension de ce que c’est et de son fonctionnement à sa configuration sur votre système, en passant par l’examen de quelques exemples de code avec le jeu de données SQuAD et la façon dont il diffère des bases de données vectorielles spécialement conçues, nous avons couvert beaucoup de terrain.
N'oubliez pas que FAISS est un outil incroyablement puissant conçu pour rendre la recherche dans d’immenses quantités de données non seulement possible, mais aussi efficace. Sa polyvalence dans la prise en charge de différents types et volumes de données témoigne de sa conception.
À mesure que vous avancez, armé de ces connaissances, gardez à l’esprit les bonnes pratiques et conseils dont nous avons discuté. Comprendre vos données, choisir le bon index, prétraiter efficacement vos données, regrouper vos requêtes par lots et ajuster vos paramètres : toutes ces étapes peuvent améliorer considérablement vos résultats.
Mais ne vous arrêtez pas là. Continuez à explorer, à expérimenter et à apprendre. Qu’il s’agisse d’approfondir les différents types d’index proposés par FAISS, d’explorer des techniques de prétraitement des données plus complexes ou d’expérimenter des cas d’utilisation plus sophistiqués, il y a toujours plus à apprendre.
Cet article est rédigé par Keshav Malik, un ingénieur en sécurité hautement qualifié et enthousiaste. Keshav est passionné par l’automatisation, le hacking et l’exploration de différents outils et technologies. Il aime trouver des solutions innovantes à des problèmes complexes et cherche constamment de nouvelles occasions de progresser et de s’améliorer en tant que professionnel. Il s’attache à garder une longueur d’avance et est toujours à la recherche des outils et technologies les plus récents et les plus performants.
Continuer à lire

How Zilliz Ended Up at the Center of NVIDIA’s Unstructured Data Story at GTC 2026
If unstructured data is the context of AI, then the ceiling of AI applications will be set not just by models, but by how mature the infrastructure for unstructured data becomes.

Introducing Zilliz Cloud Global Cluster: Region-Level Resilience for Mission-Critical AI
Zilliz Cloud Global Cluster delivers multi-region resilience, automatic failover, and fast global AI search with built-in security and compliance.

Democratizing AI: Making Vector Search Powerful and Affordable
Zilliz democratizes AI vector search with Milvus 2.6 and Zilliz Cloud for powerful, affordable scalability, cutting costs in infrastructure, operations, and development.



