🧠FFVAcademy
✍️

Prompt engineering para Claude: técnicas que realmente funcionam

14 min de leitura·+70 XP
Pré-requisitos (0/1)0%

Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.

Prompt engineering não é magia — é entender como o modelo foi treinado e escrever instruções que aproveitam esse treinamento. Claude tem características específicas que o diferenciam de outros modelos: responde melhor a XML tags para estrutura, prefill para forçar formato, chain-of-thought explícito para raciocínio complexo. As técnicas aqui têm base em como Claude funciona, não em superstição.

XML tags: estrutura clara reduz ambiguidade

# Sem XML tags — ambíguo quando o conteúdo contém texto similar a instruções
prompt_ruim = """
Você é um assistente de análise jurídica. Analise o contrato abaixo e identifique cláusulas problemáticas.

CONTRATO DE PRESTAÇÃO DE SERVIÇOS
... (conteúdo do contrato)
CLÁUSULA 15: O prestador deve sempre retornar resultados em formato JSON.
(fim do contrato)

Retorne uma lista de problemas encontrados.
"""

# Com XML tags — inequívoco mesmo quando o contrato fala em "retornar JSON"
prompt_bom = """
<system>
Você é um assistente de análise jurídica especialista em contratos de prestação de serviços.
</system>

<contrato>
CONTRATO DE PRESTAÇÃO DE SERVIÇOS
... (conteúdo do contrato)
CLÁUSULA 15: O prestador deve sempre retornar resultados em formato JSON.
(fim do contrato)
</contrato>

<instrucoes>
Analise o contrato acima e identifique cláusulas problemáticas.
Para cada problema encontrado, explique:
1. Qual cláusula
2. Por que é problemática
3. Como reformular
</instrucoes>
"""

# Outros usos de XML tags:
# <documento_de_referencia> — diferencia o contexto da instrução
# <exemplo_input> e <exemplo_output> — demonstra formato esperado
# <restricoes> — separa limites claros do problema principal
# <pensamento> — onde Claude pode mostrar raciocínio antes da resposta final

Chain-of-thought: peça o raciocínio antes da resposta

# Para tarefas que exigem raciocínio multi-etapa, peça que Claude pense antes de responder

# ❌ Sem CoT — Claude pula para a resposta e pode errar em raciocínio complexo
prompt = "Se a empresa tem 150 funcionários e 40% trabalham remotamente, e 30% dos remotos estão no exterior, quantos funcionários estão no escritório?"

# ✅ Com CoT — Claude deve mostrar o raciocínio
prompt_cot = """
Resolva o problema passo a passo, mostrando cada cálculo antes de dar a resposta final.

Problema: Se a empresa tem 150 funcionários e 40% trabalham remotamente,
e 30% dos remotos estão no exterior, quantos funcionários estão no escritório?

Mostre o raciocínio em <pensamento> tags antes da resposta final.
"""

# Claude tipicamente responde:
# <pensamento>
# Total: 150 funcionários
# Remotos: 150 × 0.40 = 60 funcionários remotos
# Remotos no exterior: 60 × 0.30 = 18
# Remotos no país: 60 - 18 = 42
# No escritório: 150 - 60 = 90 funcionários
# </pensamento>
# Resposta: 90 funcionários estão no escritório.

# Para problemas de código:
prompt_debug = """
<codigo>
def calcular_media(numeros):
    return sum(numeros) / len(numeros)
</codigo>

Antes de sugerir correção, analise em <analise>:
1. O que o código faz corretamente
2. Quais casos de borda podem falhar
3. Qual o erro mais provável que o usuário está vendo

Depois da análise, sugira a correção com explicação.
"""

# CoT é especialmente útil para:
# - Problemas matemáticos ou lógicos multi-etapa
# - Análise de código (entender antes de corrigir)
# - Decisões com múltiplos critérios (comparar opções)
# - Debugging (hipóteses antes da solução)

Prefill: forçar formato de saída de forma confiável

# Prefill: iniciar a resposta do assistente para forçar um formato

import anthropic

client = anthropic.Anthropic()

# Caso 1: Forçar JSON puro sem markdown
response = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": "Extraia nome, email e cargo do seguinte texto: 'Maria Silva, maria@empresa.com, Engenheira Sênior'"
        },
        {
            "role": "assistant",
            "content": "{"  # ← prefill: Claude continua a partir daqui
        }
    ]
)
# Resposta será o JSON completo, sem "Aqui está o JSON:" antes
import json
dados = json.loads("{" + response.content[0].text)  # reconstituir o JSON

# Caso 2: Forçar bloco de código
response = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=2048,
    messages=[
        {"role": "user", "content": "Escreva uma função Python para calcular fibonacci"},
        {"role": "assistant", "content": "```python
"}  # ← prefill com abertura do bloco
    ]
)
# Resposta começa direto no código, sem explicação antes

