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 ».
2 nombres, un lieu sur la carte.
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.
- Texte
- Tokens
- Vecteurs de tokens
- Couches de neurones (poids + biais)
- Embedding final
- 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 ».
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 :
Texte ➜ vecteur
Vecteur A + vecteur B ➜ cosinus ➜ score
8. Les 3 pièges classiques
Faux. Les dimensions sont distribuées : le sens vient de l’ensemble du vecteur, pas d’une case.
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.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
- 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.