Commit Graph

108 Commits

Author SHA1 Message Date
davide e9cc85803c docs: aggiorna README con guida parametri, tabelle modelli e licenza MIT
Espande l'abstract, rimuove il diagramma ASCII in favore di testo
discorsivo, aggiunge tabelle di modelli embedding e LLM con link al
catalogo Ollama, guida alla scelta dei parametri per chunking/ingest/RAG.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 10:25:26 +02:00
davide 9e0e1a131e docs: aggiorna CLAUDE.md per riflettere la struttura attuale del repo
Allinea comandi, architettura e schema chunk alla struttura reale:
percorsi rag/, gui/, ingestion/ corretti; pipeline chunking documentata
nei 5 moduli; config split ingestion/rag; sezione GUI aggiunta.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 10:24:51 +02:00
davide 9261e480da docs: riscrive README con abstract esteso, guida parametri e licenza MIT
Espande l'abstract con motivazione personale e contesto d'uso (manuali
tecnici di ingegneria). Aggiunge guida pratica alla scelta dei parametri
per chunking, embedding e RAG con tabelle di modelli Ollama e link al
catalogo. Aggiunge file LICENSE MIT e relativo link nel README.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 10:18:46 +02:00
davide b4e64ccedb docs: riscrive README con struttura passo-passo
Abstract, requisiti minimi, setup venv, MinerU (Colab + locale),
chunking, ingest, interrogazione (terminale + GUI) con tabelle
parametri per ogni config.py.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 10:04:38 +02:00
davide ba8035887c chore: rimuove emoji da codice e output terminale
Sostituisce tutti i simboli grafici con testo:
- checkmark/cross -> OK / ERRORE: / AVVISO:
- icone tema GUI -> testo Chiaro / Scuro

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 09:57:24 +02:00
davide 91d20da120 chore(deps): aggiunge PySide6>=6.6
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 09:50:01 +02:00
davide f947131f16 feat(gui): aggiunge interfaccia desktop PySide6 con tema light/dark
- chat con Markdown e formule KaTeX (via QWebEngineView + CDN)
- top bar con selezione collezione ChromaDB e bottone ☀️/🌙
- input multiriga con Enter per inviare e Shift+Enter per andare a capo
- animazione thinking durante la generazione
- fonti dei chunk mostrate sotto ogni risposta

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 09:50:37 +02:00
davide 619e110cd5 chore: rimuove skill prepare-md obsoleta
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 09:20:19 +02:00
davide 42d229092f refactor: sposta rag.py, retrieve.py, config.py in cartella rag/
- rag/config.py, rag/rag.py, rag/retrieve.py (spostati da radice)
- rag/__init__.py aggiunto per import come package
- path aggiornati: project_root = Path(__file__).parent.parent
- ollama/check_env.py: import da ingestion.config e rag.config
- ollama/test_ollama.py: import da rag.config

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 09:17:45 +02:00
davide 295fb3faa6 refactor: separa config embedding in ingestion/config.py
- ingestion/config.py (nuovo): EMBED_MODEL, EMBED_MAX_CHARS, OLLAMA_URL
- config.py radice: rimossi EMBED_MODEL e EMBED_MAX_CHARS — resta solo la config RAG
- ingest.py: importa da ingestion.config
- rag.py, retrieve.py: importano EMBED_MODEL da ingestion.config

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 09:14:58 +02:00
davide 2939d2f8ca feat(rag): adatta pipeline allo schema chunks AST-based + ottimizza system prompt
config.py:
- EMBED_MODEL: qwen3-embedding:0.6b → bge-m3 (multilingua, migliore su testi accademici)
- SYSTEM_PROMPT: lingua esplicita, anti-allucinazione rafforzata, citazione strutturata
  con percorso sezione, passaggi numerati per spiegazioni, fallback al plurale

ingestion/ingest.py:
- embed su content_for_embedding (prefisso header contestuale)
- store content_original in ChromaDB (testo pulito per retrieval)
- metadata aggiornati: header_path, chunk_index, content_type, flags, start/end_line

rag.py, retrieve.py:
- sostituisce sezione/titolo (schema vecchio) con header_path (schema AST)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 09:10:35 +02:00
davide 89d77d35d6 feat(chunks): pipeline AST-based completa — parser → segmenter → packer → validator
Riscrittura completa del chunker con architettura modulare basata su markdown-it-py.

Moduli:
- parser.py     — markdown-it-py + dollarmath plugin → token stream con source map
- segmenter.py  — token stream → Block[] (paragraph, code, table, list, math, html, thematic_break)
- packer.py     — Block[] → Chunk[] con packing min/target/max e content_for_embedding
- validator.py  — invarianti + metriche (size_compliance, overflow, sparse)
- chunker.py    — CLI + orchestrazione pipeline, scrive chunks.json/meta.json/report.json

