0Pricing
AI Prompt Engineering · Lekcja

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, confidence

Róż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 best

Normalizacja 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 a

Ile 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 maximum

Adaptacyjne 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 ans

Ograniczenia: 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 cluster

Wdraż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 needed

Self-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

  1. Promptowanie Chain-of-Thought
  2. Próbkowanie self-consistency
  3. Eksploracja Tree-of-Thought
  4. Kiedy prompty rozumowania pomagają
← Powrót do AI Prompt Engineering