Engenharia de Prompts
A engenharia de prompts molda o comportamento de LLMs através de instruções, exemplos e estrutura. Bons prompts reduzem alucinações, impõem o formato de saída e melhoram a precisão da tarefa sem retreinar o modelo.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
SYSTEM = """Você é um revisor de código Python.
- Sinalize bugs, problemas de segurança e problemas de estilo.
- Responda em marcadores.
- Se o código estiver bom, diga "LGTM"."""
messages = [
{"role": "system", "content": SYSTEM},
{"role": "user", "content": f"Revise este código:\n```python\n{code}\n```"},
]Quando usar isso:
- Definir comportamento consistente entre recursos da aplicação.
- Ensinar formato de saída com exemplos few-shot.
- Melhorar o raciocínio com prompting chain-of-thought.
- Reduzir alucinações com instruções de grounding.
Exemplo de Trabalho
"""prompt_engineering.py - prompts de sistema, few-shot, chain-of-thought e estruturados."""
from __future__ import annotations
from openai import OpenAI
client = OpenAI()
# Chain-of-thought para raciocínio
cot_messages = [
{"role": "system", "content": "Resolva problemas de matemática passo a passo. Mostre seu trabalho e, em seguida, dê a resposta final na última linha como RESPOSTA: <número>."},
{"role": "user", "content": "Uma loja tem 24 maçãs. Elas vendem 3/8 delas. Quantas restam?"},
]
cot = client.chat.completions.create(model="gpt-4o-mini", messages=cot_messages, temperature=0)
print(cot.choices[0].message.content)
# Classificação Few-shot
few_shot = [
{"role": "system", "content": "Classifique tickets de suporte como faturamento, técnico ou conta. Responda com apenas uma palavra."},
{"role": "user", "content": "Fui cobrado duas vezes este mês"},
{"role": "assistant", "content": "faturamento"},
{"role": "user", "content": "A API retorna erros 500 em POST /users"},
{"role": "assistant", "content": "técnico"},
{"role": "user", "content": "Preciso mudar meu endereço de e-mail"},
]
result = client.chat.completions.create(model="gpt-4o-mini", messages=few_shot, temperature=0)
print("classificação:", result.choices[0].message.content)
# QA com Grounding - use apenas o contexto fornecido
context = "Nosso limite de taxa da API é de 1000 requisições/minuto para planos Pro e 100/minuto para planos Gratuitos."
grounded = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "Responda APENAS usando o contexto fornecido. Se a resposta não estiver no contexto, diga 'Não tenho essa informação.'"},
{"role": "user", "content": f"Contexto:\n{context}\n\nPergunta: Qual é o limite de taxa do plano Pro?"},
],
temperature=0,
)
print(grounded.choices[0].message.content)O que isso demonstra:
- Chain-of-thought com formato de resposta explícito.
- Exemplos few-shot ensinando rótulos de classificação.
- QA com grounding restringindo respostas ao contexto fornecido.
temperature=0para classificação e extração determinísticas.
Mergulho Profundo
Como Funciona
- Prompt de sistema define instruções persistentes (função, restrições, formato).
- Few-shot fornece exemplos de entrada/saída no histórico de mensagens.
- Chain-of-thought pede ao modelo para raciocinar passo a passo antes de responder.
- Grounding restringe respostas ao contexto fornecido (padrão RAG).
- Instruções de formato de saída especificam estrutura JSON, markdown ou em marcadores.
Padrões de Prompt
| Padrão | Técnica | Ideal Para |
|---|---|---|
| Zero-shot | Apenas instruções | Tarefas simples e bem definidas |
| Few-shot | 2-5 exemplos | Classificação, extração |
| Chain-of-thought | "Pense passo a passo" | Matemática, lógica, raciocínio multi-etapas |
| Grounded | "Use apenas este contexto" | RAG, QA factual |
| Baseado em função | "Você é um X sênior" | Nível de tom e especialização |
Notas Python
# Prompts de template com variáveis
def build_review_prompt(code: str, focus: str) -> list[dict]:
return [
{"role": "system", "content": f"Você é um revisor de código focado em {focus}."},
{"role": "user", "content": f"```python\n{code}\n```"},
]
# Armazene prompts em arquivos versionados
from pathlib import Path
SYSTEM_PROMPT = Path("prompts/reviewer.txt").read_text()Armadilhas
- Instruções vagas - "seja prestativo" produz resultados inconsistentes. Correção: função, formato e restrições específicas.
- Muitos exemplos few-shot - desperdiça tokens sem melhorar a precisão. Correção: 2-5 exemplos diversos; reduza se o desempenho estagnar.
- Nenhuma especificação de formato de saída - o modelo retorna prosa quando você precisa de JSON. Correção: formato explícito no prompt do sistema ou
response_format. - Injeção de prompt de entrada do usuário - usuários substituem instruções do sistema. Correção: separe claramente sistema/usuário; valide saídas; use delimitadores.
- Não iterar - o primeiro prompt raramente é o ideal. Correção: teste em mais de 20 exemplos; meça a precisão antes de implantar.
- Misturar instruções e dados - o modelo confunde o que seguir vs. o que processar. Correção: use delimitadores claros (
---, tags XML, seções markdown).
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Engenharia de prompts | Iteração rápida, sem dados de treinamento | Necessita de comportamento consistente em escala |
| Fine-tuning | Milhares de exemplos rotulados | Poucos exemplos (use few-shot) |
| RAG | Respostas precisam de dados atuais/privados | O modelo já sabe a informação |
| Saída estruturada / ferramentas | Necessita de esquema garantido | Texto livre é aceitável |
FAQs
Qual o tamanho ideal de um prompt de sistema?
- O tamanho necessário, mas cada token custa dinheiro.
- Comece conciso; adicione restrições quando vir falhas.
- Mova instruções estáveis para o sistema; mantenha mensagens do usuário para dados da tarefa.
O que é chain-of-thought?
- Peça ao modelo para mostrar o raciocínio antes da resposta final.
- Melhora a precisão em tarefas de matemática, lógica e multi-etapas.
- Use
temperature=0para raciocínio reproduzível.
Como prevenir injeção de prompt?
- Nunca concatene a entrada do usuário em prompts de sistema.
- Use delimitadores:
<user_input>...</user_input>. - Valide e sanitize as saídas do modelo antes da execução.
Devo colocar exemplos em mensagens do sistema ou do usuário?
- Exemplos few-shot vão em pares de mensagens do usuário/assistente.
- O prompt do sistema contém regras e restrições de formato.
Como testar a qualidade do prompt?
- Crie um conjunto de avaliação com 20-50 pares de entrada/saída esperada.
- Meça a precisão, não a "sensação".
- Veja Avaliação e Guardrails.
O que é o padrão ReAct?
- Raciocinar + Agir: o modelo pensa, chama uma ferramenta, observa o resultado, repete.
- Implementado em frameworks de agentes como LangGraph.
Como lidar com entradas longas?
- Resuma ou divida a entrada antes de enviar.
- Use modelos com janelas de contexto maiores.
- RAG recupera apenas os trechos relevantes.
A ordem do prompt importa?
- Sim - tokens recentes têm mais influência.
- Coloque as instruções mais importantes no prompt do sistema.
- Coloque a tarefa real por último na mensagem do usuário.
Como versionar prompts?
- Armazene em arquivos rastreados pelo git (
prompts/v2/reviewer.txt). - Registre a versão do prompt com cada chamada de API.
- Teste A/B variantes de prompt em conjuntos de avaliação.
Quando devo fazer fine-tuning em vez disso?
- Milhares de pares de entrada/saída consistentes.
- A engenharia de prompts atingiu um platô no seu conjunto de avaliação.
- Necessita de menor latência ou modelo menor com a mesma qualidade.
O que são tags XML para prompts?
<context>{retrieved_docs}</context>
<question>{user_query}</question>- Claude e GPT respondem bem a delimitadores estruturados.
Como reduzir alucinações?
- Use grounding com contexto recuperado (RAG).
- Instrua "diga que não sei se não estiver no contexto."
- Reduza a temperatura; exija citações.
Relacionados
- Noções Básicas de LLMs - mensagens e funções
- Saída Estruturada - esquemas JSON
- Noções Básicas de RAG - respostas com grounding
- Avaliação e Guardrails - testes de prompt
- Tokens, Custo e Limites de Taxa - custo do comprimento do prompt
Versões da Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.