AI-promptteknik · Lektion

Top-p-nucleus sampling

Så begränsar top-p sampling till mängden mest sannolika tokens.

Lektion 2 av 413 steg

Top-p-nucleus sampling är en gratis lektion i AI-promptteknik på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för AI-promptteknik, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i AI-promptteknik innehåller totalt 4 lektioner.

Vad är top-p-sampling?

Top-p-sampling (även kallat nucleus sampling) är en teknik som begränsar samplingen till en dynamisk delmängd av vokabulären. I stället för att sampla från alla tokens tar modellen bara hänsyn till den minsta mängd tokens vars kumulativa sannolikhet är minst p.

Metoden föreslogs i artikeln 'The Curious Case of Neural Text Degeneration' (Holtzman et al., 2019) och överträffar enkel temperaturskalning vid generering med både variation och sammanhang.

Så fungerar top-p steg för steg

Algoritm:

  1. Beräkna softmax-sannolikheter över hela vokabulären
  2. Sortera tokens efter sannolikhet (högst först)
  3. Gå ned genom den sorterade listan och ackumulera sannolikheter tills den kumulativa summan når p
  4. Den här mängden tokens utgör nucleus
  5. Sampla enbart från nucleus (normalisera om sannolikheterna så att summan blir 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)

Den dynamiska nucleus

Den centrala insikten med top-p är att nucleusens storlek är dynamisk. När modellen är mycket säker (en token dominerar med sannolikheten 0.95) innehåller nucleus bara 1 token. När modellen är osäker (många tokens har liknande sannolikhet) växer nucleus och omfattar fler tokens.

Detta anpassar sig automatiskt efter modellens säkerhet – hög säkerhet → liten vokabulär → fokuserat resultat. Låg säkerhet → större vokabulär → mer utforskning.

# 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 i OpenAI API

Ställ in top_p i API-anropet. Det giltiga intervallet är 0.0–1.0. Standardvärdet är 1.0 (hela vokabulären, utan nucleus-begränsning).

OpenAI rekommenderar att temperature lämnas på 1.0 om top_p ändras, och vice versa. Om båda justeras samtidigt blir det faktiska samplingbeteendet svårt att förutsäga.

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: Obegränsad sampling

När top_p=1.0 omfattar nucleus alla tokens – hela vokabulären. Detta motsvarar ren temperatursampling utan top-p-begränsning. Varje token, oavsett hur osannolik den är, har en sannolikhet större än noll att väljas.

Använd p=1.0 när maximal variation önskas. Vid p=1.0 är det endast temperatur som styr fördelningens form.

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

Avvägning: top-p jämfört med temperatur

Båda parametrarna styr resultatets variation, men på olika sätt:

  • Temperatur formar om hela fördelningen – en tokens relativa sannolikhet jämfört med alla andras förändras
  • Top-p trunkerar fördelningen – en token utesluts helt om den ligger utanför nucleus, oavsett dess relativa sannolikhet

Top-p förhindrar problemet med sampling från svansen: vid hög temperatur kan extremt osannolika tokens (nonsens eller orelaterade ord) ibland väljas. Top-p tar bort dessa tokens helt från urvalet.

# 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

Kombinera temperatur och top-p

När båda parametrarna kombineras tillämpas temperatur först (fördelningen formas om), och därefter tillämpas top-p på de resulterande sannolikheterna (fördelningen trunkeras till nucleus).

Vanliga produktionskonfigurationer:

  • Kreativt skrivande: temp=1.0, top_p=0.95
  • Chatt: temp=0.8, top_p=0.9
  • Kod: temp=0.2, top_p=1.0 (top-p är inte begränsande vid låg temperatur)
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 och upprepning

Låga top-p-värden kan orsaka upprepningar. När nucleus är mycket liten (till exempel p=0.5) samplar modellen upprepade gånger från en liten mängd tokens. Resultatet blir upprepande och förutsägbart – motsatsen till den avsedda kreativa effekten.

Var uppmärksam på upprepningar som ett tecken på att top-p är för lågt för uppgiften. Ett användbart diagnostiskt tecken är att top-p eller temperatur bör höjas om modellen fastnar i samma fraser.

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 jämfört med top-k: en förhandsvisning

Top-p och top-k trunkerar båda vokabulären före samplingen, men på olika sätt:

  • Top-p: dynamisk nucleus-storlek – växer när modellen är osäker och krymper när den är säker
  • Top-k: fast nucleus-storlek – tar alltid hänsyn till exakt k tokens, oavsett modellens säkerhet

Top-p föredras vanligtvis eftersom metoden anpassar sig efter modellens säkerhet. Top-k behandlas utförligt i nästa lektion.

# 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

Standardvärden och när de bör ändras

API-standardvärden: top_p = 1.0 (ingen nucleus-begränsning). När bör värdet ändras?

  • Sänk top_p (0.7–0.9): när resultaten känns osammanhängande eller innehåller nonsensord – för mycket sampling från svansen
  • Behåll 1.0: när temperaturen redan är låg – vid låg temperatur är fördelningen redan koncentrerad och top-p begränsar ändå inte särskilt mycket
  • Sänk inte under 0.5: det orsakar upprepningar och minskad variation
# 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 i Anthropic Claude

Anthropic Claude API erbjuder också top_p som parameter. Funktionen är densamma: modellen bygger en nucleus med den minsta mängd tokens vars kumulativa sannolikhet når tröskeln p och samplar sedan från denna nucleus.

Kombinera med temperatur för finjusterad kontroll: använd temperatur för att forma fördelningen och top_p för att begränsa vilka tokens som kan väljas från den fördelningen.

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)

Kunskapskontroll

Vilken är den viktigaste fördelen med top-p-sampling (nucleus sampling) jämfört med top-k-sampling?

Sammanfattning: top-p nucleus sampling

Top-p-sampling bygger en dynamisk nucleus – den minsta mängd tokens som täcker minst p av den totala sannolikheten:

  • p=1.0: hela vokabulären, ingen begränsning
  • p=0.9: de översta 90 % av sannolikhetsmassan – en typisk inställning för kreativ text
  • p=0.5: mycket fokuserat – risk för upprepningar

Nucleus växer när modellen är osäker och krymper när den är säker. Detta förhindrar sampling från svansen (nonsens från osannolika tokens) samtidigt som variationen bevaras. Nästa lektion: top-k-sampling och hur det skiljer sig från top-p.

Gratis att börja

Lär dig AI-promptteknik med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
53
Lektioner
199

Vanliga frågor

Är lektionen ”Top-p-nucleus sampling” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen AI-promptteknik, inklusive ”Top-p-nucleus sampling”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i AI-promptteknik innehåller totalt 4 lektioner.

Vad lär jag mig i ”Top-p-nucleus sampling”?

Så begränsar top-p sampling till mängden mest sannolika tokens. Ni övar på AI-promptteknik med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig AI-promptteknik?

Du behöver inga förkunskaper. Utbildningen i AI-promptteknik på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Top-p-nucleus sampling”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här AI-promptteknik-lektionen?

Ja. Varje AI-promptteknik-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Vad är temperature i LLM:er?
  2. Top-p-nucleus sampling
  3. Top-k-sampling
  4. Välj parametrar för ditt användningsområde
← Tillbaka till AI-promptteknik