0Pricing
AI Prompt Engineering · Lektion

Top-p-Nucleus-Sampling

Wie Top-p das Sampling auf die Menge der wahrscheinlichsten Tokens beschränkt.

Top-p-Nucleus-Sampling ist eine kostenlose AI Prompt Engineering-Lektion auf CoddyKit. Dies ist Lektion 2 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-p-Sampling?

Top-p-Sampling (auch Nucleus-Sampling genannt) ist eine Technik, die das Sampling auf eine dynamische Teilmenge des Vokabulars beschränkt. Statt aus allen Tokens zu sampeln, berücksichtigt das Modell nur die kleinste Menge von Tokens, deren kumulierte Wahrscheinlichkeit mindestens p beträgt.

Die im Paper „The Curious Case of Neural Text Degeneration“ (Holtzman et al., 2019) vorgeschlagene Methode erzielt bei der Erzeugung vielfältiger und zugleich kohärenter Texte bessere Ergebnisse als eine einfache Temperaturskalierung.

So funktioniert Top-p Schritt für Schritt

Algorithmus:

  1. Berechnen Sie die Softmax-Wahrscheinlichkeiten für das gesamte Vokabular
  2. Sortieren Sie die Tokens nach Wahrscheinlichkeit (höchste zuerst)
  3. Gehen Sie die sortierte Liste durch und addieren Sie die Wahrscheinlichkeiten, bis die kumulierte Summe p erreicht
  4. Diese Menge von Tokens ist der Nucleus
  5. Sampeln Sie ausschließlich aus dem Nucleus (normalisieren Sie die Wahrscheinlichkeiten neu, sodass ihre Summe 1 ergibt)
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)

Der dynamische Nucleus

Die zentrale Erkenntnis bei Top-p: Die Größe des Nucleus ist dynamisch. Wenn das Modell sehr sicher ist (ein Token dominiert mit einer Wahrscheinlichkeit von 0.95), enthält der Nucleus nur 1 Token. Wenn das Modell unsicher ist (viele Tokens haben eine ähnliche Wahrscheinlichkeit), wird der Nucleus größer und nimmt mehr Tokens auf.

Dadurch passt sich die Methode automatisch an die Sicherheit des Modells an: hohe Sicherheit → kleines Vokabular → fokussierte Ausgabe. Geringe Sicherheit → größeres Vokabular → mehr Exploration.

# 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 in der OpenAI-API

Setzen Sie top_p in Ihrem API-Aufruf. Der gültige Bereich reicht von 0.0–1.0. Der Standardwert ist 1.0 (vollständiges Vokabular, keine Nucleus-Beschränkung).

OpenAI empfiehlt: Wenn Sie top_p ändern, lassen Sie die Temperatur auf 1.0 und umgekehrt. Wenn Sie beide Werte gleichzeitig anpassen, lässt sich das effektive Sampling-Verhalten nur schwer vorhersagen.

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: Uneingeschränktes Sampling

Wenn top_p=1.0 gilt, enthält der Nucleus alle Tokens – das vollständige Vokabular. Dies entspricht reinem Temperatur-Sampling ohne Top-p-Beschränkung. Jedes Token hat, unabhängig davon, wie unwahrscheinlich es ist, eine von null verschiedene Wahrscheinlichkeit, ausgewählt zu werden.

Verwenden Sie p=1.0, wenn Sie maximale Vielfalt wünschen. Bei p=1.0 steuert nur die Temperatur die Form der Verteilung.

# 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
)

Abwägung: Top-p und Temperatur

Beide Parameter steuern die Vielfalt der Ausgabe, jedoch auf unterschiedliche Weise:

  • Temperatur formt die gesamte Verteilung neu – die relative Wahrscheinlichkeit eines Tokens im Vergleich zu allen anderen verändert sich
  • Top-p beschneidet die Verteilung – ein Token wird einfach ausgeschlossen, wenn es außerhalb des Nucleus liegt, unabhängig von seiner relativen Wahrscheinlichkeit

Top-p verhindert das Problem des „Tail-Samplings“: Bei hoher Temperatur werden extrem unwahrscheinliche Tokens (unverständliche oder themenfremde Wörter) gelegentlich gesampelt. Top-p entfernt diese Tokens vollständig aus der Auswahl.

# 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

Temperatur und Top-p kombinieren

Bei der Kombination beider Parameter wird die Temperatur zuerst angewendet (die Verteilung wird neu geformt), anschließend wird Top-p auf die resultierenden Wahrscheinlichkeiten angewendet (die Verteilung wird auf den Nucleus beschränkt).

