Evaluación de una configuración de decisión tipada
El conjunto de evaluación es el producto. La precisión de un modelo System One está dominada por cómo se redactó la pregunta, y el modo de fallo es silencioso: devuelve una respuesta segura, con tipo válido, pero incorrecta. Sin etiquetas no se puede distinguir una mala pregunta de un mal modelo.
Medido: reescribir los criterios movió un modelo abierto de 4/15 a 14/15 en 15 registros. Sin cambio de modelo. Luego la misma comparación con 150 registros colocó ese modelo en 61% general contra el 97% de Jev — la lectura de 15 registros fue un artefacto de un conjunto pequeño y fácil. Ambos hechos son el punto: la redacción altera los resultados y los conjuntos pequeños mienten sobre la dirección.
Ejecútalo
python ~/.claude/skills/jev-eval/scripts/sweep.py labelled.json configs.json \
--backend jev|von --question <nombre>
labelled.json es [{"id","state","truth"}]. configs.json asigna un nombre de configuración a {"instructions", "criteria"}: un diccionario de opciones lo convierte en una elección, una lista de niveles lo convierte en una puntuación, omitirlo lo convierte en un noul. El script lee la clave Jev del Llavero (typesafe-api-key), imprime la precisión por configuración, etiqueta la dispersión como ROBUSTA o FRÁGIL, explora umbrales para nouls y puntúa la puerta de confianza.
Salida real, 50 registros de riesgo de comando shell del agente, solo cambió el backend:
config precisión ms/registro
A una línea concisa 45/50 410 <- Jev
B criterios ricos 49/50 415
C ricos + exclusiones 46/50 418
D deliberadamente perezoso 44/50 411
dispersión: 44/50 a 49/50 (ROBUSTA - la redacción no es crítica)
A una línea concisa 9/50 66 <- Von, mismas configuraciones
B criterios ricos 23/50 121
C ricos + exclusiones 15/50 129
D deliberadamente perezoso 22/50 53
dispersión: 9/50 a 23/50 (FRÁGIL - y el techo aún no es utilizable)
Lee el techo antes que la dispersión. Un modelo FRÁGIL cuya mejor configuración es 23/50 no es un problema de redacción que puedas resolver escribiendo más — es el modelo equivocado para esa pregunta.
1. Construye el conjunto
Mínimo 50 registros, 200+ antes de lanzar. Extrae del flujo real, no de datos sintéticos.
- Incluye el término medio aburrido, no solo ejemplos limpios y casos extremos dramáticos
- Incluye registros con metadatos rotos/faltantes — ahí es donde fallan los clasificadores
- Etiqueta leyendo el registro, antes de ejecutar cualquier modelo. Nunca etiquetes a partir de la salida del modelo
- Almacena como JSON con el registro bruto más un campo
truth
[{"id":"D-1994","state":"...texto completo del registro...","truth":"inbound_prospect"}]
Si no puedes etiquetar un registro con confianza tú mismo, el modelo tampoco puede — o elimínalo o arregla la pregunta para que la respuesta sea determinista.
2. Explora redacciones, no solo modelos
El movimiento central. Escribe 3–4 configuraciones de criterios genuinamente diferentes y ejecútalas todas:
- A — una línea concisa por opción (lo que todos escriben primero)
- B — 3–4 oraciones por opción con ejemplos concretos
- C — B más un valor predeterminado explícito y exclusiones explícitas ("SOLO cuando…")
- D — deliberadamente perezoso, cuatro o cinco palabras, como prueba de piso
Reporta precisión por configuración por modelo:
config JEV VON LAYA (triaje principal, n=50)
A una línea concisa 47/50 34/50 21/50
B criterios ricos 49/50 28/50 15/50
C ricos + exclusiones 48/50 24/50 19/50
D deliberadamente perezoso 48/50 22/50 24/50
Lee el piso primero, luego la dispersión. El piso es "¿puede este modelo hacer el trabajo en absoluto si lo redacto mal?"; la dispersión es "¿cuánto me costará mantenerlo?". Medido en la tarea de comando, cada modelo alojado tiene un piso del 82-92% (Haiku 46-48, GPT-4.1-mini 45-50, Jev 44-49, GPT-5-mini 41-49) mientras que Von tiene un piso de 9/50 y Laya de 18/50. Nota que Jev no es más robusto en redacción que un LLM pequeño — oscila los mismos diez puntos. Lo que compras es el piso, no inmunidad.
Nota lo que la columna de leads NO muestra: un gradiente limpio de "más rico es mejor". La mejor configuración de Von aquí es la concisa. Lo que mueve los números de un modelo abierto es sensibilidad a la forma superficial, no comprensión, así que no asumas que tu próxima reescritura de criterios lo mejora — vuelve a ejecutar el conjunto.
3. Explora umbrales para cada noul
Nunca implementes 0.5. Explora y lee la 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} prec={(tp+tn)/len(z):.2f}")
Diferentes modelos tienen diferentes pisos. El noul de Jev se situó en 0.2–0.5 en registros que eran claramente limpios, mientras que Claude llegaba a 0.0 — así que su corte real era ~0.85. Un umbral ajustado en un modelo no se transfiere a otro. Vuelve a explorar cuando cambies.
4. Puntúa la puerta de confianza honestamente
Dos números, siempre juntos:
errs = [r for r in filas if r.pred != r.truth]
rights = [r for r in filas if r.pred == r.truth]
for g in [0.5,0.7,0.9]:
atrapados = sum(r.conf < g for r in errs) # errores que la puerta escala
escalados = sum(r.conf < g for r in filas) # volumen total escalado
print(f"puerta {g}: atrapa {atrapados}/{len(errs)} errores, escala {escalados/len(filas):.0%} del volumen")
Una puerta que atrapa 10/11 errores mientras escala el 93% del volumen no es una puerta que funcione — es un camino lento con pasos extra. Una buena calibración sin buena precisión no compra nada.
5. Informa
- precisión por configuración por modelo, con la dispersión resaltada
- umbral elegido por noul, con la exploración que lo justificó
- puerta: errores atrapados y volumen escalado
- latencia y costo proyectados por 1k a volumen de producción
- declaración explícita del tamaño del conjunto de evaluación y lo que no cubre
Los conjuntos pequeños mienten. 15 registros donde dos modelos obtienen ambos 100% no distingue nada — dilo en lugar de implicar que el empate es significativo.
Relacionado
jev-integrate es el flujo de trabajo de conexión que alimenta esto. jev-audit encuentra candidatos que vale la pena evaluar.