#!/usr/bin/env bash # Reentrenamiento nocturno AMPLIADO del RAG. Encadena las fases y las deja # corriendo horas, sin tocar gitea. Cada fase es reanudable por su cuenta. # # ./reentrena_noche.sh # # Fases: # 1. Espera a que termine cualquier reindex en curso. # 2. Sintesis FRESCA de todo el contenido nuevo (conocimiento + catalogo + # apps instaladas + docs de strix) -> preguntas-gancho. # 3. Reindex personal con los ganchos horneados. # 4. Evaluacion hit@k (numeros). # 5. Refresco de COFRE: cosecha + sintesis de los apuntes. # 6. Reindex final + evaluacion. # # Todo el ruido va al log; a la salida estandar solo hitos con hora. set -uo pipefail AQUI=$(cd -P "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd) NUCLEO=$(cd "$AQUI/../.." && pwd) PY="$NUCLEO/venv/bin/python" [ -x "$PY" ] || PY=python3 DATOS="$NUCLEO/datos" LOG="${1:-$DATOS/reentrena_noche.log}" hora() { date +%H:%M:%S; } hito() { echo "[$(hora)] $*" | tee -a "$LOG"; } cd "$NUCLEO" hito "=== ARRANCA reentrenamiento nocturno ampliado ===" # --- Fase 1: no competir con un reindex en curso --- while pgrep -f "saber.indexa" | grep -qv $$ 2>/dev/null; do sleep 20 done hito "fase 1 ok: no hay reindex compitiendo" # --- Fase 2: sintesis fresca del contenido nuevo --- hito "fase 2: sintesis del catalogo+nuevo (fresca, puede tardar 1-2 h)" rm -f "$DATOS/sintesis-catalogo.jsonl" "$DATOS/sintesis-catalogo.jsonl.hecho" "$PY" -m saber.enriquece.sintetiza_catalogo >>"$LOG" 2>&1 hito "fase 2 ok: $(wc -l < "$DATOS/sintesis-catalogo.jsonl" 2>/dev/null) preguntas-gancho nuevas" # --- Fase 3: reindex con los ganchos --- hito "fase 3: reindex personal con ganchos" "$PY" -m saber.indexa >>"$LOG" 2>&1 hito "fase 3 ok: indice reconstruido" # --- Fase 4: evaluacion --- hito "fase 4: evaluacion hit@k" "$PY" -m saber.enriquece.evalua "$DATOS/saber.jsonl" "$DATOS/saber.jsonl" 2>>"$LOG" \ | grep -iE "hit@|sim" | head -3 | tee -a "$LOG" # --- Fase 5: refresco de COFRE (cosecha + sintesis) --- if [ "${SIN_COFRE:-0}" = "1" ]; then hito "fase 5: OMITIDA (SIN_COFRE=1, el refresco de COFRE ya se hizo)" else hito "fase 5: refresco de COFRE (cosecha + sintesis, largo)" "$PY" -m saber.enriquece.cosecha >>"$LOG" 2>&1 && hito " cosecha ok" || hito " cosecha fallo (sigo)" rm -f "$DATOS/sintesis.jsonl.hecho" "$PY" -m saber.enriquece.sintetiza >>"$LOG" 2>&1 && hito " sintesis COFRE ok" || hito " sintesis COFRE fallo (sigo)" fi # --- Fase 6: reindex final + evaluacion --- hito "fase 6: reindex final" "$PY" -m saber.indexa >>"$LOG" 2>&1 hito "fase 6: evaluacion final" "$PY" -m saber.enriquece.evalua "$DATOS/saber.jsonl" "$DATOS/saber.jsonl" 2>>"$LOG" \ | grep -iE "hit@|sim" | head -3 | tee -a "$LOG" hito "=== FIN del reentrenamiento nocturno ==="