Gängige Konfigurationen für die Produktion:

  • Kreatives Schreiben: temp=1.0, top_p=0.95
  • Chat: temp=0.8, top_p=0.9
  • Code: temp=0.2, top_p=1.0 (Top-p ist bei niedriger Temperatur nicht einschränkend)
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 und Wiederholungen

Niedrige Top-p-Werte können Wiederholungen verursachen. Wenn der Nucleus sehr klein ist (z. B. p=0.5), sampelt das Modell wiederholt aus einer winzigen Menge von Tokens. Die Ausgabe wird repetitiv und vorhersehbar – genau das Gegenteil des beabsichtigten kreativen Effekts.

Achten Sie auf Wiederholungen als Anzeichen dafür, dass top-p für die Aufgabe zu niedrig eingestellt ist. Eine hilfreiche Diagnose: Wenn das Modell dieselben Formulierungen wiederholt, erhöhen Sie top-p oder die 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 und Top-k: Ein Ausblick

Top-p und Top-k beschneiden beide das Vokabular vor dem Sampling, jedoch auf unterschiedliche Weise:

  • Top-p: dynamische Nucleus-Größe – wird größer, wenn das Modell unsicher ist, und kleiner, wenn es sicher ist
  • Top-k: feste Nucleus-Größe – berücksichtigt unabhängig von der Sicherheit immer genau k Tokens

Top-p wird im Allgemeinen bevorzugt, da es sich an die Sicherheit des Modells anpasst. Top-k wird in der nächsten Lektion ausführlich behandelt.

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

Standardwerte und wann Sie sie ändern sollten

API-Standardwerte: top_p = 1.0 (keine Nucleus-Beschränkung). Wann sollten Sie den Wert ändern?

  • Top-p senken (0.7–0.9): wenn die Ausgaben inkohärent wirken oder unsinnige Wörter enthalten – zu viel Tail-Sampling
  • Bei 1.0 belassen: wenn die Temperatur bereits niedrig ist – bei niedriger Temperatur ist die Verteilung ohnehin spitz, sodass top-p nicht zusätzlich einschränkt
  • Nicht unter 0.5 senken: verursacht Wiederholungen und einen Verlust an Vielfalt
# 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 in Anthropic Claude

Auch die Claude-API von Anthropic stellt top_p als Parameter bereit. Das Verhalten ist identisch: Das Modell bildet einen Nucleus aus der kleinsten Menge von Tokens, deren kumulierte Wahrscheinlichkeit den Schwellenwert p erreicht, und sampelt anschließend aus diesem Nucleus.

Kombinieren Sie top_p mit der Temperatur, um eine präzise Steuerung zu ermöglichen: Verwenden Sie die Temperatur, um die Verteilung zu formen, und top_p, um zu begrenzen, welche Tokens aus dieser Verteilung ausgewählt werden können.

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)

Wissenscheck

Was ist der entscheidende Vorteil des Top-p- (Nucleus-)Samplings gegenüber dem Top-k-Sampling?

Zusammenfassung: Top-p-Nucleus-Sampling

Top-p-Sampling erstellt einen dynamischen Nucleus – die kleinste Menge von Tokens, die mindestens p der Gesamtwahrscheinlichkeit abdeckt:

  • p=1.0: vollständiges Vokabular, keine Beschränkung
  • p=0.9: oberste 90 % der Wahrscheinlichkeitsmasse – typische Einstellung für kreative Aufgaben
  • p=0.5: sehr fokussiert – Risiko von Wiederholungen

Der Nucleus wird größer, wenn das Modell unsicher ist, und kleiner, wenn es sicher ist. Dadurch wird Tail-Sampling verhindert (unverständliche Ausgaben durch unwahrscheinliche Tokens), während die Vielfalt erhalten bleibt. In der nächsten Lektion geht es um Top-k-Sampling und dessen Unterschiede zu Top-p.

Häufig gestellte Fragen

Ist die Lektion „Top-p-Nucleus-Sampling“ kostenlos?

Ja — der vollständige Text von „Top-p-Nucleus-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-p-Nucleus-Sampling“?

Wie Top-p das Sampling auf die Menge der wahrscheinlichsten Tokens beschränkt. 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 2 von 4.

Wie lange dauert die Lektion „Top-p-Nucleus-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

  1. Was ist Temperature in LLMs?
  2. Top-p-Nucleus-Sampling
  3. Top-k-Sampling
  4. Parameter für Ihren Anwendungsfall auswählen
← Zurück zu AI Prompt Engineering