Demander une personne, et tourner en rond
Un client écrit : « Je veux parler à une personne. » Le robot répond : « Je peux vous aider ! » et repose la même question. Le client ferme l’appli et appelle le magasin.
Une bonne fonction sait quand s’arrêter. Passer le relais fait partie de la conception, ce n’est pas un échec.
À la fin de cette leçon
Remarque
Je peux concevoir le moment où une personne prend le relais.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Relais | le passage d’une conversation à une personne |
| Déclencheur | une règle qui lance le relais |
| Note de contexte | ce qu’on dit à la personne pour que personne ne répète |
| File | la liste des gens qui attendent une personne |
| Retour | le fait de rendre la conversation au modèle |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Quatre déclencheurs décident du relais
Écrivez les déclencheurs comme des règles, pour pouvoir les tester. Quatre sont courants. La personne l’a demandé. Le sujet est de ceux qu’un modèle ne doit pas trancher, comme un remboursement. La confiance du modèle est basse. La discussion a duré trop de tours.
Le premier doit toujours marcher. Personne ne devrait avoir à discuter avec une machine pour joindre quelqu’un.
La note et l’attente
La personne qui prend le relais ne doit pas demander au client de tout recommencer. Passez-lui une courte note : les motifs, le dernier message et le nombre de tours.
Dites au client combien de temps il attend, avec un vrai chiffre. Quand la personne a fini, décidez si la discussion retourne au modèle ou se termine.
Une erreur courante
Attention
Beaucoup pensent que passer le relais veut dire que la fonction a échoué, alors ils cachent le chemin vers une personne. C’est l’inverse. Un relais rapide et clair garde le client. Rendez la demande facile et envoyez le contexte avec.
É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 contrôleur de déclencheurs, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const REGLES = { maxTours: 6, confianceMin: 50, sujets: [\"remboursement\", \"reclamation\"] };' 'const DISCUSSIONS = [' ' { id: \"c1\", tours: 3, confiance: 90, sujet: \"horaires\", demande: false, dernier: \"Quand ouvrez-vous ?\" },' ' { id: \"c2\", tours: 4, confiance: 80, sujet: \"remboursement\", demande: false, dernier: \"Je veux être remboursé.\" },' ' { id: \"c3\", tours: 8, confiance: 40, sujet: \"livraison\", demande: false, dernier: \"Le colis n’est toujours pas arrivé.\" },' ' { id: \"c4\", tours: 2, confiance: 95, sujet: \"horaires\", demande: true, dernier: \"Passez-moi une personne.\" },' '];' > relais.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 contrôleur de déclencheurs, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function motifs(d) {' ' const sortie = [];' ' if (d.demande) sortie.push(\"demande\");' ' if (REGLES.sujets.includes(d.sujet)) sortie.push(\"sujet\");' ' if (d.confiance < REGLES.confianceMin) sortie.push(\"confiance\");' ' if (d.tours > REGLES.maxTours) sortie.push(\"tours\");' ' return sortie;' '}' >> relais.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 contrôleur de déclencheurs, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' for (const d of DISCUSSIONS) {' ' const pourquoi = motifs(d);' ' console.log(d.id + \" \" + (pourquoi.length > 0 ? \"passe la main \" + pourquoi.join(\"+\") : \"reste avec le modèle\"));' ' }' ' const n = DISCUSSIONS[2];' ' console.log(\"note \" + JSON.stringify({ id: n.id, motifs: motifs(n), dernier: n.dernier, tours: n.tours }));' ' const q = \"Écrivez une seule ligne courte qui dit à un client qu’une personne prend le relais et qu’il n’a rien à répéter.\";' ' const reponse = await demander([{ role: \"user\", content: q }], \"Une personne prend le relais. Vous n’avez rien à répéter.\", 30);' ' console.log(\"le client voit : \" + reponse.texte);' '}' 'main();' >> relais.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 contrôleur de déclencheurs
docker exec -w /home/node/project agent node relais.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.
Ce que le Run affiche
| Ligne | Ce qu’elle montre |
|---|---|
| c1 reste avec le modèle | Aucun déclencheur |
| c2 passe la main sujet | Un remboursement est un sujet pour une personne |
| c3 passe la main confiance+tours | Deux déclencheurs à la fois |
| c4 passe la main demande | Le client a demandé : toujours |
| note {"id":"c3",...} | Ce qu’on remet à la personne |
| le client voit : ... | Une phrase. Les mots changent à chaque Run |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.