Verificando acesso...

MÓDULO 2.2 GA

📝 Templates, versionamento de prompt e eval primer

Prompts viram código: têm versão, diff, teste. Toda mudança em prompt deve passar por mini-eval no harness antes de ir para produção.

6
Tópicos
60
Minutos
Intermediário
Nível
Prático
Tipo

Prompts são código. Você não muda código de produção sem teste — não mude prompt sem eval. Aqui você aprende a tratar prompts como artefatos versionáveis: template, hash, golden set, comparação A/B. É a sementeira da disciplina que se aprofunda em T6.

🧬 Prompt-as-code: o ciclo de vida

Trate o prompt exatamente como você trata código de produção: arquivo versionado, PR com diff, CI que roda eval, deploy só com aprovação.

📊 Por que isso importa: regressão silenciosa é o normal

💡 Comece pequeno

Não precisa de Weights & Biases dia 1. prompts/v1.0.0.txt + 20 exemplos em golden.jsonl + pytest test_prompt.py já estabelece a disciplina.

1

📦 Prompt como código: template + variáveis

Separar dado de prompt

Templates separam estrutura do prompt (versionado em git) de dados que entram (variáveis em runtime). Jinja2 é o padrão Python; mustache é portável; f-strings funcionam para casos simples. O efeito é grande: revisores leem o prompt isoladamente em PR, e o mesmo arquivo serve para múltiplos chamadores.

prompt como arquivo .j2
# prompts/classify_v1.0.0.j2
Você classifica sentimento. Saída: positivo, negativo ou neutro.

<exemplos>
{% for ex in exemplos %}
  <ex><in>{{ ex.in }}</in><out>{{ ex.out }}</out></ex>
{% endfor %}
</exemplos>

Texto: {{ texto }}
📑 Resumo navegável
O que é: Padrão template com placeholders (Jinja2, f-string, mustache). O prompt fica em arquivo versionado; dados entram no momento da chamada.
Por que aprender: Prompts hardcoded em código Python ficam impossíveis de revisar e versionar. Templates externos permitem PR review do prompt isoladamente.
Conceitos-chave: Template engine, variáveis, schema de input, sanitização.
2

🔢 Versionamento: SemVer aplicado a prompts

v1.0.0 do prompt

SemVer aplicado a prompts: v{major}.{minor}.{patch}. Major: muda formato de saída ou persona (quebra cliente). Minor: capability nova compatível. Patch: typo, clareza. Hash sha256 do template + versão são gravados no run manifest do harness — auditável.

exemplos de bump
MudançaBumpPor quê
Adicionei vírgula em 'Olá, mundo'patch (v1.0.1)estética; comportamento idêntico
Adicionei classe 'misto' às opçõesminor (v1.1.0)novo output válido; antigos casos seguem
Mudei saída de string para JSONmajor (v2.0.0)quebra qualquer parser que esperava string
📑 Resumo navegável
O que é: Major: mudança que invalida saídas anteriores (formato, persona). Minor: capability nova compatível. Patch: correção de typo, clareza.
Por que aprender: Sem versionamento, regressão silenciosa é certeza. Você muda 'só uma palavra' e quebra 30% dos casos sem perceber.
Conceitos-chave: SemVer, prompt diff, breaking change, hash de prompt.
3

🎯 Golden set: o conjunto de validação

20-50 exemplos canônicos

Golden set é seu teste automatizado. Comece com 30 exemplos cobrindo: 60% típicos, 20% edge cases, 20% adversariais. Versionado em evals/v1/datasets/ com hash sha256. O custo de manter é baixo se você adiciona casos quando descobre bugs em produção.

golden set em JSONL
{"id": "001", "in": "Adorei!", "out": "positivo", "tag": "tipico"}
{"id": "002", "in": "Que lixo.", "out": "negativo", "tag": "tipico"}
{"id": "003", "in": "Eh, mais ou menos.", "out": "neutro", "tag": "tipico"}
{"id": "020", "in": "Tá uma droga... brincadeira!", "out": "positivo", "tag": "adversarial"}
{"id": "021", "in": "", "out": "neutro", "tag": "edge"}
📑 Resumo navegável
O que é: Conjunto fixado de input → output esperado, usado para medir se o prompt continua funcionando após mudança.
Por que aprender: É o teste automatizado do prompt. Sem golden set, 'A/B' vira 'achei que melhorou'.
Conceitos-chave: Golden set, regression test, eval frozen, harness.
4

