Proyectos / RAG Evaluation Workbench

RAG Evaluation Workbench

Evaluación reproducible de RAG con BM25, recuperación densa e híbrida, inferencia local en CPU y métricas separadas de recuperación y respuesta.

Autor: · Python 3.11.13 · Licencia: MIT

Ficha publicada: · Ficha actualizada:

Repositorio · Informe crudo de evaluación

Problema y utilidad para agentes

Recuperar el documento correcto no garantiza una respuesta correcta. RAG Evaluation Workbench compara tres métodos de recuperación manteniendo fijos el modelo generador, el prompt, los presupuestos de contexto y la decodificación. Registra rankings, contexto incluido, respuestas y errores para evaluar cada etapa por separado.

Un agente que recupera evidencia todavía puede confundir hechos o inventar una respuesta cuando debería abstenerse. Este proyecto permite inspeccionar esas fallas sin atribuir al retrieval un éxito que la respuesta final no tuvo.

Arquitectura

  1. Corpus y partición. 24 documentos ficticios originales con licencia MIT, 12 preguntas de desarrollo y 26 de evaluación. Desarrollo y evaluación usan grupos de documentos relevantes disjuntos; ambos consultan el mismo corpus. Dos preguntas de evaluación no tienen respuesta.
  2. Recuperación comparable. BM25, MiniLM con similitud coseno y fusión de rankings recíprocos con constante 60. Los tres recuperan hasta tres documentos. Cada documento es una unidad completa de recuperación; este experimento no compara estrategias de chunking ni rerankers.
  3. Generación congelada. FLAN-T5-small local en CPU, cuatro hilos, semilla 1729 y decodificación greedy. El presupuesto es de 256 tokens para embeddings, 384 tokens de entrada al generador y 32 de salida. Los documentos entran completos, en orden de ranking, hasta agotar el presupuesto. Las etiquetas y respuestas de referencia no entran en el prompt.
  4. Evidencia y verificación. Cada ejecución conserva hashes de entradas y modelos, revisiones, entorno, rankings, prompts, predicciones y tiempos. Un verificador con la biblioteca estándar reconstruye rankings y prompts y recalcula métricas e intervalos desde los datos guardados, sin volver a ejecutar los modelos.

Qué demuestra

  • Diseño de una comparación controlada que separa calidad de recuperación, calidad de respuesta y abstención.
  • Implementación de Recall@3, NDCG@3, exact match y token F1, con bootstrap por grupos y diferencias pareadas entre métodos.
  • Trazabilidad de resultados hasta consultas, rankings, prompts y respuestas concretas, incluidos resultados desfavorables y límites del scoring.

Resultados publicados

Resultados publicados por el autor para la ejecución local en Intel Xeon W-3223 con Python 3.11.13 y cuatro hilos de CPU. Las métricas de recuperación usan 24 consultas con respuesta; exact match y token F1 usan las 26 consultas de evaluación, incluidas las dos sin respuesta.

Los intervalos del 95% se calculan con 2.000 remuestreos bootstrap de grupos de origen. Las dos preguntas sobre un documento se mantienen juntas. Las diferencias entre métodos usan observaciones pareadas y el mismo remuestreo. Son 12 grupos con respuesta y dos grupos sin respuesta. Las tablas redondean los valores; los informes conservan su precisión.

Recuperación: 24 consultas con respuesta

Recall@3 y NDCG@3 sobre 24 preguntas con respuesta, agrupadas en 12 fuentes. Las preguntas sin respuesta se excluyen de estas métricas. Los intervalos del 95% usan bootstrap por grupos.

Resumen de métricas ·
MétodoRecall@3Intervalo del 95%NDCG@3Intervalo del 95%
BM251.000[1.000, 1.000]0.969[0.923, 1.000]
Densa1.000[1.000, 1.000]1.000[1.000, 1.000]
Híbrida1.000[1.000, 1.000]1.000[1.000, 1.000]

Respuestas: 26 consultas de evaluación

Exact match y token F1 sobre las 26 preguntas, en 14 grupos, incluidas las dos sin respuesta. Son métricas de coincidencia textual, no de factualidad. Los intervalos del 95% usan bootstrap por grupos.

Resumen de métricas ·
MétodoExact matchIntervalo del 95%Token F1Intervalo del 95%
BM250.731[0.560, 0.885]0.756[0.583, 0.889]
Densa0.769[0.600, 0.893]0.795[0.627, 0.926]
Híbrida0.731[0.560, 0.885]0.767[0.605, 0.899]

Diferencias pareadas en exact match

Diferencias de exact match sobre las mismas 26 preguntas, con remuestreo pareado de 14 grupos. El intervalo de densa menos BM25 incluye cero; esta muestra no establece una mejora general.

