Menu

Self-consistency : le vote à la majorité

Le prompting par self-consistency pose plusieurs fois la même question de raisonnement, laisse chaque exécution raisonner à sa façon et garde la réponse qui revient le plus souvent. Comment ça marche, comment le faire à la main et comment le faire dans le code.

Chaque prompt de cette page se modifie, puis s'ouvre dans ChatGPT, Claude ou une autre application d'IA.

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.

Combien de fois le chiffre 7 apparaît-il quand on écrit tous les nombres entiers de 1 à 100 ? Raisonne étape par étape, puis donne la réponse finale sur la dernière ligne sous la forme "Answer: N".
Try it
Example replyReplies vary between models and runs.

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

  1. É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.
  2. É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.
  3. 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.
  4. 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.

Un prompt prêt pour le vote
Fill in
Parts
Une boutique vend des stylos par lots de 3 pour 2 €. Maya achète 12 stylos et paie avec un billet de 10 €. Combien lui rend-on ?
Raisonne étape par étape. Donne ensuite la réponse finale seule sur la dernière ligne sous la forme "Answer: un montant en euros".
Try it
Example replyReplies vary between models and runs.

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.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER