0Pricing
AI Prompt Engineering · Leçon

Échantillonnage top-k

Limiter le choix aux k tokens les plus probables et observer l’effet sur la diversité des sorties.

Échantillonnage top-k est une leçon AI Prompt Engineering gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Prompt Engineering, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Prompt Engineering comprend 4 leçons au total.

Qu’est-ce que l’échantillonnage top-k ?

L’échantillonnage top-k limite le modèle à l’échantillonnage parmi les k jetons les plus probables à chaque étape. Tous les jetons situés en dehors du top-k reçoivent une probabilité nulle et ne peuvent pas être sélectionnés.

k=1 correspond au décodage glouton (un seul jeton, le plus probable). k=50 est une valeur courante pour la création. k égal à la taille du vocabulaire équivaut à un échantillonnage sans restriction.

Algorithme top-k

L’algorithme est plus simple que celui de top-p :

  1. Calculer les probabilités softmax sur l’ensemble du vocabulaire
  2. Trier les jetons par probabilité décroissante
  3. Ne conserver que les k premiers jetons et attribuer 0 à tous les autres
  4. Renormaliser les probabilités des k premiers jetons pour que leur somme soit égale à 1
  5. Échantillonner à partir de la distribution renormalisée
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 : décodage glouton

Lorsque k=1, seul le jeton le plus probable fait partie de l’ensemble des candidats. Échantillonner dans un ensemble de taille 1 est déterministe : le modèle sélectionne toujours ce jeton. Cela est identique au décodage glouton (température=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

Plage créative courante : k=50

k=50 est une valeur par défaut courante pour la génération de textes créatifs. Elle permet d’explorer 50 jetons à chaque étape tout en empêchant le modèle de sélectionner des jetons pour lesquels sa confiance est très faible.

Avec un vocabulaire de 50 000 jetons, k=50 signifie que le modèle ne considère que les 0,1 % de jetons les mieux classés à chaque étape. Il s’agit d’une restriction importante : la majeure partie du vocabulaire est exclue.

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 dans l’API Claude d’Anthropic

L’API Claude d’Anthropic expose top_k comme paramètre direct. Il est ainsi facile d’expérimenter l’effet d’une troncature fixe du vocabulaire sur les sorties de 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)

Le problème du k fixe

La limitation fondamentale de top-k est la suivante : k est fixe, quelle que soit la confiance du modèle à cette étape.

Lorsque le modèle est très sûr de lui (un jeton a une probabilité de 95 %), k=50 inclut tout de même 49 jetons largement dépourvus de pertinence. Lorsque le modèle est très incertain (50 jetons ont chacun environ 2 % de probabilité), k=50 peut effectivement être approprié.

Le problème est que k=50 peut être simultanément trop restrictif et trop permissif selon le contexte. Top-p résout ce problème grâce à une taille de noyau dynamique.

# 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 dans les queues de la distribution

Top-k et top-p diffèrent le plus nettement dans les queues de la distribution :

  • Avec top-k=50, le 50e jeton peut avoir une probabilité de 0,001 % (il est extrêmement improbable, mais fait tout de même partie de l’ensemble des candidats)
  • Avec top-p=0.9, tout jeton en dehors du noyau couvrant 90 % est exclu, y compris les jetons qui feraient partie du top-k

Top-p traite le comportement dans la queue de manière plus rigoureuse : il exclut les jetons improbables en fonction de leur probabilité, et non de leur position dans le classement.

# 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

Combiner top-k et top-p

Certaines implémentations appliquent top-k et top-p : elles réduisent d’abord l’ensemble aux k premiers jetons, puis appliquent l’échantillonnage par noyau top-p à cet ensemble. Cela impose à la fois un plafond strict sur la taille du vocabulaire (top-k) et un filtrage fondé sur les probabilités (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)

Quand préférer top-k à top-p

Malgré les avantages théoriques de top-p, top-k est privilégié dans certains cas :

  • Tâches à vocabulaire contraint : lorsque le modèle ne doit produire des résultats qu’à partir d’un ensemble fixe (par exemple, des questions à choix multiple A/B/C/D), une petite valeur de top-k (4) l’impose directement
  • Reproductibilité : le comportement de top-k est plus facile à comprendre — « toujours considérer exactement 50 jetons »
  • Implémentations optimisées pour le matériel : certains moteurs d’inférence implémentent top-k plus efficacement que 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

Conseils pratiques pour top-k

Quand utiliser top-k et quelles valeurs choisir :

  • k=1 : tâches gloutonnes / factuelles
  • k=5–20 : tâches créatives ciblées, variation minimale
  • k=40–100 : plage créative standard pour la plupart des modèles de langue
  • k=500+ : exploration très ouverte (rarement nécessaire ; utilisez plutôt top-p)

Dans la plupart des API modernes de LLM, top-p est le paramètre privilégié. Utilisez top-k lorsque vous avez besoin d’un plafond strict pour le vocabulaire ou lorsque l’API l’expose, mais pas 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 et température ensemble

Top-k et la température sont appliqués successivement : la température remodèle d’abord la distribution des logits, puis top-k la tronque aux k jetons les plus probables. Leur utilisation conjointe est courante dans les chaînes de traitement Hugging Face Transformers.

Combinaison typique : temperature=0.9 (diversité modérée) + top_k=50 (limite stricte du vocabulaire). Cela évite à la fois l’uniformité excessive d’une température élevée utilisée seule et le problème de l’échantillonnage dans l’extrémité de la distribution.

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

Vérification des connaissances

Avec l’échantillonnage top-k, quel comportement le modèle adopte-t-il si k=1 est défini ?

Récapitulatif : échantillonnage top-k

L’échantillonnage top-k tronque le vocabulaire aux k jetons les plus probables avant l’échantillonnage :

  • k=1 : décodage glouton — déterministe, sélectionne toujours le jeton le mieux classé
  • k=50 : plage créative typique — équilibre entre diversité et cohérence
  • Limitation principale : k reste fixe quelle que soit la confiance du modèle — peut être trop permissif ou trop restrictif
  • Par rapport à top-p : le noyau dynamique de top-p s’adapte au niveau de confiance ; top-k ne le fait pas

Utilisez top-k lorsque vous avez besoin d’une limite stricte du vocabulaire. Préférez top-p pour la plupart des applications en production. Prochaine leçon : choisir les paramètres adaptés à votre cas d’utilisation.

Questions Fréquemment Posées

La leçon « Échantillonnage top-k » est-elle gratuite ?

Oui — le texte complet de « Échantillonnage top-k » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Prompt Engineering, passe à CoddyKit PRO. Le cours AI Prompt Engineering comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Échantillonnage top-k » ?

Limiter le choix aux k tokens les plus probables et observer l’effet sur la diversité des sorties. Tu pratiques AI Prompt Engineering avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer AI Prompt Engineering ?

Aucune expérience préalable n'est requise. AI Prompt Engineering sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Échantillonnage top-k » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon AI Prompt Engineering ?

Oui. Chaque leçon AI Prompt Engineering inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Qu’est-ce que la température dans les LLM ?
  2. Échantillonnage par noyau avec top-p
  3. Échantillonnage top-k
  4. Choisir les paramètres selon votre cas d’usage
← Retour à AI Prompt Engineering