Backend FastAPI para generar ejercicios de Python orientados a ciencia de datos con:
- generacion por LLM local/remoto
- repair loop con validacion educativa
- ejecucion segura de codigo
- metricas y persistencia de historial
- soporte opcional de RAG
- Fase:
fase_1_5(GET /health) - Endpoint principal:
POST /generate - Repair loop maximo:
3intentos - Modo debug por intento:
POST /generate?debug=true - Tests locales recientes:
69 passed, 1 skipped
Flujo principal:
backend/generator.pygenera respuesta (local model, remoto Anthropic o fallback determinista).backend/parser.pyparsea secciones:## OBJETIVO## DATASET## CODIGO## EXPLICACION
backend/executor.pyejecuta codigo en entorno controlado.backend/validators.pyvalida calidad educativa y coherencia dataset/codigo.backend/repair.pyaplica retries:- parcheo por modelo para texto corto (objetivo/explicacion)
- parcheo determinista para incoherencia de codigo
backend/metrics.pyguarda eventos enlogs/metrics/generations.jsonl.backend/store.pypersiste historial en DB (sqliteopostgres).
- Python 3.11 recomendado
- pip actualizado
- (Opcional) Docker Desktop para stack con Postgres
- (Opcional) GPU CUDA para inferencia local con LoRA
Dependencias base: requirements.txt
Dependencias modelo local: requirements-local-model.txt
py -3.11 -m venv venv311
.\venv311\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -r requirements.txtCopia variables de entorno:
Copy-Item .env.example .envVariables clave:
# Backend generation mode
USE_LOCAL_MODEL=true
USE_REAL_LLM=false
# Local model
MODEL_BASE=codellama/CodeLlama-7b-Instruct-hf
MODEL_PATH=./models/codellama-edugen-v2
MODEL_DEVICE_MAP=auto
LOCAL_MODEL_REQUIRED=false
LOCAL_MODEL_LOCAL_FILES_ONLY=false
# Remote model (Anthropic), solo si USE_REAL_LLM=true
ANTHROPIC_API_KEY=tu_api_key
ANTHROPIC_MODEL=claude-3-5-sonnet-latest
ANTHROPIC_MAX_TOKENS=700
# RAG
RAG_PREFER_CHROMA=false
# Persistence
DATABASE_URL=sqlite:///./data/app.dbModos de ejecucion recomendados:
- Desarrollo barato:
USE_LOCAL_MODEL=false,USE_REAL_LLM=false(fallback determinista). - Local LoRA:
USE_LOCAL_MODEL=true,USE_REAL_LLM=false. - Remoto Anthropic:
USE_LOCAL_MODEL=false,USE_REAL_LLM=true.
.\venv311\Scripts\python -m uvicorn backend.main:app --reloadAPI:
http://127.0.0.1:8000- Swagger:
http://127.0.0.1:8000/docs
GET /healthPOST /generateGET /metricsGET /historyGET /history/{id}
Ejemplo POST /generate:
curl -X POST "http://127.0.0.1:8000/generate" `
-H "Content-Type: application/json" `
-d "{\"tema\":\"pandas_groupby\",\"nivel\":\"principiante\",\"contexto\":\"deportes\",\"tipo\":\"tutorial\",\"use_rag\":false}"Ejemplo debug:
curl -X POST "http://127.0.0.1:8000/generate?debug=true" `
-H "Content-Type: application/json" `
-d "{\"tema\":\"pandas_filtrado\",\"nivel\":\"intermedio\",\"contexto\":\"finanzas\",\"tipo\":\"desafio\",\"use_rag\":false}"debug.attempts incluye por intento:
prompt_sentraw_textsanitized_textvalidation_errorsparse_okexec_okexec_error
Suite completa:
.\venv311\Scripts\python -m pytest -qAlgunos tests importantes:
tests/test_repair_loop.py: repair deterministic-first y patching.tests/test_validators.py: reglas educativas y coherencia dataset/codigo.tests/test_generate_debug.py: trazabilidad de intentos endebug=true.tests/test_executor_dataset_injection.py: inyeccion derowsal ejecutar.tests/test_local_model_smoke.py: smoke opcional del modelo local.
Smoke local model (opcional):
$env:RUN_LOCAL_MODEL_SMOKE="true"
.\venv311\Scripts\python -m pytest -q tests/test_local_model_smoke.pyBenchmark general:
.\venv311\Scripts\python tests\benchmark.py --runs 60 --output tests\benchmark_results.jsonComparativas disponibles:
tests/benchmark_compare_rag.pytests/benchmark_compare_v1_v2.py
Indexado de muestra:
.\venv311\Scripts\python -m backend.rag.indexer --split non_thinking --target-count 500 --min-edu-score 4 --max-per-package 40Construir indice Chroma:
.\venv311\Scripts\python -m backend.rag.indexer --split non_thinking --target-count 500 --min-edu-score 4 --max-per-package 40 --build-chroma --chroma-dir data/chroma --collection-name jupyter_agent_examplesScripts de fine-tuning dataset:
backend/scripts/analyze_for_finetuning.pybackend/scripts/prepare_training_data.pybackend/scripts/validate_training_data.py
Levantar:
docker-compose up -d --build
docker-compose psServicios:
- API:
http://127.0.0.1:8000 - Postgres:
localhost:5432
Compose de comparacion V1 vs V2:
docker compose -f docker-compose.compare.yml up -d --build api_v1 api_v2- DB por defecto:
sqlite:///./data/app.db - Historial: tabla
generation_history - Eventos de metricas:
logs/metrics/generations.jsonl
-
No module named peft:- instala dependencias opcionales:
.\venv311\Scripts\python -m pip install -r requirements-local-model.txt
-
No GPU found. A GPU is needed for quantization.:- usa WSL2/Linux con CUDA para modelo local en 4-bit
- o desactiva local model (
USE_LOCAL_MODEL=false)
-
Requests muy lentos:
- baja
LOCAL_MODEL_MAX_NEW_TOKENS - usa fallback determinista para desarrollo
- valida que no estes en
debug=truepara pruebas de latencia
- baja
-
Conflictos de entorno:
- usa
venv311 - evita mezclar Python 3.13 con dependencias de inferencia local
- usa
backend/
main.py
generator.py
parser.py
executor.py
repair.py
validators.py
metrics.py
db.py
store.py
rag/
data/
docs/
logs/
models/
tests/
La carpeta jupyter-course/ se maneja como repo separado dentro del workspace.
No forma parte del flujo principal de este backend salvo que quieras integrarlo manualmente.