Próbkowanie self-consistency
Głosowanie nad wieloma ścieżkami rozumowania
Próbkowanie self-consistency to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Prompt Engineering, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.
Jeden łańcuch jest zawodny
Pojedynczy chain-of-thought może wcześnie obrać błędny kierunek i już z niego nie wyjść. Self-consistency (Wang i in., 2022) rozwiązuje ten problem, próbkowując wiele niezależnych ścieżek rozumowania i agregując ich końcowe odpowiedzi, zazwyczaj w drodze głosowania większościowego.
Intuicja jest następująca: poprawne rozumowanie prowadzi do tej samej odpowiedzi różnymi drogami, natomiast błędy są rozproszone. Agregacja wzmacnia spójny sygnał.
def self_consistency(prompt, n=20, temperature=0.7):
answers = []
for _ in range(n):
chain = llm(prompt, temperature=temperature)
answers.append(extract_answer(chain))
return majority_vote(answers)Dlaczego marginalizowanie ścieżek działa
Self-consistency przybliża marginalizowanie ścieżek rozumowania: zamiast ufać jednemu niejawnemu wyprowadzeniu, szacuje najbardziej prawdopodobną końcową odpowiedź po uwzględnieniu wielu wyprowadzeń.
Jest to estymacja rozkładu odpowiedzi metodą Monte Carlo. Moda tego rozkładu jest zwykle bardziej niezawodna niż dowolna pojedyncza wylosowana ścieżka, szczególnie gdy przestrzeń odpowiedzi jest mała i dyskretna.
from collections import Counter
def majority_vote(answers):
norm = [normalize_answer(a) for a in answers]
counts = Counter(norm)
answer, votes = counts.most_common(1)[0]
confidence = votes / len(norm)
return answer, confidenceRóżnorodność dzięki temperaturze
Self-consistency wymaga różnorodnych ścieżek. Strategia zachłanna lub temperatura bliska zeru prowadzi do niemal identycznych łańcuchów, niwecząc działanie tej metody. Należy używać umiarkowanej temperatury (często od 0.5 do 0.8) i ewentualnie próbkowania top-p, aby zwiększyć zróżnicowanie ścieżek.
Zbyt wysoka temperatura pogarsza jakość poszczególnych łańcuchów; temperaturę należy dostrajać tak, aby maksymalizować dokładność zespołu, a nie jakość pojedynczego łańcucha.
def tune_temperature(prompt, val_set, temps=(0.4, 0.6, 0.8, 1.0)):
best = max(
temps,
key=lambda t: ensemble_accuracy(prompt, val_set, temp=t, n=20)
)
return bestNormalizacja odpowiedzi ma kluczowe znaczenie
Głosy można uwzględniać tylko wtedy, gdy równoważne odpowiedzi są rozpoznawane jako takie same. Przed ich zliczeniem należy je normalizować: usuwać jednostki, kanonizować liczby, zamieniać tekst na małe litery, analizować ułamki i wartości procentowe oraz stosować równoważność właściwą dla danego zadania.
Słaba normalizacja rozdziela prawdziwą większość między różne warianty powierzchniowe i pozwala, aby mniejszościowa odpowiedź wygrała głosowanie.
def normalize_answer(a):
a = a.strip().lower().rstrip('.')
a = a.replace(',', '').replace('$', '').replace('%', '')
try:
return str(round(float(a), 6)) # numeric canonical form
except ValueError:
return aIle próbek?
Dokładność rośnie wraz z liczbą próbek n, ale z malejącymi korzyściami; w zależności od trudności zadania często stabilizuje się na poziomie od 10 do 40 próbek. Każda próbka liniowo zwiększa koszt i opóźnienie.
Należy przetestować różne wartości n na zbiorze walidacyjnym i wybrać punkt przegięcia krzywej, w którym dodatkowe próbki nie uzasadniają już ponoszonych kosztów.
def sweep_n(prompt, val, ns=(1,3,5,10,20,40)):
return {n: ensemble_accuracy(prompt, val, n=n) for n in ns}
# Choose n at the accuracy/cost knee, not the maximumAdaptacyjne wcześniejsze zatrzymywanie
Obliczenia można ograniczyć dzięki adaptacyjnemu próbkowaniu: należy przestać generować ścieżki, gdy wynik głosowania jest już rozstrzygający. Jeśli po 5 próbkach jedna odpowiedź ma wyraźną przewagę, kolejne próbki prawdopodobnie nie zmienią zwycięzcy.
Takie podejście koncentruje obliczenia na rzeczywiście trudnych i spornych elementach, a na łatwe pytania odpowiada tanio.
def adaptive_sc(prompt, max_n=40, margin=0.6, min_n=5):
answers = []
for i in range(max_n):
answers.append(extract_answer(llm(prompt, temperature=0.7)))
if i + 1 >= min_n:
ans, conf = majority_vote(answers)
if conf >= margin:
return ans, conf, i + 1
return majority_vote(answers)Głosowanie ważone i wspomagane weryfikatorem
Zwykłe głosowanie większościowe traktuje wszystkie ścieżki jednakowo. Można ważyć głosy na podstawie prawdopodobieństwa przypisanego ścieżce przez model, wyniku wyuczonego weryfikatora lub samooceny poprawności każdego łańcucha.
Self-consistency ważona przez weryfikator często daje lepsze wyniki niż głosowanie nieważone, ponieważ obniża rangę częstych trybów błędu, w których model jest przekonany, ale się myli.
def weighted_vote(chains):
scores = {}
for c in chains:
a = normalize_answer(extract_answer(c))
scores[a] = scores.get(a, 0.0) + verifier_score(c)
return max(scores, key=scores.get)Pewność wynikająca ze zgodności
Margines głosów jest użytecznym sygnałem pewności. Jednomyślna odpowiedź jest znacznie bardziej wiarygodna niż wynik 6 do 5. Należy przekazywać tę informację do dalszej logiki: elementy o niskiej zgodności kierować do eskalacji, weryfikacji przez człowieka lub silniejszego modelu.
Dzięki temu self-consistency staje się zarówno sposobem na zwiększenie dokładności, jak i mechanizmem kalibracji.
def route(prompt):
ans, conf = adaptive_sc(prompt)[:2]
if conf < 0.5:
return escalate_to_stronger_model(prompt)
return ansOgraniczenia: zadania ciągłe i otwarte
Głosowanie większościowe zakłada dyskretną i porównywalną przestrzeń odpowiedzi. Nie ma bezpośredniego zastosowania do generowania swobodnego tekstu, długich wypowiedzi ani wyników ciągłych, w których żadne dwie próbki nie są identyczne.
W takich zadaniach należy stosować inną formę agregacji: grupować semantycznie podobne wyniki, głosować na wyodrębnionych polach strukturalnych lub użyć modelu oceniającego do wybrania najlepszej próbki zamiast zliczać dokładne dopasowania.
def semantic_consistency(samples):
clusters = cluster_by_embedding(samples)
biggest = max(clusters, key=len) # largest agreement cluster
return representative(biggest) # medoid of the clusterWdrażanie z uwzględnieniem kosztów
Self-consistency jest jedną z najdroższych technik promptowania: koszt skaluje się wraz z n. Należy rezerwować ją dla elementów o wysokiej wadze lub dużej trudności, łączyć z adaptacyjnym zatrzymywaniem oraz rozważyć politykę warstwową, w której pojedynczy łańcuch obsługuje łatwe przypadki.
Zawsze należy porównywać jej dokładność w przeliczeniu na koszt z pojedynczym wywołaniem silniejszego modelu, które może zapewnić ten sam wzrost dokładności taniej.
def tiered(prompt, q):
if easy(q):
return extract_answer(llm(prompt, temperature=0))
return adaptive_sc(prompt, max_n=20)[0] # SC only when neededSelf-consistency od początku do końca
Kompletny potok obejmuje: dostrojenie temperatury i wartości n, próbkowanie różnorodnych łańcuchów, rygorystyczną normalizację odpowiedzi, głosowanie (opcjonalnie ważone przez weryfikator), wykorzystanie marginesu jako miary pewności, wczesne zatrzymanie po uzyskaniu rozstrzygającego wyniku oraz eskalowanie elementów o niskiej zgodności.
W rezultacie otrzymujemy system rozumowania dokładniejszy i lepiej samokalibrujący się niż dowolny pojedynczy łańcuch.
def solve(prompt):
chains = sample_until_decisive(prompt, max_n=20, temp=0.7)
ans, conf = weighted_majority(chains)
if conf < THRESH:
return escalate(prompt)
return {'answer': ans, 'confidence': conf, 'paths': len(chains)}Szybkie sprawdzenie
Proszę zdiagnozować konfigurację self-consistency, która daje słabsze wyniki.
Podsumowanie
Najważniejsze wnioski:
- Self-consistency próbuje wiele różnorodnych łańcuchów i przeprowadza głosowanie, przybliżając marginalizowanie ścieżek rozumowania.
- Różnorodność (umiarkowana temperatura) i rygorystyczna normalizacja odpowiedzi są warunkami koniecznymi działania tej metody.
- Dokładność rośnie wraz z
n, ale stabilizuje się; do kontrolowania kosztów należy stosować adaptacyjne wcześniejsze zatrzymywanie. - Należy ważyć głosy za pomocą weryfikatora i używać marginesu głosów jako skalibrowanego sygnału pewności.
- Metoda wymaga dyskretnej przestrzeni odpowiedzi; w zadaniach otwartych należy grupować wyniki semantycznie lub użyć modelu oceniającego.
Często zadawane pytania
Czy lekcja „Próbkowanie self-consistency” jest bezpłatna?
Tak — pełny tekst „Próbkowanie self-consistency” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Prompt Engineering, przejdź na CoddyKit PRO. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.
Co nauczysz się w „Próbkowanie self-consistency”?
Głosowanie nad wieloma ścieżkami rozumowania Ćwiczysz AI Prompt Engineering z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Prompt Engineering?
Nie wymagamy żadnego doświadczenia. AI Prompt Engineering w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Próbkowanie self-consistency”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Prompt Engineering?
Tak. Każda lekcja AI Prompt Engineering zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Promptowanie Chain-of-Thought
- Próbkowanie self-consistency
- Eksploracja Tree-of-Thought
- Kiedy prompty rozumowania pomagają