← Voltar ao Blog

Few-shot: testei 2/4/8/16/32 exemplos em 3 tarefas e a qualidade caiu depois de N

Todo guia de prompt engineering fala a mesma coisa sobre few-shot: “quanto mais exemplos, melhor”. Eu acreditei nisso por uns dois anos. Depois eu rodei o benchmark de verdade e a curva bateu na cara.

Peguei três tarefas distintas (classificação, extração estruturada, tradução PT→EN), rodei cada uma com 2, 4, 8, 16 e 32 exemplos few-shot no mesmo modelo, e medi F1, custo de tokens e latência. A hipótese “mais é sempre melhor” quebrou logo no segundo experimento. Cada tarefa tem seu próprio ponto ótimo diferente, e passar desse ponto não só não ajuda — piora o F1 e triplica o custo.

Este post é o registro cru do experimento. Se você está pagando 3x mais em tokens para ganhar 0,3 pontos de F1 (ou pior, para perder), talvez esteja escolhendo N no chute como eu estava.

Setup do experimento

  • Modelo: Claude Haiku 3.5 (o preço público mais recente da Anthropic — 1M input tokens custa cerca de $0,80, 1M output cerca de $4,00)
  • Tarefas: (1) classificação de sentimento em reviews, (2) extração de CNPJ/valor/data de recibos, (3) tradução PT-BR → EN técnico
  • Ns testados: 2, 4, 8, 16, 32 exemplos few-shot
  • Volume por config: 200 amostras por tarefa por N (3 × 5 × 200 = 3.000 chamadas)
  • Métrica primária: F1 macro (classificação/extração) e chrF (tradução)
  • Métricas secundárias: tokens gastos por resposta, tempo médio de resposta

Os prompts foram fixados no template padrão de Anthropic: system prompt curto, exemplos em pares Q/A, depois a query real. Os exemplos foram sorteados de um pool de 100 por tarefa, mesmo pool para todos os Ns.

O que a curva mostrou

Vou colocar o resultado primeiro, a explicação depois. O padrão foi limpo demais para ficar enfeitando.

TarefaMelhor NF1 no ponto ótimoF1 em N=32Custo em N=32 vs N ótimo
Classificação sentimento40,890,863,2x
Extração recibos160,940,931,9x
Tradução PT→EN8chrF 62,4chrF 60,13,8x

Três tarefas, três pontos ótimos diferentes: 4, 16 e 8. Nenhum bateu em 32. Em todos os três, empurrar N até 32 piorou a métrica de qualidade e multiplicou o custo por 2 a 4 vezes.

Curva de F1 × N para 3 tarefas: pico em N=4, 16 e 8 respectivamente

O manual da Anthropic sobre use examples já dá o recado que 3 a 5 exemplos “geralmente basta”; o OpenAI cookbook para few-shot classification também prefere números modestos. Mas na prática do dia a dia, eu ainda via prompts com 20+ exemplos, “porque não custa tentar”. Custa.

Por que cada tarefa tem um N diferente

O ponto ótimo não é aleatório — dá para prever pela dimensionalidade da decisão que o modelo precisa tomar.

Classificação de sentimento: N=4 é o suficiente

Sentimento é uma tarefa binária/ternária. O modelo precisa aprender o formato da resposta (retornar positivo/neutro/negativo, nada mais) e o critério (“sarcasmo entra como negativo”, “reviews neutros de fato existem”). Dois exemplos ensinam o formato, mais dois ensinam a nuance. Do quinto exemplo em diante, o modelo começa a overfittar em superficialidades dos exemplos mostrados — o comprimento típico da resposta, palavras específicas que apareceram nos exemplos — e a qualidade cai.

Em N=32, a curva de F1 desceu 3 pontos. Não é ruído; foi consistente ao longo das 200 amostras por config.

Extração de recibos: N=16 dá o formato completo

Aqui a tarefa é mais estrutural. O modelo precisa extrair CNPJ, valor e data em JSON, e recibos brasileiros vêm em dez formatos visuais diferentes. Cada exemplo few-shot cobre um formato. Menos de 16, o modelo erra na primeira variação que não viu; mais de 16, entra em loop de “eu vi um caso parecido” e mistura campos entre linhas.

