Proyecto del módulo — NebulaOps Knowledge Assistant
Construye un asistente RAG evaluado sobre la documentación ficticia de NebulaOps. El repositorio incluye una API baseline completa y sin red: no es el resultado final, sino el control contra el que debes justificar embed
Construye un asistente RAG evaluado sobre la documentación ficticia de NebulaOps. El repositorio incluye una API baseline completa y sin red: no es el resultado final, sino el control contra el que debes justificar embeddings, reranking y generación.
Resultado esperado#
El usuario hace una pregunta, recibe una respuesta breve con citas y puede abrir exactamente los fragmentos usados. Si la evidencia no basta, el sistema se abstiene. Un panel de evaluación compara configuraciones con el dataset congelado sin mezclar casos de desarrollo y test.
flowchart LR
UI[Next.js / interfaz] --> API[FastAPI]
API --> R[Retriever]
R --> IDX[(índice versionado)]
API --> G[Generador grounded]
R --> G
API --> T[trazas y feedback]
E[runner de evaluación] --> API
E --> A[artefacto por caso]
Baseline incluido#
Desde la raíz:
uv sync --extra rag --extra dev
uv run uvicorn app.main:app --app-dir modulo-03-rag/proyecto/backend --reload
En otra terminal:
curl -s http://127.0.0.1:8000/health
curl -s -X POST http://127.0.0.1:8000/query \
-H 'content-type: application/json' \
-d '{"question":"¿Cuánto dura un enlace de recuperación?","top_k":4}'
El baseline carga labs/data/*.md, divide por secciones, usa TF-IDF, selecciona frases y devuelve
IDs de evidencia. No llama a ningún LLM. Sus limitaciones son deliberadas y medibles.
Iteraciones obligatorias#
- Ingesta: manifest con hashes, parser y chunker versionados; alta, cambio y baja.
- Retrieval: embeddings más lexical con RRF; evaluación por documento y por chunk.
- Reranking: candidatos amplios y contexto final pequeño; latencia y batch medidos.
- Generación: prompt grounded, citas por afirmación y abstención explícita.
- Interfaz: pregunta, respuesta, fuentes desplegables, latencia y feedback; no ocultes errores.
- Evaluación: runner offline en CI y evaluación RAGAS autorizada con límite de coste.
- Operación: health/readiness, logs sin contenido sensible, timeout y presupuesto.
Contrato de API#
POST /query acepta:
{"question": "texto no vacío", "top_k": 4}
Devuelve answer, abstained, evidence[] y latency_ms. Cada evidencia contiene chunk_id,
document_id, título, extracto y score. No cambies el contrato al sustituir el baseline: así los
tests y el comparador siguen siendo válidos.
Criterios de aceptación#
Sobre los 30 casos incluidos, manteniendo los cinco no respondibles:
- doc recall@4 ≥ 0,90 y MRR@4 ≥ 0,85;
- context recall y faithfulness medias ≥ 0,75 en la corrida RAGAS final;
- abstención correcta en ≥ 80 % de preguntas no respondibles;
- ninguna afirmación sin cita en la auditoría manual de 20 respuestas;
- latencia p95 local y coste estimado por 1.000 consultas documentados;
pytestoffline y reproducible, sin depender de claves;- threat model para prompt injection, exfiltración, poisoning y control de acceso.
Un score medio no compensa un fallo crítico. Presenta métricas por tag y cinco failure cases con su causa raíz.
Estructura#
proyecto/
├── README.md
└── backend/
├── app/
│ ├── __init__.py
│ ├── main.py
│ ├── rag.py
│ └── schemas.py
└── tests/
└── test_api.py
La interfaz y el índice persistente forman parte de la entrega del alumno. Mantén la API baseline como comparación y añade las implementaciones mediante configuración, no editando resultados.
Evidencia de entrega#
Incluye comando exacto, commit, manifest del corpus, modelos/versiones, configuración, hardware, dataset hash, resultados JSON y fecha. La demo debe mostrar una respuesta correcta, una abstención, una inyección contenida y un fallo conocido; ocultar el fallo hace la defensa menos creíble.