Self-consistency prompting polega na tym, że zadajesz modelowi to samo pytanie wymagające rozumowania kilka razy i zostawiasz odpowiedź, która pojawia się najczęściej. Każdy przebieg rozpisuje własne rozumowanie, jak w chain of thought prompting, a ponieważ model dobiera słowa z pewną losowością, przebiegi idą różnymi ścieżkami. Poprawne ścieżki zwykle dochodzą do tej samej odpowiedzi. Pomyłki zwykle rozpraszają się na różne błędne odpowiedzi. Głosowanie większością wykorzystuje tę różnicę.
Technika pochodzi z pracy Wanga i in. z 2022 roku, "Self-Consistency Improves Chain of Thought Reasoning in Language Models". Autorzy porównali próbkowanie wielu ścieżek rozumowania z głosowaniem i branie jednej zachłannej (greedy) odpowiedzi i wykazali, że głosowanie poprawia trafność w testach z arytmetyki i rozumowania zdroworozsądkowego.
Poniższy blok pokazuje trzy przebiegi tego samego promptu. Każda zakładka to jeden przebieg z własną odpowiedzią. Dwa przebiegi liczą poprawnie; jeden popełnia pomyłkę, o którą łatwo.
Liczę siódemki według pozycji.
- Jedności: 7, 17, 27, 37, 47, 57, 67, 77, 87, 97. To 10 siódemek.
- Dziesiątki: od 70 do 79. To kolejne 10 siódemek.
- Setki: tylko 100 ma trzy cyfry i nie ma w nim siódemki.
77 jest na obu listach i to się zgadza, bo zawiera dwie siódemki.
Odpowiedź: 20
Przebieg 2 odpowiedział na trochę inne pytanie: ile liczb zawiera siódemkę, a nie ile razy pojawia się ta cyfra. Jego rozumowanie brzmi równie pewnie jak dwa pozostałe i samo w sobie nie daje powodu do wątpliwości. W trzech przebiegach głosy rozkładają się 20, 19, 20, a odpowiedź większości jest poprawna.
Jak działa self-consistency
- Napisz prompt z chain of thought i stałą linią odpowiedzi. Poproś najpierw o rozumowanie, a na końcu o odpowiedź w formie, którą łatwo znaleźć, na przykład "Odpowiedź: N". Bez stałej linii trzeba czytać każdy przebieg, żeby znaleźć odpowiedź.
- Wygeneruj kilka przebiegów z włączoną losowością. Każdy przebieg potrzebuje swobody, żeby pójść inną ścieżką. W API załatwia to temperatura powyżej 0. Przy temperaturze 0 większość przebiegów powtórzyłaby to samo rozumowanie, a powtórzenie błędu pięć razy nie jest dowodem.
- Wyciągnij końcową odpowiedź z każdego przebiegu. Na tym etapie ignoruj rozumowanie. Dwa przebiegi, które doszły do 20 różnymi drogami, to dwa głosy na 20.
- Wybierz najczęstszą odpowiedź. Przed liczeniem znormalizuj odpowiedzi, żeby "20", "20." i "dwadzieścia" liczyły się jako ta sama odpowiedź.
Sam poziom zgodności to przydatna informacja. Gdy wszystkie pięć przebiegów się zgadza, przypadkowa pomyłka jest mało prawdopodobna. Gdy głosy rozkładają się na trzy odpowiedzi, pytanie jest dla modelu trudne i to sygnał, żeby samodzielnie sprawdzić odpowiedź albo przepisać prompt. Praca pokazała też, że pytania z większą zgodnością między próbkami częściej otrzymywały poprawną odpowiedź.
Self-consistency ręcznie
Tę technikę można stosować w każdej aplikacji czatowej. Wyślij prompt, zapisz ostatnią linię, a potem uzyskaj kolejny niezależny przebieg: kliknij ponowne generowanie albo wklej ten sam prompt do nowego czatu. Powtarzaj, aż zbierzesz trzy albo pięć odpowiedzi.
Nie pytaj ponownie w tej samej rozmowie słowami "Na pewno?" albo "Spróbuj jeszcze raz". Model widzi swoją poprzednią odpowiedź, więc nowa nie jest niezależna: zwykle albo powtarza pierwszą, albo zmienia ją tylko dlatego, że pytanie zabrzmiało jak wątpliwość. Ani jedno, ani drugie nie jest głosem.
Ten prompt jest przygotowany do głosowania. Wpisz własne pytanie i format odpowiedzi, a potem uruchom go kilka razy.
12 długopisów to 12 ÷ 3 = 4 paczki.
4 paczki kosztują 4 × 8.
Reszta z 10 minus 2.
Odpowiedź: $2
To część z formatem umożliwia głosowanie. Wyłącz ją, a przebiegi zaczną formułować odpowiedzi różnie, często gdzieś w środku tekstu, i proste liczenie zamieni się w uważne czytanie.
Self-consistency w kodzie
W kodzie pętla jest krótka: uruchom ten sam prompt N razy, wyciągnij linie z odpowiedziami i je policz. Ta wersja używa SDK OpenAI dla Pythona; każde API, w którym da się ustawić temperaturę, działa tak samo.
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.")
Przebiegi są niezależne, więc w produkcji wysyła się je równolegle, a nie jeden po drugim. Niektóre modele rozumujące akceptują tylko domyślną temperaturę i zwracają błąd, gdy ustawisz inną; przy nich pomiń temperature. Ich przebiegi i tak się różnią, bo wartość domyślna już próbkuje.
Kiedy jej używać i ile kosztuje
Self-consistency się opłaca, gdy spełnione są trzy warunki: odpowiedź jest krótka i porównywalna (liczba, etykieta, wybór), błędna odpowiedź kosztuje więcej niż kilka dodatkowych wywołań, a model nie jest jeszcze niezawodny w danym zadaniu. Dobrze pasują zadania tekstowe z matematyki, klasyfikacja z podchwytliwymi przypadkami brzegowymi i pytania wielokrotnego wyboru.
Kosztuje mniej więcej N razy tyle tokenów co pojedyncza odpowiedź i nie pomaga, gdy model w każdym przebiegu ma to samo błędne przekonanie. Jeśli wszystkie pięć przebiegów popełnia ten sam błąd, głosowanie jest jednogłośne i błędne. Głosowanie ogranicza przypadkowe pomyłki, a nie błędy systematyczne, więc nie zastąpi sprawdzania od czasu do czasu odpowiedzi ze znanym wynikiem.
Modele, które rozumują wewnętrznie przed odpowiedzią, i tak w każdym przebiegu dokładnie przerabiają problem, co zwykle zmniejsza zysk z głosowania. Nadal może się to opłacić przy trudnych pytaniach, na które ich przebiegi odpowiadają różnie.
Self-consistency głosuje tylko nad gotowymi odpowiedziami. Tree of thought prompting idzie krok dalej i porównuje częściowe rozumowania jeszcze w trakcie rozwiązywania problemu, zostawiając obiecujące gałęzie i odrzucając słabe, zanim dojdą do odpowiedzi.
Najczęściej zadawane pytania
Czym jest self-consistency prompting?
Self-consistency prompting to technika opisana przez Wanga i in. (2022). Wysyłasz ten sam prompt z chain of thought kilka razy przy włączonym próbkowaniu, żeby każdy przebieg rozumował inną ścieżką, a potem wybierasz końcową odpowiedź, która pojawia się najczęściej. Zamiast ufać jednemu łańcuchowi rozumowania, przeprowadzasz głosowanie między kilkoma.
Ile próbek użyć przy self-consistency?
Na co dzień wystarczą trzy do pięciu przebiegów, żeby przegłosować sporadyczną pomyłkę, a nieparzysta liczba zapobiega remisom między dwiema odpowiedziami. Oryginalna praca próbkowała znacznie więcej ścieżek na pytanie i wykazała, że trafność rośnie wraz z liczbą próbek, ale za każdym razem o mniej. Używaj więcej przebiegów, gdy błędna odpowiedź drogo kosztuje, a mniej, gdy liczy się koszt albo szybkość.
Czym self-consistency różni się od chain of thought?
Chain of thought to jeden przebieg, w którym model rozpisuje rozumowanie przed odpowiedzią. Self-consistency na nim bazuje: uruchamia chain of thought kilka razy i głosuje nad końcowymi odpowiedziami. Chain of thought zmienia prompt; self-consistency zmienia to, ile odpowiedzi zbierasz i jak wybierasz jedną z nich.
Czy self-consistency działa przy wypracowaniach albo otwartych odpowiedziach?
Nie bezpośrednio, bo głosowanie wymaga odpowiedzi, które da się porównać pod kątem równości: liczby, etykiety, litery odpowiedzi w teście albo krótkiego faktu. Przy otwartym tekście często generuje się kilka wersji i pyta model, która najlepiej zgadza się z pozostałymi, ale to ocena, a nie liczenie głosów.
Czy mogę używać self-consistency w ChatGPT albo Claude?
Tak, ręcznie. Wyślij prompt w kilku nowych czatach albo wygeneruj odpowiedź ponownie kilka razy i zapisz końcową odpowiedź z każdego przebiegu. Korzystaj z nowego czatu albo przycisku ponownego generowania, a nie pytaj jeszcze raz w tym samym wątku, bo model, który widzi swoją poprzednią odpowiedź, ma skłonność do jej powtarzania.