<!-- Canonical: https://lucioduran.com/es/projects/reranker-budget-router
Language: es
Content-SHA256: f05921ca2862bdc56bffee37b2c09a2b3275500bd2c232d61dc9b2d8021b228a
-->

[Proyectos](<https://lucioduran.com/es/projects>) / Reranker Budget Router

# Reranker Budget Router

Router de reranking con presupuestos estrictos de pares, políticas ajustadas en desarrollo y cross-encoder MiniLM local. Publica calidad, latencia, decisiones y errores.

Autor: [Lucio Durán](<https://lucioduran.com/es>) · Python 3.11.13 · Licencia: [MIT](<https://github.com/lucioduran/reranker-budget-router/blob/b34802875068f89c8fb3550f53680d60afdae513/LICENSE>)

Ficha publicada: 2026-10-21 · Ficha actualizada: 2026-10-21

[Repositorio](<https://github.com/lucioduran/reranker-budget-router>) · [Evidencia original](<https://raw.githubusercontent.com/lucioduran/reranker-budget-router/b34802875068f89c8fb3550f53680d60afdae513/results/eval/summary.json>) · [Release v0.1.0](<https://github.com/lucioduran/reranker-budget-router/releases/tag/v0.1.0>)

## Problema y utilidad para agentes

Reordenar todos los candidatos consume cómputo incluso cuando BM25 ya resolvió la consulta. Saltarse el reranker también puede perder una mejora. La decisión necesita una comparación medida y casos de error visibles.

El proyecto permite inspeccionar cuánto cómputo asigna una política a cada consulta y qué calidad deja de obtener. Separa el presupuesto de pares de los dólares, la energía y una garantía de latencia.

## Arquitectura

1. **Recuperación y señales.** BM25 genera candidatos. La diferencia entre scores y la cobertura de términos alimentan un router que elige profundidad 0, 4 o 12 bajo un presupuesto duro.
2. **Políticas congeladas.** Seis combinaciones de presupuesto y penalización ajustan umbrales únicamente sobre desarrollo. Un MiniLM cross-encoder fijado reordena el prefijo elegido y conserva el resto.
3. **Decisiones auditables.** Trazas por consulta, scores contrafactuales, políticas y hashes permiten recalcular métricas, identificar cómputo evitable y localizar pérdidas de calidad.

- [Diseño y metodología](<https://github.com/lucioduran/reranker-budget-router/blob/b34802875068f89c8fb3550f53680d60afdae513/docs/design.md>)

## Qué demuestra

- Asignación explícita de presupuesto de inferencia y separación entre ajuste y evaluación.
- Medición conjunta de calidad, latencia y pares procesados, con dos baselines.
- Análisis de un resultado negativo: reconocer cuándo un router añade costo y no captura una mejora.

## Resultados publicados

Corpus de 24 documentos ficticios, 12 consultas de desarrollo y 26 de evaluación, incluidas dos sin respuesta. MiniLM se ejecutó en Intel Xeon W-3223 con dos hilos y tres repeticiones seriales por política.

La latencia caliente incluye recuperación, señales, routing, tokenización e inferencia. Las preguntas sin respuesta puntúan cero. Son 26 unidades de calidad por política; repetir los tiempos no crea 78 consultas independientes.

### Calidad y costo en evaluación

| Política | nDCG@3 | Pares medios | Media (ms) | p95 (ms) |
| --- | --- | --- | --- | --- |
| always-12 | 0.9089 | 12.00 | 101.321 | 126.578 |
| never | 0.8947 | 0.00 | 0.108 | 0.152 |
| router-b12-p0 | 0.8947 | 0.00 | 0.114 | 0.176 |
| router-b12-p0.01 | 0.8947 | 0.00 | 0.112 | 0.154 |
| router-b12-p0.04 | 0.8947 | 0.00 | 0.109 | 0.139 |
| router-b4-p0 | 0.8947 | 0.00 | 0.160 | 0.201 |
| router-b4-p0.01 | 0.8947 | 0.00 | 0.127 | 0.194 |
| router-b4-p0.04 | 0.8947 | 0.00 | 0.116 | 0.152 |

Las seis políticas aprendidas omitieron todo reranking. Obtuvieron la calidad de never y agregaron overhead. El baseline always-12 mejoró eval-iris-1 y alcanzó 0,9089 nDCG@3 frente a 0,8947. Esta evaluación no demuestra una ventaja del router.

Los seis errores de pérdida de calidad son la misma consulta contada para seis políticas. La frontera observada contiene always-12 y never. Diferencias mínimas entre políticas con decisiones idénticas son ruido de temporización. [Resultados y análisis](<https://github.com/lucioduran/reranker-budget-router/blob/b34802875068f89c8fb3550f53680d60afdae513/results/report.md>).

## Reproducir

El replay y el comando route usan Python 3.11 o posterior sin dependencias de modelos. route muestra señales y candidatos sin ejecutar inferencia. La reproducción completa descarga un cross-encoder público.

Los comandos de entorno usan shell POSIX. reproduce.py adquiere un lock exclusivo, ejecuta ambas particiones y verifica la evidencia. La salida debe ser nueva; dev y eval permanecen como carpetas hermanas para comprobar el origen de las políticas.

### Revisar la evidencia guardada

```
git clone https://github.com/lucioduran/reranker-budget-router.git
cd reranker-budget-router
git checkout b34802875068f89c8fb3550f53680d60afdae513
python -m budget_router verify --output results/dev
python -m budget_router verify --output results/eval
python -m budget_router route "Where can I restore a deleted notebook?" --budget 4
```

### Repetir la medición local

```
python3.11 -m venv .venv
. .venv/bin/activate
python -m pip install -r requirements-models.txt -r requirements-dev.txt
python -m budget_router download
python scripts/reproduce.py --output build/reproduction
```

## Alcance y límites

- Dataset pequeño, sintético y conocido por el autor. Los grupos de consultas son correlacionados y no tienen validación humana de relevancia.
- El presupuesto limita pares, no tiempo máximo. El modelo no recupera documentos fuera del prefijo; usa truncación a 256 tokens.
- Tres repeticiones calientes en una CPU no caracterizan concurrencia, energía, costo monetario ni percentiles estables en producción.

- [Arquitectura RAG: reranking y evaluación de costo](<https://lucioduran.com/es/blog/rag-pipeline-architecture-chunking-reranking-evaluation>)

## Fuentes y revisión

Las cifras provienen del resumen, las trazas y el análisis incluidos en v0.1.0. Los metadatos identifican la revisión ejecutada y el entorno; no registran una hora de ejecución. La fecha de release se muestra por separado.

- Revisión consultada: [` b34802875068f89c8fb3550f53680d60afdae513 `](<https://github.com/lucioduran/reranker-budget-router/commit/b34802875068f89c8fb3550f53680d60afdae513>)
- Revisión registrada por el experimento: [` 09ac402ba70b1456e4e49dfa3d3fc30de18d56d3 `](<https://github.com/lucioduran/reranker-budget-router/commit/09ac402ba70b1456e4e49dfa3d3fc30de18d56d3>)
- Release publicada: [v0.1.0](<https://github.com/lucioduran/reranker-budget-router/releases/tag/v0.1.0>) · 2026-10-21T22:16:27Z
- SHA-256 del corpus: ` ecf0e3d23dbee38f61aad545e67d7ad3e81195e39659a4619b7035babb5938e6 `

- [README y uso](<https://github.com/lucioduran/reranker-budget-router/blob/b34802875068f89c8fb3550f53680d60afdae513/README.md>)
- [Evidencia original](<https://raw.githubusercontent.com/lucioduran/reranker-budget-router/b34802875068f89c8fb3550f53680d60afdae513/results/eval/summary.json>)
- [Resultados y análisis](<https://github.com/lucioduran/reranker-budget-router/blob/b34802875068f89c8fb3550f53680d60afdae513/results/report.md>)
- [Diseño y metodología](<https://github.com/lucioduran/reranker-budget-router/blob/b34802875068f89c8fb3550f53680d60afdae513/docs/design.md>)
- [Corpus y procedencia](<https://github.com/lucioduran/reranker-budget-router/blob/b34802875068f89c8fb3550f53680d60afdae513/data/README.md>)
- [Entorno de ejecución](<https://raw.githubusercontent.com/lucioduran/reranker-budget-router/b34802875068f89c8fb3550f53680d60afdae513/results/eval/metadata.json>)
- [Políticas congeladas](<https://raw.githubusercontent.com/lucioduran/reranker-budget-router/b34802875068f89c8fb3550f53680d60afdae513/results/eval/policies.json>)
- [Errores de routing](<https://raw.githubusercontent.com/lucioduran/reranker-budget-router/b34802875068f89c8fb3550f53680d60afdae513/results/eval/errors.json>)
- [Trazas de ejecución](<https://raw.githubusercontent.com/lucioduran/reranker-budget-router/b34802875068f89c8fb3550f53680d60afdae513/results/eval/trace.jsonl>)
- [Evidencia de desarrollo](<https://raw.githubusercontent.com/lucioduran/reranker-budget-router/b34802875068f89c8fb3550f53680d60afdae513/results/dev/summary.json>)
- [Modelos, revisiones y licencias](<https://github.com/lucioduran/reranker-budget-router/blob/b34802875068f89c8fb3550f53680d60afdae513/docs/model-notices.md>)
- [Dependencias del entorno medido](<https://github.com/lucioduran/reranker-budget-router/blob/b34802875068f89c8fb3550f53680d60afdae513/requirements-local.lock>)
- [Licencia MIT](<https://github.com/lucioduran/reranker-budget-router/blob/b34802875068f89c8fb3550f53680d60afdae513/LICENSE>)
