Promptteknik til AI · Lektion

Top-p-nucleus sampling

Sådan begrænser top-p sampling til sættet af mest sandsynlige tokens.

Lektion 2 af 413 trin

Top-p-nucleus sampling er en gratis Promptteknik til AI-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Promptteknik til AI, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Promptteknik til AI-kurset indeholder 4 lektioner i alt.

Hvad er top-p-udvælgelse?

Top-p-udvælgelse (også kaldet kerneudvælgelse) er en teknik, der begrænser udvælgelsen til en dynamisk delmængde af vokabularet. I stedet for at udvælge blandt alle tokens overvejer modellen kun den mindste mængde tokens, hvis kumulative sandsynlighed er mindst p.

Teknikken blev foreslået i artiklen 'Det besynderlige tilfælde med neural tekstdegenerering' (Holtzman et al., 2019) og overgår simpel temperaturskalering ved generering med både variation og sammenhæng.

Sådan fungerer top-p trin for trin

Algoritme:

  1. Beregn softmax-sandsynligheder over hele vokabularet
  2. Sortér tokens efter sandsynlighed (højeste først)
  3. Gå ned gennem den sorterede liste, og læg sandsynlighederne sammen, indtil den kumulative sum når p
  4. Denne mængde tokens er kernen
  5. Udvælg kun fra kernen (normalisér sandsynlighederne igen, så summen bliver 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 dynamiske kerne

Den afgørende pointe ved top-p er, at kernens størrelse er dynamisk. Når modellen er meget sikker (ét token dominerer med en sandsynlighed på 0.95), indeholder kernen kun 1 token. Når modellen er usikker (mange tokens har næsten samme sandsynlighed), udvides kernen, så den omfatter flere tokens.

På den måde tilpasser den sig automatisk modellens sikkerhed – høj sikkerhed → lille vokabular → fokuseret resultat. Lav sikkerhed → større vokabular → mere udforskning.

# 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'et

Angiv top_p i dit API-kald. Det gyldige interval er 0.0–1.0. Standardværdien er 1.0 (hele vokabularet, ingen kernebegrænsning).

OpenAI anbefaler, at du lader temperaturen stå på 1.0, hvis du ændrer top_p, og omvendt. Hvis du justerer begge samtidigt, bliver den faktiske udvælgelsesadfærd svær at forudsige.

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: Ubegrænset udvælgelse

Når top_p=1.0, omfatter kernen alle tokens – hele vokabularet. Det svarer til ren temperaturbaseret udvælgelse uden top-p-begrænsning. Alle tokens har en sandsynlighed større end nul for at blive valgt, uanset hvor usandsynlige de er.

Brug p=1.0, når du ønsker maksimal variation. Ved p=1.0 er det kun temperaturen, der styrer fordelingens 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
)

Afvejning: top-p eller temperatur

Begge parametre styrer variationen i resultatet, men på forskellige måder:

  • Temperatur ændrer hele fordelingen – et tokens relative sandsynlighed i forhold til alle andre ændres
  • Top-p afskærer fordelingen – et token udelukkes ganske enkelt, hvis det ligger uden for kernen, uanset dets relative sandsynlighed

Top-p forhindrer problemet med udvælgelse fra halen: Ved høj temperatur bliver ekstremt usandsynlige tokens (uforståelig tekst, irrelevante ord) lejlighedsvis valgt. Top-p fjerner disse tokens helt fra udvælgelsen.

# 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

Kombination af temperatur og top-p

Når begge parametre kombineres, anvendes temperaturen først (fordelingen ændres), og derefter anvendes top-p på de resulterende sandsynligheder (fordelingen afskæres til kernen).

