AI Prompt Engineering · Lekcja

Zero-, one- i few-shot

Wybór liczby przykładów

Lekcja 1 z 413 kroki

Zero-, one- i few-shot to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 1 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.

Spektrum liczby przykładów

Przykłady (shots) oznaczają liczbę oznakowanych demonstracji umieszczonych w prompcie przed bieżącym zapytaniem. Zero-shot opiera się całkowicie na wyuczonych wcześniej przez model zależnościach, natomiast few-shot dostosowuje model w czasie wnioskowania do niewielkiego, specyficznego dla zadania rozkładu danych, bez aktualizowania wag.

Jest to uczenie kontekstowe (ICL): transformer traktuje przykłady jako część sekwencji i niejawnie wykonuje na ich podstawie pewien rodzaj regresji wyuczonej meta-uczeniem. Wartość k (liczba przykładów) jest hiperparametrem dostrajanym empirycznie, a nie z góry ustaloną najlepszą praktyką.

from dataclasses import dataclass

@dataclass
class ICLConfig:
    k: int           # number of demonstrations
    selection: str   # 'static' | 'dynamic'
    order: str       # 'random' | 'similarity' | 'curriculum'

# Zero-shot is simply k=0
cfg = ICLConfig(k=0, selection='static', order='random')

Kiedy zero-shot wygrywa

Zero-shot warto stosować, gdy zadanie jest dobrze reprezentowane w pretrainingu (podsumowywanie, tłumaczenie, typowa klasyfikacja) oraz gdy przykłady mogłyby ukierunkować format wyjścia. W przypadku modeli dostrojonych instrukcjami zwięzła dyrektywa wraz ze schematem wyjścia często sprawdza się lepiej niż przykłady, które subtelnie narzucają styl.

Zero-shot minimalizuje także koszt tokenów i opóźnienie oraz pozwala uniknąć biasu dominującej etykiety, przez który model zbyt często przewiduje klasę dominującą w demonstracjach.

# Zero-shot with explicit schema beats vague few-shot
PROMPT = (
    'Classify sentiment as POSITIVE, NEGATIVE, or NEUTRAL.\n'
    'Respond with only the label.\n\n'
    'Text: ' + user_text + '\nLabel:'
)

One-shot jako kotwica formatu

One-shot sprawdza się najlepiej, gdy zadanie jest jasne koncepcyjnie, ale format wyjścia jest nietypowy lub ściśle określony. Pojedyncza demonstracja znacznie bardziej niezawodnie uczy dokładnego kształtu danych (kluczy JSON, ograniczników, wielkości liter) niż opis słowny.

One-shot warto stosować, gdy chce się ograniczyć strukturę bez zużywania wielu tokenów i bez ryzyka skrzywienia rozkładu etykiet, które wprowadzają liczne przykłady.

ONE_SHOT = (
    'Extract entities as JSON.\n\n'
    'Input: Apple released the iPhone in Cupertino.\n'
    'Output: {"org": ["Apple"], "product": ["iPhone"], "loc": ["Cupertino"]}\n\n'
    'Input: ' + query + '\nOutput:'
)

Few-shot i krzywa k

Wydajność w zależności od k rzadko rośnie monotonicznie. Zwykle najpierw rośnie, następnie się stabilizuje, a potem spada, gdy przykłady zapełniają kontekst, rozpraszają uwagę i odsuwają bieżące zapytanie od obszaru, na którym model skupia się ze względu na świeżość informacji.

Empirycznie należy przetestować wartości k ze zbioru {1, 2, 4, 8, 16} na wydzielonym zbiorze danych. Optymalna wartość k zależy od złożoności zadania, długości przykładów i efektywnego wykorzystania kontekstu przez model, które zwykle jest znacznie mniejsze niż deklarowane okno kontekstowe.

def sweep_k(eval_set, candidates, ks=(1,2,4,8,16)):
    results = {}
    for k in ks:
        acc = evaluate(build_prompt(candidates[:k]), eval_set)
        results[k] = acc
    return max(results, key=results.get)