⚖️ Eval primer: medir antes de mergear

A regra que enraíza em T6

A regra é simples: toda mudança em prompt entra com mini-eval contra o golden set. PR que muda prompt sem rodar eval é equivalente a PR que muda código sem rodar testes. Métrica primária definida; se regredir, não merge. Eval roda em CI fast (mockado) e scheduled (real).

pytest gate de prompt
import json, pytest
from meu_app.classify import classificar

def test_golden():
    examples = [json.loads(l) for l in open('evals/v1/datasets/classify-v1.jsonl')]
    correct = sum(1 for e in examples if classificar(e['in']) == e['out'])
    accuracy = correct / len(examples)
    assert accuracy >= 0.85, f'regression: {accuracy:.2%} < baseline 85%'
📑 Resumo navegável
O que é: Toda mudança em prompt entra com mini-eval contra o golden set. Métrica primária + 1-2 secundárias. Diff documentado.
Por que aprender: Disciplina anti-regressão. Sem isso, o prompt vai sendo 'melhorado' ad hoc até parar de funcionar.
Conceitos-chave: Mini-eval, A/B no harness, statistical significance, eval cost.
5

📊 Métricas: exact match, BLEU, LLM-as-judge

Escolha pela tarefa

Não existe métrica universal. Exact match para classificação fechada. BLEU/ROUGE para sumarização e tradução. LLM-as-judge para qualidade subjetiva (groundedness, helpfulness) — com cuidado de calibração contra humanos (κ ≥0.6, ver T6.1). Para cada prompt, escolha 1 primária + 1-2 secundárias.

métrica por tarefa
TarefaPrimáriaSecundária
Classificação binária/multi-classeAccuracy/F1Custo médio
Extração de entidadesF1 por tipo de entidadeTempo p95
SumarizaçãoROUGE-LLLM-as-judge fluência
RAG QAGroundedness (judge)Citation accuracy
Geração criativaLLM-as-judgeDiversidade
📑 Resumo navegável
O que é: Exact match para classificação. BLEU/ROUGE para tradução/sumarização. LLM-as-judge para qualidade subjetiva (com cuidado dos vieses).
Por que aprender: Cada tipo de tarefa pede sua métrica. LLM-as-judge é poderoso mas tem vieses — detalhado em T6.1.
Conceitos-chave: Exact match, BLEU, ROUGE, LLM-as-judge, judge bias.
6

🔁 Iterativa, não one-shot: o ciclo do prompt

Hipótese → eval → diff

Prompt engineering não é arte intuitiva — é ciência empírica. Ciclo: hipótese → variant → eval → diff → decide. Cada iteração é um PR pequeno com 1 mudança e métricas medidas. Em 3-5 iterações você normalmente atinge o teto da arquitetura escolhida; para subir mais, troca de modelo ou repensa retrieval.

ciclo do prompt

  • Hipótese: 'adicionar exemplo adversarial em few-shot melhora F1 em casos com ironia'.
  • Variant: v1.1.0 com 1 exemplo extra.
  • Eval: roda v1.0.0 e v1.1.0 contra mesmo golden, mesma seed.
  • Diff: F1 macro de 0.78 → 0.83; custo +5%.
  • Decide: mergea — ganho é maior que custo.
📑 Resumo navegável
O que é: Ciclo: hipótese de mudança → escrever variant → rodar contra golden → comparar métricas → decidir.
Por que aprender: Prompt engineering não é arte intuitiva — é ciência empírica. Ciclos rápidos e medidos batem 'feeling'.
Conceitos-chave: Hypothesis-driven, eval cycle, prompt diff, A/B significant.

📑 Resumo navegável dos tópicos

