Próbkowanie nucleus top-p
Jak top-p ogranicza próbkowanie do zbioru tokenów o najwyższym prawdopodobieństwie.
Próbkowanie nucleus top-p 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.
Czym jest próbkowanie top-p?
Próbkowanie top-p (nazywane także próbkowaniem jądrowym) to technika ograniczająca próbkowanie do dynamicznego podzbioru słownika. Zamiast próbkować ze wszystkich tokenów, model bierze pod uwagę tylko najmniejszy zbiór tokenów, którego skumulowane prawdopodobieństwo wynosi co najmniej p.
Technika zaproponowana w artykule „The Curious Case of Neural Text Degeneration” (Holtzman i in., 2019) przewyższa proste skalowanie temperatury w generowaniu zróżnicowanego, a zarazem spójnego tekstu.
Jak działa top-p krok po kroku
Algorytm:
- Oblicz prawdopodobieństwa softmaxu dla pełnego słownika
- Posortuj tokeny według prawdopodobieństwa (od najwyższego)
- Przechodź w dół posortowanej listy, sumując prawdopodobieństwa, aż suma skumulowana osiągnie wartość p
- Ten zbiór tokenów to jądro
- Próbkuj wyłącznie z jądra (ponownie znormalizuj prawdopodobieństwa, aby ich suma wynosiła 1)
import numpy as np
def top_p_sample(logits, p=0.9):
probs = softmax(logits, temperature=1.0)
# Sort by probability descending
sorted_indices = np.argsort(probs)[::-1]
sorted_probs = probs[sorted_indices]
# Find nucleus: smallest set with cumulative prob >= p
cumulative = np.cumsum(sorted_probs)
nucleus_size = np.searchsorted(cumulative, p) + 1
nucleus_indices = sorted_indices[:nucleus_size]
nucleus_probs = sorted_probs[:nucleus_size]
# Renormalize
nucleus_probs = nucleus_probs / nucleus_probs.sum()
# Sample
chosen = np.random.choice(nucleus_indices, p=nucleus_probs)
return chosen
token = top_p_sample(logits, p=0.9)Dynamiczne jądro
Kluczowa obserwacja dotycząca top-p: rozmiar jądra jest dynamiczny. Gdy model jest bardzo pewny (jeden token dominuje z prawdopodobieństwem 0.95), jądro zawiera tylko 1 token. Gdy model jest niepewny (wiele tokenów ma podobne prawdopodobieństwo), jądro powiększa się i obejmuje więcej tokenów.
To automatycznie dostosowuje się do pewności modelu — wysoka pewność → mały słownik → skoncentrowany wynik. Niska pewność → większy słownik → większa eksploracja.
# High-confidence situation: model strongly prefers 'the'
high_confidence_logits = np.array([5.0, 1.0, 0.5, 0.1, -0.5])
hc_probs = softmax(high_confidence_logits)
print('High confidence probs:', np.round(hc_probs, 3))
# [0.974, 0.018, 0.011, 0.007, 0.004]
# Top-p=0.9 nucleus: just 1 token (cumulative after token 0 = 97.4% > 90%)
# Low-confidence situation: model unsure
low_confidence_logits = np.array([1.1, 1.0, 0.9, 0.8, 0.7])
lc_probs = softmax(low_confidence_logits)
print('Low confidence probs:', np.round(lc_probs, 3))
# [0.218, 0.208, 0.199, 0.190, 0.181]
# Top-p=0.9 nucleus: all 5 tokens (need all to reach 90%)Top-p w API OpenAI
Ustaw top_p w wywołaniu API. Prawidłowy zakres wynosi 0.0–1.0. Wartość domyślna to 1.0 (pełny słownik, bez ograniczenia jądra).
OpenAI zaleca: po zmianie top_p należy pozostawić temperaturę na poziomie 1.0, a po zmianie temperatury — pozostawić top_p bez zmian. Jednoczesne dostosowywanie obu parametrów utrudnia przewidzenie efektywnego zachowania podczas próbkowania.
import openai
client = openai.OpenAI(api_key='sk-...')
# Nucleus sampling: top 90% of probability mass
resp = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'Tell me an interesting fact about the ocean.'}],
temperature=1.0, # leave temperature at default
top_p=0.9 # sample from top 90% nucleus
)
print(resp.choices[0].message.content)p=1.0: próbkowanie bez ograniczeń
Gdy top_p=1.0, jądro obejmuje wszystkie tokeny — pełny słownik. Jest to równoważne czystemu próbkowaniu z temperaturą, bez ograniczenia top-p. Każdy token, niezależnie od tego, jak mało prawdopodobny, ma niezerową szansę na wybór.
Wartość p=1.0 należy stosować, gdy potrzebna jest maksymalna różnorodność. Przy p=1.0 tylko temperatura kształtuje rozkład.
# p=1.0: all tokens in nucleus
resp_full = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'Generate a creative story opening.'}],
temperature=1.0,
top_p=1.0 # no nucleus restriction
)
# p=0.5: very focused nucleus
resp_focused = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'Generate a creative story opening.'}],
temperature=1.0,
top_p=0.5 # only top 50% probability mass
)Kompromis: top-p a temperatura
Oba parametry sterują różnorodnością wyników, ale robią to w różny sposób:
- Temperatura zmienia kształt całego rozkładu — zmienia się względne prawdopodobieństwo tokenu w porównaniu ze wszystkimi pozostałymi
- Top-p ucina rozkład — token zostaje po prostu wykluczony, jeśli znajduje się poza jądrem, niezależnie od jego względnego prawdopodobieństwa
Top-p zapobiega problemowi „próbkowania z ogona”: przy wysokiej temperaturze mogą być czasami wybierane skrajnie mało prawdopodobne tokeny (bełkotliwe lub niezwiązane z tematem). Top-p całkowicie usuwa te tokeny z puli kandydatów.
# The tail problem with temperature alone
high_temp_logits = np.array([3.0, 2.0, 1.0, 0.0, -1.0, -5.0, -10.0])
probs_high_temp = softmax(high_temp_logits, temperature=2.0)
print('High temp probs:', np.round(probs_high_temp, 4))
# The last token (logit=-10) still has a small probability
# With many tokens in a real vocab, these rare tokens accumulate
# and occasionally get sampled, producing incoherent output
# Top-p=0.9 cuts these off entirely
# ensuring only tokens contributing to the top 90% are consideredŁączenie temperatury i top-p
Przy łączeniu obu parametrów temperatura jest stosowana najpierw (zmienia kształt rozkładu), a następnie top-p jest stosowane do uzyskanych prawdopodobieństw (ograniczając je do jądra).
Typowe konfiguracje produkcyjne:
- Kreatywne pisanie: temp=1.0, top_p=0.95
- Czat: temp=0.8, top_p=0.9
- Kod: temp=0.2, top_p=1.0 (top-p nie ogranicza rozkładu przy niskiej temperaturze)
def combined_sample(logits, temperature=1.0, top_p=0.9):
# Step 1: apply temperature
probs = softmax(logits, temperature=temperature)
# Step 2: apply top-p nucleus
sorted_idx = np.argsort(probs)[::-1]
sorted_probs = probs[sorted_idx]
cumulative = np.cumsum(sorted_probs)
nucleus_size = np.searchsorted(cumulative, top_p) + 1
nucleus_idx = sorted_idx[:nucleus_size]
nucleus_probs = probs[nucleus_idx]
nucleus_probs = nucleus_probs / nucleus_probs.sum()
return np.random.choice(nucleus_idx, p=nucleus_probs)Top-p a powtórzenia
Niskie wartości top-p mogą powodować powtórzenia. Gdy jądro jest bardzo małe (np. p=0.5), model wielokrotnie losuje z niewielkiego zbioru tokenów. Wynik staje się powtarzalny i przewidywalny — jest to przeciwieństwo zamierzonego efektu kreatywnego.
Powtórzenia są sygnałem, że wartość top-p jest zbyt niska dla danego zadania. Przydatna wskazówka diagnostyczna: jeśli model zapętla się na tych samych frazach, należy zwiększyć top-p lub temperaturę.
def detect_repetition(text, window=20):
words = text.split()
if len(words) < window * 2:
return False
# Check if any window of words repeats within the text
for i in range(len(words) - window):
phrase = ' '.join(words[i:i + window])
rest = ' '.join(words[i + window:])
if phrase in rest:
return True
return False
response = call_llm(prompt)
if detect_repetition(response):
print('Warning: repetition detected — consider increasing top_p or temperature')Top-p a top-k: zapowiedź
Top-p i top-k przed próbkowaniem ograniczają słownik, ale robią to w różny sposób:
- Top-p: dynamiczny rozmiar jądra — powiększa się, gdy model jest niepewny, i zmniejsza, gdy model jest pewny
- Top-k: stały rozmiar jądra — zawsze uwzględnia dokładnie k tokenów, niezależnie od pewności modelu
Top-p jest na ogół preferowane, ponieważ dostosowuje się do pewności modelu. Top-k zostanie szczegółowo omówione w następnej lekcji.
# Top-k equivalent for comparison
def top_k_sample(logits, k=50):
probs = softmax(logits)
# Keep only top-k tokens
top_k_indices = np.argsort(probs)[::-1][:k]
top_k_probs = probs[top_k_indices]
top_k_probs = top_k_probs / top_k_probs.sum()
return np.random.choice(top_k_indices, p=top_k_probs)
# Key difference: k is always 50, regardless of model confidence
# Top-p nucleus size varies from 1 to thousands depending on confidenceWartości domyślne i sytuacje, w których należy je zmienić
Wartości domyślne API: top_p = 1.0 (brak ograniczenia jądra). Kiedy należy zmienić tę wartość?
- Niższe top_p (0.7–0.9): gdy wyniki wydają się niespójne lub zawierają nonsensowne słowa — występuje zbyt intensywne próbkowanie z ogona
- Pozostawienie wartości 1.0: gdy temperatura jest już niska — przy niskiej temperaturze rozkład jest już wystarczająco skupiony, więc top-p i tak nie wprowadza dodatkowego ograniczenia
- Nie należy obniżać wartości poniżej 0.5: powoduje to powtórzenia i utratę różnorodności
# Guidance: what to adjust based on symptoms
TROUBLESHOOTING = {
'output is incoherent or contains random words': {
'fix': 'lower top_p to 0.9 or 0.85',
'or': 'lower temperature'
},
'output is repetitive and looping': {
'fix': 'increase top_p or temperature',
'also': 'try adding frequency_penalty or presence_penalty'
},
'output is too predictable and boring': {
'fix': 'increase temperature to 0.9-1.2',
'keep': 'top_p at 0.95'
},
'output needs to be deterministic': {
'fix': 'set temperature=0, top_p=1.0'
}
}Top-p w Anthropic Claude
API Claude firmy Anthropic również udostępnia parametr top_p. Działa on identycznie: model buduje jądro, czyli najmniejszy zbiór tokenów, którego skumulowane prawdopodobieństwo osiąga próg p, a następnie próbuje wyłącznie z tego jądra.
Połączenie z temperaturą zapewnia precyzyjną kontrolę: temperaturą należy kształtować rozkład, a za pomocą top_p ograniczać tokeny, które mogą zostać z tego rozkładu wybrane.
import anthropic
claude = anthropic.Anthropic(api_key='sk-ant-...')
# Creative writing with nucleus sampling
message = claude.messages.create(
model='claude-opus-4-5',
max_tokens=256,
temperature=1.0,
top_p=0.95,
messages=[{
'role': 'user',
'content': 'Write a short poem about the ocean.'
}]
)
print(message.content[0].text)Sprawdzenie wiedzy
Jaka jest kluczowa przewaga próbkowania top-p (jądrowego) nad próbkowaniem top-k?
Podsumowanie: próbkowanie jądrowe top-p
Próbkowanie top-p tworzy dynamiczne jądro — najmniejszy zbiór tokenów obejmujący co najmniej p całkowitego prawdopodobieństwa:
- p=1.0: pełny słownik, brak ograniczeń
- p=0.9: 90% największej masy prawdopodobieństwa — typowe ustawienie dla zadań kreatywnych
- p=0.5: bardzo skoncentrowane próbkowanie — ryzyko powtórzeń
Jądro powiększa się, gdy model jest niepewny, i zmniejsza, gdy model jest pewny. Zapobiega to próbkowaniu z ogona (bełkotliwym wynikom pochodzącym od mało prawdopodobnych tokenów), a jednocześnie zachowuje różnorodność. Następna lekcja: próbkowanie top-k i różnice między top-k a top-p.
Często zadawane pytania
Czy lekcja „Próbkowanie nucleus top-p” jest bezpłatna?
Tak — pełny tekst „Próbkowanie nucleus top-p” 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 nucleus top-p”?
Jak top-p ogranicza próbkowanie do zbioru tokenów o najwyższym prawdopodobieństwie. Ć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 nucleus top-p”?
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
- Czym jest temperatura w LLM-ach
- Próbkowanie nucleus top-p
- Próbkowanie top-k
- Dobór parametrów do danego zastosowania