0Pricing
AI Prompt Engineering · Aula

Amostragem top-k

Limitação da escolha aos k tokens mais prováveis e seu efeito sobre a diversidade da saída.

Amostragem top-k é uma aula grátis de AI Prompt Engineering no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Prompt Engineering, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Prompt Engineering inclui 4 aulas no total.

O que é a amostragem top-k?

A amostragem top-k restringe o modelo à amostragem dos k tokens mais prováveis em cada etapa. A todos os tokens fora do top-k é atribuída probabilidade zero, e eles não podem ser selecionados.

k=1 é a decodificação gulosa (apenas o token mais provável). k=50 é um intervalo criativo típico. k igual ao tamanho do vocabulário equivale à amostragem sem restrições.

Algoritmo do top-k

O algoritmo é mais simples que o do top-p:

  1. Calcule as probabilidades de softmax em todo o vocabulário
  2. Ordene os tokens por probabilidade decrescente
  3. Mantenha apenas os k tokens principais; defina todos os outros como 0
  4. Normalize novamente as probabilidades dos top-k para que a soma seja 1
  5. Faça a amostragem da distribuição normalizada novamente
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: decodificação gulosa

Quando k=1, apenas o token mais provável está no conjunto de candidatos. Fazer a amostragem de um conjunto de tamanho 1 é determinístico — o modelo sempre escolhe esse token. Isso é idêntico à decodificação gulosa (temperatura=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

Intervalo criativo típico: k=50

k=50 é um valor padrão comum para a geração de textos criativos. Ele permite explorar 50 tokens em cada etapa, evitando que o modelo selecione tokens nos quais tem pouquíssima confiança.

Com um vocabulário de 50.000 tokens, k=50 significa que o modelo considera apenas os 0.1% de tokens mais prováveis em cada etapa. Essa é uma restrição significativa — a maior parte do vocabulário é excluída.

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 na API Claude da Anthropic

A API Claude da Anthropic expõe top_k como um parâmetro direto. Isso facilita experimentar o efeito da truncagem fixa do vocabulário nas saídas do 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)

O problema do k fixo

A limitação fundamental do top-k é que o k é fixo, independentemente da confiança do modelo nessa etapa.

Quando o modelo está muito confiante (um token tem probabilidade de 95%), k=50 ainda inclui 49 tokens em grande parte irrelevantes. Quando o modelo está muito incerto (50 tokens têm aproximadamente 2% de probabilidade cada), k=50 pode ser adequado.

O problema é que k=50 pode ser restritivo e permissivo demais ao mesmo tempo, dependendo do contexto. O top-p resolve isso com um tamanho de núcleo dinâmico.

# 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 nas caudas da distribuição

Top-k e top-p diferem mais significativamente nas caudas da distribuição:

  • Com top-k=50, o 50º token pode ter uma probabilidade de 0.001% (extremamente improvável, mas ainda no conjunto de candidatos)
  • Com top-p=0.9, qualquer token fora do núcleo de 90% é excluído — inclusive tokens que estariam no top-k

O top-p trata o comportamento da cauda de maneira mais fundamentada: exclui tokens improváveis com base na probabilidade, não na posição no ranking.

# 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

Combinando top-k e top-p

Algumas implementações aplicam tanto top-k quanto top-p: primeiro truncam até o top-k e, depois, aplicam a amostragem de núcleo top-p dentro desse conjunto. Isso estabelece um limite rígido para o tamanho do vocabulário (top-k) e também aplica uma filtragem baseada em probabilidade (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)

Quando o top-k é preferível ao top-p

Apesar das vantagens teóricas do top-p, o top-k é preferido em alguns cenários:

  • Tarefas com vocabulário restrito: quando o modelo deve produzir saída apenas de um conjunto fixo (por exemplo, múltipla escolha A/B/C/D), um top-k pequeno (4) impõe isso diretamente
  • Reprodutibilidade: o comportamento do top-k é mais fácil de compreender — 'sempre considerar exatamente 50 tokens'
  • Implementações otimizadas para hardware: alguns mecanismos de inferência implementam top-k com mais eficiência 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

Orientações práticas para top-k

Quando usar top-k e quais valores escolher:

  • k=1: decodificação gulosa / tarefas factuais
  • k=5–20: tarefas criativas focadas, com variação mínima
  • k=40–100: intervalo criativo padrão na maioria dos modelos de linguagem
  • k=500+: exploração muito aberta (raramente necessária; use top-p em vez disso)

Na maioria das APIs modernas de LLM, top-p é o parâmetro preferido. Use top-k quando precisar de um limite rígido para o vocabulário ou quando a API oferecer top-k, mas não 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 e temperatura em conjunto

A amostragem top-k e a temperatura são aplicadas em sequência: primeiro, a temperatura remodela a distribuição de logits; depois, top-k a trunca aos k tokens mais prováveis. Usar ambas em conjunto é comum nas cadeias de processamento do Hugging Face Transformers.

Combinação típica: temperatura=0,9 (diversidade moderada) + k=50 (limite rígido do vocabulário). Isso evita tanto a uniformidade causada apenas por uma temperatura alta quanto o problema de amostragem da cauda.

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

Verificação de conhecimentos

Na amostragem top-k, qual comportamento o modelo apresenta quando k=1 é definido?

Recapitulação: amostragem top-k

A amostragem top-k trunca o vocabulário aos k tokens mais prováveis antes da amostragem:

  • k=1: decodificação gulosa — determinística, sempre escolhe o token principal
  • k=50: faixa criativa típica — equilíbrio entre diversidade e coerência
  • Principal limitação: k é fixo, independentemente da confiança do modelo — pode ser permissivo ou restritivo demais
  • Em comparação com top-p: o núcleo dinâmico de top-p se adapta à confiança; top-k não

Use top-k quando precisar de um limite rígido para o vocabulário. Prefira top-p na maioria das aplicações em produção. Próxima lição: escolha de parâmetros para seu caso de uso específico.

Perguntas Frequentes

A aula “Amostragem top-k” é grátis?

Sim — o texto completo de “Amostragem top-k” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Prompt Engineering, atualize para CoddyKit PRO. O curso de AI Prompt Engineering inclui 4 aulas no total.

O que vou aprender em “Amostragem top-k”?

Limitação da escolha aos k tokens mais prováveis e seu efeito sobre a diversidade da saída. Você pratica AI Prompt Engineering com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar AI Prompt Engineering?

Nenhuma experiência prévia é necessária. AI Prompt Engineering no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Amostragem top-k”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de AI Prompt Engineering?

Sim. Cada aula de AI Prompt Engineering inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. O que é temperatura em LLMs?
  2. Amostragem de núcleo top-p
  3. Amostragem top-k
  4. Escolhendo parâmetros para seu caso de uso
← Voltar para AI Prompt Engineering