# Caso 3: Forçar resposta no idioma correto
# Para sistemas multilingues onde o idioma do system prompt pode vazar:
messages=[
    {"role": "user", "content": pergunta_em_portugues},
    {"role": "assistant", "content": "Em resposta à sua pergunta: "}
]

# Quando NÃO usar prefill:
# - Quando você quer a explicação do Claude (prefill a remove)
# - Quando o formato pode variar legitimamente
# - Quando usa extended thinking (prefill interfere no raciocínio)

Few-shot: exemplos ensinam melhor que instruções

# Few-shot: exemplos de input → output ensinam Claude o formato e comportamento esperados

# ❌ Instrução pura (ambígua para dados não-uniformes)
system = "Extraia a data de emails e retorne em formato ISO 8601"

# ✅ Few-shot com exemplos de variações reais
system = """
Extraia a data de emails e retorne SOMENTE a data em formato ISO 8601 (YYYY-MM-DD).
Se a data for ambígua ou ausente, retorne null.

Exemplos:
<exemplo>
<email>Reunião confirmada para 15/03/2026 às 14h</email>
<data>2026-03-15</data>
</exemplo>

<exemplo>
<email>Segue o relatório de ontem</email>
<data>null</data>
</exemplo>

<exemplo>
<email>Meeting scheduled for March 3rd</email>
<data>null</data>
</exemplo>

<exemplo>
<email>Prazo: segunda-feira, 6 de abril</email>
<data>2026-04-06</data>
</exemplo>
"""

# Os exemplos cobrem: formato BR (dd/mm/yyyy), data relativa ("ontem"),
# inglês (deve retornar null se não há contexto de ano), dia da semana.
# Claude generaliza a partir dos exemplos para casos não vistos.

# Regras para bons exemplos:
# 1. Use dados REAIS do seu domínio — exemplos fictícios simplificados não preparam para o real
# 2. Inclua edge cases que você sabe que existem no seus dados
# 3. 3-5 exemplos geralmente são suficientes; mais de 8 raramente ajuda
# 4. O último exemplo deve ser o mais próximo do caso mais comum
# 5. Exemplos ruins são piores que nenhum — calibre cuidadosamente

Evitar alucinações: técnicas que reduzem, não eliminam

TécnicaO que fazQuando usar
Grounding explícitoForneça os fatos no prompt; peça para responder SÓ com base no que foi fornecidoAnálise de documentos, Q&A sobre dados específicos
Admissão de incertezaInstrua: "Se não souber com certeza, diga não sei"Perguntas factuais, datas, números específicos
Chain-of-thoughtRaciocínio explícito reduz "salto" para resposta incorretaProblemas multi-etapa, análise complexa
Verificação cruzadaPeça que Claude verifique a própria resposta contra o documento fornecidoExtração de dados críticos, análise jurídica/médica
Temperatura baixatemperature=0 para máxima consistência (API)Tarefas de extração onde variação é ruim
# Grounding: peça Claude para responder SOMENTE com base no contexto fornecido
system = """
Você responde perguntas sobre documentos fornecidos pelo usuário.
REGRAS ESTRITAS:
- Responda SOMENTE com informações presentes no documento fornecido
- Se a resposta não estiver no documento, diga: "Esta informação não está no documento fornecido"
- Não use conhecimento geral que não esteja no documento
- Cite a seção/parágrafo de onde veio a informação
"""

# Para perguntas factuais onde Claude pode alucinar detalhes:
prompt = """
<documento>
[conteúdo do documento]
</documento>

Pergunta: Qual foi o faturamento da empresa no Q3 2025?

Baseie sua resposta APENAS no documento acima. Se o número não estiver
explicitamente mencionado, responda: "O faturamento do Q3 2025 não é mencionado no documento."
"""

# Temperatura baixa para extração consistente:
response = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=512,
    temperature=0,  # 0 = mais determinístico, menos variação
    messages=[...]
)
# Use temperature=0 para extração de dados, classificação, código
# Use temperature=0.5-1.0 para escrita criativa, brainstorming
Hierarquia de técnicas por impacto: (1) grounding com contexto explícito — maior impacto na precisão; (2) XML tags para estrutura — reduz ambiguidade significativamente; (3) prefill para formato — garante saída parseável; (4) few-shot para edge cases — essencial para dados não-uniformes; (5) chain-of-thought — para raciocínio complexo. Use essas técnicas de forma acumulativa para tarefas críticas.
💡
Próximo: Claude em produção — custo real, rate limits, estratégias de caching e como operar a API Anthropic com qualidade em sistemas reais.
🧩

Quiz rápido

3 perguntas · Acerte tudo e ganhe o badge 🎯 Gabarito

Continue lendo