Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Plongements et similarité cosinus

Après cette leçon: Je peux dire ce qu’est un plongement et comparer deux plongements avec la similarité cosinus.

Leçon de 60 min4 commandesLab agent de code IA : utiliser opencode pour expliquer et corriger du code, et vérifier son travail

La page qui ne partage aucun mot

Un plongement (en anglais embedding) est une liste de nombres qui représente le sens d’un texte. Deux textes de sens proche donnent deux listes qui pointent dans la même direction, et un programme peut alors comparer des sens avec du calcul.

Un visiteur de la médiathèque cherche « règles d’emprunt ». La page utile s’intitule « Conditions de prêt ». Les deux ne partagent aucun mot, donc une recherche par mots ne trouve rien. Les nombres, eux, peuvent la trouver.

À la fin de cette leçon

Remarque

Je peux dire ce qu’est un plongement et comparer deux plongements avec la similarité cosinus.

Mots-clés

MotCe que ça veut direExemple
Plongementune liste de nombres qui représente un sens
Vecteurune liste de nombres, vue comme un point ou une flèche
Produit scalairela somme des produits des nombres de même rang
Similarité cosinusun score qui dit si deux flèches pointent pareil0.98
Recherchetrouver les morceaux de texte qui correspondent à une question

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Vrais plongements et nos substituts

Un vrai plongement compte des centaines de nombres et vient d’un modèle. Rien dans ce module n’en fabrique.

Les leçons utilisent de petits substituts : des listes inventées de trois nombres, et des comptes de mots que le script calcule lui-même. Ainsi, chaque étape peut être lancée et vérifiée ici. La méthode reste la même.

Un vecteur est une liste de nombres

Imaginez une liste de nombres comme un point sur une carte. Deux nombres donnent un point sur une carte plate. Trois nombres donnent un point dans une pièce.

Donnez un sens à chaque place de la liste. Ici, les trois places sont animal, véhicule et nourriture. Un grand nombre veut dire que le mot parle beaucoup de cette chose.

Exemple travaillé : quatre vecteurs inventés

MotAnimalVéhiculeNourriture
chat0.90.10.1
chaton0.80.10.2
bus0.10.90.0
croissant0.10.00.9

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

La similarité cosinus note la ressemblance

Pour comparer deux vecteurs, il faut trois petites étapes. Le produit scalaire multiplie les nombres de même rang et les additionne. La longueur est la racine carrée du produit scalaire du vecteur avec lui-même.

Le cosinus est le produit scalaire divisé par les deux longueurs. Il vaut 1 si les flèches pointent pareil, 0 à angle droit et moins de 0 si elles s’éloignent.

Exemple travaillé : deux petits vecteurs

ÉtapeCalcul avec a = [1, 2] et b = [2, 1]Résultat
Produit scalaire1 x 2 + 2 x 14
Longueur de aracine carrée de (1 x 1 + 2 x 2)2,24
Longueur de bracine carrée de (2 x 2 + 1 x 1)2,24
Cosinus4 divisé par (2,24 x 2,24)0,8

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Écrire le calcul sous forme de boucle

Le script suivant contient les quatre vecteurs et écrit les trois étapes sous forme de petites fonctions. Il affiche le cosinus de chaque paire.

Il fabrique aussi un vecteur de comptes : une liste fixe de mots, et le nombre de fois que chacun apparaît dans une phrase. Deux phrases qui emploient les mêmes mots donnent des vecteurs qui pointent pareil.

Écrire le script des vecteurs, partie 1

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Petits vecteurs inventés : [animal, véhicule, nourriture]. Un vrai plongement a des centaines de nombres.' 'const vecteurs = {' '  chat: [0.9, 0.1, 0.1],' '  chaton: [0.8, 0.1, 0.2],' '  bus: [0.1, 0.9, 0.0],' '  croissant: [0.1, 0.0, 0.9],' '};' 'function produitScalaire(a, b) {' '  let total = 0;' '  for (let i = 0; i < a.length; i++) total = total + a[i] * b[i];' '  return total;' '}' 'function longueur(a) { return Math.sqrt(produitScalaire(a, a)); }' 'function cosinus(a, b) { return produitScalaire(a, b) / (longueur(a) * longueur(b)); }' > vec.js"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Écrire le script des vecteurs, partie 2

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const noms = Object.keys(vecteurs);' 'for (let i = 0; i < noms.length; i++) {' '  for (let j = i + 1; j < noms.length; j++) {' '    const score = cosinus(vecteurs[noms[i]], vecteurs[noms[j]]);' '    console.log(noms[i] + \" et \" + noms[j] + \" : \" + score.toFixed(2));' '  }' '}' '// Un vecteur de comptes : combien de fois chaque mot d’une liste fixe apparaît.' 'const vocabulaire = [\"ouvre\", \"tard\", \"livre\", \"amende\"];' 'function comptes(phrase) {' '  const trouves = phrase.toLowerCase().split(\" \");' '  return vocabulaire.map(function (mot) {' '    return trouves.filter(function (un) { return un === mot; }).length;' '  });' '}' >> vec.js"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Écrire le script des vecteurs, partie 3

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const un = comptes(\"ouvre tard ouvre\");' 'const deux = comptes(\"livre ouvre tard\");' 'console.log(\"Comptes :\", un.join(\" \"), \"et\", deux.join(\" \"));' 'console.log(\"Cosinus des comptes :\", cosinus(un, deux).toFixed(2));' >> vec.js"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Lancer le script et lire les scores

Commande
docker exec -w /home/node/project agent node vec.js

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Ce qu’il affiche

LigneCe qu’elle montre
chat et chaton : 0.99Très ressemblants
chat et bus : 0.22Peu ressemblants
bus et croissant : 0.01Presque rien en commun
Cosinus des comptes : 0.77Les phrases partagent les mots ouvre et tard

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Une erreur fréquente

Attention

Beaucoup de gens croient qu’un cosinus de 0,9 veut dire « identique à 90 % ». Ce n’est pas le cas. Le score sert seulement à classer : 0,9 est plus proche que 0,5. Servez-vous-en pour ordonner, jamais comme un pourcentage de vérité.

À propos de ce labo et de sa source: Lab agent de code IA : utiliser opencode pour expliquer et corriger du code, et vérifier son travail

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.