Top-k-Sampling
Beschränkung der Auswahl auf die k wahrscheinlichsten Tokens und deren Einfluss auf die Ausgabediversität.
Top-k-Sampling ist eine kostenlose AI Prompt Engineering-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Prompt Engineering-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.
Was ist Top-k-Sampling?
Top-k-Sampling beschränkt das Modell bei jedem Schritt auf das Sampling aus den k wahrscheinlichsten Tokens. Allen Tokens außerhalb der Top-k werden Wahrscheinlichkeiten von null zugewiesen, sodass sie nicht ausgewählt werden können.
k=1 entspricht Greedy Decoding (nur das einzelne wahrscheinlichste Token). k=50 ist ein typischer Bereich für kreative Aufgaben. k=vocabulary_size entspricht uneingeschränktem Sampling.
Top-k-Algorithmus
Der Algorithmus ist einfacher als bei Top-p:
- Berechnen Sie die Softmax-Wahrscheinlichkeiten für das gesamte Vokabular
- Sortieren Sie die Tokens absteigend nach Wahrscheinlichkeit
- Behalten Sie nur die Top-k-Tokens und setzen Sie alle anderen auf 0
- Normalisieren Sie die Wahrscheinlichkeiten der Top-k-Tokens neu, sodass ihre Summe 1 ergibt
- Sampeln Sie aus der neu normalisierten Verteilung
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: Greedy Decoding
Bei k=1 befindet sich nur das einzelne wahrscheinlichste Token in der Kandidatenmenge. Das Sampling aus einer Menge der Größe 1 ist deterministisch – das Modell wählt immer dieses Token. Dies entspricht dem Greedy Decoding (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 deterministicTypischer Bereich für kreative Aufgaben: k=50
k=50 ist ein gängiger Standardwert für die Generierung kreativer Texte. Dadurch kann das Modell bei jedem Schritt aus 50 Tokens wählen, während verhindert wird, dass es Tokens mit sehr geringer Sicherheit auswählt.
Bei einem Vokabular von 50.000 Tokens berücksichtigt das Modell bei k=50 in jedem Schritt nur die obersten 0,1 % der Tokens. Das ist eine deutliche Einschränkung – der größte Teil des Vokabulars wird ausgeschlossen.
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 in der Claude-API von Anthropic
Die Claude-API von Anthropic stellt top_k als direkten Parameter bereit. Dadurch lässt sich einfach untersuchen, wie sich die Beschränkung des Vokabulars auf eine feste Größe auf die Ausgaben von Claude auswirkt.
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)Das Problem mit dem festen k
Die grundlegende Einschränkung von Top-k: k ist fest, unabhängig davon, wie sicher das Modell in diesem Schritt ist.
Wenn das Modell sehr sicher ist (ein Token hat eine Wahrscheinlichkeit von 95 %), enthält k=50 weiterhin 49 weitgehend irrelevante Tokens. Wenn das Modell sehr unsicher ist (50 Tokens haben jeweils etwa 2 % Wahrscheinlichkeit), kann k=50 tatsächlich angemessen sein.
Das Problem: k=50 kann je nach Kontext gleichzeitig zu restriktiv und zu großzügig sein. Top-p löst dieses Problem mit einer dynamischen Nucleus-Größe.
# 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 an den Enden der Verteilung
Top-k und Top-p unterscheiden sich am deutlichsten an den Enden der Verteilung:
- Bei top-k=50 kann das 50. Token eine Wahrscheinlichkeit von 0,001 % haben (extrem unwahrscheinlich, aber weiterhin in der Kandidatenmenge)
- Bei top-p=0.9 wird jedes Token außerhalb des 90-%-Nucleus ausgeschlossen – auch Tokens, die in Top-k enthalten wären
Top-p behandelt das Verhalten an den Verteilungsenden prinzipiengeleiteter: Es schließt unwahrscheinliche Tokens anhand ihrer Wahrscheinlichkeit aus, nicht anhand ihrer Position in der Rangfolge.
# 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 entirelyTop-k und Top-p kombinieren
Einige Implementierungen wenden sowohl Top-k als auch Top-p an: Zuerst wird auf Top-k beschränkt, anschließend wird innerhalb dieser Menge Top-p-Nucleus-Sampling angewendet. Dadurch wird eine harte Obergrenze für die Vokabulargröße (Top-k) mit einer wahrscheinlichkeitbasierten Filterung (Top-p) kombiniert.
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)Wann Top-k gegenüber Top-p bevorzugt wird
Trotz der theoretischen Vorteile von Top-p wird Top-k in einigen Szenarien bevorzugt:
- Aufgaben mit beschränktem Vokabular: Wenn das Modell nur aus einer festen Menge ausgeben soll (z. B. bei Multiple-Choice mit A/B/C/D), setzt ein kleines Top-k (4) diese Einschränkung direkt durch
- Reproduzierbarkeit: Das Verhalten von Top-k ist leichter nachvollziehbar – „immer genau 50 Tokens berücksichtigen“
- Hardwareoptimierte Implementierungen: Einige Inference-Engines implementieren Top-k effizienter als 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 tokenPraktische Richtlinien für Top-k
Wann Sie Top-k verwenden sollten und welche Werte geeignet sind:
- k=1: Greedy / faktische Aufgaben
- k=5–20: fokussierte kreative Aufgaben, minimale Variation
- k=40–100: üblicher kreativer Bereich bei den meisten Sprachmodellen
- k=500+: sehr offene Exploration (selten erforderlich; verwenden Sie stattdessen Top-p)
In den meisten modernen LLM-APIs ist Top-p der bevorzugte Parameter. Verwenden Sie Top-k, wenn Sie eine harte Obergrenze für das Vokabular benötigen oder wenn die API Top-k, aber nicht Top-p bereitstellt.
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 und Temperatur zusammen
Top-k und Temperatur werden nacheinander angewendet: Zuerst formt die Temperatur die Logit-Verteilung neu, anschließend beschränkt top-k sie auf die k wahrscheinlichsten Tokens. Die Kombination beider Verfahren ist in Hugging-Face-Transformers-Pipelines üblich.
Typische Kombination: temperature=0.9 (moderate Vielfalt) + top_k=50 (harte Begrenzung des Vokabulars). Dadurch werden sowohl die zu starke Gleichförmigkeit einer hohen Temperatur allein als auch das Problem des Samplings aus dem Verteilungsschwanz vermieden.
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'])Wissensüberprüfung
Welches Verhalten zeigt das Modell beim Top-k-Sampling, wenn k=1 festgelegt ist?
Zusammenfassung: Top-k-Sampling
Top-k-Sampling beschränkt das Vokabular vor dem Sampling auf die k wahrscheinlichsten Tokens:
- k=1: Greedy-Decoding – deterministisch, wählt immer das oberste Token
- k=50: typischer kreativer Bereich – ausgewogenes Verhältnis von Vielfalt und Kohärenz
- Wichtige Einschränkung: k bleibt unabhängig vom Vertrauen des Modells festgelegt – die Auswahl kann zu freizügig oder zu restriktiv sein
- Im Vergleich zu top-p: Der dynamische Nukleus von top-p passt sich dem Vertrauen an, top-k dagegen nicht
Verwenden Sie top-k, wenn Sie eine harte Begrenzung des Vokabulars benötigen. Für die meisten Anwendungen in der Produktion ist top-p vorzuziehen. Nächste Lektion: Parameter für Ihren konkreten Anwendungsfall auswählen.
Häufig gestellte Fragen
Ist die Lektion „Top-k-Sampling“ kostenlos?
Ja — der vollständige Text von „Top-k-Sampling“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Prompt Engineering-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Top-k-Sampling“?
Beschränkung der Auswahl auf die k wahrscheinlichsten Tokens und deren Einfluss auf die Ausgabediversität. Du übst AI Prompt Engineering mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um AI Prompt Engineering zu starten?
Keine Vorkenntnisse erforderlich. AI Prompt Engineering auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Top-k-Sampling“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser AI Prompt Engineering-Lektion Code schreiben und ausführen?
Ja. Jede AI Prompt Engineering-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Was ist Temperature in LLMs?
- Top-p-Nucleus-Sampling
- Top-k-Sampling
- Parameter für Ihren Anwendungsfall auswählen