02-05-01 — Temperatura, top_p, top_k, max_tokens e stop sequences
TL;DR
Esses parâmetros controlam como o modelo escolhe o próximo token. Temperature é o mais importante: 0.0 = sempre o token mais provável (determinístico), valores altos = mais aleatoriedade. Top_p e top_k são filtros complementares. max_tokens controla custo. Stop sequences evitam saídas mal formatadas. Entender isso é diferencial imediato na qualidade das suas integrações.
O que acontece durante a inferência
A cada passo, o modelo calcula uma distribuição de probabilidade sobre o vocabulário inteiro (~100K tokens). O resultado é um vetor de logits — scores brutos para cada token possível. Os parâmetros de inferência determinam como amostrar dessa distribuição.
Temperature
Divide os logits antes do softmax. É o parâmetro mais impactante.
- temperature = 0.0: greedy decoding — sempre escolhe o token com maior probabilidade. Determinístico: mesma entrada → mesma saída sempre.
- temperature = 1.0: distribuição original do modelo sem modificação.
- temperature > 1.0: "aplana" a distribuição — tokens menos prováveis ganham chance. Mais criativo, mais imprevisível, mais propenso a erros.
- 0.1–0.4: respostas focadas e consistentes. Ideal para código, SQL, JSON, extração de dados.
- 0.5–0.8: balanceamento. Bom para resumos, Q&A, assistentes de propósito geral.
- 0.9–1.5: máxima criatividade. Marketing, brainstorming, geração de histórias.
seed).
Top_p (nucleus sampling)
Em vez de limitar por número de tokens, limita pela massa de probabilidade acumulada. Com top_p = 0.9, o modelo só considera tokens que juntos somam 90% da probabilidade — descarta a cauda longa de tokens improváveis.
- top_p = 1.0: sem filtragem (considera todos os tokens).
- top_p = 0.9: padrão recomendado pela OpenAI.
- top_p = 0.1: extremamente restritivo — apenas tokens muito prováveis.
Top_k
Versão mais simples: considera apenas os K tokens de maior probabilidade. Com top_k = 40, o modelo ignora todos exceto os 40 mais prováveis.
- Menos flexível que top_p porque o número de candidatos é fixo independente da distribuição.
- Comum em modelos open-weight (Llama, Mistral) e Gemini. A API da OpenAI não expõe top_k.
- Valores típicos: 20–50 para foco, 100+ para diversidade.
max_tokens
Limite máximo de tokens na resposta (output tokens). Impacta diretamente o custo — você paga por token gerado.
- Não confunda com tamanho do contexto: max_tokens é o limite da resposta, não do total.
- Se a resposta precisar de mais tokens que o limite, ela é cortada abruptamente.
- Para tarefas de extração/classificação: 100–200 é suficiente e economiza custo.
- Para geração de documentos longos: considere 2000–4000 ou use streaming com múltiplos turnos.
Stop sequences
Lista de strings que encerram a geração quando aparecem no output. O modelo para de gerar ao encontrar qualquer uma delas.
import os
from openai import AzureOpenAI
client = AzureOpenAI(
azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
api_key=os.environ["AZURE_OPENAI_API_KEY"],
api_version="2024-12-01-preview"
)
# Exemplo: extrair JSON — parar quando fechar o objeto
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Responda APENAS com JSON válido, sem markdown."},
{"role": "user", "content": "Extraia nome e cargo de: 'João Silva é o CTO da Impar'"}
],
temperature=0.0, # determinístico para extração
top_p=0.95,
max_tokens=200,
stop=["\n\n", "```"] # para se aparecer bloco de código ou linha em branco dupla
)
print(response.choices[0].message.content)
print(f"\nTokens usados: {response.usage.total_tokens}")
Comparação visual: temperatura em ação
import os
from openai import AzureOpenAI
client = AzureOpenAI(
azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
api_key=os.environ["AZURE_OPENAI_API_KEY"],
api_version="2024-12-01-preview"
)
prompt = "Complete a frase: 'A inteligência artificial vai'"
temperaturas = [0.0, 0.7, 1.5]
for temp in temperaturas:
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
temperature=temp,
max_tokens=50
)
print(f"\n--- Temperature: {temp} ---")
print(response.choices[0].message.content)
Código / SQL / JSON:
temperature=0.0, top_p=0.95, max_tokens=1000Q&A / assistente:
temperature=0.3, top_p=0.9, max_tokens=500Resumo:
temperature=0.5, top_p=0.9, max_tokens=300Copywriting criativo:
temperature=0.9, top_p=1.0, max_tokens=800
frequency_penalty e presence_penalty
Dois parâmetros adicionais da OpenAI API:
- frequency_penalty (−2.0 a 2.0): penaliza tokens proporcionalmente a quantas vezes já apareceram no output. Reduz repetição de palavras específicas.
- presence_penalty (−2.0 a 2.0): penaliza qualquer token que já apareceu (presença binária). Encoraja o modelo a falar sobre novos tópicos.
- Valores positivos reduzem repetição; negativos encorajam repetição. 0.0 = desativado.
Como isso se conecta
- → 02-01-01 — LLM como autocomplete: temperature controla exatamente essa aleatoriedade
- → 02-05-02 — Limitações: alucinação aumenta com temperature alta
- → 02-05-03 — Desafio: experimento prático comparando temperaturas
- → Módulo 03 — Prompt Engineering: parâmetros e prompts trabalham juntos para controlar output