docs: allinea README alla struttura reale del progetto
Corregge struttura progetto (step-N/ invece di scripts/ e processed/), aggiorna script, comandi e path per step 1–3, rimuove riferimenti a marker-pdf (sostituito da pymupdf4llm), snellisce step 7 e 9 con rimando ai README dedicati, segna step 10 come da implementare
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
Sistema RAG (Retrieval-Augmented Generation) costruito da zero, senza framework di alto livello.
|
Sistema RAG (Retrieval-Augmented Generation) costruito da zero, senza framework di alto livello.
|
||||||
Funziona su qualsiasi PDF digitale. Gira interamente in locale, senza GPU, senza cloud.
|
Funziona su qualsiasi PDF digitale. Gira interamente in locale, senza GPU, senza cloud.
|
||||||
|
|
||||||
**Stack:** Python · Ollama · nomic-embed-text · Qwen3 8B · ChromaDB
|
**Stack:** Python · Ollama · nomic-embed-text · Qwen3.5 · ChromaDB
|
||||||
**Compatibile con:** Linux · macOS · Windows (WSL2) · CPU Only · ~8 GB RAM libera
|
**Compatibile con:** Linux · macOS · Windows (WSL2) · CPU Only · ~8 GB RAM libera
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -72,25 +72,54 @@ rag-from-scratch/
|
|||||||
├── sources/ # PDF originali — non modificare mai
|
├── sources/ # PDF originali — non modificare mai
|
||||||
│ └── documento.pdf
|
│ └── documento.pdf
|
||||||
│
|
│
|
||||||
├── processed/ # Output di ogni step per ogni documento
|
├── step-0/
|
||||||
│ └── documento/
|
│ └── check_pdf.py # Verifica requisiti del PDF
|
||||||
│ ├── raw.md # MD grezzo da marker (non toccare)
|
│
|
||||||
│ ├── clean.md # MD revisionato a mano
|
├── step-1/
|
||||||
│ ├── structure_profile.json # Profilo struttura da step 3
|
│ └── inspect_pdf.py # Ispezione automatica del PDF
|
||||||
|
│
|
||||||
|
├── step-2/
|
||||||
|
│ ├── convert_pdf.py # Conversione PDF → Markdown grezzo
|
||||||
|
│ └── <stem>/
|
||||||
|
│ └── raw.md # MD grezzo (non toccare)
|
||||||
|
│
|
||||||
|
├── step-3/
|
||||||
|
│ ├── detect_structure.py # Rilevamento struttura MD
|
||||||
|
│ └── <stem>/
|
||||||
|
│ └── structure_profile.json # Profilo struttura
|
||||||
|
│
|
||||||
|
├── step-4/
|
||||||
|
│ ├── revise.py # Pre-processing automatico MD
|
||||||
|
│ ├── revision_log.md # Log modifiche manuali
|
||||||
|
│ └── <stem>/
|
||||||
|
│ ├── clean.md # MD revisionato
|
||||||
|
│ └── structure_profile.json # Profilo aggiornato
|
||||||
|
│
|
||||||
|
├── step-5/
|
||||||
|
│ ├── chunker.py # Chunking adattivo
|
||||||
|
│ └── <stem>/
|
||||||
│ └── chunks.json # Chunk pronti per la vettorizzazione
|
│ └── chunks.json # Chunk pronti per la vettorizzazione
|
||||||
│
|
│
|
||||||
├── scripts/
|
├── step-6/
|
||||||
│ ├── inspect.py # Step 1 — ispezione PDF
|
│ ├── verify_chunks.py # Verifica chunk
|
||||||
│ ├── detect_structure.py # Step 3 — analisi struttura MD
|
│ ├── fix_chunks.py # Fix chunk problematici
|
||||||
│ ├── chunker.py # Step 5 — chunking adattivo
|
│ └── <stem>/
|
||||||
│ ├── verify_chunks.py # Step 6 — verifica chunk
|
│ └── chunks.json # Chunk verificati
|
||||||
│ ├── ingest.py # Step 8 — vettorizzazione
|
|
||||||
│ ├── rag.py # Step 9 — pipeline RAG
|
|
||||||
│ └── test_pipeline.py # Step 10 — test automatici
|
|
||||||
│
|
│
|
||||||
├── chroma_db/ # Vector store — generato da ingest.py
|
├── step-7/
|
||||||
├── notes/
|
│ ├── check_env.py # Verifica ambiente locale
|
||||||
│ └── revision_log.md # Log delle modifiche manuali al MD
|
│ └── README.md # Guida installazione Ollama e dipendenze
|
||||||
|
│
|
||||||
|
├── step-8/
|
||||||
|
│ └── ingest.py # Vettorizzazione → ChromaDB
|
||||||
|
│
|
||||||
|
├── step-9/
|
||||||
|
│ ├── config.py # Configurazione pipeline RAG ← modifica qui
|
||||||
|
│ ├── rag.py # Pipeline RAG interattiva
|
||||||
|
│ ├── test_ollama.py # Test chat Ollama senza RAG
|
||||||
|
│ └── README.md
|
||||||
|
│
|
||||||
|
├── chroma_db/ # Vector store — generato da step-8
|
||||||
├── requirements.txt
|
├── requirements.txt
|
||||||
├── .gitignore
|
├── .gitignore
|
||||||
└── README.md
|
└── README.md
|
||||||
@@ -136,15 +165,15 @@ Se ottieni caratteri strani o testo nell'ordine sbagliato, il PDF ha problemi.
|
|||||||
### Step 1 — Ispezione automatica
|
### Step 1 — Ispezione automatica
|
||||||
|
|
||||||
**Tipo:** automatico
|
**Tipo:** automatico
|
||||||
**Input:** `sources/documento.pdf`
|
**Input:** tutti i PDF in `sources/`
|
||||||
**Output:** report testuale con score e lista problemi
|
**Output:** `step-1/<stem>_step1_report.txt`
|
||||||
**Script:** `scripts/inspect.py`
|
**Script:** `step-1/inspect_pdf.py`
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python scripts/inspect.py sources/documento.pdf --save
|
python step-1/inspect_pdf.py
|
||||||
```
|
```
|
||||||
|
|
||||||
Lo script analizza il PDF pagina per pagina e produce un report.
|
Lo script scansiona automaticamente tutti i PDF in `sources/`, analizza ogni documento pagina per pagina e produce un report.
|
||||||
Serve per capire la qualità del documento e mappare i problemi
|
Serve per capire la qualità del documento e mappare i problemi
|
||||||
prima di affrontare la revisione manuale.
|
prima di affrontare la revisione manuale.
|
||||||
|
|
||||||
@@ -186,33 +215,29 @@ PROSSIMI PASSI:
|
|||||||
### Step 2 — Conversione in Markdown grezzo
|
### Step 2 — Conversione in Markdown grezzo
|
||||||
|
|
||||||
**Tipo:** automatico
|
**Tipo:** automatico
|
||||||
**Input:** `sources/documento.pdf`
|
**Input:** tutti i PDF in `sources/` (o uno solo con `--pdf`)
|
||||||
**Output:** `processed/documento/raw.md`
|
**Output:** `step-2/<stem>/raw.md` + `step-2/<stem>/clean.md`
|
||||||
**Tool:** marker-pdf
|
**Script:** `step-2/convert_pdf.py`
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
marker_single sources/documento.pdf processed/documento/raw.md
|
python step-2/convert_pdf.py # tutti i PDF in sources/
|
||||||
|
python step-2/convert_pdf.py --pdf sources/doc.pdf # un solo PDF
|
||||||
```
|
```
|
||||||
|
|
||||||
Converte il PDF in Markdown. Il risultato non è perfetto — è la base
|
Converte il PDF in Markdown usando `pymupdf4llm`. Il risultato non è perfetto — è la base
|
||||||
su cui lavorerai nello step 4.
|
su cui lavorerai nello step 4.
|
||||||
|
|
||||||
**Regola fondamentale:** `raw.md` non va mai modificato.
|
Lo script crea due file:
|
||||||
È il punto di partenza di riferimento. Se qualcosa va storto
|
- `raw.md` — conversione grezza, **non modificare mai**. È il punto di partenza di riferimento.
|
||||||
nella revisione, puoi sempre ripartire da qui.
|
- `clean.md` — copia di lavoro che verrà modificata negli step successivi.
|
||||||
|
|
||||||
```bash
|
**Cosa produce la conversione:**
|
||||||
# Crea subito la copia su cui lavorare
|
|
||||||
cp processed/documento/raw.md processed/documento/clean.md
|
|
||||||
```
|
|
||||||
|
|
||||||
**Cosa produce marker:**
|
|
||||||
|
|
||||||
- Titoli riconosciuti e convertiti in `#` `##` `###`
|
- Titoli riconosciuti e convertiti in `#` `##` `###`
|
||||||
- Paragrafi separati da righe vuote
|
- Paragrafi separati da righe vuote
|
||||||
- Sillabazione parzialmente risolta
|
- Sillabazione parzialmente risolta
|
||||||
|
|
||||||
**Cosa non produce marker:**
|
**Cosa non produce:**
|
||||||
|
|
||||||
- Rimozione intestazioni e piè di pagina
|
- Rimozione intestazioni e piè di pagina
|
||||||
- Correzione completa del layout a colonne
|
- Correzione completa del layout a colonne
|
||||||
@@ -223,15 +248,17 @@ cp processed/documento/raw.md processed/documento/clean.md
|
|||||||
### Step 3 — Rilevamento struttura
|
### Step 3 — Rilevamento struttura
|
||||||
|
|
||||||
**Tipo:** automatico
|
**Tipo:** automatico
|
||||||
**Input:** `processed/documento/raw.md`
|
**Input:** `step-2/<stem>/`
|
||||||
**Output:** `processed/documento/structure_profile.json`
|
**Output:** `step-3/<stem>/structure_profile.json`
|
||||||
**Script:** `scripts/detect_structure.py`
|
**Script:** `step-3/detect_structure.py`
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python scripts/detect_structure.py processed/documento/raw.md
|
python step-3/detect_structure.py # tutti i documenti in step-2/
|
||||||
|
python step-3/detect_structure.py --stem <nome> # un solo documento
|
||||||
|
python step-3/detect_structure.py --force # riesegui anche se già presente
|
||||||
```
|
```
|
||||||
|
|
||||||
Analizza la struttura del Markdown grezzo senza modificarlo.
|
Copia `raw.md` e `clean.md` da `step-2/<stem>/` e analizza la struttura del Markdown senza modificarla.
|
||||||
Il profilo prodotto guida sia la revisione manuale che il chunker.
|
Il profilo prodotto guida sia la revisione manuale che il chunker.
|
||||||
|
|
||||||
**I quattro livelli strutturali:**
|
**I quattro livelli strutturali:**
|
||||||
@@ -472,35 +499,14 @@ Distribuzione lunghezze:
|
|||||||
**Output:** ambiente locale funzionante
|
**Output:** ambiente locale funzionante
|
||||||
**Script:** `step-7/check_env.py`
|
**Script:** `step-7/check_env.py`
|
||||||
|
|
||||||
|
Installa Ollama, scarica i modelli e verifica l'ambiente. Si esegue una volta sola.
|
||||||
|
|
||||||
|
Vedi [`step-7/README.md`](step-7/README.md) per istruzioni dettagliate e scelta dei modelli.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Installa Ollama
|
|
||||||
curl -fsSL https://ollama.com/install.sh | sh
|
|
||||||
|
|
||||||
# Scarica un modello di embedding e un LLM
|
|
||||||
ollama pull nomic-embed-text # Embedding — ~274 MB (consigliato)
|
|
||||||
ollama pull qwen3.5:4b # LLM — ~3.4 GB (consigliato per 8 GB RAM)
|
|
||||||
|
|
||||||
# Installa dipendenze Python nel venv
|
|
||||||
source .venv/bin/activate
|
|
||||||
pip install -r requirements.txt
|
|
||||||
|
|
||||||
# Verifica tutto
|
|
||||||
python step-7/check_env.py
|
python step-7/check_env.py
|
||||||
```
|
```
|
||||||
|
|
||||||
**Modelli consigliati per 8 GB RAM:**
|
|
||||||
|
|
||||||
| Modello | Ruolo | Dimensione |
|
|
||||||
|---|---|---|
|
|
||||||
| `nomic-embed-text` | Embedding | ~274 MB |
|
|
||||||
| `qwen3.5:4b` | LLM | ~3.4 GB |
|
|
||||||
|
|
||||||
Per guide dettagliate su modelli alternativi, installazione e disinstallazione
|
|
||||||
di Ollama e ChromaDB, vedi [`step-7/README.md`](step-7/README.md).
|
|
||||||
|
|
||||||
Questo step si esegue una volta sola. Da questo momento
|
|
||||||
Ollama è sempre disponibile sul sistema.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Step 8 — Vettorizzazione
|
### Step 8 — Vettorizzazione
|
||||||
@@ -575,53 +581,16 @@ Non è necessario ripetere questo step a meno che il documento cambi.
|
|||||||
**Tipo:** interattivo
|
**Tipo:** interattivo
|
||||||
**Input:** `chroma_db/` + domanda dell'utente
|
**Input:** `chroma_db/` + domanda dell'utente
|
||||||
**Output:** risposta basata sul documento
|
**Output:** risposta basata sul documento
|
||||||
**Script:** `scripts/rag.py`
|
**Script:** `step-9/rag.py`
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python scripts/rag.py
|
source .venv/bin/activate
|
||||||
|
python step-9/rag.py --stem <nome>
|
||||||
```
|
```
|
||||||
|
|
||||||
Mette insieme retrieval e generation in un loop interattivo.
|
Loop interattivo che risponde a domande sul documento. Configura i parametri in `step-9/config.py` prima di avviare.
|
||||||
|
|
||||||
**Flusso per ogni domanda:**
|
Vedi [`step-9/README.md`](step-9/README.md) per la configurazione completa.
|
||||||
|
|
||||||
```
|
|
||||||
La tua domanda in testo
|
|
||||||
│
|
|
||||||
▼ embedding della domanda (nomic-embed-text)
|
|
||||||
vettore 768 dimensioni
|
|
||||||
│
|
|
||||||
▼ ricerca per similarità coseno in ChromaDB
|
|
||||||
top 3 chunk semanticamente più vicini
|
|
||||||
│
|
|
||||||
▼ costruzione del prompt
|
|
||||||
"Rispondi SOLO dal contesto:
|
|
||||||
[chunk 1]
|
|
||||||
[chunk 2]
|
|
||||||
[chunk 3]
|
|
||||||
Domanda: ..."
|
|
||||||
│
|
|
||||||
▼ Ollama (Qwen3 8B)
|
|
||||||
risposta generata
|
|
||||||
```
|
|
||||||
|
|
||||||
**Come si usa:**
|
|
||||||
|
|
||||||
```
|
|
||||||
Domanda: La tua domanda qui
|
|
||||||
Domanda: La tua domanda qui -v ← aggiunge i chunk recuperati
|
|
||||||
Domanda: exit
|
|
||||||
```
|
|
||||||
|
|
||||||
**La similarità coseno:**
|
|
||||||
Misura l'angolo tra due vettori — non la distanza ma l'orientamento.
|
|
||||||
Due testi semanticamente simili puntano nella stessa direzione
|
|
||||||
nello spazio a 768 dimensioni, indipendentemente dalla loro lunghezza.
|
|
||||||
|
|
||||||
**Regola del prompt:**
|
|
||||||
Il LLM risponde SOLO dal contesto fornito.
|
|
||||||
Se la risposta non è nel documento lo dice esplicitamente.
|
|
||||||
Non inventa, non integra con conoscenza esterna.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -630,10 +599,10 @@ Non inventa, non integra con conoscenza esterna.
|
|||||||
**Tipo:** automatico
|
**Tipo:** automatico
|
||||||
**Input:** sistema completo
|
**Input:** sistema completo
|
||||||
**Output:** tutti i test verdi
|
**Output:** tutti i test verdi
|
||||||
**Script:** `scripts/test_pipeline.py`
|
**Script:** `step-10/test_pipeline.py` *(da implementare)*
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python scripts/test_pipeline.py
|
python step-10/test_pipeline.py --stem <nome>
|
||||||
```
|
```
|
||||||
|
|
||||||
Verifica ogni componente in isolamento e poi nel sistema completo.
|
Verifica ogni componente in isolamento e poi nel sistema completo.
|
||||||
|
|||||||
Reference in New Issue
Block a user