2026-05-11 16:05:23 +02:00
|
|
|
# Ingestion — Vettorizzazione
|
2026-04-14 18:22:05 +02:00
|
|
|
|
2026-05-11 16:05:23 +02:00
|
|
|
Legge i chunk prodotti dal chunker, genera gli embedding tramite Ollama e li
|
2026-04-14 18:22:05 +02:00
|
|
|
salva in ChromaDB (vector store persistente su disco).
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Prerequisiti
|
|
|
|
|
|
2026-05-11 16:05:23 +02:00
|
|
|
- Chunking completato (esiste `chunks/<stem>/chunks.json`)
|
2026-04-14 18:22:05 +02:00
|
|
|
- Ollama attivo con il modello di embedding scaricato
|
|
|
|
|
- `chromadb` installato (`pip install -r requirements.txt`)
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
2026-05-11 16:05:23 +02:00
|
|
|
## Verifica ambiente
|
|
|
|
|
|
|
|
|
|
Prima di eseguire l'ingestion, verifica che Ollama e i modelli siano disponibili:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
.venv/bin/python ollama/check_env.py
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
2026-04-14 18:22:05 +02:00
|
|
|
## Configurazione modello
|
|
|
|
|
|
2026-04-17 18:50:31 +02:00
|
|
|
Il modello di embedding viene letto da **`config.py`**:
|
2026-04-14 18:22:05 +02:00
|
|
|
|
|
|
|
|
```python
|
2026-04-17 18:50:31 +02:00
|
|
|
# config.py
|
2026-04-14 18:22:05 +02:00
|
|
|
EMBED_MODEL = "nomic-embed-text" # ← cambia qui
|
|
|
|
|
```
|
|
|
|
|
|
2026-04-17 18:50:31 +02:00
|
|
|
> Il modello scelto qui deve corrispondere a quello usato in rag.py.
|
2026-05-11 15:58:54 +02:00
|
|
|
> Se lo cambi dopo aver già vettorizzato, devi rieseguire ingestion con `--force`.
|
2026-04-14 18:22:05 +02:00
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Uso
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Vettorizza un singolo documento
|
2026-05-11 16:05:23 +02:00
|
|
|
.venv/bin/python ingestion/ingest.py --stem <nome>
|
2026-04-14 18:22:05 +02:00
|
|
|
|
|
|
|
|
# Vettorizza tutti i documenti trovati in step-6/
|
2026-05-11 16:05:23 +02:00
|
|
|
.venv/bin/python ingestion/ingest.py
|
2026-04-14 18:22:05 +02:00
|
|
|
|
|
|
|
|
# Sovrascrive una collection già esistente
|
2026-05-11 16:05:23 +02:00
|
|
|
.venv/bin/python ingestion/ingest.py --stem <nome> --force
|
2026-04-14 18:22:05 +02:00
|
|
|
|
|
|
|
|
# Override modello (senza modificare config.py)
|
2026-05-11 16:05:23 +02:00
|
|
|
.venv/bin/python ingestion/ingest.py --stem <nome> --model bge-m3
|
2026-04-14 18:22:05 +02:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Output
|
|
|
|
|
|
|
|
|
|
I vettori vengono salvati in `chroma_db/<stem>/` come collection ChromaDB con
|
|
|
|
|
distanza coseno. La directory è ignorata da git (generata automaticamente).
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Modelli supportati
|
|
|
|
|
|
2026-04-17 18:50:31 +02:00
|
|
|
Stessi modelli raccomandati nel [README di ollama](../ollama/README.md).
|
2026-04-14 18:22:05 +02:00
|
|
|
Il modello deve essere scaricato in Ollama prima di eseguire questo script
|
|
|
|
|
(`ollama pull <modello>`).
|
2026-04-14 19:10:34 +02:00
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Regole d'oro per parametri ottimali
|
|
|
|
|
|
|
|
|
|
### Modello di embedding
|
|
|
|
|
|
|
|
|
|
**Usa un modello multilingue per testi italiani.**
|
|
|
|
|
I modelli English-first (`nomic-embed-text`, `mxbai-embed-large`, `all-minilm`)
|
|
|
|
|
producono vettori di qualità inferiore su italiano, con retrieval meno preciso.
|
|
|
|
|
Prima scelta: `qwen3-embedding:0.6b`.
|
|
|
|
|
|
|
|
|
|
**Più dimensioni = retrieval più preciso, ma più spazio su disco.**
|
|
|
|
|
|
|
|
|
|
| Dimensioni | Modelli | Quando usarlo |
|
|
|
|
|
|---|---|---|
|
|
|
|
|
| 1024 | `qwen3-embedding:0.6b`, `bge-m3` | documenti tecnici, testi lunghi |
|
|
|
|
|
| 768 | `nomic-embed-text-v2-moe` | buon compromesso |
|
|
|
|
|
| 384 | `all-minilm` | solo per test rapidi |
|
|
|
|
|
|
|
|
|
|
**Usa la stessa famiglia LLM + embedding quando possibile.**
|
|
|
|
|
`qwen3-embedding` + `qwen3.5` condividono tokenizer e spazio semantico —
|
|
|
|
|
il retrieval è più coerente rispetto a modelli di famiglie diverse.
|
|
|
|
|
|
2026-04-17 18:50:31 +02:00
|
|
|
### Coerenza tra ingest e retrieval
|
2026-04-14 19:10:34 +02:00
|
|
|
|
2026-04-17 18:50:31 +02:00
|
|
|
**`EMBED_MODEL` deve essere identico in `ingest.py` e `rag.py`.**
|
|
|
|
|
ChromaDB memorizza i vettori generati con un certo modello. Se `rag.py` usa un
|
2026-04-14 19:10:34 +02:00
|
|
|
modello diverso per la query di ricerca, gli spazi vettoriali non corrispondono
|
|
|
|
|
e il retrieval restituisce risultati casuali — senza alcun errore visibile.
|
|
|
|
|
|
|
|
|
|
**Dopo aver cambiato `EMBED_MODEL`, riesegui sempre con `--force`.**
|
|
|
|
|
Senza `--force` lo script salta la collection già esistente — i vecchi vettori
|
2026-04-17 18:50:31 +02:00
|
|
|
(generati col modello precedente) restano e continuano a essere usati da `rag.py`.
|
2026-04-14 19:10:34 +02:00
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Cambio modello → ricrea sempre la collection
|
2026-05-11 16:05:23 +02:00
|
|
|
.venv/bin/python ingestion/ingest.py --stem <nome> --force
|
2026-04-14 19:10:34 +02:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Quando usare `--force`
|
|
|
|
|
|
|
|
|
|
| Situazione | `--force` necessario? |
|
|
|
|
|
|---|---|
|
|
|
|
|
| Prima esecuzione | No |
|
|
|
|
|
| Hai cambiato `EMBED_MODEL` | **Sì** |
|
2026-05-11 16:05:23 +02:00
|
|
|
| Hai migliorato i chunk in chunks/ | **Sì** |
|
2026-04-14 19:10:34 +02:00
|
|
|
| Hai aggiunto nuovi documenti (stem diverso) | No |
|
|
|
|
|
| Vuoi solo verificare che funzioni | No |
|
|
|
|
|
|
|
|
|
|
### Distanza vettoriale
|
|
|
|
|
|
|
|
|
|
Lo script usa **distanza coseno** (hardcoded), che è la scelta corretta per
|
|
|
|
|
embedding testuali — misura l'angolo tra vettori indipendentemente dalla loro
|
|
|
|
|
lunghezza. Non cambiare questo parametro.
|