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

Reclasser les résultats d’une recherche

Après cette leçon: Je peux réordonner une courte liste de résultats avec une seconde passe et dire si elle valait son coût.

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

La bonne page est la quatrième

Reclasser, c’est reprendre la courte liste qu’une recherche a rendue et la remettre dans un meilleur ordre, avec un examen plus attentif. C’est utile parce que la première passe est rapide et grossière, et que la page qui répond n’est pas toujours en tête.

Quelqu’un demande comment se faire rembourser. La page sur la politique de remboursement est quatrième, sous une page sur le paiement par carte. Un second regard la remonte.

À la fin de cette leçon

Remarque

Je peux réordonner une courte liste de résultats avec une seconde passe et dire si elle valait son coût.

Mots clés

MotCe que ça veut dire
Première passela recherche rapide sur tout l’index
Seconde passeun examen plus lent des premiers résultats
Reclasseurce qui note de nouveau la courte liste
Candidatun résultat que la seconde passe peut réordonner
Plafond de rappelle mieux possible, fixé par la première passe
Réussite au rang kla part des questions dont la source est dans les k premiers

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

Une passe large, puis une passe étroite

Examiner chaque page de près serait trop lent. La recherche travaille donc en deux passes. La première passe est bon marché et large : elle réduit des millions de pages à quelques dizaines. La seconde passe est lente et étroite : elle ne lit que celles-là.

Les chiffres ci-dessous sont inventés, mais la forme est réelle : un examen attentif n’est abordable que sur une courte liste.

Exemple détaillé : ce que coûte chaque passe

PassePages examinéesTemps par pageTemps total
Première passe1 000 0000,00002 ms20 ms
Seconde passe205 ms100 ms
Seconde passe sur tout1 000 0005 ms5 000 secondes

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

Un reclasseur peut être une simple règle

Un reclasseur, c’est ce qui note de nouveau la courte liste. Ce peut être un modèle entraîné, un modèle de langage ou une règle que vous écrivez. La règle du Run donne 3 points pour un mot de la requête dans le titre et 1 pour un mot dans le corps.

Un reclasseur par modèle de langage lit de plus près, mais coûte un appel, des jetons et du temps à chaque requête. Commencez par une règle et mesurez.

Une erreur courante

Attention

Beaucoup pensent qu’un reclasseur peut trouver des pages que la première passe a ratées. C’est faux. Il ne fait que réordonner ce qu’on lui donne : la première passe fixe le plafond. Si la réponse n’est pas dans les 20 premiers, aucune seconde passe ne la montrera.

Écrire l’assistant du modèle, partie 1

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' '// Les jetons d’une réponse, ou null si elle n’en donne pas.' 'function compter(donnees, nom) {' '  return donnees.usage && typeof donnees.usage[nom] === \"number\" ? donnees.usage[nom] : null;' '}' > model.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 l’assistant du modèle, partie 2

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function demander(messages, echantillon, max) {' '  try {' '    const res = await fetch(base + \"/v1/chat/completions\", {' '      method: \"POST\",' '      headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' '      body: JSON.stringify({ model: \"lab\", messages: messages, max_tokens: max || 100 }),' '      signal: AbortSignal.timeout(30000),' '    });' '    if (res.ok === false) throw new Error(\"statut \" + res.status);' '    const d = await res.json();' '    return { texte: d.choices[0].message.content, entree: compter(d, \"prompt_tokens\"), sortie: compter(d, \"completion_tokens\"), enregistre: false };' '  } catch (erreur) {' '    console.log(\"Échantillon enregistré : aucun modèle n’a répondu (\" + erreur.message + \").\");' '    return { texte: echantillon, entree: null, sortie: null, enregistre: true };' '  }' '}' 'module.exports = { demander };' >> model.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 reclasseur, partie 1

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const requete = [\"remboursement\", \"argent\", \"retour\"];' 'const trouves = [' '  { id: \"c1\", titre: \"Payer par carte ou par virement\", corps: \"votre argent quitte votre compte quand vous payez\" },' '  { id: \"c2\", titre: \"Délais de remboursement\", corps: \"votre argent est de retour sous cinq jours\" },' '  { id: \"c3\", titre: \"Suivre un colis avec le numéro de commande\", corps: \"saisissez le numéro pour voir où il se trouve\" },' '  { id: \"c4\", titre: \"Politique de remboursement : argent rendu après retour\", corps: \"renvoyez un colis sous trente jours et demandez votre remboursement\" },' '  { id: \"c5\", titre: \"Changer l’adresse courriel\", corps: \"ouvrez votre compte et modifiez l’adresse\" },' '];' > reclasser1.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 reclasseur, partie 2

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function compter(texte) {' '  const m = texte.toLowerCase().split(\" \");' '  return requete.filter(function (q) { return m.includes(q); }).length;' '}' 'function points(c) { return 3 * compter(c.titre) + compter(c.corps); }' 'function ids(liste) { return liste.map(function (c) { return c.id; }).join(\" \"); }' >> reclasser1.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 reclasseur, partie 3

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  console.log(\"première passe :\", ids(trouves));' '  const seconde = trouves.slice().sort(function (a, b) { return points(b) - points(a); });' '  console.log(\"seconde passe :\", seconde.map(function (c) { return c.id + \"=\" + points(c); }).join(\" \"));' '  console.log(\"passages lus par la seconde passe :\", trouves.length);' '  const haut = seconde.slice(0, 3);' '  const lignes = haut.map(function (c, i) { return (i + 1) + \". \" + c.titre; });' '  const consigne = \"Quel passage répond à : comment me faire rembourser ? Répondez par un seul numéro. \" + lignes.join(\" \");' '  const reponse = await demander([{ role: \"user\", content: consigne }], \"1\", 5);' '  const choix = Number(reponse.texte.trim().charAt(0));' '  console.log(\"le modèle choisit :\", choix >= 1 && choix <= 3 ? haut[choix - 1].id : \"pas de choix clair\");' '}' 'main();' >> reclasser1.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 et comparer les ordres

Commande
docker exec -w /home/node/project agent node reclasser1.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.

Quand une seconde passe ne vaut rien

Mesurez le taux de réussite aux premières places avant et après. S’il bouge à peine, laissez la passe de côté. Faites de même quand la première passe a déjà raison, quand la liste est courte, ou quand le délai dépasserait votre budget de latence.

Le Run est une maquette : cinq candidats enregistrés et une règle. Un vrai système utilise un vrai index et un vrai modèle.

Une sortie possible

LigneCe qu’elle montre
première passe : c1 c2 c3 c4 c5L’ordre enregistré de la première passe
seconde passe : c4=10 c2=5 c1=1 ...La règle remonte c4 en tête
passages lus par la seconde passe : 5Le coût, compté en passages
le modèle choisit : c4Un choix réel, ou un échantillon enregistré

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

À 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.