A/B testing de prompt em produção
⏱ 13 min·⭐ 55 XP
Pré-requisitos (0/1)0%
- ⬜🧰 Eval frameworks: Braintrust, Langfuse, Inspect, Promptfoo(LLM Evals Profissional)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
Stack A/B recomendada
🗺️ A ordem correta, e o que cada etapa responde
1 · Avaliação offlineconjunto curado
Elimina candidato ruim sem expor ninguém. Custa dólares.
SE PASSAR▼
2 · Sombrasem consumir a resposta
Roda com tráfego real e resposta descartada. Mede divergência, não preferência.
SE PASSAR▼
3 · Fatia pequena5% do tráfego
Primeira medida de efeito em USUÁRIO. Estrago limitado por construção.
SE PASSAR▼
4 · Ampliar gradualmentecom gatilho de reversão
Métrica de negócio, não de modelo: resolução, retrabalho, escalonamento.
ATENÇÃO▼
5 · Nunca o inversoexperimento antes da avaliação
Expor usuário a um candidato que falharia no conjunto é gastar confiança para descobrir o que custava centavos.
- Feature flag SDK: LaunchDarkly, Statsig (free tier), Unleash (open), GrowthBook (open)
- Traffic split: 5% canary → 25% → 50% → 100% se métricas OK
- Sticky assignment: same user sempre mesma variant (user_id hash)
- Métricas: tracked em Amplitude/Mixpanel + Langfuse (LLM-specific)
- Guard rails: SDK auto-disable variant em spike de error/complaint
- Statistical engine: built-in nos SDKs modernos
Código exemplo (Statsig)
import { Statsig } from 'statsig-node';
await Statsig.initialize(process.env.STATSIG_SECRET!);
export async function generateResponse(user: User, query: string) {
const variant = await Statsig.getExperiment(user, 'assistant_prompt_v2');
const promptVersion = variant.get('version', 'v1');
const systemPrompt = promptVersion === 'v2' ? PROMPT_V2 : PROMPT_V1;
const start = Date.now();
const response = await claude.messages.create({
model: 'claude-sonnet-4',
system: systemPrompt,
messages: [{ role: 'user', content: query }],
});
// Log metrics
await Statsig.logEvent(user, 'llm_request', {
variant: promptVersion,
latency_ms: Date.now() - start,
input_tokens: response.usage.input_tokens,
output_tokens: response.usage.output_tokens,
});
return response;
}Quiz rápido
Por que testar duas versões de prompt com tráfego real, se já houve avaliação offline?
Retry loop
💡
LLM A/B vira loop contínuo: hipótese → variant → 1-2 semanas prod → decide promote/rollback → próxima hipótese. Organizações maduras rodam 5-20 A/Bs concorrentes. Cultura: "toda mudança de prompt é variant" — não merge main sem A/B ship.
Perguntas frequentes
❓ Como testar prompt novo em produção sem risco?
Direcionando uma fração do tráfego pela chave de recurso, com a métrica de qualidade e a de custo comparadas lado a lado, e promovendo só quando as duas se mantêm. O detalhe que falta com frequência é fixar o usuário na variante durante a sessão — alternar no meio produz incoerência que parece bug.
❓ Quais métricas observar num teste de prompt?
Taxa de conclusão da tarefa, custo por interação, comprimento de saída e taxa de rejeição pela validação. As duas últimas são as que detectam degradação silenciosa: resposta ficando mais longa ou mais frequentemente inválida costuma anteceder queda de satisfação.
❓ Quanto tempo deixar o teste rodando?
Até a diferença ser distinguível do ruído no seu volume — e com saída não determinística, isso é mais tempo do que a intuição sugere. Encerrar cedo com resultado bonito é a forma mais comum de promover prompt pior e não descobrir.
Fixando
Quiz rápido
Qual erro estatístico mais compromete um teste de prompt em produção?
Quiz rápido
O que precisa estar pronto ANTES de iniciar o teste?
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…