03-02-01 — Zero-shot, few-shot e chain-of-thought

⏱ 15 minFontes validadas em: 2026-04-29

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)"
💡 Quando zero-shot falha: Tarefas que exigem formato muito específico, domínio técnico raro, ou raciocínio multi-etapa. Nesses casos, few-shot ou CoT são mais confiáveis.

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
⚠️ Qualidade > quantidade: Exemplos ruins ensinam o modelo a ser consistentemente errado. Revise seus exemplos few-shot como revisaria um test case crítico.

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écnicaUse quandoEvite 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
🔗 Conexão: CoT é a base intelectual do ReAct pattern (próximo tópico). A ideia de "raciocinar antes de agir" que você verá em agentes LLM vem diretamente do chain-of-thought.

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

Fontes

  1. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models — Wei et al., 2022 (arXiv:2201.11903)
  2. OpenAI — Prompt engineering: ask the model to think step by step
  3. Anthropic — Chain of thought prompting
  4. Microsoft Learn — Advanced prompt engineering techniques