1 📦 Prompt como código: template + variáveis — Separar dado de prompt
O que é: Padrão template com placeholders (Jinja2, f-string, mustache). O prompt fica em arquivo versionado; dados entram no momento da chamada.
Por que aprender: Prompts hardcoded em código Python ficam impossíveis de revisar e versionar. Templates externos permitem PR review do prompt isoladamente.
Conceitos-chave: Template engine, variáveis, schema de input, sanitização.
2 🔢 Versionamento: SemVer aplicado a prompts — v1.0.0 do prompt
O que é: Major: mudança que invalida saídas anteriores (formato, persona). Minor: capability nova compatível. Patch: correção de typo, clareza.
Por que aprender: Sem versionamento, regressão silenciosa é certeza. Você muda 'só uma palavra' e quebra 30% dos casos sem perceber.
Conceitos-chave: SemVer, prompt diff, breaking change, hash de prompt.
3 🎯 Golden set: o conjunto de validação — 20-50 exemplos canônicos
O que é: Conjunto fixado de input → output esperado, usado para medir se o prompt continua funcionando após mudança.
Por que aprender: É o teste automatizado do prompt. Sem golden set, 'A/B' vira 'achei que melhorou'.
Conceitos-chave: Golden set, regression test, eval frozen, harness.
4 ⚖️ Eval primer: medir antes de mergear — A regra que enraíza em T6
O que é: Toda mudança em prompt entra com mini-eval contra o golden set. Métrica primária + 1-2 secundárias. Diff documentado.
Por que aprender: Disciplina anti-regressão. Sem isso, o prompt vai sendo 'melhorado' ad hoc até parar de funcionar.
Conceitos-chave: Mini-eval, A/B no harness, statistical significance, eval cost.
5 📊 Métricas: exact match, BLEU, LLM-as-judge — Escolha pela tarefa
O que é: Exact match para classificação. BLEU/ROUGE para tradução/sumarização. LLM-as-judge para qualidade subjetiva (com cuidado dos vieses).
Por que aprender: Cada tipo de tarefa pede sua métrica. LLM-as-judge é poderoso mas tem vieses — detalhado em T6.1.
Conceitos-chave: Exact match, BLEU, ROUGE, LLM-as-judge, judge bias.
6 🔁 Iterativa, não one-shot: o ciclo do prompt — Hipótese → eval → diff
O que é: Ciclo: hipótese de mudança → escrever variant → rodar contra golden → comparar métricas → decidir.
Por que aprender: Prompt engineering não é arte intuitiva — é ciência empírica. Ciclos rápidos e medidos batem 'feeling'.
Conceitos-chave: Hypothesis-driven, eval cycle, prompt diff, A/B significant.

✓ O que FAZER

  • Versionar prompts em arquivos separados
  • Rodar mini-eval em toda mudança de prompt
  • Documentar o diff e métricas no PR
  • Pinar versão do modelo no eval

✗ O que NÃO fazer

  • Hardcoded como string em código Python
  • 'Eu testei manualmente em 2 casos'
  • Mergear com 'melhora performance' sem números
  • Eval que vira ruído porque o modelo muda

🚫 Quando NÃO usar

💻 Exemplo de código

# prompts/classify_v1.0.0.j2
# (template Jinja2 — versionado em git)

from jinja2 import Template
from fec_sdk import Message, MessageRole
from fec_sdk.adapters import get_adapter

TEMPLATE = Template(open("prompts/classify_v1.0.0.j2").read())

def classificar(texto: str, modelo: str = "mock") -> str:
    prompt = TEMPLATE.render(texto=texto)
    client = get_adapter(modelo, model="mock-v1")
    resp = client.chat([
        Message(role=MessageRole.SYSTEM, content=prompt),
        Message(role=MessageRole.USER, content=texto),
    ])
    return resp.content.strip()

# tests/test_classify.py
def test_golden():
    golden = json.load(open("evals/classify/golden_v1.jsonl"))
    correct = sum(1 for ex in golden if classificar(ex["in"]) == ex["out"])
    assert correct / len(golden) >= 0.85  # baseline pinado

🏋️ Exercício hands-on

Você recebe um prompt v1.0.0 + golden set de 20 exemplos. Modifique para v1.1.0 melhorando ≥1 caso sem regredir nenhum. Diff documentado. Em exercicios/modulo-2-2/.

📚 Bibliografia

🎯 Resumo do Módulo

  • Prompts são código — versione em arquivo separado.
  • SemVer aplicado: major/minor/patch para prompts.
  • Golden set de 20-50 exemplos é o teste automatizado.
  • Mini-eval em toda mudança — antes de mergear.
  • Eval primer aqui é semente do que aprofunda em T6.1.

Próximo Módulo:

T3 — RAG e Recuperação