Almindelige produktionskonfigurationer:

  • Kreativ skrivning: temp=1.0, top_p=0.95
  • Chat: temp=0.8, top_p=0.9
  • Kode: temp=0.2, top_p=1.0 (top-p er ikke begrænsende ved lav 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 og gentagelser

Lave top-p-værdier kan føre til gentagelser. Når kernen er meget lille (f.eks. p=0.5), udvælger modellen gentagne gange fra en lille mængde tokens. Resultatet bliver gentagende og forudsigeligt – det modsatte af den ønskede kreative effekt.

Vær opmærksom på gentagelser som et tegn på, at top-p er sat for lavt til opgaven. En nyttig fejlsøgningsregel er: Hvis modellen gentager de samme formuleringer i en løkke, skal du øge top-p eller temperaturen.

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 og top-k: Et eksempel på forskellen

Top-p og top-k afskærer begge vokabularet før udvælgelsen, men på forskellige måder:

  • Top-p: dynamisk kernestørrelse – udvides, når modellen er usikker, og bliver mindre, når den er sikker
  • Top-k: fast kernestørrelse – overvejer altid præcis k tokens uanset modellens sikkerhed

Top-p foretrækkes generelt, fordi metoden tilpasser sig modellens sikkerhed. Top-k gennemgås detaljeret i næste 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ærdier, og hvornår du bør ændre dem

API'ets standardværdier: top_p = 1.0 (ingen kernebegrænsning). Hvornår bør du ændre den?

  • Sænk top_p (0.7–0.9): når resultaterne virker usammenhængende eller indeholder meningsløse ord – for meget udvælgelse fra halen
  • Bevar værdien 1.0: når temperaturen allerede er lav – ved lav temperatur er fordelingen allerede skarp, og top-p er alligevel ikke begrænsende
  • Sænk den ikke til under 0.5: det fører til gentagelser og mindre 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

Anthropics Claude-API tilbyder også top_p som parameter. Adfærden er identisk: Modellen opbygger en kerne bestående af den mindste mængde tokens, hvis kumulative sandsynlighed når tærsklen p, og udvælger derefter fra denne kerne.

Kombinér med temperatur for fin kontrol: Brug temperatur til at forme fordelingen og top_p til at begrænse, hvilke tokens der kan vælges fra fordelingen.

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)

Videnscheck

Hvad er den vigtigste fordel ved top-p- (kerne-)udvælgelse frem for top-k-udvælgelse?

Opsummering: Top-p-kerneudvælgelse

Top-p-udvælgelse opbygger en dynamisk kerne – den mindste mængde tokens, der dækker mindst p af den samlede sandsynlighed:

  • p=1.0: hele vokabularet, ingen begrænsning
  • p=0.9: de øverste 90 % af sandsynlighedsmassen – typisk indstilling til kreativ tekst
  • p=0.5: meget fokuseret – risiko for gentagelser

Kernen udvides, når modellen er usikker, og bliver mindre, når den er sikker. Det forhindrer udvælgelse fra halen (uforståelig tekst fra usandsynlige tokens), samtidig med at variationen bevares. Næste lektion: top-k-udvælgelse, og hvordan den adskiller sig fra top-p.

Gratis at komme i gang

Lær Promptteknik til AI med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
53
Lektioner
199

Ofte stillede spørgsmål

Er lektionen “Top-p-nucleus sampling” gratis?

Ja — alle 3 lektioner i læringssporet Promptteknik til AI, inklusive “Top-p-nucleus sampling”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Promptteknik til AI-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Top-p-nucleus sampling”?

Sådan begrænser top-p sampling til sættet af mest sandsynlige tokens. Du øver dig i Promptteknik til AI med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Promptteknik til AI?

Der kræves ingen tidligere erfaring. Promptteknik til AI på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Top-p-nucleus sampling”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Promptteknik til AI-lektion?

Ja. Alle Promptteknik til AI-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Hvad er temperature i LLM'er?
  2. Top-p-nucleus sampling
  3. Top-k-sampling
  4. Valg af parametre til din anvendelse
← Tilbage til Promptteknik til AI