morphos / Makefile
Jose Salazar
Implementacion de AI judge para evals y actualizacion de readme
1e215c9
Raw
History Blame Contribute Delete
5.36 kB
# Morphos — tareas de desarrollo y despliegue
.PHONY: help frontend-install frontend-test frontend-build backend-sync backend-test \
ingest dev lint evals evals-test ragas revision retrieval-eval docker-build \
publish-index fetch-index publish-books
# Los repos del Hub se declaran en scripts/hub.py (y deben coincidir con rag_index_repo /
# rag_books_repo en backend/app/config.py).
help:
@echo "Objetivos disponibles:"
@echo " frontend-install Instala dependencias del frontend (npm)"
@echo " frontend-test Ejecuta la suite de regresión del motor (vitest)"
@echo " frontend-build Compila el frontend a dist/"
@echo " backend-sync Sincroniza dependencias del backend (uv)"
@echo " backend-test Ejecuta pytest del backend"
@echo " ingest Construye el índice RAG desde books/ (grupo rag, local)"
@echo " publish-index Sube instance/rag_index al dataset privado del Hub"
@echo " fetch-index Descarga el índice del Hub a instance/rag_index"
@echo " publish-books Sube books/*.pdf al dataset privado (sólo para reingerir)"
@echo " evals Suite de evaluación clínica (split dev, casos validados)"
@echo " evals-test Igual sobre el split reservado (sólo antes de desplegar)"
@echo " ragas Groundedness RAG con juez local gratuito (ARGS=--modelo …)"
@echo " revision Hoja de revisión veterinaria de los casos pendientes"
@echo " dev Levanta el backend FastAPI en local"
@echo " lint Ruff (backend) + eslint (frontend)"
@echo " docker-build Construye la imagen de despliegue"
frontend-install:
cd frontend && npm install
frontend-test:
cd frontend && npm test
frontend-build:
cd frontend && npm run build
backend-sync:
cd backend && uv sync
backend-test:
cd backend && uv run pytest -q
# Requiere el grupo pesado 'rag'. Coloca los PDFs con licencia en books/ primero.
ingest:
cd backend && uv sync --group rag && uv run --group rag python -m app.rag.ingest --fuente ../books --salida ../instance/rag_index
# --- Distribución del índice y del corpus (Hub privado) -----------------------------------
#
# El índice es un artefacto derivado de libros con licencia: contiene su texto troceado, así que
# se publica SIEMPRE en un repo privado (--private) y nunca se comitea (instance/ está en
# .gitignore). Los libros viven en su propio repo privado y sólo hacen falta para reingerir.
publish-index:
cd backend && uv run --group rag python ../scripts/hub.py publish-index
fetch-index:
cd backend && uv run --group rag python ../scripts/hub.py fetch-index
# Los PDFs no entran nunca en git ni en la imagen; este repo privado es sólo su respaldo y la
# fuente para reingerir.
publish-books:
cd backend && uv run --group rag python ../scripts/hub.py publish-books
# NOTA: la ingesta en infra HF con GPU (`hf jobs uv run`) queda pendiente. Requiere que el
# paquete `app` esté disponible en el runner (publicar el backend como paquete o construir una
# imagen con las dependencias del grupo rag); no es un one-liner. Como reingerir sólo hace falta
# cuando cambia el corpus (dos veces al año), `make ingest` en local cubre el caso hoy.
# Los objetivos de evals se ejecutan DESDE backend/: es donde vive el proyecto uv, y sólo ahí
# `--group` instala algo (fuera de un proyecto uv lo ignora con un warning y las evals corren
# sin ragas ni langchain).
#
# Puerta por defecto: split de iteración (dev) y sólo casos con validación veterinaria.
evals:
cd backend && uv run python ../evals/run_evals.py --simular
# Split reservado. Se mira en agregado antes de desplegar, NO para afinar prompts.
evals-test:
cd backend && uv run python ../evals/run_evals.py --simular --split test
# Eval de recuperación RAG (A/B de embeddings × idioma de consulta). Requiere índice
# construido para la config activa (MORPHOS_RAG_EMBED_MODEL / MORPHOS_RAG_QUERY_LANG).
retrieval-eval:
cd backend && uv run --group rag python ../evals/run_retrieval_eval.py
# Groundedness con Ragas (faithfulness / context precision-recall). Juez local gratuito;
# necesita el índice RAG y un archivo de predicciones reales (o --modelo).
ragas:
cd backend && uv run --group rag --group evals python ../evals/run_ragas.py $(ARGS)
# Hoja de revisión veterinaria de los casos aún no validados del dataset dorado.
revision:
cd backend && uv run python ../evals/revision.py
dev:
cd backend && uv run uvicorn app.main:app --reload --port 8000
# Cubre backend (app + tests) y scripts/. evals/ y bridge/ quedan fuera a propósito: aún no
# están saneados bajo estas reglas y meterlos ahora dejaría el lint en rojo permanente.
lint:
cd backend && uv run ruff check . ../scripts
cd frontend && npm run lint
# Si instance/rag_index existe en local, se hornea directamente. Si no (clon limpio o CI), la
# build lo descarga del dataset privado: exporta HF_TOKEN y se pasa como secreto de build (no
# como --build-arg, que quedaría grabado en el historial de capas de la imagen).
docker-build:
@if [ -n "$$HF_TOKEN" ]; then \
printf '%s' "$$HF_TOKEN" | docker build --secret id=hf_token,src=/dev/stdin -t morphos:latest . ; \
else \
echo "AVISO: HF_TOKEN no definido; la build sólo tendrá RAG si instance/rag_index existe en local."; \
docker build -t morphos:latest . ; \
fi