Context
Il parser PPTX attuale (python-pptx) estrae solo testo e speaker notes. Le slide dei corsi Polito spesso contengono grafici, diagrammi di architettura e schemi che rappresentano contenuto critico non indicizzato. Uno studente che chiede "spiega lo schema UTXO" non otterrà risposta se lo schema è un'immagine.
La soluzione è generare caption automatiche per ogni immagine nelle slide con un modello vision leggero, poi indicizzare le caption come chunk aggiuntivi.
Approccio raccomandato
moondream2 (~1.9 GB, gira su CPU e Apple Silicon MPS):
from moondream import vl
model = vl(model="moondream-2B-int8.mf")
for img in slide_images:
caption = model.caption(img)["caption"]
# indicizzare caption come chunk con metadati: slide N, tipo "image_caption"
Modelli alternativi CPU-friendly: SmolVLM (~1 GB), Phi-3.5-vision Q4 (~3 GB).
File coinvolti
services/ai/app/workers/pipeline.py — parser PPTX
services/ai/requirements.txt — aggiungere moondream
Azioni richieste
-
Aggiungere estrazione immagini da slide PPTX (slide.shapes con picture type → PIL.Image)
-
Per ogni immagine estratta: generare caption con moondream2
-
Creare chunk aggiuntivo per ogni immagine con:
text: caption generata
chunk_type: "image_caption"
slide: numero slide
label: "[Immagine slide N] {caption}"
-
Abilitare via env var RAG_IMAGE_CAPTIONS=true (default: false — il modello è 1.9 GB)
-
Documentare il tempo aggiuntivo di ingest (stimato: ~2–5s per immagine su CPU)
Acceptance criteria
- Con
RAG_IMAGE_CAPTIONS=true: le immagini delle slide producono chunk indicizzati
- Le caption appaiono nelle citazioni con label chiara ("Immagine slide N")
- Nessuna regressione con
RAG_IMAGE_CAPTIONS=false
- Il modello viene caricato lazy (solo se la feature è abilitata)
Note
- ColPali (retrieval visivo diretto su PDF) è SOTA ma richiede ~8 GB VRAM → non raccomandato senza GPU
- Questa feature è classificata come post-MVP per l'alto effort di setup
Riferimenti
- [rag-sota-2026.md §2.8 — Multimodale per PPTX]
- moondream2
Context
Il parser PPTX attuale (
python-pptx) estrae solo testo e speaker notes. Le slide dei corsi Polito spesso contengono grafici, diagrammi di architettura e schemi che rappresentano contenuto critico non indicizzato. Uno studente che chiede "spiega lo schema UTXO" non otterrà risposta se lo schema è un'immagine.La soluzione è generare caption automatiche per ogni immagine nelle slide con un modello vision leggero, poi indicizzare le caption come chunk aggiuntivi.
Approccio raccomandato
moondream2(~1.9 GB, gira su CPU e Apple Silicon MPS):Modelli alternativi CPU-friendly:
SmolVLM(~1 GB),Phi-3.5-vision Q4(~3 GB).File coinvolti
services/ai/app/workers/pipeline.py— parser PPTXservices/ai/requirements.txt— aggiungeremoondreamAzioni richieste
Aggiungere estrazione immagini da slide PPTX (
slide.shapesconpicturetype →PIL.Image)Per ogni immagine estratta: generare caption con moondream2
Creare chunk aggiuntivo per ogni immagine con:
text: caption generatachunk_type:"image_caption"slide: numero slidelabel:"[Immagine slide N] {caption}"Abilitare via env var
RAG_IMAGE_CAPTIONS=true(default: false — il modello è 1.9 GB)Documentare il tempo aggiuntivo di ingest (stimato: ~2–5s per immagine su CPU)
Acceptance criteria
RAG_IMAGE_CAPTIONS=true: le immagini delle slide producono chunk indicizzatiRAG_IMAGE_CAPTIONS=falseNote
Riferimenti