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

Réécrire une requête pour mieux chercher

Après cette leçon: Je peux réécrire une question pour qu’elle trouve davantage et vérifier, sur des sources connues, que la réécriture a aidé.

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

La question n’est pas la requête

Réécrire une requête, c’est changer une question avant de chercher avec elle, pour que la recherche trouve davantage. C’est utile parce que les gens tapent des questions courtes, vagues ou en deux parties, et qu’un index ne connaît que les mots qu’il contient.

« Comment me faire rembourser » ne partage aucun mot avec la page qui dit « remboursement ». « Et combien ? » ne partage que le petit mot « et » avec deux pages sans rapport.

À la fin de cette leçon

Remarque

Je peux réécrire une question pour qu’elle trouve davantage et vérifier, sur des sources connues, que la réécriture a aidé.

Mots clés

MotCe que ça veut dire
Requêtele texte que la recherche reçoit vraiment
Élargissementl’ajout de mots proches à une requête
Décompositioncouper une question en questions plus petites
Question de suiteune question qui n’a de sens qu’avec la conversation
Synonymeun autre mot pour la même idée
Source connuela page qu’une question de test doit trouver

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

Élargir ajoute les mots que la page emploie

Une page sur les remboursements dit « remboursement ». Une personne dit « récupérer mon argent ». L’élargissement ajoute des mots proches à la requête : « récupérer mon argent » devient « récupérer mon argent remboursement renvoyer ». Un tableau de synonymes le fait. Un modèle peut aussi en proposer.

Gardez les mots d’origine et ajoutez-en. Un élargissement qui remplace les mots de la personne peut perdre le seul mot exact qui comptait.

Deux parties, deux recherches

Prenez « Êtes-vous fermés le dimanche et puis-je renvoyer un colis ». Une seule recherche rend la page qui convient le mieux à une moitié. L’autre moitié se perd.

La décomposition coupe la question là où elle dit « et » et cherche chaque morceau. Ensuite on fusionne les listes, avec la fusion de la leçon 1.

Une suite a besoin de la conversation

« Et combien ? » ne veut rien dire seule. Joignez-la à la question d’avant, « puis-je renvoyer un colis », ou faites écrire par un modèle une question qui se comprend seule.

N’envoyez jamais toute la conversation : les longues requêtes dérivent. Ajoutez seulement la dernière question, et seulement quand la nouvelle est courte.

Une erreur courante

Attention

Beaucoup pensent qu’une réécriture aide toujours. Un synonyme peut faire trouver la mauvaise page, et un long historique peut écarter la requête de son but. Gardez un jeu de questions de test aux sources connues et comptez les réussites avant et après chaque changement.

É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 réécriveur, partie 1

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const docs = {' '  horaires: \"la boutique ouvre à neuf heures le samedi et ferme à treize heures\",' '  dimanche: \"la boutique est fermée le dimanche\",' '  retours: \"vous pouvez renvoyer un colis sous trente jours pour un remboursement\",' '  livraison: \"la livraison prend trois jours et coûte quatre euros\",' '};' 'const synonymes = { argent: [\"remboursement\", \"renvoyer\"] };' > reecrire1.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 réécriveur, partie 2

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function racine(m) { return m.length > 3 && m.endsWith(\"s\") ? m.slice(0, -1) : m; }' 'function mots(t) { return t.toLowerCase().replace(/[?,]/g, \"\").split(\" \").map(racine); }' 'function meilleur(q) {' '  const m = mots(q);' '  let id = \"rien\", haut = 0;' '  Object.keys(docs).forEach(function (k) {' '    const n = mots(docs[k]).filter(function (x) { return m.includes(x); }).length;' '    if (n > haut) { haut = n; id = k; }' '  });' '  return id;' '}' 'function elargir(q) {' '  const plus = [];' '  q.toLowerCase().split(\" \").forEach(function (m) {' '    (synonymes[m] || []).forEach(function (s) { plus.push(s); });' '  });' '  return q + \" \" + plus.join(\" \");' '}' >> reecrire1.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 réécriveur, partie 3

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const cas = [' '  { q: \"le samedi la boutique ouvre à quelle heure\", voulu: \"horaires\" },' '  { q: \"comment me faire rembourser mon argent\", voulu: \"retours\" },' '  { q: \"combien de jours dure la livraison\", voulu: \"livraison\" },' '];' 'let simple = 0, large = 0;' 'cas.forEach(function (c) {' '  const a = meilleur(c.q), b = meilleur(elargir(c.q));' '  if (a === c.voulu) simple++;' '  if (b === c.voulu) large++;' '  console.log(c.q + \" | simple : \" + a + \" | élargie : \" + b);' '});' 'console.log(\"réussites simple :\", simple, \"élargie :\", large, \"sur\", cas.length);' >> reecrire1.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 réécriveur, partie 4

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const deux = \"êtes-vous fermés le dimanche et puis-je renvoyer un colis\";' 'console.log(\"la question entière trouve :\", meilleur(deux));' 'console.log(\"la question coupée trouve :\", deux.split(\" et \").map(meilleur).join(\" + \"));' 'async function main() {' '  const texte = \"Avant : puis-je renvoyer un colis. Maintenant : combien de jours ai-je. Réécrivez la dernière question pour qu’elle se comprenne seule. Répondez par la question seule.\";' '  const reponse = await demander([{ role: \"user\", content: texte }], \"Combien de jours ai-je pour renvoyer un colis ?\", 40);' '  console.log(\"réécrite :\", reponse.texte.trim());' '  console.log(\"trouve :\", meilleur(reponse.texte));' '}' 'main();' >> reecrire1.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 compter les réussites

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

Ceci est une maquette

Le chercheur compte les mots communs dans quatre pages. Un vrai système cherche dans un vrai index. Le seul appel au modèle réécrit une question de suite, et le programme utilise une réécriture enregistrée quand aucun modèle ne répond.

La méthode ne change pas avec la taille : changer la requête, puis compter les réussites sur des sources connues.

Ce que le Run affiche

QuestionSimple trouveÉlargie trouve
le samedi la boutique ouvre à quelle heurehoraireshoraires
comment me faire rembourser mon argentrienretours
combien de jours dure la livraisonlivraisonlivraison

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.