Dlaczego ICL działa: wnioskowanie niejawne

Badania opisują ICL jako wykonywanie przez model niejawnego wnioskowania bayesowskiego: demonstracje pomagają zlokalizować ukrytą koncepcję zadania, której model nauczył się już podczas pretrainingu. Przykłady są dowodami zawężającymi rozkład a posteriori zadań, a nie nową wiedzą.

Wyjaśnia to nieintuicyjne odkrycie: nawet niepoprawne etykiety w demonstracjach mogą zachować znaczną część dokładności, ponieważ najważniejszym sygnałem jest format i przestrzeń etykiet, a nie samo odwzorowanie danych wejściowych na etykiety.

# Min, Lyu et al. (2022): label correctness matters less than
#   - the input distribution
#   - the label space (which classes exist)
#   - the format / structure
# Implication: invest in representative inputs + valid label set

Budżet tokenów i kompromisy kosztowe

Każda demonstracja zużywa kontekst i środki. W przypadku długich demonstracji cztery przykłady mogą wielokrotnie przewyższać zapytanie pod względem długości. Należy obliczać metrykę kosztu przypadającego na punkt dokładności: jeśli k=8 daje przewagę 0,5% nad k=4 przy dwukrotnie większej liczbie tokenów, w środowisku produkcyjnym wygrywa k=4.

W potokach o dużej przepustowości warto stosować buforowanie promptu dla statycznego bloku przykładów, aby powtarzane demonstracje były rozliczane i przetwarzane tylko raz.

def cost_efficiency(acc_by_k, tokens_by_k, price_per_1k):
    return {
        k: acc_by_k[k] / (tokens_by_k[k] / 1000 * price_per_1k)
        for k in acc_by_k
    }
# Pick the k maximizing accuracy per dollar, not raw accuracy

Bias dominującej etykiety i pozycji

Prompty few-shot zawierają ukryte obciążenia. Bias dominującej etykiety sprawia, że model preferuje klasę najczęściej występującą w demonstracjach. Bias recencyjny nadaje zbyt dużą wagę ostatniemu przykładowi. Bias często występujących tokenów faworyzuje tokeny pojawiające się często.

Techniki kalibracji, takie jak kalibracja kontekstowa, szacują a priori modelu dla wejścia pozbawionego treści (na przykład tokenu N/A), a następnie usuwają ten wpływ przez dzielenie, znacznie stabilizując klasyfikatory few-shot.

# Contextual calibration (Zhao et al. 2021)
p_cf = model_probs(prompt_with_input('N/A'))  # content-free prior
W = 1.0 / p_cf                                  # diagonal correction
def calibrated(probs):
    return normalize(W * probs)

Równoważenie zbioru demonstracji

Aby przeciwdziałać biasowi dominującej etykiety, należy zrównoważyć klasy w demonstracjach i zmieniać ich kolejność. W przypadku klasyfikacji binarnej i k=4 należy użyć 2 przykładów pozytywnych i 2 negatywnych w losowej kolejności, zamiast proporcji 3:1.

W zadaniach generowania należy równoważyć istotne wymiary (długość, ton, trudność), aby model nie zredukował się do pojedynczego trybu, który widział najczęściej.

import random

def balanced_demos(pool, k, label_fn):
    by_label = {}
    for ex in pool:
        by_label.setdefault(label_fn(ex), []).append(ex)
    per = k // len(by_label)
    picks = [e for lst in by_label.values() for e in random.sample(lst, per)]
    random.shuffle(picks)
    return picks

Few-shot a fine-tuning

Few-shot jest właściwym narzędziem, gdy zadanie często się zmienia, danych jest mało lub nie można hostować dostrojonego modelu. Fine-tuning wygrywa, gdy dostępne są tysiące przykładów, potrzebne jest minimalne opóźnienie każdego wywołania lub format ma zostać wbudowany w model, aby prompty pozostały krótkie.

