Embeddings et recherche vectorielle : guide du débutant

AI2026-09-28TryQuickToolBox

Vous souhaitez ajouter une recherche sémantique à votre application : les utilisateurs saisissent une requête et obtiennent des résultats basés sur le sens, pas sur des mots-clés exacts. Mais vous ne savez pas par où commencer : que sont les embeddings ? Avez-vous besoin d'une base de données vectorielle ? Comment mesurer la similarité ? Ce guide répond à ces questions avec des étapes pratiques et du code que vous pouvez exécuter dès aujourd'hui.

Que sont les embeddings ?

Un embedding est un vecteur dense de nombres à virgule flottante qui représente le sens d'une entrée : texte, image, audio, etc. Pour le texte, un modèle comme text-embedding-3-small ou une alternative open source (par exemple, all-MiniLM-L6-v2) convertit une phrase en un vecteur, disons de 384 dimensions. Les mots ou phrases ayant un sens similaire se retrouvent proches dans cet espace vectoriel.

Exemple : « chat » et « chaton » auront des vecteurs plus proches que « chat » et « avion ». Cette propriété permet la recherche sémantique : vous encodez vos documents et la requête, puis vous trouvez les vecteurs de documents les plus proches.

Comment fonctionne la recherche vectorielle

La recherche vectorielle (aussi appelée recherche par similarité) trouve les vecteurs de votre jeu de données qui sont les plus similaires à un vecteur de requête. La similarité est généralement mesurée par la similarité cosinus ou le produit scalaire. Pour des vecteurs normalisés, la similarité cosinus et le produit scalaire sont équivalents.

La recherche exhaustive compare la requête à chaque vecteur : acceptable pour quelques milliers de vecteurs, trop lent pour des millions. C'est là que les algorithmes de plus proches voisins approximatifs (ANN) entrent en jeu, tels que HNSW (Hierarchical Navigable Small World) ou IVF (Inverted File Index). Ils échangent une infime perte de précision contre d'énormes gains de vitesse.

Étape par étape : construire un prototype de recherche sémantique

  1. Choisissez un modèle d'embedding. Pour le texte anglais, commencez par un modèle petit et rapide comme all-MiniLM-L6-v2 (384 dims) de Sentence Transformers. Pour la production, envisagez text-embedding-3-small (1536 dims) ou text-embedding-3-large (3072 dims) d'OpenAI.
  2. Encodez vos documents. Divisez les textes longs en morceaux (par exemple, 200 à 500 mots) pour que chaque morceau capture une idée cohérente. Stockez le texte original à côté du vecteur.
  3. Choisissez un stockage vectoriel. Pour un démarrage rapide, utilisez une bibliothèque en mémoire comme FAISS ou un simple tableau NumPy. Pour la production, choisissez une base de données vectorielle dédiée (voir le tableau ci-dessous).
  4. Encodez la requête. Utilisez le même modèle pour encoder la requête de recherche de l'utilisateur.
  5. Recherchez. Calculez la similarité entre le vecteur de requête et tous les vecteurs de documents (ou utilisez un index ANN) et retournez les k meilleurs résultats.
  6. Itérez. Évaluez les résultats, ajustez la taille des morceaux, le modèle ou la métrique de similarité.

Exemple Python minimal avec Sentence Transformers et FAISS

from sentence_transformers import SentenceTransformer
import faiss
import numpy as np

# 1. Charger le modèle
model = SentenceTransformer('all-MiniLM-L6-v2')

# 2. Documents d'exemple
docs = [
    "The cat sat on the mat.",
    "A kitten is playing with yarn.",
    "The stock market crashed today.",
    "Investors are worried about inflation."
]

# 3. Créer les embeddings
embeddings = model.encode(docs, convert_to_numpy=True)

# 4. Construire l'index FAISS
dim = embeddings.shape[1]
index = faiss.IndexFlatL2(dim)  # distance L2 ; pour cosinus, normalisez d'abord
index.add(embeddings)

# 5. Rechercher
query = "feline resting"
query_vec = model.encode([query], convert_to_numpy=True)
D, I = index.search(query_vec, k=2)
print([docs[i] for i in I[0]])
# Sortie probable : ['The cat sat on the mat.', 'A kitten is playing with yarn.']

Choisir une base de données vectorielle

Pour les petits projets, vous pouvez stocker les vecteurs dans un simple fichier ou un index en mémoire. À mesure que vous montez en charge, une base de données vectorielle dédiée offre la persistance, le filtrage et les index ANN. Voici une comparaison rapide :

Base de donnéesTypeIdéal pour
FAISSBibliothèquePrototypage, expérimentations locales
ChromaIntégré / Client-ServeurApplications petites à moyennes, installation facile
PineconeCloud managéProduction, mise à l'échelle serverless
WeaviateOpen Source / CloudRecherche hybride, API GraphQL
QdrantOpen Source / CloudHaute performance, filtrage
pgvectorExtension PostgreSQLStack Postgres existant

Bonnes pratiques et pièges courants

FAQ

Ai-je besoin d'une base de données vectorielle pour un petit projet ?

Non. Pour quelques milliers de vecteurs, vous pouvez utiliser une bibliothèque en mémoire comme FAISS ou même un tableau NumPy. Une base de données vectorielle devient utile lorsque vous avez besoin de persistance, de filtrage ou d'une échelle dépassant la mémoire.

Comment choisir un modèle d'embedding ?

Commencez par un modèle petit et rapide comme all-MiniLM-L6-v2 pour le prototypage. Si vous avez besoin d'une meilleure précision et pouvez assumer les coûts d'API, essayez text-embedding-3-small ou text-embedding-3-large d'OpenAI. Évaluez toujours sur vos propres données.

Quelle est la différence entre la similarité cosinus et la distance euclidienne ?

La similarité cosinus mesure l'angle entre les vecteurs, en ignorant leur magnitude. La distance euclidienne mesure la distance en ligne droite. Pour des vecteurs normalisés, elles donnent le même classement. Le cosinus est courant pour les embeddings de texte car il se concentre sur la direction (le sens) plutôt que sur la longueur.

Prochaines étapes

Maintenant que vous comprenez les bases, essayez de construire une petite recherche sémantique sur vos propres notes ou votre documentation. Expérimentez avec les tailles de morceaux et les modèles. À mesure que vous grandissez, migrez vers une base de données vectorielle managée et ajoutez la recherche hybride. Le domaine évolue vite, mais ces fondamentaux resteront pertinents.

Lorsque vous devez formater des réponses d'API ou déboguer des payloads JSON provenant de services d'embedding, le JSON Formatter peut vous aider à inspecter et valider les données rapidement.