Intermédiaire 11 minStack

FAISS : la bibliothèque derrière la recherche vectorielle

Réponse directe

FAISS (Facebook AI Similarity Search) est une bibliothèque open source sous licence MIT, développée par le groupe de recherche en IA de Meta, qui recherche les vecteurs les plus proches d'un vecteur donné. Ce n'est pas une base de données : pas de serveur, pas de filtrage par métadonnées, pas de persistance intégrée. Elle comptait plus de 41 000 étoiles GitHub fin septembre 2026 et sert de moteur interne à plusieurs bases vectorielles.

FAISS est une bibliothèque de recherche par similarité sur des vecteurs denses, développée principalement par le groupe de recherche en IA fondamentale de Meta, utilisée à l'intérieur de quantité d'outils qui ne la citent jamais. Ce n'est pas une base de données : ni serveur, ni filtrage par métadonnées, ni contrôle d'accès, ni persistance. Pour une chaîne documentaire locale mono-processus, c'est ce qu'il y a de plus léger qui fonctionne — et cela cesse d'être le bon outil dès qu'arrivent les droits d'accès ou plusieurs écrivains.

Par Mohamed Meguedmi·Màj 2026-09-28·Testé sur Windows, macOS, Linux

#Une bibliothèque, pas une base

On compare souvent FAISS aux bases vectorielles comme s'il s'agissait d'alternatives. Ce ne sont pas les mêmes catégories. Une base vectorielle est un service avec une API, du stockage, du filtrage et des droits. FAISS est un composant : écrit en C++ avec des enveloppes complètes pour Python et NumPy, vous lui donnez des vecteurs, il construit un index en mémoire, et il répond à la question « lesquels sont les plus proches de celui-là ». Plusieurs bases vectorielles l'utilisent, ou utilisent quelque chose de semblable, en interne. Le projet est publié sous licence MIT, comptait plus de 41 000 étoiles GitHub fin septembre 2026, et ses auteurs indiquent que certaines de ses méthodes passent à l'échelle de milliards de vecteurs en mémoire principale sur un seul serveur.

La conséquence pratique est que choisir FAISS, c'est accepter de prendre en charge tout le reste : sauvegarder l'index sur disque, le recharger, le garder cohérent avec vos documents, faire le lien entre la position d'un vecteur et le texte dont il provient, et décider ce qui se passe quand deux processus veulent écrire en même temps. Rien de tout cela n'est fourni par défaut ; c'est un choix d'architecture assumé, pas un oubli du projet.

#Les index qui comptent

Le kit RAG Local

Tes documents, ton IA : un RAG local fiable sur tes PDF, notes et mails — sans rien envoyer dans le cloud.

  • Espace en ligne à vie
  • PDF + fichiers
  • Mises à jour à vie
Quatre familles, trois compromis
IndexComment il chercheQuand l'utiliser
Exact (Flat)Compare à tous les vecteursJusqu'à quelques dizaines de milliers : résultats exacts, aucun réglage, réellement assez rapide
IVF (partitions inversées)Découpe l'espace en clusters, n'explore que quelques partitionsÀ partir de centaines de milliers ; demande une phase d'apprentissage sur des données représentatives
HNSW (graphe de voisins)Navigue dans un graphe de liensBeaucoup de RAM disponible ou corpus modeste : rapide et précis, mais pas de suppression de vecteurs
PQ / OPQ (quantification produit)Stocke des vecteurs compressés en codes de M octetsQuand l'index ne tient plus en mémoire : la précision baisse, la mémoire bien davantage
RaBitQ (compression maximale)Compresse à 1 bit par dimension plus un petit surcoûtLe dernier recours mémoire, avec une étape de rotation aléatoire pour garder une bonne précision

Le conseil qui fait gagner le plus de temps : commencer par l'exact. Les index approchés existent pour résoudre un problème d'échelle ; les adopter avant d'avoir ce problème revient à acheter des paramètres à régler et un rappel à mesurer, en échange de millisecondes que personne n'a remarquées. À l'échelle d'un corpus local, la récupération n'est presque jamais l'étape lente — c'est la génération par le modèle de langage qui domine le temps de réponse perçu par l'utilisateur final.

