03-02-01 — Zero-shot, few-shot e chain-of-thought
TL;DR
Três técnicas fundamentais de prompting: zero-shot (pergunta direta, sem exemplos), few-shot (dá exemplos no prompt para calibrar o formato e tom) e chain-of-thought (força o modelo a raciocinar passo a passo antes de responder). CoT é especialmente poderoso para tarefas que exigem lógica ou múltiplas etapas.
Zero-shot prompting
Você pergunta direto, sem exemplos. O modelo usa apenas o que aprendeu no treinamento para responder. Funciona bem para tarefas simples e comuns.
from openai import OpenAI
client = OpenAI()
# Zero-shot: sem exemplos, pergunta direta
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Você classifica o sentimento de reviews de software."},
{"role": "user", "content": "Classifique este review: 'A API é rápida mas a documentação é péssima.'"}
]
)
print(response.choices[0].message.content)
# Output: "Misto — positivo (performance) / negativo (documentação)"
Few-shot prompting
Você inclui exemplos de input/output no prompt para mostrar ao modelo exatamente o que quer. É o equivalente a um teste unitário inline — o modelo aprende por demonstração.
# Few-shot: exemplos ensinam o formato esperado
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "system",
"content": "Você extrai dados de tickets de suporte e retorna no formato especificado."
},
# Exemplo 1
{
"role": "user",
"content": "Ticket: 'O sistema caiu às 14h. João da Vale reportou. Prioridade alta.'"
},
{
"role": "assistant",
"content": "hora: 14h | reportado_por: João | empresa: Vale | prioridade: alta"
},
# Exemplo 2
{
"role": "user",
"content": "Ticket: 'Lentidão no dashboard desde ontem. Maria da TIM abriu chamado. Prioridade média.'"
},
{
"role": "assistant",
"content": "hora: ontem | reportado_por: Maria | empresa: TIM | prioridade: média"
},
# Input real
{
"role": "user",
"content": "Ticket: 'Erro 500 no módulo financeiro às 9h30. Carlos da Michelin. Urgente.'"
}
]
)
print(response.choices[0].message.content)
# Output seguindo o formato: "hora: 9h30 | reportado_por: Carlos | empresa: Michelin | prioridade: urgente"
Quantos exemplos usar?
Não existe regra universal, mas como guia prático:
- 1-2 exemplos: calibrar formato simples
- 3-5 exemplos: tarefas de classificação com múltiplas classes
- 5-10 exemplos: extração de entidades complexas ou raciocínio especializado
- +10 exemplos: considere fine-tuning em vez de few-shot — mais barato em produção
Chain-of-thought (CoT)
CoT força o modelo a mostrar o raciocínio antes de dar a resposta final. Isso melhora drasticamente a precisão em problemas que envolvem lógica, matemática, ou múltiplos passos.
CoT zero-shot: a frase mágica
# Sem CoT — resposta direta (pode errar em raciocínio)
response_direct = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": "Uma empresa tem 200 funcionários. 30% são engenheiros. Desses, 25% trabalham em IA. Quantos engenheiros de IA há?"}
]
)
# Com CoT zero-shot — "pense passo a passo"
response_cot = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": """Uma empresa tem 200 funcionários. 30% são engenheiros. Desses, 25% trabalham em IA.
Quantos engenheiros de IA há?
Pense passo a passo antes de responder."""
}
]
)
# O modelo agora vai calcular: 200 × 0.30 = 60 engenheiros; 60 × 0.25 = 15 engenheiros de IA
print(response_cot.choices[0].message.content)
CoT few-shot: exemplos com raciocínio explícito
# CoT few-shot: exemplos mostram o raciocínio
messages = [
{
"role": "system",
"content": "Você analisa se uma mudança de infraestrutura deve ser aprovada. Raciocine passo a passo."
},
# Exemplo com raciocínio explícito
{
"role": "user",
"content": "Mudança: aumentar instâncias do serviço de autenticação de 2 para 4. Justificativa: pico de Black Friday."
},
{
"role": "assistant",
"content": """Raciocínio:
1. Serviço de autenticação é crítico — indisponibilidade afeta 100% dos usuários
2. Black Friday é pico previsível — histórico confirma 3x a carga normal
3. 2 instâncias atuais mal suportam carga normal; 4 instâncias dão margem de 2x
4. Custo incremental: 2 instâncias t3.medium por ~1 semana ≈ $50
Decisão: APROVADO — risco mitigado, custo justificado."""
},
# Input real
{
"role": "user",
"content": "Mudança: migrar banco de dados principal de SQL Server 2019 para 2022. Justificativa: features de JSON nativo."
}
]
response = client.chat.completions.create(model="gpt-4o", messages=messages)
print(response.choices[0].message.content)
Quando usar cada técnica
| Técnica | Use quando | Evite quando |
|---|---|---|
| Zero-shot | Tarefa comum, formato flexível, prototipagem rápida | Formato rígido exigido, domínio muito especializado |
| Few-shot | Formato específico, classificação, extração de dados | Tarefa rara sem bons exemplos, context window curto |
| CoT zero-shot | Raciocínio lógico, cálculos, decisões multi-critério | Respostas factuais simples (overhead desnecessário) |
| CoT few-shot | Raciocínio complexo + formato específico | Alto custo de tokens se o raciocínio é longo |
CoT com o novo campo reasoning_effort
Modelos como o o3 e o4-mini da OpenAI têm raciocínio nativo — CoT acontece internamente, invisível para você. Você controla o esforço de raciocínio:
# Modelos 'reasoning' da OpenAI — o raciocínio é interno
response = client.chat.completions.create(
model="o4-mini",
messages=[
{"role": "user", "content": "Analise os tradeoffs de migrar nosso monolito .NET para microsserviços."}
],
# reasoning_effort: "low", "medium", "high"
# high = mais preciso, mais caro, mais lento
extra_body={"reasoning_effort": "high"}
)
print(response.choices[0].message.content)
# Nota: usage.completion_tokens inclui tokens de raciocínio (cobrados)
Como isso se conecta
- → 03-02-02 ReAct e variantes: ReAct é CoT + ação — você vai ver como estender o raciocínio para agentes que executam ferramentas
- → 03-03-02 Avaliação: o benchmark entre zero-shot vs few-shot para sua tarefa específica é exatamente o tipo de avaliação que você deve fazer em CI/CD
- → 03-03-03 Desafio: o desafio final usa few-shot CoT para extração estruturada de entidades