ragsolver / docs /eval_report_v2.md
CamiloS1111's picture
Upload folder using huggingface_hub
ee54756 verified
|
Raw History Blame Contribute Delete
9.5 kB
# Evaluación eval-v2 — sistema por goal (`docs/PLAN_MEJORA_RAG.md`), reporte parcial
> 2026-10-15. **Estado final:**
> - Ronda 1 completa. Ronda 2 completa (opción B): `full` 2/15, `no_rag` 2/15, `baseline_auto` 2/15, a US$0.109.
> - Ronda 3 detenida a pedido (#111): 11/15 pares de `full` (2 resueltos), sin `no_rag`.
> - `baseline_auto` completa en los 60.
> - Comparación `full` contra `no_rag` en 30 problemas pareados: 8 frente a 9.
> - Siguiente paso: el rediseño con demostrador local (`docs/PLAN_REDISENO_PROVER.md`, eval-v3).
> El guardia de costo detuvo la cadena tras la ronda 1: la proyección para las rondas 2-4 (US$0.343) superaba el saldo de la key (US$0.289).
> **Falta tu decisión para seguir (sección 6).**
>
> Datos:
> - `data/eval/runs/eval-v2/` (resultados y trazas);
> - `data/eval/results/eval_v2_round1_check.json` (guardia);
> - `eval_v2_analysis.json` y `eval_v2_stats.json` (cifras de este reporte; se regeneran con `data/eval/results/eval_v2_analysis.py`).
---
## 1. Resumen
| Configuración | Ronda 1 (15 problemas) | IC95 Wilson | Los 60 problemas |
|---|---|---|---|
| **`full`** (sistema nuevo con RAG por goal) | **6/15** | 0.20-0.64 | — |
| `no_rag` (sistema nuevo sin premisas recuperadas) | 7/15 | 0.25-0.70 | — |
| `baseline_auto` (sólo tácticas de Lean, 0 LLM) | 5/15 | 0.15-0.58 | **11/60** (0.11-0.30) |
| *eval-v1 `full` (sistema viejo)* | *3/15* | 0.07-0.45 | *9/60* |
| *eval-v1 `no_rag`* | *4/15* | 0.11-0.52 | *9/60* |
| *eval-v1 línea base A (LLM escribe la prueba)* | — | — | *5/60* |
Lo que dicen los datos, de más a menos firme:
1. **El cambio de arquitectura es lo que más mueve el resultado.** Las tácticas de Lean solas, sin una sola llamada al LLM y a US$0, resuelven **11/60**, más que el sistema viejo completo (9/60). En la ronda 1, el sistema nuevo resuelve el doble que el viejo en los mismos problemas: 6-7/15 frente a 3-4/15. Esa comparación no es significativa (McNemar p = 0.375; 4 problemas sólo en v2, 1 sólo en v1) y está confundida por el cambio de proveedor del LLM y de índice.
2. **Las premisas recuperadas (el RAG nuevo) no muestran efecto medible.** `full` 6 frente a `no_rag` 7: un único problema distinto, a favor de `no_rag`. El kernel usó **1 premisa recuperada en 1 problema** de los 6 resueltos. La batería cerró más pasos con premisas (26 frente a 18), pero las premisas no aparecen en los términos de prueba: `grind` cerró esos pasos con lo que ya sabe.
3. **Los agentes aportan poco sobre la automatización en esta ronda.** `full` resuelve 1 problema más que `baseline_auto` (`algebra_sqineq_2unitcircatblt1`) y `no_rag`, 2.
4. **El flujo nuevo no es más barato en problemas difíciles.** US$0.0036 por par en `full` y US$0.0032 en `no_rag`, con 23 600 y 16 700 tokens de entrada: lo mismo que eval-v1. La estimación de US$0.0016 que di antes salía de pares fáciles.
Con 15 problemas pareados ninguna diferencia es significativa. Completar las 4 rondas daría n = 60 para `full` contra `no_rag`.
## 2. Configuración
- **Problemas:** eval-v1 (60), en 4 rondas intercaladas (`eval_v1_round{k}.jsonl` = problemas k, k+4, …). Cada ronda tiene 6 de álgebra, 6 de teoría de números y 3 de combinatoria.
- **Configuraciones:** `full`, `no_rag`, `baseline_auto` (DECISIONS #96). `rag_nl` quedó aislada a pedido del usuario (#106).
- **Modelo:** DeepSeek V4 Flash vía OpenRouter, con 4 hilos. El tope de precio se subió a {0.13, 0.30} durante la ronda 1 (8 proveedores, #107), porque con el anterior sólo calificaba DeepInfra, saturado.
- **Código:** `prompt_version: "3"`; índice `mathlib_full`; canal denso apagado; prior de competición de 778 lemas.
- **Cambios de infraestructura durante la ronda 1 (no afectan a los resultados):**
- los 429 pasaron a reintentarse hasta 10 veces, porque no se cobran (#104);
- hubo dos reinicios de la cadena: el cambio de reintentos y la salida de `rag_nl`;
- los pares interrumpidos se repitieron completos.
## 3. Ronda 1 por problema
| Problema | Área | Dif. | `full` | `no_rag` | `baseline_auto` | v1 `full` | v1 `no_rag` |
|---|---|---|---|---|---|---|---|
| mathd_algebra_209 | álgebra | 1 | ✔ | ✔ | ✔ | – | – |
| algebra_sqineq_2unitcircatblt1 | álgebra | 1 | ✔ | ✔ | – | ✔ | ✔ |
| mathd_algebra_77 | álgebra | 1 | ✔ | ✔ | ✔ | – | – |
| amc12b_2020_p13 | álgebra | 2 | – | – | – | – | – |
| amc12a_2010_p11 | álgebra | 2 | – | – | – | – | – |
| imo_1965_p1 | álgebra | 3 | – | – | – | – | – |
| mathd_numbertheory_728 | t. números | 1 | ✔ | ✔ | ✔ | ✔ | ✔ |
| mathd_numbertheory_403 | t. números | 1 | ✔ | ✔ | ✔ | – | – |
| numbertheory_aneqprodakp4_anmsqrtanp1eq2 | t. números | 1 | – | – | – | – | – |
| amc12a_2020_p10 | t. números | 2 | – | – | – | – | – |
| amc12a_2016_p3 | t. números | 2 | – | – | – | ✔ | ✔ |
| imo_1977_p5 | t. números | 3 | – | – | – | – | – |
| mathd_algebra_170 | combinatoria | 1 | – | – | – | – | – |
| mathd_algebra_104 | combinatoria | 1 | ✔ | ✔ | ✔ | – | ✔ |
| amc12a_2002_p6 | combinatoria | 2 | – | ✔ | – | – | – |
Comparaciones pareadas (McNemar exacto, ronda 1):
| A | B | sólo A | sólo B | p |
|---|---|---|---|---|
| v2 `full` | v2 `no_rag` | 0 | 1 | 1.00 |
| v2 `full` | `baseline_auto` | 1 | 0 | 1.00 |
| v2 `full` | v1 `full` | 4 | 1 | 0.375 |
| v2 `no_rag` | v1 `no_rag` | 4 | 1 | 0.375 |
En los 60: `baseline_auto` contra v1 `full`, 7 sólo auto frente a 5 sólo v1 (p = 0.77); contra la línea base A de v1, 7 frente a 1 (p = 0.07).
## 4. Qué cerró cada paso y qué usó el kernel
- **Pasos cerrados por la batería CLOSE** (sin LLM; los cerrados por el bloque del propio modelo no se cuentan aquí):
| Config | `grind` (con premisas en `full`) | `try?` | `nlinarith` | abiertos tras CLOSE (van a FILL) |
|---|---|---|---|---|
| `full` | 23 | 3 | — | 113 |
| `no_rag` | 14 | 3 | 1 | 128 |
- **Premisas recuperadas que usa el término aceptado** (`Verdict.used_constants`, #101): **1** en `full`, en un problema. El texto de las pruebas nombra 16 por cada `grind +lax [...]`, pero el kernel no las usa. Los 9 pasos de diferencia en la batería se explican porque cada configuración recibe esqueletos distintos (muestras distintas del LLM), no por las premisas.
- **Llamadas FILL:** 19 en `full` y 21 en `no_rag`, en 15 problemas.
- **Por qué fallan los problemas difíciles:** sobre todo pruebas del modelo que Lean rechaza (`unsolved goals`, `type mismatch`) en pasos que ni la batería ni FILL logran cerrar. Ejemplo, `amc12a_2002_p6` en `full`: el modelo usa `Set.infinite_univ` para `{m | 0 < m}`, y en FILL escribe un bloque en una sola línea con viñetas `·` encadenadas por `;`. No se encontró ningún error de ensamblado: el archivo final contiene exactamente lo que se verificó paso a paso.
## 5. Costo
| Concepto | US$ |
|---|---|
| Smoke (2 corridas, 8 problemas) | 0.0145 |
| Ronda 1 (gasto de la key, incluidos ~US$0.008 de pares interrumpidos por los reinicios) | 0.1143 |
| `baseline_auto`, 60 problemas | 0.0000 |
| **Saldo de la key** | **0.2892** |
Por par: `full` US$0.0036 (23 600 tokens de entrada / 9 300 de salida); `no_rag` US$0.0032 (16 700 / 9 800). `full` lleva un 42 % más de tokens de entrada por las listas de premisas con firma que van a FILL. Ningún par superó el presupuesto de 20 llamadas (máximo 15) y no hubo pares en `error`.
**Proyección para las rondas 2-4:** 90 pares pagados × ~US$0.0034 ≈ **US$0.31-0.34**, frente a US$0.289 de saldo. Por eso el guardia cortó, como estaba previsto.
## 6. Opciones para seguir (decisión del usuario)
| Opción | Qué se obtiene | Costo | Tiempo |
|---|---|---|---|
| **A. Subir el límite de la key** en OpenRouter (≥ US$0.10 más) y correr las rondas 2-4 | `full` contra `no_rag` en los 60 problemas: la única medición con potencia mínima para el aporte del RAG | ~US$0.33 | 2-4 h |
| B. Correr sólo las rondas 2 y 3 con el saldo actual | 45 problemas pareados | ~US$0.21 | 1.5-3 h |
| C. Volver al tope barato (sólo DeepInfra) y correr las rondas 2-4 | 60 problemas; ~17 % más barato por token. La proyección (~US$0.28) queda justo en el límite del saldo y puede quedar incompleta | ~US$0.28 | 13-16 h (429) |
| D. Parar aquí | Ronda 1 + `baseline_auto` en los 60 | 0 | — |
**Recomendación: A**, y si no es posible, **B**. Con la ronda 1 sola no se puede afirmar nada del aporte del RAG: se necesitan los pares de las otras rondas.
## 7. Qué significa para el objetivo del RAG
- El RAG nuevo recupera mucho mejor (recall@16 por goal 0.327 frente a <0.01, Fase 3), pero **todavía no convierte eso en problemas resueltos**:
- la automatización (`grind`) ya conoce los lemas genéricos que trae el prior (`sq_nonneg`, `mul_pos`…), así que dárselos no le añade nada;
- FILL los recibe, pero el término final casi nunca los usa.
- Donde el RAG podría aportar es en **lemas específicos** (`Nat.Prime.eq_one_or_self_of_dvd`, `Real.log_rpow`) que ni la automatización ni el modelo conocen bien. El canal que los buscaba (el índice denso) fue el que no funcionó (recall 0.028).
- Siguiente mejora candidata, a medir antes de gastar: recuperar para los goals que quedan **abiertos tras la batería**, en lugar de para todos. Con el dato de qué falló (el error de Lean) se buscarían lemas específicos, y se pasarían a FILL con prioridad sobre los genéricos.