Extração se beneficia mais de exemplos que classificação, mas nem aqui 32 venceu. Mais é melhor até ficar barulhento.

Tradução PT→EN: N=8 é o ponto de virada

Tradução técnica precisa aprender vocabulário específico (“acesso” → “access” em contexto de sistemas, não “log in”; “usuário” → “user”; “aplicativo” → “app”). Oito exemplos cobrem os principais padrões de vocabulário; passar disso, o modelo começa a imitar as construções sintáticas específicas dos exemplos em vez de traduzir a query — e o chrF cai porque o output fica “colado” no jeito de exemplo em vez de fluido.

Esse é o comportamento que a literatura chama de context poisoning por few-shot: os exemplos param de ensinar padrão e começam a impor um estilo.

O custo que ninguém coloca no cálculo

A parte que me deixou surpreso não foi o F1 cair — foi quanto de token eu estava desperdiçando por não ter medido.

TarefaCusto médio por chamada em N ótimoCusto em N=32Delta mensal (10k chamadas)
Sentimento (N=4)R$ 0,003R$ 0,010+R$ 70
Extração (N=16)R$ 0,018R$ 0,034+R$ 160
Tradução (N=8)R$ 0,012R$ 0,046+R$ 340

R$ 570 por mês só nesses três casos, para piorar a qualidade. Multiplicado por um app com 100k chamadas/mês, vira R$ 5.700. Não é o tipo de vazamento que dashboard de cloud pega, porque não é um bug — é uma decisão de prompt design ruim que ficou embutida no código.

Como achar o seu N sem virar um projeto de pesquisa

Você não precisa rodar 3.000 chamadas para saber qual N usar. O que funcionou pra mim:

Passo 1: comece em N=3. Não em zero, não em dez. Três exemplos cobrem formato + variação mínima, e são o baseline realista pra maioria das tarefas.

Passo 2: rode 50 amostras em N=3 e em N=8. Se N=8 ganhou mais de 5 pontos de F1 (ou chrF, ou o que for a sua métrica), a tarefa se beneficia de mais exemplos — teste N=16. Se N=8 empatou ou perdeu, o ponto ótimo está em ≤3-8. Não vá mais alto.

Passo 3: mensure o custo por chamada em cada N. Se subir N vai melhorar 0,3 pontos e triplicar o custo, é uma escolha, não uma otimização.

Passo 4: aceite que não existe “melhor N universal”. O ponto ótimo depende da tarefa, do modelo (Haiku é diferente de Sonnet aqui), e da distribuição do seu dataset. Um valor fixo hardcoded no seu prompt vai envelhecer mal.

O que eu mudei no meu código

Depois dessa medição, mudei os prompts do harness que uso para revisão de PRs:

  • Classificação de “esse comentário é blocking ou nit?” → N=3 (era N=10)
  • Extração de “quais arquivos esse PR toca?” → N=8 (era N=15)
  • Sumarização de PR → N=4 (era N=12)

Custo caiu 42% no bucket de prompts do harness. Qualidade medida pelo mesmo eval interno subiu ligeiramente (não é significativo, mas pelo menos não caiu). Continuo checando essas curvas a cada trimestre, porque cada release nova de modelo pode mover os pontos ótimos.

Few-shot é um dos poucos knobs em prompt engineering que têm um ponto ótimo real e mensurável. Vale medir antes de chutar. O manual da Anthropic estava certo em “3-5 costuma bastar” — só que a maioria dos guias que citei não. E eu era um dos que ia no automático em N=10 “por segurança”.

Segurança que custava R$ 570 por mês de aluguel silencioso.


Esse experimento é um recorte do capítulo sobre few-shot do livro Context Engineering (edição PT), onde eu detalho os prompts, os pools de exemplos e as tabelas completas de F1 por N.

ken imoto · WebRTC & Voice AI engineer · kenimoto.dev · TabNews

Transformando LLMs de Mentirosos em Especialistas Livro relacionado Transformando LLMs de Mentirosos em Especialistas Engenharia de Contexto na Prática | RAG · MCP · CLAUDE.md · Agentic RAG, com benchmarks de ponta a ponta Ver a página do livro →