instalado.py lee los .desktop y los paquetes para saber que hay en el equipo y para que sirve cada cosa. indexa.py lo engancha, y con el los docs markdown de las herramientas clonadas en CODERS. Las dos fuentes son personales: se quedan en el indice de la maquina y no entran en el publico. busca_cli.py expone el mismo motor que usa el cerebro (saber.busca) para consultar el indice desde la terminal, con --n y --json. reentrena_noche.sh encadena las fases del reentrenamiento largo y las deja corriendo horas; cada fase es reanudable por su cuenta. eval del indice vivo: hit@1 43/57 (75%), hit@5 55/57 (96%), sim 0.909.
71 lines
2.7 KiB
Bash
Executable file
71 lines
2.7 KiB
Bash
Executable file
#!/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 ==="
|