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
| Mot | Ce que ça veut dire |
|---|---|
| Requête | le texte que la recherche reçoit vraiment |
| Élargissement | l’ajout de mots proches à une requête |
| Décomposition | couper une question en questions plus petites |
| Question de suite | une question qui n’a de sens qu’avec la conversation |
| Synonyme | un autre mot pour la même idée |
| Source connue | la 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
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
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
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
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
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
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
docker exec -w /home/node/project agent node reecrire1.jsAffiché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
| Question | Simple trouve | Élargie trouve |
|---|---|---|
| le samedi la boutique ouvre à quelle heure | horaires | horaires |
| comment me faire rembourser mon argent | rien | retours |
| combien de jours dure la livraison | livraison | livraison |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.