Prompt Engineering Avançado: Técnicas que Realmente Funcionam
A maioria dos guias de prompt engineering lista técnicas sem explicar quando cada uma funciona. Este artigo vai direto ao que muda resultados mensuráveis.
Por que prompt engineering importa (com números)
Em benchmarks de raciocínio matemático:
- Prompt simples: ~18% de acurácia no GPT-3
- Com Chain-of-Thought: ~57% de acurácia no mesmo modelo
A técnica certa pode dobrar a qualidade da saída sem trocar de modelo.
Chain-of-Thought (CoT)
Forçar o modelo a “pensar em voz alta” antes de responder melhora dramaticamente tarefas que envolvem raciocínio.
# ❌ Prompt direto — modelo adivinha a resposta
prompt = """
Uma loja vende camisetas a R$35 e calças a R$89.
João comprou 3 camisetas e 2 calças. Quanto gastou?
"""
# ✅ Chain-of-Thought — modelo raciocina antes de responder
prompt = """
Uma loja vende camisetas a R$35 e calças a R$89.
João comprou 3 camisetas e 2 calças. Quanto gastou?
Vamos resolver passo a passo:
"""
# Ou com zero-shot CoT (mais simples):
prompt = """
Uma loja vende camisetas a R$35 e calças a R$89.
João comprou 3 camisetas e 2 calças. Quanto gastou?
Pense passo a passo antes de responder.
"""Quando usar: problemas matemáticos, raciocínio lógico, análise multi-etapa. Não ajuda para tarefas simples de recuperação de fato.
Few-Shot Prompting
Exemplos no prompt ensinam o formato e o nível de detalhe esperado.
system = """
Você classifica o sentimento de avaliações de produtos.
Responda apenas: POSITIVO, NEGATIVO ou NEUTRO.
"""
prompt = """
Exemplos:
Avaliação: "Produto chegou rápido e funciona perfeitamente!"
Sentimento: POSITIVO
Avaliação: "Veio com defeito e o suporte não resolveu."
Sentimento: NEGATIVO
Avaliação: "Produto ok, entrega dentro do prazo."
Sentimento: NEUTRO
---
Avaliação: "Esperava mais pelo preço, mas cumpre o básico."
Sentimento:
"""Dica de implementação: os exemplos importam mais que a instrução. Um exemplo ruim piora mais que nenhum exemplo.
Self-Consistency
Em vez de uma resposta, gere várias e pegue a mais frequente (votação). Funciona especialmente bem para raciocínio.
from openai import OpenAI
from collections import Counter
client = OpenAI()
def self_consistent_answer(question: str, n: int = 5) -> str:
respostas = []
for _ in range(n):
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Resolva o problema passo a passo."},
{"role": "user", "content": question},
],
temperature=0.7, # variação intencional entre as gerações
)
# Extrai a resposta final (última linha ou valor numérico)
texto = response.choices[0].message.content
resposta_final = extrair_resposta_final(texto)
respostas.append(resposta_final)
# Votação majoritária
contador = Counter(respostas)
return contador.most_common(1)[0][0]Quando usar: quando o custo de erro é alto e latência não é crítica. Aumenta o custo em N×.
Tree of Thought (ToT)
Para problemas onde é preciso explorar múltiplos caminhos:
# Estrutura simplificada de ToT
tof_prompt = """
Problema: {problema}
Gere 3 abordagens diferentes para resolver este problema.
Para cada abordagem, avalie sua viabilidade (1-10) e estime o resultado.
Então, escolha a melhor abordagem e desenvolva a solução completa.
Formato:
Abordagem 1: ...
Viabilidade: X/10
Estimativa: ...
Abordagem 2: ...
Viabilidade: X/10
Estimativa: ...
Abordagem 3: ...
Viabilidade: X/10
Estimativa: ...
Melhor abordagem: [número]
Solução completa: ...
"""Structured Output com Pydantic/Zod
Para saídas que serão processadas por código:
from pydantic import BaseModel
from openai import OpenAI
client = OpenAI()
class AnaliseTexto(BaseModel):
sentimento: str # "positivo" | "negativo" | "neutro"
confianca: float # 0.0 a 1.0
pontos_positivos: list[str]
pontos_negativos: list[str]
resumo: str
def analisar_avaliacao(texto: str) -> AnaliseTexto:
completion = client.beta.chat.completions.parse(
model="gpt-4o",
messages=[
{"role": "system", "content": "Analise avaliações de produtos."},
{"role": "user", "content": texto},
],
response_format=AnaliseTexto,
)
return completion.choices[0].message.parsedComo medir se um prompt é melhor
A parte que a maioria ignora: avaliação objetiva.
# Crie um conjunto de teste com respostas esperadas
test_cases = [
{"input": "...", "expected": "..."},
# 20-50 exemplos representativos
]
def avaliar_prompt(prompt_template: str, test_cases: list) -> float:
corretos = 0
for caso in test_cases:
resposta = chamar_llm(prompt_template, caso["input"])
if comparar(resposta, caso["expected"]):
corretos += 1
return corretos / len(test_cases)
# Compare versões com o mesmo conjunto de teste
score_v1 = avaliar_prompt(prompt_v1, test_cases)
score_v2 = avaliar_prompt(prompt_v2, test_cases)
print(f"v1: {score_v1:.1%} | v2: {score_v2:.1%}")
# Decisão baseada em dados, não intuiçãoSem avaliação objetiva, você está iterando no escuro. Um prompt que “parece melhor” em 3 exemplos pode ser pior em 50.
Checklist prático
Antes de escalar um prompt para produção:
- Testado em pelo menos 20 exemplos representativos
- Casos de borda definidos (inputs inválidos, ambíguos, extremos)
- Temperatura calibrada para a tarefa (0 para determinístico, 0.7+ para criativo)
- Saída estruturada quando o resultado será processado por código
- Monitoramento de qualidade em produção (sample + human eval)