Le prompting par self-consistency (cohérence interne) consiste à poser plusieurs fois la même question de raisonnement à un modèle et à garder la réponse qui revient le plus souvent. Chaque exécution écrit son propre raisonnement, comme dans le chain of thought, et comme le modèle choisit ses mots avec une part de hasard, les exécutions empruntent des chemins différents. Les chemins corrects ont tendance à aboutir à la même réponse. Les erreurs ont tendance à se disperser entre différentes réponses fausses. Un vote à la majorité exploite cette différence.
La technique vient de Wang et al. 2022, "Self-Consistency Improves Chain of Thought Reasoning in Language Models". L'article comparait l'échantillonnage de nombreux chemins de raisonnement suivi d'un vote avec une seule réponse gloutonne, et montrait que le vote améliorait la précision sur des benchmarks de raisonnement arithmétique et de sens commun.
Le bloc ci-dessous montre trois exécutions du même prompt. Chaque onglet est une exécution avec sa propre réponse. Deux exécutions comptent juste ; une commet une erreur facile à faire. Le libellé Answer: reste en anglais dans ces prompts, car le code Python plus bas le recherche tel quel.
Comptons les 7 par position.
- Unités : 7, 17, 27, 37, 47, 57, 67, 77, 87, 97. Cela fait 10 fois le chiffre 7.
- Dizaines : de 70 à 79. Cela fait 10 fois de plus.
- Centaines : seul 100 a trois chiffres, et il ne contient pas de 7.
77 figure dans les deux listes, ce qui est correct, puisqu'il contient deux 7.
Answer: 20
L'exécution 2 a répondu à une question légèrement différente : combien de nombres contiennent un 7, et non combien de fois le chiffre apparaît. Son raisonnement a l'air aussi sûr que les deux autres, et prise seule, vous n'auriez aucune raison d'en douter. Sur trois exécutions, le vote donne 20, 19, 20, et la réponse majoritaire est la bonne.
Comment fonctionne le self-consistency
- Écrivez un prompt chain of thought avec une ligne de réponse fixe. Demandez d'abord le raisonnement et la réponse finale en dernier, sous une forme que vous pouvez retrouver, comme "Answer: N". Sans ligne fixe, vous devez lire chaque exécution pour trouver sa réponse.
- Échantillonnez plusieurs exécutions avec le hasard activé. Chaque exécution doit être libre de prendre un chemin différent. Dans l'API, une température supérieure à 0 le permet. À température 0, la plupart des exécutions répéteraient le même raisonnement, et répéter cinq fois une erreur ne prouve rien.
- Extrayez la réponse finale de chaque exécution. Ignorez le raisonnement à ce stade. Deux exécutions arrivées à 20 par des chemins différents comptent pour deux votes pour 20.
- Retenez la réponse la plus fréquente. Normalisez avant de compter, pour que "20", "20." et "vingt" comptent comme la même réponse.
L'accord lui-même est une information utile. Quand les cinq exécutions sont d'accord, une erreur aléatoire est peu probable. Quand les votes se divisent en trois, la question est difficile pour le modèle, et c'est le signal qu'il faut vérifier la réponse vous-même ou réécrire le prompt. L'article montrait aussi que les questions où les échantillons s'accordaient le plus avaient plus de chances d'être bien répondues.
Le self-consistency à la main
Vous pouvez appliquer la technique dans n'importe quelle application de chat. Envoyez le prompt, notez la dernière ligne, puis obtenez une autre exécution indépendante : appuyez sur régénérer, ou collez le même prompt dans une nouvelle conversation. Répétez jusqu'à avoir trois ou cinq réponses.
Ne redemandez pas dans la même conversation avec "Tu es sûr ?" ou "Réessaie". Le modèle voit sa réponse précédente, donc la nouvelle n'est pas indépendante : elle a tendance soit à répéter la première, soit à la changer simplement parce que vous sembliez douter. Ni l'un ni l'autre n'est un vote.
Ce prompt est prêt pour un vote. Mettez votre propre question et votre format de réponse, puis lancez-le plusieurs fois.
12 stylos, c'est 12 ÷ 3 = 4 lots.
4 lots coûtent 4 × 2 € = 8 €.
Monnaie sur 10 € : 10 € moins 8 € = 2 €.
Answer: 2 €
La partie format est ce qui rend le vote possible. Désactivez-la et les exécutions ont tendance à formuler leur réponse différemment, souvent au milieu du texte, ce qui transforme un simple décompte en lecture attentive.
Le self-consistency dans le code
Dans le code, la boucle est courte : exécuter le même prompt N fois, extraire les lignes de réponse et les compter. Cette version utilise le SDK Python d'OpenAI ; toute API qui permet de régler la température fonctionne de la même façon. Si vous traduisez le libellé Answer: dans votre prompt, changez-le aussi dans l'expression régulière de final_answer.
import re
from collections import Counter
from openai import OpenAI
client = OpenAI()
MODEL = "your-model-id" # e.g. from your provider's model list
PROMPT = (
"How many times does the digit 7 appear when you write out all the whole "
"numbers from 1 to 100? Think it through step by step, then give the final "
'answer on the last line in the form "Answer: N".'
)
def final_answer(text):
# Also matches "**Answer: 20**", since chat models often bold the last line.
lines = re.findall(r"^\**Answer:\**\s*(.+)$", text, re.MULTILINE)
return lines[-1].strip(" *.") if lines else None
answers = []
for _ in range(5):
response = client.chat.completions.create(
model=MODEL,
temperature=0.8,
messages=[{"role": "user", "content": PROMPT}],
)
answers.append(final_answer(response.choices[0].message.content))
votes = Counter(a for a in answers if a is not None)
if votes:
best, count = votes.most_common(1)[0]
print(f"{best} ({count} of {len(answers)} runs agree)")
else:
print("No run gave an answer line.")
Les exécutions sont indépendantes : en production, vous les enverriez donc en parallèle plutôt que l'une après l'autre. Certains modèles de raisonnement n'acceptent que leur température par défaut et renvoient une erreur si vous en fixez une ; pour eux, omettez temperature. Leurs exécutions varient quand même, car la valeur par défaut échantillonne déjà.
Quand l'utiliser, et ce que ça coûte
Le self-consistency vaut la peine quand trois conditions sont réunies : la réponse est courte et comparable (un nombre, une étiquette, un choix), une mauvaise réponse coûte plus que quelques appels supplémentaires, et le modèle n'est pas déjà fiable sur la tâche. Les problèmes de maths à énoncé, la classification avec des cas limites délicats et les QCM s'y prêtent bien.
Il coûte environ N fois les tokens d'une seule réponse, et il n'aide pas quand le modèle partage la même idée fausse à chaque exécution. Si les cinq exécutions commettent la même erreur, le vote est unanime et faux. Le vote réduit les erreurs aléatoires, pas les erreurs systématiques : il ne remplace pas une vérification régulière des réponses sur des résultats connus.
Les modèles qui raisonnent en interne avant de répondre travaillent déjà longuement le problème à chaque exécution, ce qui tend à réduire le gain du vote. Il peut quand même payer sur des questions difficiles où leurs exécutions divergent.
Le self-consistency ne vote que sur des réponses terminées. Le tree of thought va plus loin et compare des raisonnements partiels pendant la résolution du problème, en gardant les branches prometteuses et en abandonnant les faibles avant qu'elles n'aboutissent à une réponse.
Questions fréquentes
Qu'est-ce que le prompting par self-consistency ?
Le self-consistency (cohérence interne) est une technique de Wang et al. (2022). Vous envoyez plusieurs fois le même prompt chain of thought avec l'échantillonnage activé, pour que chaque exécution raisonne par un chemin différent, puis vous retenez la réponse finale qui apparaît le plus souvent. On remplace la confiance dans un seul raisonnement par un vote entre plusieurs.
Combien d'échantillons utiliser pour le self-consistency ?
Pour un usage courant, trois à cinq exécutions suffisent pour mettre en minorité une erreur occasionnelle, et un nombre impair évite les égalités entre deux réponses. L'article original échantillonnait bien plus de chemins par question et constatait que la précision continuait d'augmenter avec le nombre d'échantillons, mais avec des gains de plus en plus faibles. Faites plus d'exécutions quand une mauvaise réponse coûte cher, moins quand le coût ou la vitesse comptent.
Quelle est la différence entre le self-consistency et le chain of thought ?
Le chain of thought est une seule exécution dans laquelle le modèle écrit son raisonnement avant la réponse. Le self-consistency s'appuie dessus : il exécute le chain of thought plusieurs fois et fait voter les réponses finales. Le chain of thought change le prompt ; le self-consistency change le nombre de réponses que vous collectez et la façon d'en choisir une.
Le self-consistency marche-t-il pour des rédactions ou des réponses ouvertes ?
Pas directement, car un vote suppose des réponses qu'on peut comparer à l'identique : un nombre, une étiquette, une lettre de QCM ou un fait court. Pour un texte ouvert, un contournement courant consiste à générer plusieurs versions et à demander au modèle laquelle s'accorde le mieux avec les autres, mais c'est un jugement, pas un décompte.
Peut-on utiliser le self-consistency dans ChatGPT ou Claude ?
Oui, à la main. Envoyez le prompt dans plusieurs nouvelles conversations, ou régénérez la réponse plusieurs fois, et notez la réponse finale de chaque exécution. Utilisez une nouvelle conversation ou le bouton de régénération plutôt que de redemander dans le même fil, car un modèle qui voit sa réponse précédente a tendance à la répéter.