#Le minimum pour démarrer en Python

  1. 01
    Installer la bibliothèque
    pip install faiss-cpu installe le paquet officiel PyPI (version 1.15.1 fin septembre 2026). Pour la variante GPU, le projet documente une installation via conda : conda install -c pytorch -c nvidia -c conda-forge faiss-gpu=1.15.1.
  2. 02
    Construire un index exact
    index = faiss.IndexFlatL2(dimension) crée un index de recherche exacte pour des vecteurs de la dimension de votre modèle d'embedding.
  3. 03
    Ajouter les vecteurs
    index.add(vecteurs) où vecteurs est un tableau NumPy de forme (n, dimension) en flottants 32 bits.
  4. 04
    Interroger
    distances, indices = index.search(requete, k) renvoie les k voisins les plus proches et leurs distances ; à vous de faire correspondre indices aux morceaux de texte d'origine.
  5. 05
    Sauvegarder et recharger
    faiss.write_index(index, chemin) puis faiss.read_index(chemin) persistent l'index sur disque entre deux exécutions, puisque FAISS ne le fait pas lui-même.

#Choisir un index selon la taille du corpus

Le wiki officiel du projet publie des repères précis, exprimés comme des chaînes à passer à sa fabrique d'index (index_factory). En dessous d'un million de vecteurs, IVF_K suffit, avec K choisi entre 4×√N et 16×√N selon le nombre de vecteurs N, et un jeu d'apprentissage de 30×K à 256×K vecteurs. Entre 1 et 10 millions, la combinaison recommandée est IVF65536_HNSW32, qui utilise HNSW pour accélérer l'affectation aux clusters. Entre 10 et 100 millions, IVF262144_HNSW32 ; au-delà, jusqu'au milliard, IVF1048576_HNSW32 — à ce stade, l'apprentissage devient nettement plus lent et se fait généralement sur GPU pendant que le reste tourne sur CPU.

Repères officiels par taille de corpus
Taille du corpusConfiguration recommandée
Moins d'1 millionIVF_K (K entre 4×√N et 16×√N)
1 à 10 millionsIVF65536_HNSW32
10 à 100 millionsIVF262144_HNSW32
100 millions à 1 milliardIVF1048576_HNSW32

Pour un corpus documentaire local — quelques milliers à quelques centaines de milliers de morceaux de texte — ces repères confirment surtout qu'on est loin du seuil où l'index approché devient nécessaire : l'index exact ou, au pire, un simple IVF_K couvrent la quasi-totalité des cas réels, et les configurations à plusieurs centaines de milliers d'entrées d'apprentissage restent hors de portée d'un usage documentaire courant.

#La mémoire, chiffres en main

Un vecteur de 1 024 dimensions en flottants 32 bits occupe environ 4 Ko. Un million de vecteurs, c'est donc à peu près 4 Go, avant la structure d'index elle-même. Pour un index HNSW précisément, le wiki officiel donne la formule (d×4 + M×2×4) octets par vecteur, où d est la dimension et M le nombre de liens par vecteur (entre 4 et 64 : plus de liens, plus de précision, plus de mémoire). Cette arithmétique décide de la plupart des architectures : c'est pour cela que la compression existe, et c'est pour cela qu'une machine qui héberge aussi un modèle de langage dispose de moins de marge qu'on ne le suppose.

Côté compression, la quantification produit (PQ) code chaque vecteur sur M octets, typiquement 64 au maximum — au-delà, une quantification scalaire (SQ) est en général aussi précise et plus rapide. Quand la qualité de la compression compte vraiment, le guide officiel recommande d'ajouter une transformation OPQ avant la quantification : elle réduit d'abord la dimension du vecteur par une transformation linéaire qui le rend plus facile à compresser, puis applique la quantification produit sur le résultat. C'est une étape de plus à calculer à l'indexation, mais elle réduit la perte de précision par rapport à une quantification produit directe, à taille de code égale. RaBitQ, l'option de compression maximale, descend à environ (d/8 + 8) octets par vecteur en ne gardant qu'un bit par dimension, au prix d'une étape de rotation aléatoire nécessaire pour conserver une précision correcte ; des variantes à plusieurs bits par dimension existent pour retrouver un peu de précision contre un peu plus de stockage.

i
Index en RAM, modèle en VRAM
Les index FAISS vivent par défaut dans la mémoire système. Une exécution sur GPU existe pour les très gros volumes — la documentation officielle précise qu'elle accepte les données aussi bien depuis la mémoire CPU que GPU — mais disputer la carte à votre modèle de langage est rarement un bon échange dans une installation locale. Notez aussi qu'un index HNSW n'accepte que des ajouts séquentiels (pas d'identifiants personnalisés sans l'envelopper dans IDMap) et ne permet pas de supprimer des vecteurs un par un, contrairement à IVF.

#La fonction absente qui décide de tout

Les questions réelles portent des conditions : seulement les documents de ce client, seulement après cette date, seulement ce que cette personne a le droit de lire. FAISS n'a aucune notion de métadonnées. Le contournement habituel — récupérer plus de résultats que nécessaire puis filtrer en Python — est faux d'une manière précise : si les cinquante meilleurs appartiennent tous à un autre service, le filtrage ne laisse rien, et votre assistant déclare n'avoir trouvé aucune information au lieu de dire qu'il n'en a trouvé aucune que vous puissiez voir.

