Du texte au vecteur : comprendre les embeddings

Un cours pas à pas avec des analogies, des exemples chiffrés et des mini-outils à manipuler.

1. L’idée en une image : des coordonnées pour le sens

Une ville est décrite par 2 nombres (latitude, longitude). Deux villes proches ont des coordonnées proches. Un embedding fait la même chose pour un texte, mais avec des centaines de nombres, et c’est le sens qui est « proche » ou « loin ».

Tunis [36.8, 10.2] Sfax [34.7, 10.8] Lisbonne [38.7, -9.1] Villes proches = coordonnées proches. Phrases proches = vecteurs proches.
Ville
2 nombres, un lieu sur la carte.
Phrase
384, 768, 1536… nombres, un point dans l’« espace du sens ».

2. Étape 1 : découper en tokens à essayer

Le modèle ne lit pas des lettres. Il découpe d’abord le texte en tokens (mots ou morceaux de mots), puis remplace chacun par un identifiant.

Simulation : vrais tokenizers (BPE…) découpent autrement, mais l’idée est la même. Les identifiants ici sont fictifs. Ce n’est pas encore l’embedding.

3. Étape 2 : chaque token a un vecteur appris

Les cases ci-dessous montrent 6 dimensions (rouge = négatif, bleu = positif). Regardez : chat et chien ont presque le même motif, voiture est très différente.

Pourquoi ? Chat et chien apparaissent dans les mêmes contextes (« Le ___ mange », « Le ___ dort »). Le modèle rapproche ce qui se ressemble par l’usage.

4. Étape 3 : un neurone fait un petit calcul à essayer

Le réseau est fait de milliers de neurones. Chacun calcule : z = x₁w₁ + x₂w₂ + x₃w₃ + b, puis applique une activation. Ici : w = [0.13, -0.27, 0.41], b = 0.10.

  1. Texte
  2. Tokens
  3. Vecteurs de tokens
  4. Couches de neurones (poids + biais)
  5. Embedding final
  6. Comparaison par similarité cosinus

5. Comment les poids sont appris à essayer

Départ : poids aléatoires. Puis on répète : prédire ➜ mesurer l’erreur ➜ ajuster ➜ recommencer, des millions de fois. Ici, le but est de rapprocher « chat » et « animal ».

chatanimal
Erreur (distance)

6. Mesurer la ressemblance : la similarité cosinus à essayer

On compare l’angle entre deux vecteurs : proche de 1 = même sens, proche de 0 = sans rapport, négatif = opposé. Formule : cos(A,B) = (A·B) / (‖A‖ × ‖B‖)

7. Cas réel : le moteur de votre chatbot à essayer

Le chatbot vectorise la question, la compare à toutes les réponses stockées, puis renvoie la meilleure. Choisissez une question :

Le modèle IA
Texte ➜ vecteur
Votre PHP
Vecteur A + vecteur B ➜ cosinus ➜ score

8. Les 3 pièges classiques

Piège 1 : « 0.82 = chat ».
Faux. Les dimensions sont distribuées : le sens vient de l’ensemble du vecteur, pas d’une case.
Piège 2 : « L’embedding est écrit à la main ».
Faux. Notre [0.9, 0.8, 0.7, 0.1] en PHP était fictif, uniquement pour montrer Texte ➜ Vecteur ➜ Comparaison. Les vraies valeurs (0.012, -0.084, 0.231…) sortent du modèle.
Piège 3 : « Un token = un mot ».
Faux. Un mot rare peut être coupé en plusieurs morceaux (voir l’outil de l’étape 2).

9. Le code côté PHP

Le modèle fait Texte ➜ vecteur. Votre code ne fait que la comparaison :

function cosine(array $a, array $b): float {
    $dot = $na = $nb = 0.0;
    foreach ($a as $i => $x) {
        $dot += $x * $b[$i];
        $na  += $x * $x;
        $nb  += $b[$i] * $b[$i];
    }
    return $dot / (sqrt($na) * sqrt($nb));
}
// $score = cosine($vecQuestion, $vecReponseEnBase);

10. Testez-vous

À retenir : les nombres d’un vecteur sont le résultat des calculs d’un réseau de neurones dont les poids ont été appris pendant l’entraînement. Textes proches ➜ vecteurs proches ➜ cosinus élevé.
Token
Morceau de texte (mot ou fragment) traité par le modèle.
Embedding
Vecteur qui représente le sens d’un texte.
Poids / biais
Paramètres appris par le réseau pendant l’entraînement.
Similarité cosinus
Score entre -1 et 1 mesurant la ressemblance entre deux vecteurs.