Prompt engineering, mesuré : ce qui change la sortie
Soixante tickets, les mêmes mots en six ordres, et une exactitude de 26,7 % à 85,0 %. Puis quatre astuces web avec marges d’erreur.
Dans cet article
Voici un ticket d’assistance, et quatre files vers lesquelles il pourrait être orienté.
The label on the parcel has my old surname on it.
-> billing / technical / shipping / accountPour le router, il vous faut trois éléments dans le prompt : les définitions des files, le ticket, et l’instruction de choisir une file. Trois blocs. Il existe six ordres dans lesquels vous pouvez les placer, et les blocs contiennent exactement les mêmes caractères dans les six cas.
Sur soixante tickets dont la réponse est connue, les six ordres obtiennent entre 26,7 % et 55,0 %. Déplacez les deux mêmes blocs hors du tour utilisateur et dans le tour système, sans changer un seul mot, et le même modèle obtient 76,7 %. Encadrez le ticket dans une balise de style XML et il atteint 85,0 %.
Rien dans le modèle n’a changé. Rien dans la tâche n’a changé. Pas un seul mot n’a été réécrit. Un écart de cinquante-huit points est sorti de l’agencement du même texte.
C’est la raison d’être de ce chapitre, et c’est aussi la raison pour laquelle c’est le sujet le plus infesté de pensée magique dans le domaine. Les effets sont réels et importants, ce qui donne à chaque anecdote l’impression d’être confirmée ; et ils sont instables d’un modèle et d’une tâche à l’autre, ce qui signifie qu’une anecdote est à peu près tout ce que la plupart des conseils seront jamais. Ce chapitre a donc une règle, et tout ce qu’il contient lui est subordonné :
Un prompt se mesure, il ne se débat pas. Quatre variantes sur vingt cas ne distinguent rien du tout.
Le prompt est l’état entier
Lien vers la section : Le prompt est l’état entierAvant les mesures, un fait qui explique discrètement la moitié de ce qui suit.
Le modèle n’a pas de mémoire. Entre deux appels, il ne conserve rien — ni votre dernière question, ni sa propre dernière réponse, ni le fichier que vous avez joint, ni le fait que vous l’ayez déjà demandé deux fois. Chaque appel démarre depuis une machine vide, et la seule chose que cette machine connaît est la séquence de tokens que vous venez de lui fournir.
Ce qui ressemble à de la mémoire dans une interface de chat, c’est votre client qui renvoie toute la conversation, chaque tour, depuis le début. Le modèle relit tout depuis zéro, à chaque fois. Le chapitre 13 a mesuré ce que cette relecture coûte dans une passe avant ; le chapitre 16 en fait une ligne sur une facture. Ce qui compte ici, c’est la conséquence pour la conception : le prompt n’est pas un message adressé à un système qui a un état. Il est l’état.
Cela met fin à toute une famille de confusions. « Le modèle a oublié ce que je lui ai dit » signifie généralement que cela ne lui a jamais été envoyé. « Il a ignoré mon instruction précédente » signifie généralement que l’instruction est sortie de la fenêtre quand l’historique a été tronqué. « Il s’est comporté différemment en production » signifie généralement que la production assemble un prompt différent de celui que vous avez testé. Aucun de ces cas n’est un problème de modèle, et aucun ne se corrige en reformulant quoi que ce soit.
Le banc d’essai
Lien vers la section : Le banc d’essaiAffirmer que « ce prompt est meilleur » revient à faire une affirmation sur une distribution, et vous ne pouvez pas voir une distribution en regardant une seule sortie. Ce qu’il vous faut est ennuyeux : des cas dont les réponses sont connues, N variantes et un intervalle.
Le harness tient en cinquante lignes de TypeScript et a la même forme que le client du chapitre 14 — une requête, une échéance, un peu de concurrence, un comptage. Il réapparaît au chapitre 19 pour évaluer un retriever et au chapitre 29 comme jeu de référence.
export type Case = { input: string; expected: string };
export type Variant = { name: string; build: (c: Case) => ChatMessage[] };
async function pooled<T, R>(xs: T[], n: number, f: (x: T) => Promise<R>) {
const out: R[] = new Array(xs.length);
let i = 0;
await Promise.all(
Array.from({ length: n }, async () => {
while (i < xs.length) {
const k = i++;
out[k] = await f(xs[k]);
}
}),
);
return out;
}
export async function runVariant(v: Variant, cases: Case[], concurrency = 6) {
const hits = await pooled(cases, concurrency, async (c) => {
const answer = await complete(v.build(c));
return answer.trim().toLowerCase() === c.expected;
});
return { name: v.name, hits, k: hits.filter(Boolean).length, n: cases.length };
}Le nombre qui revient n’est pas le résultat. Le résultat, c’est ceci :
/** 95 % Wilson score interval for a proportion. Chapter 4 derives it. */
export function wilson(k: number, n: number, z = 1.96) {
const p = k / n;
const d = 1 + (z * z) / n;
const centre = (p + (z * z) / (2 * n)) / d;
const half = (z * Math.sqrt((p * (1 - p)) / n + (z * z) / (4 * n * n))) / d;
return [Math.max(0, centre - half), Math.min(1, centre + half)] as const;
}Le chapitre 4 a posé l’argument, et ce chapitre l’encaisse. Dix-sept bonnes réponses sur vingt, c’est 85 %, et son intervalle à 95 % va de 64 % à 95 %. Une variante qui obtient 13 sur 20 — 65 %, ce qui semble clairement moins bon — a un intervalle de 43 % à 82 %. Ces deux intervalles se chevauchent sur presque toute leur longueur. Vingt cas ne peuvent pas distinguer un bon prompt d’un prompt médiocre, et la plupart des conseils publiés sur les prompts ont été validés sur moins que cela.
Soixante cas, comme dans ce chapitre, ce n’est toujours pas beaucoup. C’est assez pour voir de grands effets et assez honnête pour admettre quand cela ne permet pas de voir les petits — et cela l’admettra plusieurs fois ci-dessous.
Position : les mêmes mots, six ordres
Lien vers la section : Position : les mêmes mots, six ordresTrois blocs — les règles R, le ticket T, l’instruction I — concaténés dans un seul message utilisateur. Les six permutations, contenu identique au byte près, soixante cas chacune.
| ordre des trois blocs | correct | exactitude, Wilson 95 % |
|---|---|---|
| règles, instruction, ticket | 33/60 | 55,0 % [42,5, 66,9] |
| règles, ticket, instruction | 30/60 | 50,0 % [37,7, 62,3] |
| ticket, règles, instruction | 22/60 | 36,7 % [25,6, 49,3] |
| instruction, ticket, règles | 21/60 | 35,0 % [24,2, 47,6] |
| instruction, règles, ticket | 17/60 | 28,3 % [18,5, 40,8] |
| ticket, instruction, règles | 16/60 | 26,7 % [17,1, 39,0] |
Du meilleur au pire, l’écart est de 28,3 points, et les intervalles ne se chevauchent pas : ce n’est donc pas une histoire de bruit. Puisque chaque bras est noté sur les mêmes soixante éléments, la question plus précise est la question appariée : parmi les cas où deux bras ne sont pas d’accord, à quel point le partage est-il déséquilibré ? Passer du pire ordre au meilleur a fait basculer 21 cas de faux à vrai et 4 de vrai à faux — probabilité appariée exacte : 0,0009.3
Lisez le tableau pour sa forme plutôt que pour son vainqueur. Les deux meilleures lignes se terminent par le ticket ; les deux pires enterrent l’instruction au milieu ou la traînent après les données. C’est le même phénomène que Liu et al. ont nommé Lost in the Middle : le contenu placé aux bords d’un prompt est utilisé plus fiablement que celui placé au centre.4 Le chapitre 16 chiffre le coût de la fenêtre et le chapitre 24 mesure correctement l’effet en longueur, là où le milieu s’effondre comme décrit et où la récupération tout à la fin ne réapparaît pas. Ici, la règle pratique tombe d’elle-même : la tâche en haut, les données en bas, rien d’important au milieu.
Déplaçons maintenant les mêmes mots entre les tours. Le chapitre 11 a établi que le chat template n’est pas une décoration autour du modèle mais une partie de celui-ci — <|im_start|>system et <|im_start|>user sont de vrais tokens que le modèle a vus des millions de fois pendant le fine-tuning, exactement à ces positions. Il devrait donc être important de savoir de quel côté de ces marqueurs votre instruction atterrit, et c’est bien le cas :
| emplacement des mêmes mots | correct | exactitude, Wilson 95 % |
|---|---|---|
| règles et instruction dans le tour système, ticket seul dans le tour utilisateur | 46/60 | 76,7 % [64,6, 85,6] |
| règles dans le tour système, instruction et ticket dans le tour utilisateur | 44/60 | 73,3 % [61,0, 82,9] |
| règles et instruction dans le tour système, instruction répétée après le ticket | 42/60 | 70,0 % [57,5, 80,1] |
| les trois blocs dans un seul tour utilisateur | 33/60 | 55,0 % [42,5, 66,9] |
Déplacer les règles et l’instruction à travers la frontière du template a rapporté 21,7 points — 19 cas gagnés, 6 perdus, probabilité appariée 0,0146 — sans en changer un seul caractère. C’est la réponse concrète à system prompt versus user prompt : ce ne sont pas deux façons de dire la même chose. Ce sont deux positions de tokens différentes dans une structure sur laquelle le modèle a été entraîné, et la position système est celle où doivent aller les instructions qui s’appliquent à toute la conversation.
Remarquez aussi la troisième ligne. Répéter l’instruction après le ticket — une astuce largement recommandée — a obtenu un score inférieur à une instruction énoncée une seule fois. Sur ce modèle, sur cette tâche, le dire deux fois était pire que le dire une fois.
Délimiteurs, et la leçon statistique qu’ils cachent
Lien vers la section : Délimiteurs, et la leçon statistique qu’ils cachentMême prompt, meilleur placement, soixante cas. La seule chose qui change est ce qui entoure le texte du ticket.
| délimitation du ticket | correct | exactitude, Wilson 95 % |
|---|---|---|
| une balise de style XML | 51/60 | 85,0 % [73,9, 91,9] |
| rien du tout | 48/60 | 80,0 % [68,2, 88,2] |
| un titre Markdown | 47/60 | 78,3 % [66,4, 86,9] |
une étiquette, Ticket: | 46/60 | 76,7 % [64,6, 85,6] |
| des clôtures avec dièses | 45/60 | 75,0 % [62,8, 84,2] |
| des triples backticks | 44/60 | 73,3 % [61,0, 82,9] |
| des guillemets doubles | 40/60 | 66,7 % [54,1, 77,3] |
Dix-huit points d’écart dus à la ponctuation. Mais regardez les deux intervalles extrêmes : [73,9, 91,9] et [54,1, 77,3]. Ils se chevauchent. Selon la lecture grossière — comparez les barres d’erreur, et si elles se touchent, ne dites rien — ce tableau ne prouve absolument rien.
La lecture grossière est fausse ici, et comprendre pourquoi vaut plus que le tableau. Chaque variante a été notée sur les mêmes soixante tickets, les deux mesures ne sont donc pas des échantillons indépendants ; elles sont appariées. La majeure partie de la largeur de chaque intervalle vient d’une source d’incertitude partagée par les deux bras — le fait que ces soixante tickets soient ou non représentatifs — et cette source s’annule quand vous les comparez entre eux. Posez plutôt la question appariée, et la réponse est nette : passer des guillemets doubles à la balise XML a fait basculer 12 cas de faux à vrai et 1 de vrai à faux, probabilité appariée 0,0034. C’est une vraie différence.
Puis le même test dégonfle le titre. La balise XML a battu l’étiquette simple Ticket: de 8,3 points, le nombre qu’un article de blog mettrait dans son titre. Apparié : 6 gagnés, 1 perdu, probabilité 0,1250. Non établi. Sept cas : voilà sur quoi repose cette amélioration célèbre.
Il y a donc deux questions avec deux instruments différents, et les confondre est la façon dont les conseils de prompt se trompent dans les deux sens à la fois :
Quelle est la qualité de ce prompt ? L’intervalle de Wilson sur sa propre exactitude. Large, sauf si vous avez des centaines de cas. C’est le nombre que vous communiquez à quelqu’un qui décide s’il faut livrer.
B est-il meilleur que A ? Le test apparié sur les cas où ils divergent. Beaucoup plus sensible, parce que la difficulté partagée de l’ensemble s’annule. C’est le nombre que vous utilisez pour décider entre deux candidats.
Le constat général — les modèles sont fortement et imprévisiblement sensibles à des choix de formatage sans contenu sémantique — n’est pas nouveau. Sclar et al. n’ont fait varier que les séparateurs, l’espacement et la casse sur des dizaines de tâches, et ont trouvé des écarts d’exactitude assez larges pour inverser des classements de modèles publiés.5 La conséquence pratique n’est pas « utilisez des balises XML ». C’est que le formatage est un hyperparamètre, qu’il ne coûte rien à balayer, et que toute comparaison de deux modèles qui fige un format compare les formats autant que les modèles.
Combien d’exemples suffisent vraiment
Lien vers la section : Combien d’exemples suffisent vraimentL’in-context learning — montrer au modèle des exemples résolus dans le prompt et le laisser généraliser à partir d’eux sans aucune mise à jour des poids — est la capacité qui a rendu GPT-3 célèbre.6 La question pratique n’est jamais de savoir si cela fonctionne. C’est de savoir combien d’exemples payer.
Les exemples sont fournis comme de vrais tours précédents, alternant utilisateur et assistant, parce que c’est la structure sur laquelle le template a été entraîné. Chaque k a été exécuté avec cinq tirages aléatoires différents depuis un pool distinct de seize tickets étiquetés :
| exemples | exactitude moyenne | pire et meilleur tirage | écart entre tirages |
|---|---|---|---|
| 0 | 76,7 % | — | — |
| 1 | 78,7 % | 78,3 – 80,0 % | 1,7 point |
| 2 | 83,7 % | 80,0 – 86,7 % | 6,7 points |
| 4 | 81,7 % | 78,3 – 86,7 % | 8,3 points |
| 8 | 83,7 % | 78,3 – 88,3 % | 10,0 points |
| 16 | 89,3 % | 85,0 – 93,3 % | 8,3 points |
Deux exemples ont rapporté sept points. Les six exemples suivants n’ont rien rapporté de mesurable — 83,7, puis 81,7, puis 83,7, une séquence qui se promène dans son propre bruit. Seize en ont rapporté encore cinq et demi. La courbe n’est pas une montée régulière ; c’est une marche, un plateau et une marche.
La colonne la plus importante est la dernière. À k = 8, les huit exemples que vous avez par hasard choisis ont déplacé l’exactitude de 10 points — plus que tout le gain obtenu en passant de deux exemples à huit. Et la dernière ligne en est la version la plus nette : à k = 16, le pool est épuisé, donc les cinq exécutions contiennent exactement les mêmes seize exemples, ne différant que par leur ordre d’apparition. L’ordre seul a déplacé l’exactitude de 8,3 points.
C’est le résultat rapporté par Lu et al., et il survit partout où on l’a cherché : l’ordre des exemples est un véritable hyperparamètre, avec des effets comparables au nombre d’exemples.7 Le conseil honnête sur le few-shot prompting n’est donc pas un nombre. C’est ceci :
Commencez à zéro et n’ajoutez des exemples que face à une mesure
Lien vers la section : Commencez à zéro et n’ajoutez des exemples que face à une mesureLes deux premiers en valent généralement la peine. Au-delà, vous devinez, et cette supposition coûte des tokens à chaque appel, pendant toute la vie du produit.
Traitez la sélection comme une partie du prompt
Lien vers la section : Traitez la sélection comme une partie du promptDeux exemples bien choisis battent huit exemples choisis négligemment. Si vos exemples viennent du haut d’une feuille de calcul, c’est cette variable qu’il faut balayer avant d’en ajouter davantage.
Balayez l’ordre, une fois, puis figez-le
Lien vers la section : Balayez l’ordre, une fois, puis figez-leC’est gratuit, c’est un effet réel, et contrairement à la plupart de ce chapitre, cela n’exige pas de réécriture pour être essayé.
Vérifiez l’équilibre des classes
Lien vers la section : Vérifiez l’équilibre des classesQuatre exemples portant tous la même étiquette enseignent au modèle l’étiquette, pas la tâche. L’effondrement de ce modèle sur la file listée en dernier est le même échec sous un autre costume.
Quatre phrases venues d’internet
Lien vers la section : Quatre phrases venues d’internetPassons au folklore. Chacune de ces phrases est une seule phrase ajoutée au début d’un system prompt par ailleurs identique, sur les mêmes soixante cas.
| phrase ajoutée au system prompt | correct | exactitude, Wilson 95 % | apparié contre la référence |
|---|---|---|---|
| rien d’ajouté | 46/60 | 76,7 % [64,6, 85,6] | — |
| « Respirez profondément et travaillez soigneusement sur ce problème. » | 47/60 | 78,3 % [66,4, 86,9] | +4 / −3, p = 1,000 |
| « C’est très important pour ma carrière. » | 46/60 | 76,7 % [64,6, 85,6] | +5 / −5, p = 1,000 |
| « Vous êtes un expert mondial des opérations de support client avec vingt ans d’expérience. » | 42/60 | 70,0 % [57,5, 80,1] | +3 / −7, p = 0,344 |
| « Je vous donnerai $200 de pourboire si vous répondez correctement. » | 41/60 | 68,3 % [55,8, 78,7] | +1 / −6, p = 0,125 |
| « Vous serez pénalisé pour chaque ticket que vous envoyez vers la mauvaise file. » | 25/60 | 41,7 % [30,1, 54,3] | +3 / −24, p < 0,001 |
Quatre des cinq n’ont rien fait. Pas « un peu » ; rien que soixante cas appariés puissent voir. La persona d’expert et le pot-de-vin ont tous deux obtenu un score inférieur à la référence intacte, et même ces baisses échouent au test apparié — c’est du bruit orienté vers le bas.
La troisième ligne est celle sur laquelle s’attarder. « C’est très important pour ma carrière » a produit exactement la même exactitude, 46 sur 60 — et dix des soixante réponses ont changé, cinq dans chaque direction. La statistique synthétique était identique, mais pas le comportement. Si votre évaluation est un seul nombre sur un petit ensemble, un changement qui réécrit un sixième de vos sorties peut ressembler à un changement qui n’a rien fait, et vous le livrerez en croyant qu’il était gratuit.
Puis vient la menace, seule phrase à avoir fait bouger l’aiguille, et à l’avoir fait bouger de 35 points vers le bas, faisant basculer 24 cas de vrai à faux. Ce n’est pas un artefact d’arrondi ; c’est un comportement de modèle différent. La leçon n’est pas « ne menacez jamais un modèle ». C’est que le cadrage émotionnel n’est pas inerte. Il déplace la distribution, parfois fortement, dans une direction que personne ne peut prédire en lisant la phrase — précisément pourquoi il doit être mesuré plutôt que raisonné.
Une réserve que ce chapitre vous doit : ces cinq phrases ont été testées sur un petit modèle et une tâche. Certaines ont un soutien publié ailleurs — « respirez profondément » vient d’un article qui a cherché des instructions à score élevé plutôt que de les inventer, ce qui est une affirmation différente et meilleure que celle qui a circulé ensuite.8 Ce qui se généralise, ce ne sont pas les phrases. C’est que la liste qui survit dans les articles de blog et la liste qui survit à la mesure sont deux listes différentes, et que la seule façon de savoir laquelle vous avez entre les mains est d’exécuter le banc.
Pourquoi « ne pas » échoue
Lien vers la section : Pourquoi « ne pas » échoueUne règle que tout le monde répète — dites ce que vous voulez, pas ce que vous ne voulez pas — avec l’absence habituelle de nombre. Voici le nombre. La même exigence de format, écrite de trois façons, avec le modèle qui génère librement pour que la conformité puisse être observée :
| rédaction de la règle de format | la sortie était exactement un mot autorisé | tokens de sortie moyens |
|---|---|---|
| « Répondez avec un mot. » | 10/60 (16,7 %) | 2,6 |
| « Ne vous expliquez pas. N’écrivez pas de phrase. N’ajoutez pas de ponctuation. » | 1/60 (1,7 %) | 14,0 |
| les deux ensemble | 41/60 (68,3 %) | 2,3 |
Trois interdictions ont fait pire qu’une instruction, et ont poussé le modèle à écrire cinq fois plus de texte — l’exact opposé des trois à la fois. Réintroduire la phrase positive l’a sauvé jusqu’à 68 %.
Le mécanisme n’a rien de mystérieux si vous vous souvenez du chapitre 8. Le modèle choisit un prochain token dans une distribution conditionnée par tout ce qui le précède, et une interdiction met la chose interdite dans ce conditionnement. Il n’existe pas d’opérateur de négation ; il existe un contexte dans lequel un mot apparaît désormais.
Cela se mesure directement. Prenez le prompt de référence et ajoutez une ligne : Do not use the shipping queue for software problems. Puis regardez uniquement les quarante-cinq tickets qui ne sont pas des tickets d’expédition :
shipping choisi | probabilité moyenne sur shipping | exactitude globale | |
|---|---|---|---|
| référence | 11,1 % des 45 cas | 0,131 | 76,7 % [64,6, 85,6] |
| après l’avoir interdit par son nom | 37,8 % | 0,374 | 51,7 % [39,3, 63,8] |
Nommer une file pour l’exclure a poussé le modèle à la choisir trois fois plus souvent, a presque triplé la masse de probabilité qu’il lui attribuait, et a coûté 25 points d’exactitude globale — 16 cas perdus contre 1 gagné, probabilité appariée 0,0003.
Ne pensez pas à un éléphant, mesuré. La réécriture est toujours la même : remplacez l’interdiction par la règle positive qui la rend inutile. Pas « n’utilisez pas expédition pour les problèmes logiciels », mais « utilisez expédition uniquement lorsqu’un colis physique est impliqué ».
Le contre-exemple honnête : chain of thought qui coûte et ne rapporte pas
Lien vers la section : Le contre-exemple honnête : chain of thought qui coûte et ne rapporte pasLe chapitre 12 a construit correctement la chain of thought — d’abord comme technique de prompting,910 puis comme quelque chose entraîné avec des récompenses vérifiables — et s’est terminé par un avertissement reporté à ce chapitre : dire à un modèle de réfléchir étape par étape cesse d’aider une fois que le modèle raisonne par lui-même, et peut nuire. Voici cet avertissement avec un tableau dessous, sur une tâche où il est facile de supposer que plus de réflexion doit être meilleur.
Les deux bras sont lus avec le même instrument, à la même position. La seule différence est de savoir si une chain of thought écrite par le modèle lui-même se trouve d’abord dans le contexte.
| bras | correct | exactitude, Wilson 95 % | tokens de sortie supplémentaires par cas |
|---|---|---|---|
| pas de chain of thought | 37/60 | 61,7 % [49,0, 72,9] | 0 |
| chain of thought, jusqu’à 60 tokens | 34/60 | 56,7 % [44,1, 68,4] | 53,1 |
| chain of thought, jusqu’à 200 tokens | 34/60 | 56,7 % [44,1, 68,4] | 97,7 |
L’exactitude a baissé et le coût a augmenté, et la règle de ce chapitre s’applique à son propre résultat : la baisse est de 7 cas gagnés contre 10 perdus, probabilité appariée 0,629, ce qui n’est pas établi. Ce qui est établi, c’est que cela a produit quatre-vingt-dix-huit tokens de sortie supplémentaires par appel et n’a rien acheté de mesurable avec eux. L’incertitude porte entièrement sur le bénéfice. La facture, elle, est certaine.
Une chaîne qui échoue est plus instructive qu’une chaîne qui fonctionne. Invité à raisonner sur « Votre intégration Slack a cessé de publier des messages après mardi », le modèle a écrit :
1. Check if the issue persists on Monday.
2. Verify if there are any updates or changes in your Slack setup that
might affect message posting.
3. If no update has been made since Tuesday, check for any recent system
restarts or downtime affecting Slack functionality.
4. If you have recently installed new software or updated your
environment, ensure it's compatible with Slack version.
5. Contact Slack support for further assistance or troubleshooting steps.C’est un conseil de dépannage compétent, et ce n’est pas la tâche. Invité à réfléchir, le modèle a dérivé vers le genre auquel « réfléchir étape par étape à ce ticket d’assistance » ressemble le plus dans ses données d’entraînement — puis a répondu à une question de classification avec cinq cents caractères de raisonnement sans rapport dans son propre contexte. La chain of thought aide sur les problèmes avec un état intermédiaire qui mérite d’être calculé : arithmétique, recherches multi-sauts, satisfaction de contraintes. Router une phrase dans l’un de quatre seaux n’a pas d’état intermédiaire. Il n’y a rien que la chaîne puisse tenir, donc tout ce qu’elle fait est d’ajouter un texte plausible auquel la décision finale doit ensuite survivre.
Deux corollaires pratiques. D’abord, pour un modèle entraîné à raisonner — les modèles RLVR du chapitre 12 — l’instruction est pire que redondante : elle peut remplacer la longue chaîne que le modèle aurait produite par une chaîne courte, en forme de prompt. Et échantillonner plusieurs chaînes puis voter, ce que fait la self-consistency,11 ne peut pas sauver une tâche où il n’y a rien sur quoi diverger : cela multiplie le coût par le nombre d’échantillons pour départager des ex æquo qui n’existent pas. Le chapitre 12 a mesuré cet arbitrage là où il s’applique. Ensuite, notez ce que le dispositif de comparaison lui-même a coûté. Forcer la réponse dans une ligne Final queue: a fait chuter le bras sans raisonnement de 76,7 % à 61,7 %. Quinze points, payés pour rendre les deux bras comparables. Une structure qui existe pour votre confort n’est pas gratuite non plus.
Le même appel, deux fois
Lien vers la section : Le même appel, deux foisUne dernière mesure, parce que c’est la question que tout le monde pose après le premier résultat surprenant. Soixante prompts, décodage greedy, exécutés plusieurs fois :
- Le même appel répété avec tout maintenu fixe a renvoyé des probabilités identiques au bit près. Déterministe.
- Le même appel batché avec des voisins différents — tailles de batch 1, 4, 12, 30 et 60 — a renvoyé des probabilités différant jusqu’à 0,0128. L’étiquette choisie n’a jamais changé, dans 0 cas sur 60.
L’étiquette a survécu parce qu’elle avait de la marge : sur les soixante cas, le plus petit écart entre les deux meilleures files était de 0,0459, trois fois et demie la dérive. La stabilité n’était pas une propriété de l’algorithme. C’était une marge, et les marges s’épuisent. Le chapitre 17 est l’endroit où se trouve la raison arithmétique et où les réglages d’échantillonnage qui élargissent et resserrent ces écarts sont démontés. La raison de la planter ici est qu’elle borne ce que toute mesure de prompt peut signifier : le banc mesure un système reproductible seulement jusqu’à une tolérance, et une différence de deux points entre variantes est dans cette tolérance un mauvais jour.
Arrêtez d’opiner, commencez à chercher
Lien vers la section : Arrêtez d’opiner, commencez à chercherTout ce qui précède, c’est un humain qui choisit une variante et une machine qui la note. L’étape évidente suivante est de laisser la machine choisir aussi les variantes.
APE fait exactement cela : un modèle propose des instructions candidates, elles sont notées sur des exemples mis de côté, et les meilleures survivent.8 Les instructions qu’il trouve sont souvent des instructions qu’aucun humain n’écrirait, et c’est le but — la recherche porte sur ce qui score, pas sur ce qui sonne professionnel.
DSPy va plus loin et constitue l’idée la plus utile pour un produit.12 Vous déclarez ce que chaque étape d’un pipeline prend et renvoie, et le framework compile cela en prompts, sélectionne des démonstrations et optimise les instructions contre votre métrique. Changez de modèle, et vous recompilez au lieu de réécrire. Le prompt cesse d’être du code source réglé à la main par quelqu’un et devient un artefact généré contre une métrique, ce qu’il aurait dû être depuis le début.
Aucun des deux ne supprime le besoin du banc. Tous deux en font la seule chose dont vous avez besoin, parce qu’un optimiseur sans métrique n’optimise rien.
Reste la discipline. Les prompts doivent vivre dans le contrôle de version, dans des fichiers, à côté du code qui les envoie — pas dans une ligne de base de données que quelqu’un a modifiée un mardi. Ils ont besoin d’un identifiant de version stocké avec chaque sortie qu’ils ont produite, sinon le jour où quelque chose régresse, vous ne pouvez pas découvrir ce qui a changé. Ils ont besoin du banc en intégration continue, parce qu’un prompt est la seule partie de votre système qu’un fournisseur peut invalider silencieusement en déployant un nouveau modèle. Et ils ont besoin de cas : pas cent cas astucieux, seulement les vingt cas ennuyeux qui ont cassé le trimestre dernier, conservés pour toujours. Le banc est le livrable. Le prompt en est un sous-produit.
Où cela mène ensuite
Lien vers la section : Où cela mène ensuiteTout dans ce chapitre a été mesuré en exactitude. Chacune de ces variantes a aussi un prix.
Le system prompt qui a rapporté 21,7 points est envoyé à chaque appel, pour toujours. Les deux exemples qui ont rapporté sept points sont envoyés à chaque appel, pour toujours. Les seize qui en ont rapporté douze sont envoyés à chaque appel, pour toujours, et ils font environ dix fois la longueur de la question réellement posée par l’utilisateur. La chain of thought qui n’a rien rapporté a produit quatre-vingt-dix-huit tokens supplémentaires par requête, et les tokens de sortie sont les plus chers.
Rien de cela n’est visible dans un tableau d’exactitudes, et tout cela est visible sur une facture.
Le chapitre 16 porte sur l’unité dans laquelle ces décisions sont réellement libellées. Le token comme unité de facturation, la context window comme budget plutôt que mémoire, pourquoi une conversation de quarante tours coûte bien plus que quarante fois le premier tour, ce que prompt caching paie et ne paie pas, et pourquoi l’ordre de votre prompt décide si le cache touche ou non — ce qui s’avère être une seconde raison, entièrement économique, de placer le contenu stable en premier et le contenu variable en dernier.
Sources et méthode
Lien vers la section : Sources et méthodeLe banc et chaque tableau ont été produits avec Qwen/Qwen2.5-0.5B-Instruct sous décodage greedy, ils se reproduisent donc exactement. La documentation Hugging Face sur les chat templates est la référence pour ce en quoi les marqueurs de template du chapitre 11 se développent réellement, et pour le fait qu’un modèle livré avec le mauvais template est une défaillance réelle et récurrente. Pour les effets de position et de format à l’échelle de production plutôt qu’à l’échelle de laboratoire, les citations ci-dessus sont les sources primaires ; les guides de prompting des fournisseurs sont utiles pour leurs exemples et doivent être lus en sachant qu’aucun ne publie d’intervalle.
Références
Lien vers la section : Références-
Anthropic, Effective context engineering for AI agents (29 septembre 2025), pour la distinction prompt-versus-contexte utilisée dans ce chapitre et développée au chapitre 24. ↩
-
Zhao, Z., Wallace, E., Feng, S., Klein, D. et Singh, S. Calibrate Before Use: Improving Few-Shot Performance of Language Models. arXiv:2102.09690 (2021). Biais d’étiquette majoritaire, de récence et de token commun, et pourquoi la rotation dans le banc de ce chapitre n’est pas optionnelle. ↩
-
McNemar, Q. Note on the sampling error of the difference between correlated proportions or percentages. Psychometrika 12(2), p. 153–157 (1947). Les comparaisons appariées de ce chapitre utilisent la forme binomiale exacte plutôt que l’approximation du khi-deux, car les effectifs discordants sont faibles. ↩
-
Liu, N. F. et al. Lost in the Middle: How Language Models Use Long Contexts. arXiv:2307.03172 (2023). Cité ici pour l’effet de position ; mesuré en longueur au chapitre 24. ↩
-
Sclar, M., Choi, Y., Tsvetkov, Y. et Suhr, A. Quantifying Language Models' Sensitivity to Spurious Features in Prompt Design. arXiv:2310.11324 (2023). Les seuls séparateurs et espacements déplacent suffisamment l’exactitude pour réordonner des classements de modèles. ↩
-
Brown, T. B. et al. Language Models are Few-Shot Learners. arXiv:2005.14165 (2020). L’article qui a présenté l’in-context learning comme une capacité plutôt qu’une curiosité ; la section 3 est la source du vocabulaire zero-shot / one-shot / few-shot que tout le monde utilise désormais. ↩
-
Lu, Y., Bartolo, M., Moore, A., Riedel, S. et Stenetorp, P. Fantastically Ordered Prompts and Where to Find Them: Overcoming Few-Shot Prompt Order Sensitivity. arXiv:2104.08786 (2021). Le résultat reproduit dans le tableau few-shot ci-dessus. ↩
-
Zhou, Y. et al. Large Language Models Are Human-Level Prompt Engineers. arXiv:2211.01910 (2022). Prompt engineering automatique par proposition et scoring. L’instruction tant citée « respirez profondément » vient de Yang, C. et al., Large Language Models as Optimizers, arXiv:2309.03409 (2023), qui l’a trouvée par recherche sur une tâche avec un modèle — une affirmation qui n’a pas survécu intacte à son passage dans les articles de blog. ↩ ↩2
-
Wei, J. et al. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. arXiv:2201.11903 (2022). ↩
-
Kojima, T., Gu, S. S., Reid, M., Matsuo, Y. et Iwasawa, Y. Large Language Models are Zero-Shot Reasoners. arXiv:2205.11916 (2022). Le résultat « réfléchissons étape par étape », et une lecture utile pour comprendre à quel point les conditions étaient étroites. ↩
-
Wang, X. et al. Self-Consistency Improves Chain of Thought Reasoning in Language Models. arXiv:2203.11171 (2022). Mesuré avec son coût attaché au chapitre 12. ↩
-
Khattab, O. et al. DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines. arXiv:2310.03714 (2023). ↩