2026-05-11 14:44:16 +02:00
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
---
2026-04-13 08:02:48 +02:00
2026-05-20 14:04:12 +02:00
## Lingua e comportamento
2026-04-13 08:02:48 +02:00
2026-04-15 11:38:45 +02:00
- **Lingua:** Rispondi sempre in italiano.
2026-05-20 14:04:12 +02:00
- **Prima di eseguire qualsiasi istruzione**, esponi:
2026-05-20 14:21:16 +02:00
1. Come intendi procedere (approccio, file coinvolti).
2026-05-20 14:04:12 +02:00
2. Se l'istruzione ha problemi concettuali — e perché — con una proposta alternativa.
3. Aspetta conferma o correzione prima di toccare il codice, salvo che l'istruzione sia banale (rinomina, formattazione).
2026-05-11 14:44:16 +02:00
---
2026-05-20 14:04:12 +02:00
## Missione
2026-05-20 14:21:16 +02:00
Pipeline RAG su documenti accademici. La conversione PDF → Markdown è delegata a **MinerU ** (tool esterno). Questo repository si occupa solo di: pulizia Markdown, chunking, vettorizzazione e retrieval/generazione.
2026-05-11 14:44:16 +02:00
```
2026-05-20 16:08:00 +02:00
MinerU (esterno) → sources/<stem>/auto/
2026-05-20 14:21:16 +02:00
↓
2026-05-20 16:08:00 +02:00
chunker.py (Stage 1: _clean.md + Stage 2: chunks.json)
2026-05-20 14:21:16 +02:00
↓
ingest.py (embedding → ChromaDB)
↓
rag.py / retrieve.py
2026-05-20 14:04:12 +02:00
```
---
## Regole invarianti
2026-05-11 14:44:16 +02:00
2026-05-20 14:04:12 +02:00
- **Venv:** Usa `.venv/bin/python` . Mai `pip` /`python` di sistema.
2026-05-20 14:21:16 +02:00
- **Niente LLM nella pipeline:** chunking e pulizia devono essere rule-based e riproducibili.
2026-05-20 16:08:00 +02:00
- **Input immutabile:** Non modificare mai i file originali in `sources/<stem>/auto/` . Il `chunker.py` scrive solo `_clean.md` (prodotto derivato) nella stessa cartella e `chunks.json` in `chunks/<stem>/` .
2026-05-20 14:21:16 +02:00
---
## Input — struttura MinerU
MinerU produce una cartella per ogni documento. Posizionarla in `sources/` :
```
2026-05-20 16:08:00 +02:00
sources/<stem>/auto/<stem>_content_list_v2.json ← struttura ricca (tipo, livello, bbox) [RICHIESTO]
sources/<stem>/auto/<stem>_model.json ← label di layout (doc_title, abstract…) [RACCOMANDATO]
sources/<stem>/auto/<stem>.md ← Markdown grezzo (non usato dalla pipeline)
sources/<stem>/auto/<stem>_middle.json ← dati intermedi (non usato)
2026-05-20 14:21:16 +02:00
sources/<stem>/auto/images/ ← immagini estratte
```
`<stem>` = nome del documento, usato in tutti i comandi come identificatore.
2026-05-11 14:44:16 +02:00
---
## Comandi
``` bash
2026-05-20 14:04:12 +02:00
# Setup
python -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt
2026-05-20 16:08:00 +02:00
# Chunking unificato: Stage 1 (_clean.md) + Stage 2 (chunks.json)
2026-05-20 14:21:16 +02:00
.venv/bin/python chunks/chunker.py --stem <stem>
2026-05-20 16:08:00 +02:00
.venv/bin/python chunks/chunker.py # tutti gli stem in sources/
.venv/bin/python chunks/chunker.py --stem <stem> --force # rigenera tutto
.venv/bin/python chunks/chunker.py --stem <stem> --skip-optimize # salta Stage 1
# Solo Stage 1 (se serve rigenerare solo il _clean.md)
.venv/bin/python chunks/md_optimizer.py --stem <stem> --force
# Verifica e correzione chunk
.venv/bin/python chunks/verify_chunks.py --stem <stem>
.venv/bin/python chunks/fix_chunks.py --stem <stem>
2026-05-11 14:44:16 +02:00
2026-05-20 14:04:12 +02:00
# Vettorizzazione (richiede Ollama attivo)
2026-05-20 14:21:16 +02:00
.venv/bin/python ingestion/ingest.py --stem <stem>
.venv/bin/python ingestion/ingest.py --stem <stem> --force
2026-05-11 14:44:16 +02:00
2026-05-20 14:04:12 +02:00
# RAG interattivo
2026-05-20 14:21:16 +02:00
.venv/bin/python rag.py --stem <stem>
2026-05-20 16:08:00 +02:00
.venv/bin/python retrieve.py --stem <stem> # retrieval puro, senza LLM
2026-05-20 14:04:12 +02:00
```
2026-04-13 08:02:48 +02:00
2026-04-15 11:38:45 +02:00
---
2026-05-11 14:44:16 +02:00
## Architettura
2026-05-20 14:21:16 +02:00
### Chunking — `chunks/`
2026-04-15 11:38:45 +02:00
2026-05-20 14:21:16 +02:00
| File | Responsabilità |
|------|---------------|
2026-05-20 16:08:00 +02:00
| `chunker.py` | Entry point unificato: chiama `md_optimizer` (Stage 1) poi esegue il chunking (Stage 2) |
| `md_optimizer.py` | Modulo Stage 1: `_content_list_v2.json` + `_model.json` → `<stem>_clean.md` |
| `config.py` | Tutti i parametri: `MAX_CHARS` , `MIN_CHARS` , `OVERLAP_SENTENCES` , `FRONTMATTER_HEADINGS` , `SOMMARIO_PATTERNS` , label sets model.json |
| `verify_chunks.py` | Verifica qualità chunk (lunghezze, frasi spezzate, prefissi) |
| `fix_chunks.py` | Correzioni post-chunking (merge incompleti, split lunghi) |
`md_optimizer.py` è generico rispetto al documento: usa le strutture comuni di tutti gli output MinerU (`_content_list_v2.json` e `_model.json` ) senza dipendere da pattern testuali lingua-specifici. I parametri documento-specifici (es. `FRONTMATTER_HEADINGS` per documenti italiani) sono in `config.py` .
2026-04-15 11:38:45 +02:00
2026-05-20 14:21:16 +02:00
Output: `chunks/<stem>/chunks.json` , `chunks/<stem>/meta.json` , `chunks/<stem>/report.json`
2026-05-11 14:44:16 +02:00
2026-05-20 14:21:16 +02:00
### Vettorizzazione — `ingestion/ingest.py`
2026-05-11 14:44:16 +02:00
2026-05-20 14:21:16 +02:00
Legge `chunks/<stem>/chunks.json` , genera embedding via Ollama (`EMBED_MODEL` ), indicizza in ChromaDB persistente (`chroma_db/` ). Supporta collection multi-documento (`--collection <nome> --stems doc1 doc2` ).
2026-04-13 08:02:48 +02:00
2026-05-20 14:21:16 +02:00
### RAG — file radice
2026-05-11 14:44:16 +02:00
2026-05-20 14:04:12 +02:00
| File | Responsabilità |
|------|---------------|
2026-05-20 14:21:16 +02:00
| `rag.py` | Loop interattivo: retrieval + generazione Ollama |
| `retrieve.py` | Retrieval puro (debug senza LLM) |
| `config.py` | `TOP_K` , `TEMPERATURE` , `OLLAMA_MODEL` , `EMBED_MODEL` , `SYSTEM_PROMPT` , `OLLAMA_URL` |
2026-05-11 14:44:16 +02:00
2026-05-20 14:04:12 +02:00
### Output per stem
2026-05-11 14:44:16 +02:00
2026-05-20 14:04:12 +02:00
```
chunks/<stem>/chunks.json
2026-05-20 14:21:16 +02:00
chunks/<stem>/meta.json
chunks/<stem>/report.json
chroma_db/<stem>/ ← collection ChromaDB
2026-05-20 14:04:12 +02:00
```
2026-05-11 14:44:16 +02:00
---
2026-04-20 11:05:20 +02:00
## Skills custom
2026-04-15 11:38:45 +02:00
2026-05-20 14:21:16 +02:00
- `/prepare-md <path|stem>` — corregge il Markdown MinerU: sillabazione, artefatti, header malformati, gerarchia incoerente. Opera su una copia, non sull'originale.
2026-05-20 14:04:12 +02:00
- `/post-chunk` — verifica e perfeziona i chunk prima della vettorizzazione.