Avaliando a decisão
Meça qualidade e custo.
Avaliando a decisão é uma aula grátis de AI Prompt Engineering no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Prompt Engineering, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Prompt Engineering inclui 4 aulas no total.
Não é possível decidir o que não é possível medir
A escolha entre instruções, ajuste e abordagem híbrida só é tão boa quanto a avaliação que a sustenta. Sem um conjunto de avaliação fixo e um modelo de custos, toda comparação é anedótica.
- Qualidade e custo são dois eixos — nunca os reduza prematuramente a um único número
- O conjunto de avaliação deve ser separado e estável em todas as abordagens comparadas
- A vencedora é a abordagem no melhor ponto da fronteira qualidade-custo para suas restrições
Crie primeiro o conjunto de avaliação fixo
Antes de comparar qualquer coisa, construa um conjunto de avaliação separado no qual nenhuma abordagem seja treinada. Ele deve abranger a distribuição real: casos comuns, casos-limite conhecidos e entradas adversariais em proporções aproximadamente iguais às de produção.
Congele-o. Cada abordagem — somente instruções, ajustada e híbrida — é avaliada no conjunto idêntico. Se a avaliação mudar entre as comparações, os números não serão comparáveis e a decisão será inválida.
def split_eval(labeled, holdout_ratio=0.2, seed=42):
import random
rng = random.Random(seed) # fixed seed = reproducible split
data = labeled[:]
rng.shuffle(data)
cut = int(len(data) * (1 - holdout_ratio))
train, frozen_eval = data[:cut], data[cut:]
return train, frozen_eval # eval never enters any training runEscolha métricas adequadas à tarefa
A exatidão genérica esconde falhas específicas da tarefa. Escolha métricas que capturem o que realmente importa:
- Correspondência exata/do esquema para saída estruturada
- LLM como avaliador com pontuação baseada em rubrica para qualidade de respostas abertas, com uma amostra auditada por humanos
- Métricas de cauda — pior caso e p95, não apenas a média
- Taxas de segurança/recusa como critérios rígidos, avaliadas separadamente da qualidade
Uma pontuação média que esconde uma cauda catastrófica levará você à decisão errada.
Avalie cada candidato de forma idêntica
Execute as abordagens somente com instruções, ajustada e híbrida pelo mesmo avaliador no mesmo conjunto fixo. Registre a qualidade e o vetor completo de custos de cada uma, para que as comparações sejam realmente equivalentes.
def evaluate(candidate, frozen_eval, scorer):
results = []
for ex in frozen_eval:
out = candidate.run(ex['input'])
results.append(scorer(out, ex['label']))
mean = sum(results) / len(results)
p95 = sorted(results)[int(0.95 * len(results)) - 1]
return {'mean': mean, 'p95_worst': p95}
# Identical frozen_eval + scorer for prompt / tuned / hybridModele o vetor completo de custos
O custo não é um único número. Registre cada componente para que a comparação reflita a realidade no seu volume:
- Inferência por chamada: tokens de entrada + saída multiplicados pelo preço (instruções longas custam mais por chamada)
- Custo de treinamento amortizado: custo do ajuste distribuído pelo volume esperado de solicitações
- Manutenção: fluxo de dados, execuções de avaliação e reajuste quando o modelo base mudar
- Latência: precificada separadamente quando afeta a conversão ou a experiência do usuário
def monthly_cost(calls, in_tok, out_tok, price_in, price_out,
train_cost=0.0, months_amortized=12):
inference = calls * ((in_tok/1000)*price_in + (out_tok/1000)*price_out)
amortized_train = train_cost / months_amortized
return inference + amortized_train
# Long prompt-only: high in_tok, train_cost=0
# Tuned: low in_tok, train_cost>0 amortized over volumeTrace a fronteira qualidade-custo
Com a qualidade e o custo mensal de cada candidato, posicione-os em uma fronteira. Um candidato é dominado se outro tiver qualidade maior e custo menor; descarte os candidatos dominados.
Entre os não dominados, a escolha correta depende da sua restrição: selecione o mais barato que ultrapasse o limite de qualidade ou a maior qualidade dentro do teto de custo. A decisão agora é explícita e defensável, não uma questão de preferência.
def non_dominated(candidates):
# candidate: {'name','quality','cost'} -- higher quality, lower cost better
keep = []
for c in candidates:
dominated = any(o['quality'] >= c['quality'] and o['cost'] <= c['cost']
and o != c for o in candidates)
if not dominated:
keep.append(c)
return keepSignificância estatística, não ruído
Um ganho de dois pontos em uma avaliação com 200 exemplos pode ser ruído. Antes de declarar um vencedor, verifique se a diferença de qualidade é estatisticamente significativa considerando o tamanho da sua avaliação.
Use uma comparação pareada (os mesmos exemplos passando pelos dois candidatos) e um intervalo de confiança para a diferença. Se o intervalo cruzar zero, não há uma melhoria real — e o custo adicional do ajuste não se justifica.
def paired_diff_ci(scores_a, scores_b):
import statistics
diffs = [a - b for a, b in zip(scores_a, scores_b)]
mean = statistics.mean(diffs)
sd = statistics.pstdev(diffs)
se = sd / (len(diffs) ** 0.5)
return (mean - 1.96*se, mean + 1.96*se) # if it spans 0 -> not significantProteja-se contra vazamento na avaliação
A maneira mais rápida de fazer o ajuste parecer falsamente superior é o vazamento — exemplos de treinamento que se sobrepõem ao conjunto de avaliação. Uma avaliação vazada recompensa a memorização e infla a pontuação do candidato ajustado.
Elimine duplicatas entre os limites de treinamento e avaliação, verifique quase duplicatas e prefira uma avaliação separada temporalmente (mantida fora por data), para que o modelo ajustado não possa tê-la visto. O vazamento é a causa mais comum de uma decisão de ajuste que fracassa em produção.
Monitore após o lançamento
A decisão não é final no lançamento. A distribuição de produção muda, e um modelo ajustado pode degradar silenciosamente à medida que as entradas se afastam da sua distribuição de treinamento.
- Amostre o tráfego real e avalie-o com a mesma rubrica
- Emita alertas para quedas de qualidade e aumento do custo por chamada
- Execute novamente a avaliação fixa sempre que a versão do modelo base mudar
Trate a abordagem escolhida como uma hipótese em avaliação contínua, não como uma decisão encerrada.
Registro da decisão
Registre a comparação como um registro de decisão escrito: a avaliação fixa, o vetor de qualidade e custo de cada candidato, o resultado da significância, o volume presumido e o ponto escolhido na fronteira, com sua justificativa.
Isso torna a escolha auditável e passível de nova avaliação. Quando o volume ou o modelo base mudar, reabra o registro e execute novamente, em vez de rediscutir a decisão com base na memória.
Função de decisão de ponta a ponta
Una tudo: avalie cada candidato no conjunto fixo, associe seu custo, descarte as opções dominadas, exija significância em relação à referência mais barata e, em seguida, selecione de acordo com sua restrição determinante.
def decide(candidates, quality_bar, cost_ceiling):
frontier = non_dominated(candidates)
feasible = [c for c in frontier
if c['quality'] >= quality_bar and c['cost'] <= cost_ceiling]
if not feasible:
return 'NO_CANDIDATE_MEETS_CONSTRAINTS'
# cheapest option that clears the quality bar
return min(feasible, key=lambda c: c['cost'])['name']
# Prefer prompt-only on ties: lower maintenance TCOVerificação rápida
Um modelo ajustado obtém uma pontuação 2 pontos maior que a abordagem por instruções em uma avaliação com 150 exemplos, mas um intervalo de confiança pareado para a diferença abrange zero. Ele também custa mais por mês. Qual é a decisão correta?
Recapitulação
Decida com base em uma avaliação fixa e em um vetor de custos honesto, não na intuição. Qualidade e custo são dois eixos; a resposta é um ponto na fronteira qualidade-custo, escolhido de acordo com sua restrição determinante.
- Congele um único conjunto de avaliação; avalie todos os candidatos de forma idêntica nele
- Escolha métricas adequadas à tarefa e observe a cauda, não apenas a média
- Modele o vetor completo de custos e amortize o treinamento sobre o volume real
- Exija significância estatística; um intervalo de confiança que abrange zero não representa melhoria
- Proteja-se contra vazamento na avaliação — a principal causa de falsos ganhos do ajuste
- Monitore após o lançamento e registre a decisão para que ela possa ser executada novamente
Perguntas Frequentes
A aula “Avaliando a decisão” é grátis?
Sim — o texto completo de “Avaliando a decisão” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Prompt Engineering, atualize para CoddyKit PRO. O curso de AI Prompt Engineering inclui 4 aulas no total.
O que vou aprender em “Avaliando a decisão”?
Meça qualidade e custo. Você pratica AI Prompt Engineering com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar AI Prompt Engineering?
Nenhuma experiência prévia é necessária. AI Prompt Engineering no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Avaliando a decisão”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de AI Prompt Engineering?
Sim. Cada aula de AI Prompt Engineering inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Quando solicitar já é suficiente
- Quando fazer ajuste fino
- Híbrido: solicitação e ajuste leve
- Avaliando a decisão