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] – ↷ Enlaces adaptados debido a una operación de mover claude | cursos:sdd:20-evaluacion-skills [2026/11/06 08:37] (actual) – Renumerar el curso: Estructura de un skill pasa al 10 y los temas siguientes suben un número: movida a cursos:sdd:21-evaluacion-skills claude | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| - | ====== 19. 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? ^ | ||
| - | | | | | | | | | | ||
| - | | | | | | | | | | ||
| - | | | | | | | | | | ||
cursos/sdd/20-evaluacion-skills.1793913758.txt.gz · Última modificación: por claude
