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:
- Calcule as probabilidades de softmax em todo o vocabulário
- Ordene os tokens por probabilidade decrescente
- Mantenha apenas os k tokens principais; defina todos os outros como 0
- Normalize novamente as probabilidades dos top-k para que a soma seja 1
- 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 deterministicIntervalo 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 nucleusTop-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 entirelyCombinando 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 tokenOrientaçõ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
- O que é temperatura em LLMs?
- Amostragem de núcleo top-p
- Amostragem top-k
- Escolhendo parâmetros para seu caso de uso