Typowa ścieżka produkcyjna wygląda następująco: prototypowanie z few-shot, zebranie udanych śladów, a następnie zdestylowanie ich do modelu po fine-tuningu, aby całkowicie usunąć tokeny przykładów.

# Decision heuristic
if num_labeled < 500 or task_volatility == 'high':
    strategy = 'few-shot ICL'
elif latency_budget_ms < 200 or prompt_token_cost_dominant:
    strategy = 'fine-tune + zero-shot'
else:
    strategy = 'few-shot now, distill later'

Zadania wymagające rozumowania potrzebują czegoś więcej niż przykładów

W przypadku wieloetapowego rozumowania same pary odpowiedzi few-shot mogą zaszkodzić: model uczy się przechodzić od razu do odpowiedzi, której nie potrafi uzasadnić. Few-shot należy łączyć z demonstracjami chain-of-thought, które pokazują ślad rozumowania, a nie tylko końcową etykietę.

Liczba przykładów oddziałuje na głębokość rozumowania; często k=2 wysokiej jakości przykładów CoT przewyższa k=8 przykładów zawierających wyłącznie odpowiedzi w testach arytmetycznych i logicznych.

COT_SHOT = (
    'Q: A shop had 23 apples, used 20, bought 6 more. How many now?\n'
    'A: Start 23, minus 20 leaves 3, plus 6 is 9. Answer: 9\n\n'
    'Q: ' + question + '\nA:'
)

Środowisko testowe dla k

Dobór liczby przykładów należy traktować jako wyszukiwanie empiryczne wspierane przez środowisko testowe. Należy wydzielić zbiór walidacyjny, kontrolować kolejność przykładów za pomocą wielu ziaren losowości oraz raportować średnią i wariancję, ponieważ dokładność few-shot może zmieniać się o kilka punktów wyłącznie z powodu kolejności.

Należy rejestrować liczbę tokenów i opóźnienie dla każdego k, aby ostateczny wybór optymalizował pełny cel, a nie tylko dokładność.

def harness(pool, val, ks, seeds=5):
    report = {}
    for k in ks:
        accs = []
        for s in range(seeds):
            demos = balanced_demos(pool, k, label_fn)
            accs.append(evaluate(build_prompt(demos), val))
        report[k] = (mean(accs), stdev(accs))
    return report

Szybkie sprawdzenie

Sprawdź swoje rozumienie doboru liczby przykładów i biasów ICL.

Podsumowanie

Najważniejsze wnioski:

  • k jest dostrajalnym hiperparametrem; należy przetestować różne wartości i obserwować krzywą wzrost–stabilizacja–spadek.
  • Zero-shot sprawdza się w dobrze znanych zadaniach, one-shot kotwiczy ścisłe formaty, a few-shot uzależnia odpowiedź od rozkładu zadania.
  • ICL działa przez odnalezienie zadania wyuczonego podczas pretrainingu, dlatego format i przestrzeń etykiet mają większe znaczenie niż poprawność etykiet.
  • Biasowi dominującej etykiety, biasowi recencyjnemu i biasowi często występujących tokenów należy przeciwdziałać przez równoważenie, losowanie kolejności i kalibrację kontekstową.
  • Należy optymalizować dokładność względem kosztu, łączyć zadania wymagające rozumowania z przykładami CoT oraz destylować stabilne prompty few-shot do modeli po fine-tuningu.
Bezpłatny start

Ucz się AI Prompt Engineering dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
53
Lekcje
199

Często zadawane pytania

Czy lekcja „Zero-, one- i few-shot” jest bezpłatna?

Tak — pełny tekst „Zero-, one- i few-shot” 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 „Zero-, one- i few-shot”?

Wybór liczby przykładów Ć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 1 z 4.

Ile czasu zajmuje lekcja „Zero-, one- i few-shot”?

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. Zero-, one- i few-shot
  2. Projektowanie skutecznych przykładów
  3. Kolejność przykładów i ich aktualność
  4. Dynamiczny dobór few-shot
← Powrót do AI Prompt Engineering