Flag universali: has_math rileva math_block, $$ e \begin{; has_table rileva pipe table e <table> HTML.
65 test passing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 08:43:19 +02:00
davide 2e02ae9914 chore: rimuove docs/superpowers — documentazione temporanea di sviluppo
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 08:42:28 +02:00
davide 3b61df73d3 feat(chunks): rilevamento universale has_math/has_table + dollarmath plugin
- parser.py: integra dollarmath_plugin (graceful fallback) — blocchi $$…$$ → token math_block atomico
- segmenter.py: gestisce math_block → Block(kind=math, atomic=True, plain_text=[formula])
- packer.py: has_table rileva anche <table> in blocchi html; has_math rileva $$ e \begin{ nel contenuto
- +11 test (parser×3, segmenter×3, packer×5) — totale 65 test

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 08:40:41 +02:00
davide 1980efb0d6 feat(chunks): aggiunge chunker.py — CLI + orchestrazione pipeline AST-based
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 08:21:54 +02:00
davide ed42e1ba7b feat(chunks): aggiunge validator.py — invarianti + metriche
Implementa validate() che controlla chunk_id duplicati, fence rotti,
size compliance (esclusi overflow) e calcola metriche aggregate.
Fix fixture cfg: min_chars=40 per allinearla ai chunk da 50 chars nel test.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 08:02:35 +02:00
davide d2b8baa844 feat(chunks): aggiunge packer.py — Block[] → Chunk[] con packing min/target/max
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 16:29:24 +02:00
davide 2d2d478a3f feat(chunks): aggiunge segmenter.py — token stream → Block[]
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 16:25:49 +02:00
davide 63ca7121b2 feat(chunks): aggiunge parser.py con markdown-it-py
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 16:22:58 +02:00
davide bca01dc1c6 feat(chunks): aggiunge ChunkerConfig dataclass
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 16:20:59 +02:00
davide be1347378b feat(chunks): aggiunge models.py con Block, Chunk, Diagnostics, ChunkingResult
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 16:20:30 +02:00
davide be8ae9f6b8 chore: rimuove chunker legacy, aggiunge dipendenze AST-based pipeline
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 16:16:07 +02:00
davide b321a51c5c docs: spec design chunker Phase 1 (AST-based pipeline)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 15:59:59 +02:00
davide ab52d26b99 feat(notebook): download ZIP per tutti gli stem in output/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 15:44:26 +02:00
davide 019a484854 chore: cambia modello embedding da nomic-embed-text a qwen3-embedding:0.6b
Migliore supporto multilingue e coerenza semantica con qwen3.5:4b.
Aggiornati config.py, README.md, ingestion/README.md, ollama/README.md.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 15:54:43 +02:00
davide cdda929537 feat(notebook): aggiunge sezione chunking post-MinerU
Clone del repo RAG, cella config modificabile che sovrascrive
chunks/config.py, esecuzione chunker.py e download automatico
di chunks.json.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:44:56 +02:00
davide 3445226584 chore: rimuove commento ridondante nell'header di config.py
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:40:13 +02:00
davide 450c6d5784 docs: aggiorna CLAUDE.md e README secondari per rispecchiare architettura attuale
Rimuove riferimenti a Stage 1/Stage 2, md_optimizer.py, fix_chunks.py,
--skip-optimize, _clean.md e _content_list_v2.json (tutti obsoleti).
Aggiorna pipeline diagram, comandi, tabella architettura e input MinerU.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:39:12 +02:00
davide 70eed10cb6 fix(config): system prompt più preciso e ancorato al contesto
Rimosso "interpreta liberamente" che incoraggiava allucinazioni.
Aggiunto vincolo esplicito "esclusivamente sul contesto fornito"
e istruzione a citare la sezione di riferimento.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:33:48 +02:00
davide 98a8eaa9fb docs/fix: aggiorna README e fix ingest per embedding robusto
README riscritto per rispecchiare la pipeline attuale:
- rimossi riferimenti a Stage 1, md_optimizer, fix_chunks
- pipeline semplificata: MinerU .md → chunker → ingest → rag
- tabelle parametri aggiornate (SKIP_HEADINGS, SKIP_PRE_HEADING,
  MERGE_SHORT_PARAGRAPHS, EMBED_MAX_CHARS al posto dei vecchi)
- struttura repo corretta

ingest.py: strip tag HTML ed entità prima dell'embedding per evitare
HTTP 500 da Ollama su chunk con tabelle HTML grezze; aggiunto
EMBED_MAX_CHARS (default 6000) in config.py.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:29:06 +02:00
davide c93e2e8494 fix(verify): PUNCT_END generico e frasi spezzate come warning
PUNCT_END esteso con terminatori comuni in documenti tecnici:
- $ e } per formule LaTeX inline e blocchi
- > per tag HTML (</table>, </td>, ecc.)
- \\ per line break LaTeX
- · (punto centrato, U+00B7) per notazione matematica
Caratteri unicode scritti con chr() per evitare SyntaxError Python 3.12+
con curly quotes nel sorgente.

Frasi spezzate spostate da blockers a warnings: il chunker le risolve
automaticamente con merge_broken_sentences; i casi residui sono
perlopiù falsi positivi (frontespizi, entità proprie senza punto finale).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:18:27 +02:00
davide f0c6bad046 feat(chunker): riscrittura completa per input MD pulito
Input: sources/<stem>_output/auto/<stem>.md (fallback: sources/<stem>.md)
Output: chunks/<stem>/chunks.json + meta.json

Regole implementate:
- 1 paragrafo = 1 chunk; paragrafi di contesti diversi non si mescolano
- split a confine di frase se paragrafo > MAX_CHARS (mai a metà frase)
- merge_short(): paragrafi < MIN_CHARS fusi col successivo (stesso contesto)
- merge_broken_sentences(): chunk consecutivi con frase spezzata vengono
  uniti automaticamente se stesso contesto e corpo senza punteggiatura finale
- parse_paragraphs(): skip sezioni via SKIP_HEADINGS (prefisso case-insensitive)
  e skip contenuto pre-heading via SKIP_PRE_HEADING
- blocchi atomici: tabelle, liste, code block non vengono mai spezzati
- nessun overlap tra chunk

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:18:17 +02:00
davide ce4c3e5c87 refactor(chunks): rimuove Stage 1 e riscrive config per MD pulito
Eliminati md_optimizer.py e fix_chunks.py: la pipeline non parte più
da _content_list_v2.json ma da un .md già pulito in sources/.

config.py ridotto da 114 a 64 righe: rimossi tutti i parametri MinerU
(NOISE_TYPES, FRONTMATTER_HEADINGS, MODEL_SKIP_LABELS, ecc.) e aggiunti
i parametri effettivamente utili al chunking: SKIP_HEADINGS,
SKIP_PRE_HEADING, MERGE_SHORT_PARAGRAPHS, ATOMIC_TYPES, CONTEXT_DEPTH.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:18:44 +02:00
davide aabe4d168c feat(notebook): sostituisce visualizzazione layout con download ZIP output MinerU
La cella finale ora crea uno ZIP della cartella di output (auto o hybrid_auto)
e lo scarica automaticamente su Colab, pronto per essere decompresso in sources/.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 12:14:48 +02:00
davide e88043baee docs: aggiunge notebook MinerU per Colab e configurazione rapida nel README
- Passo 1 ora presenta opzione Colab (mineru.ipynb) e installazione locale
- Notebook adattato per uso reale: variabile PDF_NAME, path dinamico, gestione pagine
- Nuova sezione "Configurazione rapida" con parametri chunking e RAG

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 11:45:13 +02:00
davide f76184340e chore: rimuove comando /post-chunk obsoleto
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 16:23:03 +02:00
davide 98653464dd docs: README dettagliato MinerU + CLAUDE.md aggiornato per pipeline Stage 1+2
README.md: sezione MinerU espansa con requisiti di sistema, installazione
(pip/conda/Docker), CLI completo con tutti i flag, tabella comparativa
backend (pipeline/hybrid-auto-engine/vlm-auto-engine), configurazione
avanzata, struttura output e limitazioni note.

CLAUDE.md: aggiornato diagramma pipeline, input RICHIESTO/RACCOMANDATO,
comandi con --force e --skip-optimize, architettura chunker/md_optimizer.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 16:08:00 +02:00
davide 156b1ebba4 feat(verify): nuovi check, istogramma ASCII e sezioni per documento
Nuovi check bloccanti:
  - prefisso malformato ([ senza ] o contenuto vuoto)
  - corpo vuoto dopo prefisso valido

Nuovi warning:
  - tabelle Markdown senza riga separatore |---|
  - chunk con corpo identico (duplicati da overlap/merge)

Output migliorato:
  - istogramma ASCII con marcatori ← MIN / ← MAX
  - top 5 sezioni per volume di chunk
  - mediana (p50) nelle statistiche di lunghezza

report.json arricchito: p50_chars, sections, malformed_prefix,
body_empty, broken_tables, duplicate_bodies.

PUNCT_END esteso con \d[\d.,/]*$ per numeri, anni, riferimenti normativi.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 16:07:51 +02:00
davide e96c510e1f feat(chunks): pipeline unificata Stage 1+2 con md_optimizer
chunker.py ora esegue in sequenza:
  - Stage 1 (md_optimizer.py): _content_list_v2.json + _model.json → _clean.md
    con pulizia TOC, frontespizio, sommari interni, merge titoli capitolo
  - Stage 2: _clean.md → chunks.json (paragraph-overlap, atomici tabelle/liste)

config.py esteso con CHAPTER_PREFIX_PATTERNS, SOMMARIO_PATTERNS,
MODEL_SKIP_LABELS, MODEL_ABSTRACT_LABELS, MIN_CONTENT_CHARS.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 16:07:40 +02:00
davide 52e881d09c refactor: rimuove pipeline conversione PDF→MD, delegata a MinerU
Elimina conversione/ (9 stadi PyMuPDF) e tests/ (tutti unit/integration).
Il repository gestisce ora solo: pulizia MD, chunking, vettorizzazione e RAG.
Aggiorna CLAUDE.md e .gitignore per il nuovo flusso MinerU-first.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 14:21:16 +02:00
davide c546ad9674 docs(claude-md): riscrittura con modalità collaborativa e architettura compatta
Aggiunge sezione comportamento: Claude espone approccio e problemi concettuali
prima di toccare il codice. Ristruttura architettura in tabelle, completa i
comandi con chunking/ingestion/retrieve, rimuove note sulla pipeline deprecata.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 14:04:12 +02:00
davide 6d7170d18b fix(verify): riconosce URL www. come terminatori validi + doc multi-documento
- _URL_TAIL ora matcha anche www.* (non solo https://) — evita falsi blockers
  su watermark tipo www.docsity.com
- README: documenta --collection / --stems per ingestion, retrieve e rag

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 11:21:24 +02:00
davide 606fad9e09 feat(ingestion): supporto multi-documento in unica collection ChromaDB
Aggiunge la possibilità di unire più documenti in una singola collection
ChromaDB, con chunk_id prefissati per stem e metadato source per filtrare.

- ingest.py: --stems doc1 doc2 --collection nome (nuovo), --stem (invariato)
- rag.py / retrieve.py: --collection, source nei chunk, verbose mostra [source]

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 11:21:17 +02:00
davide b630316936 feat(chunks): ottimizzazione chunking e post-processing
- chunker.py: scrive meta.json con strategia e soglie effettive (target,
  min_chars, max_chars) per ogni documento chunked

- verify_chunks.py:
  * _load_thresholds(): legge min/max da meta.json invece del TARGET_CHARS
    globale, eliminando il mismatch tra soglie chunker e verify
    (h3_aware target=600 -> range 450-750, non piu' validato a 225-375)
  * _ROMAN_END: esclude numeri romani finali (XV, XIV...) dagli incompleti
    perche' sono artefatti indice PDF, non frasi spezzate
  * PUNCT_END: aggiunge ; come fine valida (clausole legali italiane)

- fix_chunks.py:
  * _load_thresholds(): usa max_chars da meta.json per split coerente
  * _SECONDARY_END: split secondario su ; per testo legale multi-clausola
  * Fase 1 (convergenza): risolve solo blockers (incomplete, empty,
    no_prefix) senza toccare warnings -- elimina il ciclo
    merge->too_long->split->incomplete->merge
  * Fase 2 (finale): una sola passata di merge too_short + split too_long
    dopo che i blockers sono azzerati

Risultato su dirittopenale: da blocked (265 incomplete) a warnings_only
in 2 iterazioni, senza cicli infiniti.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 11:09:28 +02:00
davide 0cf3c0564b docs(conversione): aggiorna README — comandi, output e log di esecuzione
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 10:43:17 +02:00
davide 135036c53d docs(readme): aggiunge sezioni configurazione modelli, test ollama, retrieval e RAG
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 10:39:27 +02:00
davide d947e04152 chore(config): tuning RAG — modello 4b, temperatura 0.2, chunk target 300
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 10:37:39 +02:00
davide 8831e3c047 fix(ingestion): correggi path chunks da step-6/ a chunks/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 10:37:35 +02:00
davide e3e259965e docs: aggiorna README con flusso ingestion completo
- README.md: aggiunge step 7 (ingestion) con verifica ambiente,
  comandi base e --force; aggiorna pipeline header e riferimenti
- ingestion/README.md: rinomina da "Step 8" a "Ingestion",
  aggiorna riferimenti da step-6 a chunks/, aggiunge sezione
  "Verifica ambiente", corregge comandi con .venv/bin/python

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 16:05:23 +02:00
davide 2c180fc9b6 refactor: rinomina step-8 → ingestion
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 15:58:54 +02:00