Prompt, recherche ou ajustement fin : comment choisir
Trois moyens changent le comportement d’une fonction adossée à un modèle : un meilleur prompt, la recherche documentaire et l’ajustement fin (fine-tuning). La recherche documentaire s’appelle aussi RAG, pour « génération augmentée par la recherche ». Ils corrigent des problèmes différents et coûtent très inégalement. C’est important, car les équipes choisissent souvent d’abord le plus cher.
Une équipe d’assistance veut des réponses dans le ton de la maison, d’après le tarif de cette semaine, dans un format fixe. Ce sont trois besoins, qui n’ont peut-être pas la même solution.
À la fin de cette leçon
Remarque
Je peux choisir entre un meilleur prompt, la recherche et l’ajustement fin pour un besoin.
Mots-clés
| Mot | Ce que ça veut dire |
|---|---|
| Prompt | les consignes et exemples envoyés avec un appel |
| Recherche | aller chercher des documents et les envoyer avec l’appel |
| Ajustement fin | entraîner encore un modèle sur vos exemples |
| Exemple d’entraînement | une entrée associée à la sortie voulue |
| Connaissance | les faits dont dépend la réponse |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
L’ajustement fin n’est pas lancé ici
Attention
Le labo ne peut pas ajuster finement un modèle. Cette leçon est un exercice de décision. Elle donne les questions à poser et une règle d’enseignement. Elle n’affirme pas ce qu’un ajustement fin vous apporterait : mesurez-le sur vos propres cas.
Demandez quelle sorte de problème c’est
Posez quatre questions dans l’ordre. La réponse dépend-elle de faits privés ou changeants ? Le modèle échoue-t-il sur la forme, comme le ton ou le format ? Avez-vous essayé un prompt clair avec des exemples ? Avez-vous assez d’exemples et un moyen de mesurer ?
Les faits mènent à la recherche. La forme mène d’abord au prompt, et à l’ajustement fin seulement quand le prompt échoue et que les exemples existent.
Exemple travaillé : cinq besoins
| Besoin | Première question | Premier pas probable |
|---|---|---|
| Un ton aimable | Un prompt avec exemples échoue-t-il ? | Prompt, puis ajustement fin s’il échoue et que les exemples existent |
| Des prix qui changent chaque semaine | Les faits changent-ils ? | Recherche : des faits ajustés vieillissent |
| Un format de sortie strict | Des exemples peuvent-ils le montrer ? | Prompt, avec un contrôle qui analyse la sortie |
| Des réponses tirées de notices privées | Les faits sont-ils privés ? | Recherche, avec les sources affichées |
| Un coût par appel plus bas | Quelle est la taille du prompt ? | Mesurer d’abord : un prompt plus court ou un modèle plus petit |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Coût et limites de chaque choix
Un prompt se change à bas prix et s’annule facilement, mais il consomme des jetons à chaque appel. La recherche ajoute un stockage et une recherche, et échoue quand la recherche rate. L’ajustement fin demande des exemples, un entraînement et un nouveau modèle à entretenir, et il ne garde pas les faits à jour.
Aucun ne corrige une exigence manquante ni une mauvaise évaluation. Écrivez d’abord les cas qui décident du succès.
Une erreur fréquente
Attention
Beaucoup pensent que l’ajustement fin apprend de nouveaux faits à un modèle. Il façonne surtout le style et le format. Les faits qui changent relèvent de la recherche, où l’on met un document à jour et où la réponse change le jour même.
Écrire l’aide 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\";' '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 || 200 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"statut \" + res.status);' ' return (await res.json()).choices[0].message.content;' > 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’aide du modèle, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' } catch (erreur) {' ' console.log(\"Échantillon enregistré : aucun modèle n’a répondu (\" + erreur.message + \").\");' ' const liste = [].concat(echantillon);' ' const tour = messages.filter(function (m) { return m.role === \"assistant\"; }).length;' ' return liste[Math.min(tour, liste.length - 1)];' ' }' '}' '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 la règle de décision, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const cas = [' ' { besoin: \"un ton aimable\", docsPrives: false, faitsChangent: false, promptEchoue: true, exemples: 800 },' ' { besoin: \"des prix qui changent chaque semaine\", docsPrives: false, faitsChangent: true, promptEchoue: false, exemples: 0 },' ' { besoin: \"un format de sortie strict\", docsPrives: false, faitsChangent: false, promptEchoue: false, exemples: 40 },' ' { besoin: \"des réponses tirées de nos notices\", docsPrives: true, faitsChangent: false, promptEchoue: true, exemples: 60 },' ' { besoin: \"un coût par appel plus bas\", docsPrives: false, faitsChangent: false, promptEchoue: false, exemples: 0 },' '];' > decide.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 la règle de décision, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function choisir(c) {' ' const recherche = c.docsPrives || c.faitsChangent;' ' const ajuster = c.promptEchoue && c.exemples >= 500;' ' if (recherche && ajuster) return \"recherche et ajustement\";' ' if (recherche) return \"recherche\";' ' if (ajuster) return \"ajustement\";' ' if (c.promptEchoue) return \"collecter des exemples\";' ' return \"prompt\";' '}' 'cas.forEach(function (c) { console.log(c.besoin + \" :\", choisir(c)); });' >> decide.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 la règle de décision, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const texte = \"Répondez uniquement en JSON avec les clés produit et prix pour : Vélo, 120 euros.\";' ' const echantillon = JSON.stringify({ produit: \"Vélo\", prix: 120 });' ' const reponse = await demander([{ role: \"user\", content: texte }], echantillon, 40);' ' let valide = true;' ' try { JSON.parse(reponse); } catch (erreur) { valide = false; }' ' console.log(\"Le prompt d’abord :\", reponse);' ' console.log(\"JSON valide :\", valide);' '}' 'main();' >> decide.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.
Appliquer la règle à cinq cas
docker exec -w /home/node/project agent node decide.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.
La règle est une règle d’enseignement
Le Run applique une règle facile à lire, pas une mesure. Le seuil de 500 exemples est un nombre inventé pour l’exercice. Votre propre seuil vient de vos cas et de votre évaluation.
L’appel réel essaie d’abord l’étape la moins chère : un prompt qui demande du JSON, puis une analyse pour le contrôler.
Une sortie possible
| Ligne | Ce qu’elle montre |
|---|---|
| un ton aimable : ajustement | Le prompt a échoué et 800 exemples existent |
| des prix qui changent chaque semaine : recherche | Les faits changent |
| un coût par appel plus bas : prompt | Rien n’a échoué : mesurez d’abord le prompt |
| JSON valide | true ou false : la réponse a été analysée, pas lue |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.