Avaliando uma configuração de decisão tipada
O conjunto de avaliação é o produto. A precisão de um modelo System One é dominada por como a pergunta foi escrita, e o modo de falha é silencioso — ele retorna uma resposta confiante, válida para o tipo, mas errada. Sem rótulos, você não pode distinguir uma pergunta ruim de um modelo ruim.
Medido: reescrever o critério moveu um modelo aberto de 4/15 para 14/15 em 15 registros. Nenhuma mudança de modelo. Em seguida, a mesma comparação com 150 registros colocou esse modelo em 61% geral contra 97% do Jev — a leitura de 15 registros foi um artefato de um conjunto pequeno e fácil. Ambos os fatos são o ponto: a redação altera os resultados, e conjuntos pequenos mentem sobre qual direção.
Execute
python ~/.claude/skills/jev-eval/scripts/sweep.py labelled.json configs.json \
--backend jev|von --question <nome>
labelled.json é [{"id","state","truth"}]. configs.json mapeia um nome de configuração para {"instructions", "criteria"} — um dicionário de opções torna isso uma escolha, uma lista de níveis torna isso uma pontuação, omitir torna isso um noul. O script lê a chave Jev do Keychain (typesafe-api-key), imprime a precisão por configuração, rotula a dispersão como ROBUSTA ou FRÁGIL, varre limites para nouls e pontua o portão de confiança.
Saída real, 50 registros de risco de comando shell de agente, apenas o backend mudou:
config precisão ms/reg
A Uma linha concisa 45/50 410 <- Jev
B Critério rico 49/50 415
C Rico + exclusões 46/50 418
D Deliberadamente preguiçoso 44/50 411
dispersão: 44/50 a 49/50 (ROBUSTA - a redação não é crítica)
A Uma linha concisa 9/50 66 <- Von, mesmas configs
B Critério rico 23/50 121
C Rico + exclusões 15/50 129
D Deliberadamente preguiçoso 22/50 53
dispersão: 9/50 a 23/50 (FRÁGIL - e o teto ainda não é utilizável)
Leia o teto antes da dispersão. Um modelo FRÁGIL cuja melhor configuração é 23/50 não é um problema de redação que você pode resolver escrevendo — é o modelo errado para aquela pergunta.
1. Construa o conjunto
Mínimo de 50 registros, 200+ antes do lançamento. Puxe do fluxo real, não de dados sintéticos.
- Inclua o meio chato, não apenas exemplos limpos e casos extremos dramáticos
- Inclua registros com metadados quebrados/faltando — é onde os classificadores falham
- Rotule lendo o registro, antes de qualquer execução do modelo. Nunca rotule a partir da saída do modelo
- Armazene como JSON com o registro bruto mais um campo
truth
[{"id":"D-1994","state":"...texto completo do registro...","truth":"inbound_prospect"}]
Se você não consegue rotular um registro com confiança, o modelo também não consegue — ou descarte ou corrija a pergunta para que a resposta seja determinística.
2. Varra redações, não apenas modelos
O movimento central. Escreva 3–4 configurações de critérios genuinamente diferentes e execute todas:
- A — uma linha concisa por opção (o que todo mundo escreve primeiro)
- B — 3–4 frases por opção com exemplos concretos
- C — B mais um padrão explícito e exclusões explícitas ("SOMENTE quando…")
- D — deliberadamente preguiçoso, quatro ou cinco palavras, como teste de piso
Relate a precisão por configuração por modelo:
config JEV VON LAYA (triagem principal, n=50)
A Uma linha concisa 47/50 34/50 21/50
B Critério rico 49/50 28/50 15/50
C Rico + exclusões 48/50 24/50 19/50
D Deliberadamente preguiçoso 48/50 22/50 24/50
Leia o piso primeiro, depois a dispersão. O piso é "este modelo consegue fazer o trabalho se eu escrever mal?"; a dispersão é "quanto vai custar mantê-lo?" Medido na tarefa de comando, todo modelo hospedado tem piso de 82-92% (Haiku 46-48, GPT-4.1-mini 45-50, Jev 44-49, GPT-5-mini 41-49) enquanto Von tem piso de 9/50 e Laya de 18/50. Note que Jev não é mais robusto a redação do que um LLM pequeno — ele oscila os mesmos dez pontos. O que você compra é o piso, não imunidade.
Note o que a coluna de liderança NÃO mostra: um gradiente limpo de "mais rico é melhor". A melhor configuração de Von aqui é a concisa. O que quer que mova os números de um modelo aberto é sensibilidade à forma superficial, não compreensão, então não assuma que sua próxima reescrita de critério o melhora — reexecute o conjunto.
3. Varra limites para cada noul
Nunca envie 0.5. Varra e leia a curva:
for t in [0.5,0.6,0.7,0.75,0.8,0.85,0.9,0.95]:
tp = sum(p>=t and y for p,y in z); fp = sum(p>=t and not y for p,y in z)
fn = sum(p< t and y for p,y in z); tn = sum(p< t and not y for p,y in z)
print(f"{t} P={tp/max(tp+fp,1):.2f} R={tp/max(tp+fn,1):.2f} acc={(tp+tn)/len(z):.2f}")
Modelos diferentes têm pisos diferentes. O noul do Jev ficava em 0.2–0.5 em registros que eram claramente limpos, onde Claude ia para 0.0 — então seu corte real era ~0.85. Um limite ajustado em um modelo não se transfere para outro. Revarra quando você trocar.
4. Pontue o portão de confiança honestamente
Dois números, sempre juntos:
errs = [r for r in linhas if r.pred != r.truth]
rights = [r for r in linhas if r.pred == r.truth]
for g in [0.5,0.7,0.9]:
capturados = sum(r.conf < g for r in errs) # erros que o portão escala
escalados = sum(r.conf < g for r in linhas) # volume total escalado
print(f"portão {g}: captura {capturados}/{len(errs)} erros, escala {escalados/len(linhas):.0%} do volume")
Um portão que captura 10/11 erros enquanto escala 93% do volume não é um portão funcional — é um caminho lento com etapas extras. Boa calibração sem boa precisão não compra nada.
5. Relate
- precisão por configuração por modelo, com a dispersão destacada
- limite escolhido para cada noul, com a varredura que o justificou
- portão: erros capturados e volume escalado
- latência e custo projetados por 1k no volume de produção
- declaração explícita do tamanho do conjunto de avaliação e do que ele não cobre
Conjuntos pequenos mentem. 15 registros onde dois modelos pontuam 100% não distinguem nada — diga isso em vez de sugerir que o empate é significativo.
Relacionados
jev-integrate é o fluxo de trabalho de integração que este alimenta. jev-audit encontra candidatos dignos de avaliação.