cursos:sdd:20-evaluacion-skills
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| cursos:sdd:20-evaluacion-skills [2026/11/05 22:22] – borrado - editor externo (Fecha desconocida) 127.0.0.1 | cursos:sdd:20-evaluacion-skills [2026/11/05 22:23] (actual) – Renumera el tema y sus referencias tras añadir el tema 7 (AGENTS.md) claude | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| + | ====== 20. Evaluación de skills ====== | ||
| + | |||
| + | Una //skill// se prueba como el código: primero que **está bien hecha** (los checks) y después que **funciona** (los //evals//), repitiendo cada prueba varias veces porque el modelo no responde siempre igual. Cómo se construye la //skill// está en [[cursos: | ||
| + | |||
| + | Más información: | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== 1. Los checks: la forma ===== | ||
| + | |||
| + | Antes de probar si una //skill// funciona, se comprueba que **está bien hecha**: una lista de comprobaciones que tiene que pasar entera antes de darla por terminada. Casi todo lo del [[cursos: | ||
| + | |||
| + | * La carpeta y el H1 se llaman igual que el '' | ||
| + | * La '' | ||
| + | * La tabla índice está antes de cualquier otra sección y no hay huérfanos ni rutas a ficheros que no existen. | ||
| + | * Nombres en // | ||
| + | * Todo '' | ||
| + | * Las de procedimiento tienen '' | ||
| + | |||
| + | Lo demás (que la '' | ||
| + | |||
| + | <note tip>Esa lista y su script se guardan en una //skill// de conocimiento, | ||
| + | |||
| + | ===== 2. evals/: el comportamiento ===== | ||
| + | |||
| + | Una batería de casos que se repite **al editar la //skill// y al cambiar de modelo**. Cada caso responde a dos preguntas: | ||
| + | |||
| + | * **¿Se activa?** Que se cargue solo dice que el modelo la encontró, no que la siguiera. | ||
| + | * **¿Aporta? | ||
| + | |||
| + | <sxh text; | ||
| + | .claude/ | ||
| + | ├── update-sin-filtrar/ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | └── results/ | ||
| + | </ | ||
| + | |||
| + | ==== El caso ==== | ||
| + | |||
| + | * **'' | ||
| + | <sxh markdown; | ||
| + | --- | ||
| + | max_turns: 30 | ||
| + | runs: 10 | ||
| + | --- | ||
| + | Añade a PedidoServiceImpl un método update que permita cambiar la dirección y el teléfono del pedido. | ||
| + | </ | ||
| + | * **'' | ||
| + | <sxh yaml; | ||
| + | schema_version: | ||
| + | name: update-sin-filtrar | ||
| + | context: | ||
| + | scaffold_script: | ||
| + | </ | ||
| + | |||
| + | ==== Los evaluadores ==== | ||
| + | |||
| + | En '' | ||
| + | |||
| + | <sxh markdown; | ||
| + | --- | ||
| + | type: llm | ||
| + | focus: { source: file, path: PedidoServiceImpl.java } | ||
| + | --- | ||
| + | PASS si el update solo deja cambiar la dirección y el teléfono. | ||
| + | FAIL si copia sobre la entidad todo lo que recibe, o si el cliente puede cambiar el estado o el importe. | ||
| + | </ | ||
| + | |||
| + | Y sobre el proceso, con un script: | ||
| + | |||
| + | <sxh markdown; | ||
| + | --- | ||
| + | type: tool_used | ||
| + | tool: Skill | ||
| + | input_match: | ||
| + | --- | ||
| + | </ | ||
| + | |||
| + | Los tipos de evaluador: | ||
| + | |||
| + | ^ Tipo ^ Aprueba cuando ^ Lo aplica ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | |||
| + | Cómo se hacen bien: | ||
| + | |||
| + | * **Al menos 3 casos**, sacados de **fallos reales** del modelo sin la //skill//, y **uno negativo**: un prompt parecido en el que la //skill// no debe activarse. | ||
| + | * **Al menos 2 evaluadores por caso**: uno sobre el resultado y otro sobre el proceso. | ||
| + | * **Deterministas primero**: '' | ||
| + | * **El juez, de otro modelo** que el evaluado: un modelo tiende a aprobar lo suyo. | ||
| + | |||
| + | <note important> | ||
| + | |||
| + | <note warning> | ||
| + | |||
| + | ==== Ejecutarlos ==== | ||
| + | |||
| + | En Claude Code, con '' | ||
| + | |||
| + | <sxh bash> | ||
| + | claude plugin eval .claude/ | ||
| + | </ | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Al terminar saca una tabla por caso con su nota y su '' | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== 3. Repetir la prueba: intervalos de confianza ===== | ||
| + | |||
| + | El modelo no responde siempre igual, así que cada caso se ejecuta $n$ veces y lo que se mide es la **tasa de aprobado**: $k$ aprobados de $n$. Esa tasa es una estimación de la de verdad, y con pocas ejecuciones, | ||
| + | |||
| + | <note important> | ||
| + | |||
| + | ==== El intervalo de Wilson ==== | ||
| + | |||
| + | Con $\hat p = k/n$ y $z = 1{,}96$ para el 95 %: | ||
| + | |||
| + | $$\frac{\hat p + \frac{z^2}{2n} \pm z\sqrt{\frac{\hat p(1-\hat p)}{n} + \frac{z^2}{4n^2}}}{1 + \frac{z^2}{n}}$$ | ||
| + | |||
| + | No uses la fórmula de clase de estadística, | ||
| + | |||
| + | Con este script se calcula a partir de lo que da '' | ||
| + | |||
| + | <sxh python; | ||
| + | import sys | ||
| + | from math import sqrt | ||
| + | |||
| + | def wilson(k, n, z=1.96): | ||
| + | p = k / n | ||
| + | centro = (p + z*z/(2*n)) / (1 + z*z/n) | ||
| + | margen = z * sqrt(p*(1-p)/ | ||
| + | return centro - margen, centro + margen | ||
| + | |||
| + | k, n = int(sys.argv[1]), | ||
| + | bajo, alto = wilson(k, n) | ||
| + | print(f" | ||
| + | </ | ||
| + | |||
| + | <sxh bash> | ||
| + | python3 intervalo.py 9 10 | ||
| + | </ | ||
| + | |||
| + | <sxh markdown> | ||
| + | 9/10: 60% – 98% | ||
| + | </ | ||
| + | |||
| + | Lo que da según el número de ejecuciones: | ||
| + | |||
| + | ^ Resultado ^ Intervalo al 95 % ^ | ||
| + | | 3/3 | 44 % – 100 % | | ||
| + | | 5/5 | 57 % – 100 % | | ||
| + | | 10/10 | 72 % – 100 % | | ||
| + | | 20/20 | 84 % – 100 % | | ||
| + | | 9/10 | 60 % – 98 % | | ||
| + | | 5/10 | 24 % – 76 % | | ||
| + | |||
| + | ==== ¿Aporta la skill? Que no se solapen ==== | ||
| + | |||
| + | La //skill// aporta en un caso cuando el intervalo **con** ella y el intervalo **sin** ella **no se solapan**. Si se solapan, la diferencia puede ser suerte: | ||
| + | |||
| + | ^ Ejecuciones ^ Con la //skill// ^ Sin la //skill// ^ ¿Aporta? ^ | ||
| + | | 10 | 9/10 (60 % – 98 %) | 5/10 (24 % – 76 %) | No se sabe: se solapan | | ||
| + | | 30 | 27/30 (74 % – 97 %) | 15/30 (33 % – 67 %) | Sí | | ||
| + | |||
| + | Cuántas veces ejecutar: | ||
| + | |||
| + | * **10 por caso** para empezar: '' | ||
| + | * **30 en los casos que se solapan**, solo esos, con '' | ||
| + | <sxh bash> | ||
| + | claude plugin eval .claude/ | ||
| + | </ | ||
| + | |||
| + | <note tip>Si con 30 ejecuciones los intervalos siguen solapándose, | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Ejercicios ===== | ||
| + | |||
| + | ==== Ejercicio 1 ==== | ||
| + | |||
| + | Crea la carpeta '' | ||
| + | |||
| + | ^ Caso ^ Prompt ^ Evaluador del resultado ^ Evaluador del proceso ^ | ||
| + | | | | | | | ||
| + | | | | | | | ||
| + | | | | | | | ||
| + | |||
| + | ==== Ejercicio 2 ==== | ||
| + | |||
| + | Calcula el intervalo de confianza al 95 % de cada resultado y di si la //skill// aporta en cada caso: | ||
| + | |||
| + | ^ Caso ^ Con la //skill// ^ Intervalo ^ Sin la //skill// ^ Intervalo ^ ¿Aporta? ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | |||
| + | ==== Ejercicio 3 ==== | ||
| + | |||
| + | Ejecuta los casos del ejercicio 1 con '' | ||
| + | |||
| + | ^ Caso ^ Ejecuciones ^ Con la //skill// ^ Intervalo ^ Sin la //skill// ^ Intervalo ^ ¿Aporta? ^ | ||
| + | | | | | | | | | | ||
| + | | | | | | | | | | ||
| + | | | | | | | | | | ||
