--- description: Perfeziona i chunk di un documento (verifica, dry-run, fix, ri-verifica) e li prepara per la vettorizzazione. allowed-tools: Read Bash Grep argument-hint: --- ## Passo 0 β€” Verifica fresca Esegui sempre `verify_chunks.py` per un report aggiornato: ```bash source .venv/bin/activate && python chunks/verify_chunks.py --stem $ARGUMENTS ``` Leggi il report appena generato: !`python3 -c " import json, sys try: r = json.load(open('chunks/$ARGUMENTS/report.json')) v = r.get('verdict','?') s = r.get('stats', {}) t = r.get('thresholds', {}) print(f'Verdict: {v}') print(f'Totale chunk: {s.get(\"total\",\"?\")} | OK: {s.get(\"ok\",\"?\")}') print(f'Min: {s.get(\"min_chars\",\"?\")} char Max: {s.get(\"max_chars\",\"?\")} char Media: {s.get(\"avg_chars\",\"?\")} char') print(f'Soglie: MIN={t.get(\"min_chars\",200)} MAX={t.get(\"max_chars\",800)}') bl = r.get('blockers', {}) wa = r.get('warnings', {}) for cat, label in [('empty','Vuoti'), ('no_prefix','Senza prefisso'), ('incomplete','Frasi spezzate')]: items = bl.get(cat, []) if items: print(f' πŸ”΄ {label}: {len(items)}') for c in items[:3]: print(f' [{c[\"chunk_id\"]}] {c[\"n_chars\"]} char β†’ {c[\"last_text\"][-60:]!r}') for cat, label in [('too_short','Troppo corti'), ('too_long','Troppo lunghi'), ('incomplete_math','Math incompleto')]: items = wa.get(cat, []) if items: print(f' 🟑 {label}: {len(items)}') for c in items[:3]: print(f' [{c[\"chunk_id\"]}] {c[\"n_chars\"]} char') except Exception as e: print(f'ERRORE lettura report: {e}') " 2>/dev/null` --- ## Se verdict == "ok" βœ… Nessun problema bloccante. Comunica: ``` βœ… Chunk pronti β€” procedi con la vettorizzazione: python ingestion/ingest.py --stem $ARGUMENTS ``` Se ci sono solo 🟑, spiega brevemente i warning e chiedi se l'utente vuole risolverli prima o procedere. --- ## Se verdict == "warnings_only" o "blocked" ### Passo 1 β€” Dry-run ```bash source .venv/bin/activate && python chunks/fix_chunks.py --stem $ARGUMENTS --dry-run ``` Spiega in italiano ogni operazione pianificata: - **rimuovi chunk vuoti** β€” privi di testo, non contribuiscono al retrieval - **aggiungi prefisso** β€” `[sezione > titolo]` fornisce contesto all'embedding; senza, il chunk Γ¨ decontestualizzato - **fondi incompleti** β€” frase spezzata a metΓ : il chunk corrente e il successivo formano una frase unica - **fondi troppo corti** β€” sotto MIN_CHARS: troppo brevi per portare informazione semantica utile - **spezza troppo lunghi** β€” sopra MAX_CHARSΓ—1.5: troppo densi, degradano la precision del retrieval Se ci sono solo 🟑 (nessun πŸ”΄), informa che si puΓ² procedere anche senza fix e chiedi la preferenza. ### Passo 2 β€” Conferma Chiedi: **"Applico le correzioni?"** Applica solo su risposta affermativa esplicita. ### Passo 3 β€” Applica ```bash source .venv/bin/activate && python chunks/fix_chunks.py --stem $ARGUMENTS ``` ### Passo 4 β€” Ri-verifica automatica ```bash source .venv/bin/activate && python chunks/verify_chunks.py --stem $ARGUMENTS ``` Leggi il nuovo `chunks/$ARGUMENTS/report.json` e riporta: - Nuovo verdict - Delta chunk (N prima β†’ N dopo) - Problemi residui se presenti ### Passo 5 β€” Conclusione Se verdict finale Γ¨ `ok` o `warnings_only` senza πŸ”΄: ``` βœ… Chunk pronti in chunks/$ARGUMENTS/chunks.json Procedi con la vettorizzazione: python ingestion/ingest.py --stem $ARGUMENTS ``` Se rimangono πŸ”΄ dopo il fix (testo non spezzabile o struttura anomala nel sorgente): ``` πŸ”΄ X problemi residui non risolvibili automaticamente. Torna a conversione/$ARGUMENTS/clean.md e correggi manualmente le sezioni indicate, poi riesegui nell'ordine: python chunks/chunker.py --stem $ARGUMENTS --force python chunks/verify_chunks.py --stem $ARGUMENTS ```