Resumen de métricas ·
ComparaciónDiferencia mediaIntervalo del 95%
Densa menos BM250.038[0.000, 0.120]
Híbrida menos BM250.000[0.000, 0.000]

Latencia de solicitud y costo de API

Milisegundos por solicitud en la ejecución publicada con Intel Xeon W-3223 y cuatro hilos. Una observación por consulta y método, 26 consultas por método. Carga de modelos, calentamiento e indexación quedan fuera. USD 0 corresponde solo a APIs pagas; electricidad y hardware no se midieron.

Resumen de métricas ·
MétodoP50 (ms)P95 (ms)API (USD)
BM2593.7133.40
Densa105.9138.80
Híbrida105.9144.40

Los tres métodos alcanzan Recall@3 = 1 y conservan el contexto relevante en el prompt, pero ninguno responde correctamente todas las consultas. Dense obtiene un acierto exacto más que BM25: 20/26 frente a 19/26. Su diferencia pareada es 0,038 y el intervalo [0,000, 0,120] incluye cero. Este resultado no establece un ganador general.

Los tres métodos fallan las dos preguntas de abstención: 0/2 por método. Entre las 78 respuestas hay 20 fallos de exact match: 14 con el contexto relevante presente y seis correspondientes a preguntas sin respuesta. Análisis de errores.

Algunos fallos son del scoring: «90 requests per minute» es una respuesta correcta excluida por los alias cortos fijados antes de evaluar. Otros son errores sustantivos, como confundir el código de acceso a una puerta con el código de registro de red. Los alias no se ampliaron después de ver las predicciones. Errores por consulta.

La latencia de solicitud incluye recuperación, preparación del contexto y generación. Carga de modelos, calentamiento y construcción del índice se miden por separado. Hay una observación por consulta y método. Costo de API: USD 0; electricidad y hardware no están cuantificados. Metodología y límites de medición.

Reproducir

La verificación del informe usa únicamente la biblioteca estándar de Python. Reproducir la inferencia requiere instalar las dependencias y descargar explícitamente los dos modelos públicos. No requiere cuentas, APIs pagas ni GPU alquilada.

Con Python 3.11.13, el primer bloque verifica la consistencia de la evidencia registrada. El segundo ejecuta los modelos y debe correrse desde el mismo repositorio. El lock corresponde al entorno medido, Intel macOS; otras plataformas pueden requerir paquetes PyTorch compatibles. Usá directorios de salida nuevos. La descarga requiere internet y varios cientos de MB; luego la inferencia se ejecuta offline. Una nueva ejecución registra su propio entorno, fecha y tiempos.

Verificar el informe guardado sin ejecutar modelos

git clone https://github.com/lucioduran/rag-evaluation-workbench.git
cd rag-evaluation-workbench
git checkout 60246831be5cf68768710e83d7b41614e49a8341
python -m rag_workbench verify --report results/eval/report.json

Repetir la inferencia local en el entorno de referencia

python -m venv .venv
. .venv/bin/activate
python -m pip install -r requirements-local.lock
python -m rag_workbench download
HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 TOKENIZERS_PARALLELISM=false python -m rag_workbench run --split dev --output build/reproduced-dev
HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 TOKENIZERS_PARALLELISM=false python -m rag_workbench run --split eval --output build/reproduced-eval
python -m rag_workbench verify --report build/reproduced-eval/report.json

Alcance y límites

  • Corpus sintético pequeño y sencillo para retrieval. La partición está reservada contra el ajuste de parámetros, pero es conocida por el autor. No es una evaluación ciega externa ni demuestra generalización a producción.
  • Exact match y token F1 comparan formas de texto, no factualidad. Los alias congelados pueden penalizar paráfrasis válidas. El análisis manual no modifica las puntuaciones.
  • El modelo generador pequeño falla en abstención en esta muestra. Un recall perfecto no equivale a un sistema que responde correctamente.
  • Los intervalos provienen de pocos grupos. Un intervalo degenerado no prueba certeza fuera del corpus. Las latencias describen una ejecución local, no una prueba de carga ni un SLA.
  • La verificación offline comprueba consistencia interna. No autentica las mediciones, repite la inferencia neuronal ni recuenta tokens con el tokenizer. Los cambios de hardware o backend pueden alterar tiempos y predicciones.
  • La CLI procesa archivos locales confiables y carga entradas y resultados en memoria. No es un servicio de subida de archivos. Código, corpus y resultados usan MIT; los modelos descargados usan Apache-2.0 y no se redistribuyen en el repositorio.

Fuentes y revisión

Los valores de esta ficha provienen del informe enlazado. No son una medición en vivo. El informe conserva la revisión ejecutada; la revisión consultada incluye la publicación posterior de ese informe.