Embeddings

La représentation vectorielle du sens en intelligence artificielle

01

📖 Qu'est-ce qu'un embedding ?

Un embedding est une représentation vectorielle numérique d'un texte (mot, phrase, document) qui capture son sens sémantique. Les mots ou phrases ayant des significations similaires ont des vecteurs proches dans l'espace vectoriel.

💡 À retenir : Un embedding transforme du texte en nombres compréhensibles par les machines tout en préservant la similarité sémantique.
🔢 Visualisation simplifiée :

"Paris" → [0.12, 0.45, 0.78, 0.03, ...] (vecteur 384 dimensions)
"France" → [0.14, 0.42, 0.75, 0.05, ...] (vecteur proche)
"Pizza" → [0.89, 0.12, 0.23, 0.91, ...] (vecteur éloigné)

Propriétés fondamentales :

  • Similarité sémantique : mots proches = vecteurs proches
  • Relations vectorielles : "roi" - "homme" + "femme" ≈ "reine"
  • Dimensions compressées : 384-1536 dimensions (vs vocabulaire de 50k+ mots)
  • Transfer learning : pré-entraînés sur des corpus massifs
02

🧠 Principe des embeddings

Les embeddings sont générés par des modèles de deep learning entraînés sur des corpus massifs de texte. Ils apprennent à placer les mots sémantiquement proches dans des régions voisines de l'espace vectoriel.

📊 Exemple de similarités cosinus :

Paire de mots Similarité
"discours" - "allocution" 0.87
"liberté" - "indépendance" 0.82
"résistance" - "combat" 0.79
"discours" - "cuisine" 0.12
"liberté" - "dictature" 0.08

L'analogie vectorielle

# "roi" - "homme" + "femme" ≈ "reine"
embedding("roi") - embedding("homme") + embedding("femme") ≈ embedding("reine")
03

🤖 Modèles d'embeddings

Sentence-BERT

Dimensions : 384-768

Langues : 50+ (dont français)

Type : Open source

✅ Idéal pour phrases et documents

OpenAI Ada-002

Dimensions : 1536

Langues : Multilingue

Type : API (payant)

✅ Haute qualité, dimensions élevées

Mistral Embed

Dimensions : 1024

Langues : Multilingue

Type : API / Open source

✅ Rapport qualité/prix

CamemBERT

Dimensions : 768

Langues : Français uniquement

Type : Open source

✅ Spécialiste français

💡 Notre recommandation : Pour le français, utilisez Sentence-BERT (paraphrase-multilingual-MiniLM-L12-v2) : gratuit, efficace, 384 dimensions.
04

⚙️ Génération d'embeddings

Avec Sentence-BERT (Python)

from sentence_transformers import SentenceTransformer

# Charger le modèle (téléchargement la première fois)
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')

# Générer un embedding pour une phrase
phrase = "L'Appel du 18 juin est un discours historique"
embedding = model.encode(phrase)

print(embedding.shape)  # (384,) - vecteur de 384 dimensions
print(embedding[:5])    # [ 0.12, -0.34,  0.56, -0.08,  0.23]

Batch processing (plusieurs textes)

# Générer des embeddings pour plusieurs textes
textes = [
    "Charles de Gaulle a prononcé l'Appel du 18 juin",
    "Victor Hugo a écrit Les Misérables",
    "La Résistance française pendant la Seconde Guerre mondiale"
]

embeddings = model.encode(textes)
print(embeddings.shape)  # (3, 384)

Avec l'API Le Monde Sémantique

curl -X POST https://lemondesemantique.fr/api/v2/embed \
  -H "Authorization: Bearer kg_live_xxxxx" \
  -H "Content-Type: application/json" \
  -d '{"text": "Discours sur la liberté"}'
05

📊 Mesure de similarité

Une fois les embeddings générés, on compare les vecteurs pour mesurer la similarité sémantique.

Similarité cosinus

import numpy as np

def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

# Calculer la similarité entre deux phrases
phrase1 = "discours sur la liberté"
phrase2 = "appel à la résistance"

emb1 = model.encode(phrase1)
emb2 = model.encode(phrase2)

similarite = cosine_similarity(emb1, emb2)
print(f"Similarité : {similarite:.3f}")  # > 0.7 si sémantiquement proches

Autres métriques

MétriqueFormuleUtilisation
Cosinus cos(θ) = (A·B)/(||A||·||B||) Textes (orientation, pas magnitude)
Euclidienne distance = √Σ(Ai-Bi)² Vecteurs proches dans l'espace
Produit scalaire similarité = A·B Vecteurs normalisés
06

🔍 Recherche vectorielle

La recherche vectorielle consiste à trouver les k vecteurs les plus similaires à un vecteur requête.

Avec FAISS

import faiss

# Créer un index FAISS
dimension = 384
index = faiss.IndexFlatIP(dimension)  # Similarité cosinus (produit scalaire)

# Ajouter les embeddings
index.add(embeddings)  # embeddings: matrice (nb_textes, 384)

# Rechercher les 5 plus similaires
requete = model.encode(["discours sur la liberté"])
scores, indices = index.search(requete, k=5)

for score, idx in zip(scores[0], indices[0]):
    print(f"{textes[idx]} (score: {score:.3f})")
📝 Résultat de recherche :
Requête : "discours sur la liberté"
1. "Appel du 18 juin" (score: 0.89)
2. "Appel du 22 juin" (score: 0.85)
3. "Discours de Bayeux" (score: 0.76)
4. "Discours de Grenoble" (score: 0.71)
5. "Discours de Vichy" (score: 0.52)
07

🎯 Cas d'usage des embeddings

1. Recherche sémantique

Trouver des documents par sens, pas par mots-clés.

2. RAG (Retrieval-Augmented Generation)

Récupérer les documents pertinents pour alimenter un LLM.

3. Détection de similarité / plagiat

Comparer des documents pour trouver des passages similaires.

4. Clustering de documents

Grouper des documents par thèmes (classification non supervisée).

5. Recommandation

"Les utilisateurs qui ont aimé ce discours ont aussi aimé..."

🚀 Chez Le Monde Sémantique

Nous utilisons Sentence-BERT pour générer des embeddings de nos 100+ discours, avec FAISS pour la recherche vectorielle.

🎯 Tester notre recherche vectorielle →