Le filtrage par droits, en particulier, ne doit pas être implémenté en aval de la récupération. C'est l'argument pratique le plus fort en faveur d'un système qui filtre pendant la recherche : une base vectorielle, ou des vecteurs dans PostgreSQL où c'est une clause WHERE.

#Quand FAISS est le bon choix

Une application mono-processus
Qui charge un index au démarrage et l'interroge : un outil de bureau, un traitement par lots, un carnet de notes.
Un corpus figé
Reconstruit selon un calendrier plutôt que mis à jour en continu.
Aucun filtrage par utilisateur
Ou un filtrage si grossier qu'un index par catégorie reste raisonnable.
Une latence critique
Quand le coût d'un aller-retour réseau vers une base est précisément ce que vous cherchez à supprimer, par exemple dans un outil embarqué sans connexion garantie.

En dehors de ces cas, le service qu'on évite d'installer coûte en général moins cher, sur la durée, que le code de persistance, de filtrage et de concurrence qu'on finit par réécrire soi-même à mesure que le projet grandit.

Un dernier repère utile avant de trancher : plusieurs bases vectorielles que vous croiserez par ailleurs ne remplacent pas FAISS par magie, elles l'enveloppent, ou s'inspirent des mêmes familles d'index (IVF, HNSW, quantification produit) derrière une API réseau, un système de persistance géré et un moteur de filtrage. Comprendre FAISS revient donc à comprendre une bonne partie du fonctionnement interne des bases vectorielles elles-mêmes — un détour utile même si le projet final utilise Qdrant ou Milvus plutôt que FAISS directement, parce que les mêmes compromis mémoire et précision s'y retrouvent sous d'autres noms de paramètres.

#FAQ

FAISS est-il une base de données vectorielle ?+
Non, c'est une bibliothèque de recherche par similarité, écrite en C++ avec des enveloppes Python et NumPy. Ni serveur, ni filtrage par métadonnées, ni contrôle d'accès, ni durabilité intégrée — c'est précisément ce qu'ajoute une base vectorielle comme Qdrant ou Milvus par-dessus un moteur comparable, souvent inspiré des mêmes principes d'indexation.
FAISS est-il gratuit et open source ?+
Oui. Le projet est publié sous licence MIT, une licence permissive qui autorise l'usage commercial sans redevance, et il est développé principalement par le groupe de recherche en IA fondamentale de Meta. Aucun coût de licence à prévoir, seulement le temps d'intégration, d'exploitation et de maintien à jour de la bibliothèque dans votre pile.
Combien de vecteurs peut-il gérer ?+
Des millions, voire des milliards selon les auteurs du projet, avec le bon index et assez de mémoire vive. La contrainte est la RAM : environ 4 Ko par vecteur de 1 024 dimensions en pleine précision, avant la structure d'index, ou nettement moins avec une quantification produit ou RaBitQ pour les très grands volumes.
Peut-on filtrer les résultats par métadonnées ?+
Pas pendant la recherche. On filtre après, dans son propre code, ce qui peut ne rien laisser quand les meilleurs résultats échouent tous au filtre. Pour un filtrage par droits, il faut un système qui filtre pendant la récupération elle-même, comme pgvector ou une base vectorielle dédiée.
FAISS ou une base vectorielle ?+
FAISS pour un processus unique, un corpus figé et aucun filtrage. Une base dès qu'il y a plusieurs clients, des mises à jour continues, de la persistance ou des droits d'accès à faire respecter pendant la recherche elle-même plutôt qu'après coup dans votre code applicatif.
Par quel index commencer ?+
L'exact (IndexFlatL2 ou IndexFlatIP selon la distance). Aucun réglage, aucune phase d'apprentissage, aucun rappel à mesurer, et c'est assez rapide bien au-delà de la taille de la plupart des corpus locaux — le wiki officiel ne recommande un index approché qu'au-delà du million de vecteurs.
HNSW peut-il remplacer IVF dans tous les cas ?+
Non. HNSW convient quand la RAM abonde ou le corpus reste modeste, mais il n'accepte que des ajouts séquentiels et ne supporte pas la suppression de vecteurs. IVF, moins rapide en requête pure, reste plus flexible pour un corpus qui évolue et se combine avec HNSW au-delà du million de vecteurs. L'exécution GPU, elle, remplace directement l'index CPU équivalent (GpuIndexFlatL2 pour IndexFlatL2, par exemple) mais reste rarement utile à l'échelle d'un corpus local.
Ce guide vous a aidé ?

Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.