Próbkowanie top-k
Ograniczenie wyboru do k najbardziej prawdopodobnych tokenów i wpływ tego rozwiązania na różnorodność wyników.
Próbkowanie top-k to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 3 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-k?
Próbkowanie top-k ogranicza model do próbkowania spośród k najbardziej prawdopodobnych tokenów na każdym kroku. Wszystkim tokenom spoza top-k przypisywane jest prawdopodobieństwo zero, więc nie mogą zostać wybrane.
k=1 oznacza zachłanne dekodowanie (tylko pojedynczy najbardziej prawdopodobny token). k=50 to typowy zakres dla zadań kreatywnych. k=vocabulary_size jest równoważne próbkowaniu bez ograniczeń.
Algorytm top-k
Algorytm jest prostszy niż top-p:
- Oblicz prawdopodobieństwa softmaxu dla pełnego słownika
- Posortuj tokeny według prawdopodobieństwa malejąco
- Pozostaw tylko k najważniejszych tokenów, a wszystkim pozostałym ustaw wartość 0
- Ponownie znormalizuj prawdopodobieństwa top-k, aby ich suma wynosiła 1
- Próbkuj z ponownie znormalizowanego rozkładu
import numpy as np
def softmax(logits, temperature=1.0):
scaled = logits / temperature
e = np.exp(scaled - np.max(scaled))
return e / e.sum()
def top_k_sample(logits, k=50, temperature=1.0):
probs = softmax(logits, temperature)
# Find top-k indices
top_k_indices = np.argsort(probs)[::-1][:k]
top_k_probs = probs[top_k_indices]
# Renormalize
top_k_probs = top_k_probs / top_k_probs.sum()
# Sample
chosen = np.random.choice(top_k_indices, p=top_k_probs)
return chosen
# With a 10-token vocabulary:
logits = np.random.randn(10)
print('Chosen token:', top_k_sample(logits, k=3))k=1: zachłanne dekodowanie
Gdy k=1, zbiór kandydatów zawiera tylko pojedynczy najbardziej prawdopodobny token. Próbkowanie ze zbioru jednoelementowego jest deterministyczne — model zawsze wybiera ten token. Jest to identyczne z zachłannym dekodowaniem (temperature=0).
logits = np.array([3.0, 2.0, 1.0, 0.5, -1.0])
# k=1: greedy
top_1 = top_k_sample(logits, k=1)
print(f'k=1 always picks: {np.argmax(logits)}') # index 0, the highest logit
print(f'top_k_sample result: {top_1}') # always 0
# Multiple runs
for _ in range(5):
print(top_k_sample(logits, k=1), end=' ')
# Output: 0 0 0 0 0 — perfectly deterministicTypowy zakres kreatywny: k=50
k=50 to często stosowana wartość domyślna przy generowaniu kreatywnego tekstu. Pozwala eksplorować 50 tokenów na każdym kroku, jednocześnie uniemożliwiając modelowi wybieranie tokenów, co do których ma bardzo małą pewność.
Przy słowniku zawierającym 50 000 tokenów k=50 oznacza, że model bierze pod uwagę tylko 0.1% tokenów o najwyższym prawdopodobieństwie na każdym kroku. Jest to znaczne ograniczenie — większość słownika zostaje wykluczona.
import openai
client = openai.OpenAI(api_key='sk-...')
# Note: OpenAI API does not expose top_k directly in chat completions.
# Top-k is primarily a parameter in Hugging Face Transformers and Anthropic's API.
# Hugging Face example:
from transformers import pipeline
generator = pipeline('text-generation', model='gpt2')
output = generator(
'Once upon a time',
max_new_tokens=100,
do_sample=True,
top_k=50,
temperature=1.0
)
print(output[0]['generated_text'])Top-k w API Anthropic Claude
API Anthropic Claude udostępnia parametr top_k. Ułatwia to eksperymentowanie z wpływem stałego ograniczania słownika na wyniki Claude.
import anthropic
claude = anthropic.Anthropic(api_key='sk-ant-...')
# top_k limits the number of tokens considered
message = claude.messages.create(
model='claude-opus-4-5',
max_tokens=256,
temperature=1.0,
top_k=50, # sample from top 50 most probable tokens
messages=[{
'role': 'user',
'content': 'Write a short poem about debugging code.'
}]
)
print(message.content[0].text)Problem stałej wartości k
Podstawowe ograniczenie top-k: k jest stałe niezależnie od pewności modelu na danym kroku.
Gdy model jest bardzo pewny (jeden token ma prawdopodobieństwo 95%), k=50 nadal obejmuje 49 w dużej mierze nieistotnych tokenów. Gdy model jest bardzo niepewny (50 tokenów ma prawdopodobieństwo wynoszące około 2% każde), k=50 może być odpowiednią wartością.
Problem polega na tym, że w zależności od kontekstu k=50 może być jednocześnie zbyt restrykcyjne i zbyt liberalne. Top-p rozwiązuje ten problem dzięki dynamicznemu ustalaniu rozmiaru jądra.
# Illustrating the fixed-k problem
logits_confident = np.array([5.0] + [0.1] * 9) # model is very sure
logits_uncertain = np.array([1.0] * 10) # model has no idea
probs_conf = softmax(logits_confident)
probs_unc = softmax(logits_uncertain)
print('Confident — top 3 tokens cover:', np.sort(probs_conf)[::-1][:3].sum().round(3))
# ~0.998 — k=50 is extremely wasteful, includes near-zero probability tokens
print('Uncertain — top 3 tokens cover:', np.sort(probs_unc)[::-1][:3].sum().round(3))
# ~0.30 — k=50 may actually be needed to cover a reasonable nucleusTop-k na ogonach rozkładu
Top-k i top-p najbardziej różnią się na ogonach rozkładu:
- Przy top-k=50 token na 50. pozycji może mieć prawdopodobieństwo 0.001% (jest skrajnie mało prawdopodobny, ale nadal znajduje się w zbiorze kandydatów)
- Przy top-p=0.9 wykluczany jest każdy token spoza jądra obejmującego 90% prawdopodobieństwa — także tokeny, które znalazłyby się w top-k
Top-p w bardziej uzasadniony sposób obsługuje ogon rozkładu: wyklucza nieprawdopodobne tokeny na podstawie prawdopodobieństwa, a nie ich pozycji w rankingu.
# Tail behavior comparison
import numpy as np
# Highly skewed distribution (one dominant token)
skewed_logits = np.array([4.0, 2.0, 1.5, 1.0, 0.5,
0.1, 0.0, -0.1, -0.5, -1.0])
probs = softmax(skewed_logits)
print('Probability of tokens 6-9 (tail):')
for i in range(6, 10):
print(f' Token {i}: {probs[i]:.4%}')
# These tokens are very unlikely but are included in top-k=10
# Top-p=0.9 would exclude them entirelyŁączenie top-k i top-p
Niektóre implementacje stosują jednocześnie top-k i top-p: najpierw ograniczają zbiór do top-k, a następnie stosują próbkowanie jądrowe top-p w obrębie tego zbioru. Zapewnia to twardy limit rozmiaru słownika (top-k), a jednocześnie filtruje tokeny na podstawie prawdopodobieństwa (top-p).
def top_k_top_p_sample(logits, k=50, p=0.9, temperature=1.0):
probs = softmax(logits, temperature)
# First apply top-k
top_k_indices = np.argsort(probs)[::-1][:k]
top_k_probs = probs[top_k_indices]
# Then apply top-p within top-k
sorted_k = np.sort(top_k_probs)[::-1]
cumulative = np.cumsum(sorted_k)
nucleus_size = np.searchsorted(cumulative, p) + 1
final_indices = top_k_indices[:nucleus_size]
final_probs = top_k_probs[:nucleus_size]
final_probs = final_probs / final_probs.sum()
return np.random.choice(final_indices, p=final_probs)Kiedy top-k jest lepsze od top-p
Pomimo teoretycznych zalet top-p metoda top-k bywa preferowana w niektórych sytuacjach:
- Zadania z ograniczonym słownikiem: gdy model powinien generować wyłącznie elementy ze stałego zbioru (np. odpowiedzi wielokrotnego wyboru A/B/C/D), niska wartość top-k (4) bezpośrednio to wymusza
- Powtarzalność: działanie top-k łatwiej przeanalizować — „zawsze uwzględniaj dokładnie 50 tokenów”
- Implementacje zoptymalizowane sprzętowo: niektóre silniki wnioskowania implementują top-k wydajniej niż top-p
# Constrained output with top-k=4
# For a multiple choice task (A, B, C, D)
# If A/B/C/D tokens have indices 32, 33, 34, 35
# top-k=4 with those as the top-4 logits forces selection from those 4 only
multiple_choice_prompt = (
'Answer with only A, B, C, or D.\n'
'What is the capital of France?\n'
'A) Berlin\n'
'B) Paris\n'
'C) Rome\n'
'D) Madrid\n'
'Answer:'
)
# With temperature=0, top_k=1: always picks the highest logit tokenPraktyczne wskazówki dotyczące top-k
Kiedy stosować top-k i jakie wybierać wartości:
- k=1: zachłanne dekodowanie / zadania oparte na faktach
- k=5–20: skoncentrowane zadania kreatywne, minimalna zmienność
- k=40–100: standardowy zakres kreatywny w większości modeli językowych
- k=500+: bardzo swobodna eksploracja (rzadko potrzebna; zamiast tego należy użyć top-p)
W większości nowoczesnych API LLM preferowanym parametrem jest top-p. Top-k należy stosować, gdy potrzebny jest twardy limit słownika albo gdy API udostępnia top-k, ale nie top-p.
TOP_K_GUIDELINES = {
'factual_qa': 1, # greedy
'code_generation': 10, # near-greedy, correct syntax
'summarization': 20, # slightly varied but focused
'chat': 50, # natural variation
'creative_writing': 100, # wider vocabulary exploration
'poetry': 200, # unusual word choices encouraged
}
def call_with_top_k(task, prompt, model='claude-opus-4-5'):
k = TOP_K_GUIDELINES.get(task, 50)
claude = anthropic.Anthropic(api_key='sk-ant-...')
return claude.messages.create(
model=model,
max_tokens=512,
top_k=k,
messages=[{'role': 'user', 'content': prompt}]
)Top-k i temperatura razem
Top-k i temperatura są stosowane sekwencyjnie: najpierw temperatura zmienia kształt rozkładu logitów, a następnie top-k obcina go do k najbardziej prawdopodobnych tokenów. Stosowanie obu parametrów jednocześnie jest powszechne w potokach biblioteki Hugging Face Transformers.
Typowe połączenie: temperature=0.9 (umiarkowane zróżnicowanie) + top_k=50 (twarde ograniczenie słownika). Pozwala to uniknąć zarówno spłaszczenia rozkładu powodowanego przez samą wysoką temperaturę, jak i problemu próbkowania z ogona rozkładu.
from transformers import pipeline
generator = pipeline('text-generation', model='gpt2')
# Combined top-k + temperature
output = generator(
'The future of AI is',
max_new_tokens=80,
do_sample=True,
top_k=50,
temperature=0.9
)
print(output[0]['generated_text'])
# Compare: top-k=1 (greedy)
greedy_output = generator(
'The future of AI is',
max_new_tokens=80,
do_sample=False # greedy, equivalent to top_k=1
)
print(greedy_output[0]['generated_text'])Sprawdzian wiedzy
W próbkowaniu top-k, jak zachowuje się model po ustawieniu k=1?
Podsumowanie: próbkowanie top-k
Próbkowanie top-k ogranicza słownik do k najbardziej prawdopodobnych tokenów przed próbkowaniem:
- k=1: dekodowanie zachłanne — deterministyczne, zawsze wybiera token o najwyższym prawdopodobieństwie
- k=50: typowy zakres kreatywności — równowaga między różnorodnością a spójnością
- Główne ograniczenie: wartość k jest stała niezależnie od pewności modelu — może być zbyt liberalna lub zbyt restrykcyjna
- W porównaniu z top-p: dynamiczny zbiór nucleus top-p dostosowuje się do poziomu pewności, a top-k tego nie robi
Top-k należy stosować, gdy potrzebne jest twarde ograniczenie słownika. W większości zastosowań produkcyjnych należy preferować top-p. Następna lekcja: dobór parametrów do konkretnego przypadku użycia.
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 „Próbkowanie top-k” jest bezpłatna?
Tak — pełny tekst „Próbkowanie top-k” 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 top-k”?
Ograniczenie wyboru do k najbardziej prawdopodobnych tokenów i wpływ tego rozwiązania na różnorodność wynikó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 3 z 4.
Ile czasu zajmuje lekcja „Próbkowanie top-k”?
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