AI-prompt engineering · leksjon

Top-k-utvalg

Begrensning av valget til de k mest sannsynlige tokenene og effekten dette har på mangfoldet i utdataene.

Leksjon 3 av 413 trinn

Top-k-utvalg er en gratis leksjon i AI-prompt engineering på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i AI-prompt engineering, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i AI-prompt engineering inneholder totalt 4 leksjoner.

Hva er top-k-sampling?

Top-k-sampling begrenser modellen til å sample fra de k mest sannsynlige tokenene ved hvert trinn. Alle token utenfor top-k får sannsynlighet null og kan ikke velges.

k=1 er greedy decoding (bare det ene tokenet med høyest sannsynlighet). k=50 er et typisk område for kreativ tekst. k=vocabulary_size tilsvarer ubegrenset sampling.

Top-k-algoritmen

Algoritmen er enklere enn top-p:

  1. Beregn softmax-sannsynligheter over hele vokabularet
  2. Sorter tokenene etter synkende sannsynlighet
  3. Behold bare de k øverste tokenene; sett alle andre til 0
  4. Normaliser sannsynlighetene for top-k på nytt slik at summen blir 1
  5. Sample fra den omnormaliserte fordelingen
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

Når k=1, er bare det ene tokenet med høyest sannsynlighet med i kandidatsettet. Sampling fra et sett med størrelse 1 er deterministisk – modellen velger alltid dette tokenet. Dette er identisk med 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 deterministic

Typisk kreativt område: k=50

k=50 er en vanlig standardverdi for kreativ tekstgenerering. Det åpner for utforskning blant 50 token ved hvert trinn, samtidig som modellen hindres i å velge token den har svært lav sikkerhet for.

Med et vokabular på 50,000 token betyr k=50 at modellen bare vurderer de øverste 0.1% av tokenene ved hvert trinn. Dette er en betydelig begrensning – det meste av vokabularet utelates.

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 i Claude API-et fra Anthropic

Claude API-et fra Anthropic tilbyr top_k som en direkte parameter. Dette gjør det enkelt å eksperimentere med effekten av fast vokabularavkorting på resultatene fra 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)

Problemet med fast k

Den grunnleggende begrensningen ved top-k er at k er fast, uavhengig av modellens sikkerhet på det aktuelle trinnet.

Når modellen er svært sikker (ett token har 95 % sannsynlighet), inneholder k=50 fortsatt 49 i stor grad irrelevante token. Når modellen er svært usikker (50 token har omtrent 2 % sannsynlighet hver), kan k=50 faktisk være passende.

Problemet er at k=50 kan være både for begrensende og for åpent, avhengig av konteksten. Top-p løser dette med dynamisk dimensjonering av nucleus.

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

Top-k i fordelingshalene

Top-k og top-p skiller seg tydeligst i halene av fordelingen:

  • Med top-k=50 kan token nummer 50 ha sannsynlighet 0.001% (ekstremt usannsynlig, men fortsatt med i kandidatsettet)
  • Med top-p=0.9 utelates alle token utenfor 90 %-nucleus – også token som ville vært med i top-k

Top-p har en mer prinsipiell tilnærming til hvordan halen håndteres: metoden utelukker usannsynlige token basert på sannsynlighet, ikke plasseringen i rangeringen.

# 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

Kombinere top-k og top-p

Enkelte implementasjoner bruker både top-k og top-p: Først avkortes fordelingen til top-k, og deretter brukes top-p nucleus sampling innenfor dette settet. Dette gir både en hard grense for vokabularstørrelsen (top-k) og sannsynlighetsbasert filtrering (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)

Når top-k foretrekkes fremfor top-p

Til tross for top-p sine teoretiske fordeler foretrekkes top-k i enkelte scenarioer:

  • Oppgaver med begrenset vokabular: når modellen bare skal gi resultater fra et fast sett (for eksempel flervalgsalternativene A/B/C/D), håndhever en lav top-k (4) dette direkte
  • Reproduserbarhet: top-k-atferd er enklere å forstå – «vurder alltid nøyaktig 50 token»
  • Maskinvareoptimaliserte implementasjoner: enkelte inferensmotorer implementerer top-k mer effektivt enn 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 token

Praktiske retningslinjer for top-k

Når top-k bør brukes, og hvilke verdier du bør velge:

  • k=1: greedy / faktabaserte oppgaver
  • k=5–20: fokuserte kreative oppgaver, minimal variasjon
  • k=40–100: standard kreativt område i de fleste språkmodeller
  • k=500+: svært åpen utforskning (trengs sjelden; bruk heller top-p)

I de fleste moderne LLM-API-er er top-p den foretrukne parameteren. Bruk top-k når du trenger en hard grense for vokabularet, eller når API-et tilbyr top-k, men ikke 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 og temperatur sammen

Top-k og temperatur brukes i rekkefølge: Først former temperaturen logit-fordelingen på nytt, deretter avkorter top-k den til de k mest sannsynlige tokenene. Det er vanlig å bruke begge sammen i Hugging Face Transformers-pipelines.

Typisk kombinasjon: temperature=0.9 (moderat variasjon) + top_k=50 (fast grense for ordforrådet). Dette unngår både flatheten som høy temperatur alene kan gi, og problemet med sampling fra halen.

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'])

Kunnskapssjekk

Hvilken atferd viser modellen ved top-k-sampling når k=1 er angitt?

Oppsummering: Top-k-sampling

Top-k-sampling avkorter ordforrådet til de k mest sannsynlige tokenene før sampling:

  • k=1: greedy decoding – deterministisk, velger alltid det øverste tokenet
  • k=50: typisk kreativt område – balansert variasjon og sammenheng
  • Viktig begrensning: k er fast, uavhengig av modellens konfidens – kan være for tillatende eller for begrensende
  • Sammenlignet med top-p: top-p-ets dynamiske kjerne tilpasser seg konfidensen; det gjør ikke top-k

Bruk top-k når det er nødvendig med en fast grense for ordforrådet. Foretrekk top-p for de fleste produksjonsapplikasjoner. Neste leksjon: valg av parametere for det spesifikke bruksområdet.

Gratis å komme i gang

Lær deg AI-prompt engineering med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
53
Leksjoner
199

Ofte stilte spørsmål

Er leksjonen «Top-k-utvalg» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien AI-prompt engineering, inkludert «Top-k-utvalg», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i AI-prompt engineering inneholder totalt 4 leksjoner.

Hva lærer jeg i «Top-k-utvalg»?

Begrensning av valget til de k mest sannsynlige tokenene og effekten dette har på mangfoldet i utdataene. Du øver på AI-prompt engineering med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med AI-prompt engineering?

Ingen tidligere erfaring er nødvendig. AI-prompt engineering på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Top-k-utvalg»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne AI-prompt engineering-leksjonen?

Ja. Alle AI-prompt engineering-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Hva er temperatur i LLM-er?
  2. Top-p-nukleusutvalg
  3. Top-k-utvalg
  4. Velge parametere for bruksområdet
← Tilbake til AI-prompt engineering