Domande di colloquio per ingegneri di Machine Learning Multimodale
15 domande selezionate di machine learning multimodale, raggruppate per livello di seniority. Usale per ripassare i fondamenti, i compromessi pratici e il ragionamento di produzione a livello senior.
1Spiega l'idea centrale dell'apprendimento contrastivo per allineare le rappresentazioni di immagini e testo, e perché uno spazio di embedding condiviso è utile.
L'idea centrale dell'apprendimento contrastivo per la rappresentazione immagine-testo è quella di proiettare gli input di immagini e testo in uno spazio vettoriale latente condiviso, in modo che le coppie semanticamente corrispondenti (positive) siano avvicinate, mentre le coppie non corrispondenti (negative) siano allontanate. Addestrando encoder di visione e testo separati utilizzando obiettivi di similarità (come la similarità del coseno), il modello allinea la semantica dei pixel visivi continui con i token testuali discreti. Uno spazio di embedding condiviso è utile perché consente di risolvere direttamente i compiti multimodali tramite la ricerca di similarità vettoriale. In questo spazio unificato, il recupero cross-modale (trovare immagini date query di testo, o viceversa) e la classificazione zero-shot (valutare un embedding di immagine rispetto a embedding di prompt come 'una foto di un cane') diventano semplici e altamente efficienti ricerche del vicino più prossimo o di prodotto scalare, senza richiedere head di classificazione specifici per il compito.
import torch
import torch.nn.functional as F
# image_features: [B, D], text_features: [B, D]
image_norm = F.normalize(image_features, dim=-1)
text_norm = F.normalize(text_features, dim=-1)
# Pairwise cosine similarity matrix: [B, B]
sim_matrix = image_norm @ text_norm.T
# Positive pairs lie on the diagonal; off-diagonals are negatives
2Spiega l'architettura *dual-encoder* in stile CLIP e le assunzioni che fa sull'interazione immagine-testo.
L'architettura *dual-encoder* in stile CLIP è composta da due reti neurali separate e disaccoppiate: un *encoder* visivo (ad es. Vision Transformer o ResNet) che elabora le immagini in vettori di *feature* (caratteristiche) visive, e un *encoder* testuale (ad es. Transformer) che elabora il testo in vettori di *feature* testuali. Entrambe le rappresentazioni sono proiettate in una dimensione di *embedding* comune, dove l'allineamento viene misurato utilizzando una semplice metrica di similarità (come la similarità del coseno normalizzata o il prodotto scalare).
L'assunzione architettonica fondamentale è la *late fusion* (o interazione cross-modale fattorizzata): le modalità immagine e testo non interagiscono a livelli intermedi tramite *cross-attention* o interazioni a livello di *token*. Invece, si assume che la semantica completa di ciascuna modalità sia comprimibile in un singolo riassunto vettoriale denso, e che l'interazione cross-modale sia completamente decomponibile in un prodotto interno. Questo compromesso privilegia l'estrema efficienza di recupero (consentendo il pre-calcolo *offline* degli *embedding* delle immagini per la ricerca vettoriale su scala di miliardi) rispetto al ragionamento cross-modale a grana fine (come il *grounding* *token*-a-regione o complesse relazioni spaziali compositive).
3Descrivi l'intuizione alla base della proiezione delle *feature* di immagini e testo in uno *spazio normalizzato* comune e dell'ottimizzazione della *similarità del coseno*.
La proiezione delle *feature* di immagini e testo in uno *spazio normalizzato* comune (tipicamente su un'ipersfera unitaria tramite normalizzazione L2) e l'ottimizzazione della *similarità del coseno* disaccoppia la direzione semantica di un *embedding* dalla sua magnitudine vettoriale. Senza normalizzazione, un prodotto scalare non vincolato permette al modello di minimizzare la *loss* di *training* gonfiando banalmente le norme delle *feature* per campioni facili o frequenti, anziché allineare le loro direzioni semantiche.
Normalizzare i vettori sull'ipersfera unitaria delimita i valori di similarità strettamente all'interno di [-1, 1], assicurando che la distanza corrisponda puramente alla separazione angolare. Questo stabilizza i *gradienti* di ottimizzazione, previene l'esplosione o il collasso della rappresentazione e assicura che ogni campione in un *batch* contribuisca equamente alla *loss* indipendentemente dalle discrepanze di scala specifiche della modalità. Se abbinato a un parametro di temperatura apprendibile, controlla la nitidezza della distribuzione di probabilità sull'ipersfera per bilanciare l'allineamento delle coppie vere con la dispersione uniforme delle coppie negative.
import torch
import torch.nn.functional as F
# Unnormalized embeddings with extreme norm differences
v = torch.tensor([[10.0, 0.0], [0.1, 0.0]])
t = torch.tensor([[5.0, 0.0], [0.1, 0.0]])
# Raw dot products: heavily distorted by magnitude (50.0 vs 0.01)
raw_dot = v @ t.T
# L2 Normalized:
v_norm = F.normalize(v, p=2, dim=-1)
t_norm = F.normalize(t, p=2, dim=-1)
cosine_sim = v_norm @ t_norm.T
print('Cosine similarity matrix:\n', cosine_sim)
4Spiega il visual grounding e la Referring Expression Comprehension come localizzazione condizionata dal linguaggio, e in che modo differiscono dalla similarità a livello di immagine.
Il visual grounding (spesso operazionalizzato come Referring Expression Comprehension, o REC) è il compito di localizzare una specifica regione visiva, un bounding box o una maschera di segmentazione all'interno di un'immagine basandosi su un'espressione di riferimento in linguaggio naturale (ad es. 'l'uomo che indossa una giacca blu accanto alla lampada'). Tratta la localizzazione come condizionata dal linguaggio, richiedendo al modello di risolvere relazioni spaziali linguistiche, attributi e identità di oggetti fino alle coordinate pixel o spaziali. Ciò differisce fondamentalmente dalla similarità a livello di immagine, che calcola un singolo punteggio di affinità semantica olistico tra un'intera immagine e una stringa di testo (ad es. determinare se un'immagine corrisponde alla didascalia 'un uomo in un parco'). La similarità a livello di immagine non produce coordinate spaziali, può abbinare immagini in cui l'oggetto di riferimento non è localizzato in modo univoco e spesso fallisce nel risolvere la disambiguazione di riferimento a grana fine tra più oggetti simili nella stessa scena.
# Image-level similarity:
# Input: Image I, Text T ("black dog sitting on the left")
# Output: scalar score s in [0, 1] or dot product
similarity_score = image_text_model(image, text)
# Referring Expression Comprehension (Visual Grounding):
# Input: Image I, Text T ("black dog sitting on the left")
# Output: Bounding box coordinates [x_min, y_min, x_max, y_max]
bbox = grounding_model.predict_box(image, text)
5Spiega la cross-attenzione come meccanismo di fusione tra token visivi e token testuali nei transformer multimodali.
Nei transformer multimodali, la cross-attenzione agisce come un meccanismo di fusione asimmetrico in cui una modalità indirizza le query (Q) per prestare attenzione (attend) a chiavi (K) e valori (V) estratti da un'altra modalità. Ad esempio, quando i token visivi agiscono come query e i token testuali agiscono come chiavi e valori, ogni token visivo calcola una somma pesata dall'attenzione sulle rappresentazioni testuali, condizionando dinamicamente le feature visive sul contesto testuale (e viceversa quando il testo interroga i token visivi). Matematicamente, data una sequenza visiva X_v e una sequenza testuale X_t, la cross-attenzione calcola: CrossAttention(Q_v, K_t, V_t) = softmax((Q_v * K_t^T) / sqrt(d)) * V_t dove Q_v = X_v * W_Q, K_t = X_t * W_K, e V_t = X_t * W_V. Questo meccanismo consente al modello di eseguire un allineamento semantico token-to-token a grana fine tra le modalità, indipendentemente dalle differenze nelle lunghezze delle sequenze o negli spazi delle feature iniziali. La fusione bidirezionale può essere ottenuta utilizzando due strati di cross-attenzione simmetrici (ad esempio, visione-a-linguaggio e linguaggio-a-visione) o alternando blocchi di cross-attenzione.
6Spiega come le aumentazioni di immagine come il cropping, il color jitter e la compressione possono aiutare o danneggiare l'allineamento contrastivo immagine-testo.
Nell'apprendimento contrastivo multimodale (come CLIP), le aumentazioni di immagine servono a uno scopo diverso rispetto all'apprendimento auto-supervisionato unimodale (come SimCLR). Poiché le immagini sono confrontate con didascalie testuali abbinate piuttosto che con un'altra vista aumentata della stessa immagine, le aumentazioni possono sia giovare che corrompere l'apprendimento delle rappresentazioni. Come le aumentazioni aiutano: 1. Prevenire l'apprendimento di scorciatoie: Aumentazioni lievi (come il cropping casuale, i flip orizzontali lievi e un moderato color jitter) impediscono all'encoder visivo di basarsi su artefatti visivi di basso livello triviali (ad esempio, distribuzioni di colori di sfondo, filigrane angolari o bias di posizione spaziale). 2. Invarianza di punto di vista e scala: Uno scaling e un cropping moderati incoraggiano il modello a identificare oggetti semantici attraverso diverse lunghezze focali e prospettive, garantendo una robusta generalizzazione zero-shot. Come le aumentazioni possono danneggiare (Disallineamento Semantico): 1. Cropping Casuale Aggressivo: Se una didascalia descrive un oggetto specifico ("un uccello appollaiato su un ramo") e un cropping aggressivo taglia via completamente l'uccello, il ritaglio rimanente (solo foglie/cielo) è comunque forzato ad allinearsi con la didascalia dell'uccello. Questo introduce un falso rumore di supervisione e degrada la precisione del recupero. 2. Forte Color Jittering / Inversione di Tonalità: Molte didascalie descrivono esplicitamente attributi di colore ("un taxi giallo", "una mela rossa"). Forti cambiamenti di colore trasformano il taxi in blu o la mela in verde, causando una diretta contraddizione semantica tra l'input visivo e la didascalia testuale. 3. Forte Sfocatura e Compressione: Un downsampling spaziale aggressivo, la compressione JPEG o la sfocatura gaussiana distruggono indizi testuali a grana fine (testo OCR su insegne, loghi, texture fini) che sono esplicitamente descritti nelle didascalie abbinate. Regola Pratica: L'addestramento contrastivo multimodale richiede aumentazioni significativamente più conservative (ad esempio, Random Resized Crop con un intervallo di scala [0.5, 1.0] e un flipping leggero) rispetto all'apprendimento auto-supervisionato unimodale.
7Spiega il recupero immagine-testo (image-text retrieval) come compito e la differenza tra il matching a set chiuso (closed-set matching) e il recupero in un mondo aperto (open-world retrieval) su grandi corpora.
Il recupero immagine-testo (image-text retrieval) è il compito di trovare dati corrispondenti tra diverse modalità (testo-a-immagine o immagine-a-testo) data una query in una modalità, tipicamente realizzato mappando sia le immagini che i testi in uno spazio di rappresentazione condiviso dove la similarità è correlata alla rilevanza. Il matching a set chiuso (closed-set matching) presuppone un pool di candidati fisso, predefinito, con accoppiamenti (ground-truth pairings) noti (come nei benchmark standard Flickr30k o MS-COCO), consentendo il calcolo esaustivo della similarità a coppie o della cross-attention all-to-all. Il recupero in un mondo aperto (open-world retrieval) opera su corpora massicci, dinamici e non curati (ad esempio, da milioni a miliardi di elementi web o di catalogo) dove i pool di candidati sono illimitati, i distrattori e i falsi negativi sono prevalenti e sono richiesti indici di ricerca scalabili di tipo K-vicino approssimato (ANN - Approximate Nearest Neighbor) (ad esempio, Faiss, HNSW) perché la cross-attention esaustiva su tutte le coppie è computazionalmente intrattabile.
import torch
import torch.nn.functional as F
# Closed-set matching: full pairwise similarity matrix over fixed evaluation set
image_embeds = F.normalize(torch.randn(1000, 512), dim=-1)
text_embeds = F.normalize(torch.randn(1000, 512), dim=-1)
sim_matrix = torch.matmul(text_embeds, image_embeds.T) # (1000, 1000)
# Open-world retrieval: query vector queried against an indexed corpus using ANN
# index = faiss.IndexHNSWFlat(512, 32)
# distances, indices = index.search(query_embed, k=10)
8Confronta le perdite contrastive di tipo InfoNCE con softmax con le perdite sigmoidali a coppie per l'apprendimento di embedding immagine-testo.
Le perdite contrastive di tipo InfoNCE (come in CLIP) trattano l'allineamento come un problema di classificazione multiclasse categoriale. Per ogni campione, calcola una distribuzione softmax su tutte le coppie negative candidate nel batch, normalizzando le similarità attraverso l'intero pool del batch. Al contrario, le perdite contrastive sigmoidali a coppie (come in SigLIP) trattano ogni voce nella matrice di similarità immagine-testo come un compito di classificazione binaria indipendente, applicando una funzione sigmoide e una perdita di cross-entropy binaria per coppia (le coppie positive hanno come target +1, le coppie negative -1). Le differenze chiave sono: 1. Accoppiamento vs. Disaccoppiamento: InfoNCE accoppia tutti i negativi attraverso il denominatore di partizione softmax globale, causando una competizione in cui i negativi più difficili dominano i gradienti. SigLIP disaccoppia tutte le coppie, valutando ciascuna in modo indipendente. 2. Scalabilità Distribuita ed Efficienza: InfoNCE richiede il raggruppamento delle matrici di similarità tra le GPU per la normalizzazione globale (collo di bottiglia della comunicazione all-gather). La perdita a coppie indipendente di SigLIP può essere calcolata localmente senza normalizzazione softmax globale tra GPU, migliorando l'efficienza di scalatura e rimanendo stabile sia con batch di piccole che di grandissime dimensioni.
import torch
import torch.nn.functional as F
def siglip_loss(sim_matrix, temperature, bias):
# sim_matrix: [B, B] dot product of normalized embeddings
# targets: 1 on diagonal (positive), -1 on off-diagonals (negative)
B = sim_matrix.size(0)
targets = 2 * torch.eye(B, device=sim_matrix.device) - 1.0
logits = sim_matrix * temperature + bias
# Pairwise binary cross entropy with log-sigmoid
return -torch.mean(F.logsigmoid(targets * logits))
9Spiega come i negativi difficili e i falsi negativi influenzano l'apprendimento contrastivo immagine-testo.
I negativi difficili e i falsi negativi hanno effetti contrastanti sull'apprendimento contrastivo immagine-testo:
1. **Negativi difficili** sono coppie non corrispondenti che sono semanticamente o visivamente molto vicine all'elemento di ancoraggio (ad esempio, un'immagine di un husky siberiano abbinata alla didascalia 'un malamute dell'Alaska'). I negativi difficili forniscono segnali di gradiente informativi e di grande magnitudine. Essi costringono il modello a guardare oltre le caratteristiche di categoria grossolane e ad apprendere dettagli visuali-linguistici a grana fine e confini decisionali netti.
2. **Falsi negativi** si verificano quando coppie 'negative' campionate casualmente nel batch sono in realtà corrispondenze semantiche valide (ad esempio, due foto distinte di golden retriever in cui una è abbinata come negativo contro 'un simpatico golden retriever in un parco'). I falsi negativi penalizzano gli allineamenti semantici corretti costringendo il modello ad allontanare le rappresentazioni corrispondenti valide. Questo corrompe i gradienti, degrada la qualità della rappresentazione e sopprime la sinonimia legittima e la varianza visiva.
Le strategie di mitigazione per i falsi negativi includono obiettivi contrastivi con soft/label-smoothing, apprendimento contrastivo debiasato, deduplicazione del dataset e multi-positive matching.
import torch
import torch.nn.functional as F
# Image 0 and Image 1 both depict 'a red sports car'
# Text 0: 'a red sports car', Text 1: 'a fast red car'
# In standard InfoNCE, Text 1 is treated as a negative for Image 0.
sim = torch.tensor([[0.95, 0.90], # Image 0 similarities
[0.88, 0.94]]) # Image 1 similarities
loss_img0 = -F.log_softmax(sim / 0.07, dim=-1)[0, 0]
print(f'InfoNCE loss for Image 0: {loss_img0.item():.4f}')
# High similarity to false negative Text 1 (0.90) heavily penalizes the model
10Confronta l'allineamento globale immagine-testo con gli obiettivi di allineamento a livello di parola-regione o di token.
L'allineamento globale immagine-testo mappa un'intera immagine e un'intera sequenza di testo in singoli vettori di embedding olistici (es. tramite feature aggregate in CLIP) e li allinea utilizzando un obiettivo contrastivo come InfoNCE. Questo fornisce eccellenti proprietà di scalabilità, rappresentazioni indicizzabili veloci per il recupero e un forte clustering semantico. Tuttavia, soffre di una granularità spaziale grossolana, ha difficoltà con dettagli visivi a grana fine, composizionalità, conteggio e relazioni spaziali, e spesso presenta problemi di associazione degli attributi.
Al contrario, l'allineamento parola-regione o a livello di token opera a granularità sub-immagine a grana fine (es. token di patch, feature di bounding box di oggetti) e sub-frase (es. token di parola o sub-parola). Metodi come FILIP, GLIP o VinVL allineano i token tramite perdite contrastive a grana fine (come max-sim token-wise o similarità di Chamfer) o allineamento basato su trasporto ottimale / cross-attention. Questo preserva esplicitamente i dettagli composizionali spaziali e linguistici, consentendo il rilevamento di oggetti, il grounding visuale e l'associazione precisa di attributi, ma a costo di una maggiore complessità computazionale e di memoria, una maggiore latenza di inferenza e segnali di allineamento più rumorosi.
import torch
import torch.nn.functional as F
# visual_tokens: [B, N_v, D], text_tokens: [B, N_t, D]
def token_level_maxsim_similarity(visual_tokens, text_tokens):
v_norm = F.normalize(visual_tokens, dim=-1)
t_norm = F.normalize(text_tokens, dim=-1)
# Compute similarity matrix between all visual and text tokens: [B, N_t, N_v]
sim_matrix = torch.bmm(t_norm, v_norm.transpose(1, 2))
# Text-to-image: For each word token, find maximum visual token similarity and average
t2i_sim = sim_matrix.max(dim=-1).values.mean(dim=-1) # [B]
return t2i_sim
11Confronta la fusione precoce, la fusione tardiva, la fusione intermedia, la fusione a cross-attenzione, la fusione con gating e la concatenazione per i modelli multimodali.
Le strategie di fusione multimodale integrano i segnali visivi e linguistici a diverse profondità e configurazioni strutturali:
1. **Fusione precoce (Early Fusion)**: Le caratteristiche raw o di basso livello (ad esempio, gli embedding di patch di immagine e gli embedding di token di parole) vengono fuse nella fase di input e alimentate in un unico backbone condiviso. Questo consente interazioni cross-modali profonde fin dal livello zero, ma è computazionalmente costoso e rende più difficile il riutilizzo del pre-addestramento unimodale.
2. **Fusione tardiva (Late Fusion)**: Le modalità vengono elaborate indipendentemente da profondi backbone unimodali in vettori di rappresentazione globale, che vengono combinati solo alla fine tramite una semplice aggregazione (ad esempio, prodotto scalare, similarità del coseno o una rete MLP (Multi-Layer Perceptron) superficiale). Questo è estremamente efficiente e ideale per il recupero indicizzabile, ma non può catturare interazioni cross-modali a grana fine.
3. **Fusione intermedia (Intermediate Fusion)**: I backbone unimodali elaborano gli input per diversi strati, e la fusione avviene in fasi intermedie attraverso strati condivisi o connessioni laterali, trovando un equilibrio tra la specializzazione unimodale e l'interazione multimodale.
4. **Fusione a cross-attenzione (Cross-Attention Fusion)**: Utilizza l'attenzione multi-testa (multi-head attention) in cui una modalità fornisce le query e l'altra fornisce le key/value. Offre un'elevata capacità rappresentativa con condizionamento token-to-token, adattandosi a lunghezze di sequenza eterogenee.
5. **Fusione con gating (Gated Fusion)**: Utilizza meccanismi di gating appresi (ad esempio, gate sigmoidali o tanh) per pesare dinamicamente il contributo di ciascuna modalità o strato di fusione in base alla confidenza contestuale, impedendo a una modalità di dominare o corrompere i pesi pre-addestrati.
6. **Concatenazione (Concatenation)**: Unisce vettori di caratteristiche o sequenze di token lungo la dimensione delle caratteristiche (concatenazione di caratteristiche) o la dimensione della lunghezza della sequenza (concatenazione di token prima di un transformer unificato). È semplice e non parametrica, ma la concatenazione di caratteristiche richiede dimensioni spaziali/temporali allineate, mentre la concatenazione di token scala quadraticamente con la lunghezza totale della sequenza nell'auto-attenzione (self-attention).
12Confronta i modelli di recupero a doppio encoder (dual-encoder) con i reranker a cross-encoder (cross-encoder) per la corrispondenza immagine-testo in termini di capacità di interazione, accuratezza e latenza.
I modelli a doppio encoder (dual-encoder o bi-encoder) e i reranker a cross-encoder (cross-encoder) rappresentano due paradigmi distinti per la corrispondenza immagine-testo, presentando compromessi fondamentali tra capacità di interazione, accuratezza e latenza:
1. **Capacità di Interazione:**
* **Dual-Encoders** (ad esempio, CLIP): Elaborano immagine e testo attraverso backbone separati e disaccoppiati. L'interazione multimodale è strettamente tardiva e superficiale, limitata a un singolo prodotto scalare o similarità del coseno tra vettori globali aggregati (pooled). Mancano di interazioni cross-modali a livello di token.
* **Cross-Encoders** (ad esempio, UNITER, ViLT, ramo multimodale ALBEF): Concatenano token visivi e testuali in un transformer condiviso o utilizzano layer di cross-attenzione. Ogni token visivo può interagire con ogni token testuale attraverso più layer, consentendo un ragionamento cross-modale profondo.
2. **Accuratezza:**
* I **Dual-encoders** raggiungono un'accuratezza inferiore su query composizionali complesse, relazioni spaziali, negazioni e corrispondenza di attributi a grana fine a causa del collo di bottiglia delle rappresentazioni a singolo vettore.
* I **Cross-encoders** raggiungono un'accuratezza significativamente più elevata su compiti complessi, a grana fine e composizionali di corrispondenza immagine-testo.
3. **Latenza e Scalabilità:**
* I **Dual-encoders** consentono di pre-calcolare e indicizzare gli embedding delle immagini offline in un database vettoriale (ad esempio, Milvus, FAISS). Al momento dell'inferenza, solo la query testuale viene codificata, e la ricerca su milioni di candidati richiede solo prodotti scalari leggeri di vicini più prossimi approssimati (ANN) (latenza sub-millisecondo).
* I **Cross-encoders** richiedono l'esecuzione dell'intera rete neurale congiunta per ogni coppia candidato (immagine, testo) al momento della query (O(N) passaggi in avanti per N candidati), risultando in una latenza ordini di grandezza superiore e rendendoli computazionalmente proibitivi per il recupero di primo stadio su grandi corpus. Nei sistemi di produzione pratici, una pipeline a due stadi è standard: un dual-encoder recupera i top-K candidati (ad esempio, K=100) con bassa latenza, seguito da un cross-encoder che li riordina per un'alta accuratezza.
13Progettare un sistema RAG (Retrieval Augmented Generation) multimodale per PDF o manuali contenenti testo, tabelle, grafici, screenshot, diagrammi e immagini incorporate.
Un sistema RAG (Retrieval Augmented Generation) multimodale end-to-end per documenti visivi complessi (PDF, manuali, report) si articola in quattro fasi architetturali principali: 1. Ingestione e Parsing Consapevole del Layout: Le pagine PDF vengono elaborate tramite modelli di documenti consapevoli del layout (ad esempio, LayoutLM, DocTR) o pipeline di parsing visivo per segmentare il contenuto in blocchi strutturati: passaggi di testo, tabelle strutturate (convertite in HTML/Markdown con "cell spans"), immagini di grafici renderizzate con serie di dati e diagrammi o screenshot autonomi con "bounding box" spaziali. 2. Indicizzazione Multimodale e Doppia Rappresentazione: - Risorse Visive (Grafici, Screenshot, Diagrammi): Memorizzate come ritagli di immagini con embedding multimodali densi (ad esempio, SigLIP, CLIP o "visual patch tokens" di ColPali) insieme a riepiloghi testuali sintetici e testo OCR (Optical Character Recognition) generato da un VLM (Vision-Language Model), memorizzate in un indice di testo denso. - Tabelle: Memorizzate come Markdown/HTML strutturato in indici vettoriali di testo e BM25. - Testo: Segmentato per sezione semantica e indicizzato tramite embedding densi e parole chiave sparse. 3. Recupero Ibrido e Reranking Multimodale: - Recupero di Primo Stadio: Esegue un recupero parallelo attraverso BM25 sparso (parole chiave, testo OCR, markup di tabella), vettori di testo densi e indici di embedding visivi (ricerca ANN - Approximate Nearest Neighbor). - Fusione e Reranking: Unisce i candidati (ad esempio, tramite Reciprocal Rank Fusion) e assegna un punteggio agli elementi migliori utilizzando un "cross-encoder" multimodale o un modello di interazione tardiva visiva (che valuta il testo della query rispetto a ritagli di immagini ad alta risoluzione e testo parsificato). 4. Assemblaggio del Contesto Multimodale e Generazione Fondata: Il contesto multimodale top-$k$ — patch di immagini renderizzate, schemi di tabelle e passaggi di testo con metadati del documento/pagina — viene passato a un VLM (Vision-Language Model) "instruction-tuned" (ad esempio, GPT-4o, Claude 3.5 Sonnet o Qwen2-VL open source). Il prompt di generazione impone la provenienza della fonte richiedendo citazioni esplicite (numeri di pagina, numeri di figura o "bounding box").
from dataclasses import dataclass
from typing import Optional, List
@dataclass
class MultimodalChunk:
chunk_id: str
document_id: str
page_number: int
modality_type: str # 'text', 'table', 'chart', 'diagram'
text_payload: str # Raw text or structured Markdown/HTML
vlm_caption: Optional[str] = None # Synthetic summary of visual content
bbox: Optional[List[float]] = None # [x0, y0, x1, y1]
image_crop_path: Optional[str] = None
dense_embedding: Optional[List[float]] = None
# Indexing strategy: Text search covers text_payload + vlm_caption;
# Multimodal search matches dense_embedding or visual tokens.
14Spiegare come la valutazione RAG multimodale dovrebbe misurare separatamente la qualità del recupero, l'utilizzo delle prove, la provenienza e la fedeltà della risposta finale.
La valutazione di un sistema RAG (Retrieval Augmented Generation) multimodale richiede la scomposizione del sistema in quattro dimensioni di valutazione disaccoppiate per individuare se gli errori originano nel recupero, nel consumo del contesto, nell'accuratezza della citazione o nella generazione:
1. **Qualità del Recupero**: Valuta se il retriever identifica i frammenti visivi e testuali necessari. Le metriche chiave includono Recall@K multimodale, NDCG@K (Normalized Discounted Cumulative Gain) e MRR (Mean Reciprocal Rank). Per gli elementi visivi, questo include anche Visual IoU (Intersection over Union) / Recall del Bounding-Box (se il ritaglio dell'immagine recuperata contiene il diagramma/grafico pertinente) e Modality Recall Balance (assicurando che le modalità non testuali come tabelle e grafici non vengano sistematicamente ignorate).
2. **Utilizzo delle Prove (Sufficienza e Necessità)**: Misura se il modello di generazione si affida genuinamente alle prove multimodali recuperate piuttosto che generare risposte puramente dalla memoria parametrica. Questo viene misurato tramite la Pertinenza del Contesto (precisione dei token visivi/testuali recuperati a supporto della domanda), la Necessità delle Prove / Test di Ablazione (mascherare o eliminare il grafico/tabella recuperato per verificare se la risposta fallisce) e l'analisi di attribuzione tramite cross-attention.
3. **Provenienza e Accuratezza della Citazione**: Misura se le attribuzioni della fonte sono precise e verificabili. Valutato tramite Precisione, Recall e F1 sulle citazioni (nomi di documenti, numeri di pagina, ID di figure o coordinate del bounding box). Controlli automatici verificano che il bounding box o la pagina citata contenga effettivamente la prova di "ground truth" necessaria per rispondere alla domanda.
4. **Fedeltà e Correttezza della Risposta Finale**:
* **Fedeltà / Grounding**: Valuta se ogni affermazione generata è implicata dal contesto multimodale recuperato senza allucinazioni (tipicamente valutata tramite un VLM (Vision-Language Model)-as-a-judge che controlla l'entailment delle affermazioni rispetto a ritagli di testo e visivi).
* **Correttezza Fattuale**: Valuta se la risposta generata corrisponde alla verità.
* **Robustezza al Rifiuto**: Testa se il modello rifiuta correttamente di rispondere quando il contesto recuperato è irrilevante o contraddittorio.
# Evaluation record schema for a single Multimodal RAG query:
eval_record = {
'retrieval_quality': {
'hit_at_k': True, # Top-3 chunks contain target diagram
'visual_bbox_iou': 0.85 # Retrieved crop overlap with true figure region
},
'evidence_utilization': {
'necessity_ablation_passed': True # Removing chart causes answer to fail
},
'provenance': {
'page_match': True, # Cited Page 12 (Ground Truth Page 12)
'figure_id_match': True # Cited 'Figure 4'
},
'faithfulness': {
'claim_entailment_score': 1.0, # All claims entailed by context
'hallucination_detected': False
}
}
all_passed = all(all(metrics.values()) for metrics in eval_record.values())
print(f'System passes all decoupled checks: {all_passed}')
15Ragionare sull'aggiornamento dei modelli di recupero multimodale in produzione quando gli embedding e gli indici della galleria devono essere aggiornati su larga scala.
L'aggiornamento di un sistema di recupero (retrieval) multimodale su larga scala presenta un problema di deriva della rappresentazione: gli embedding di nuova generazione risiedono in uno spazio latente geometrico diverso e non possono essere confrontati direttamente con gli embedding della galleria esistenti senza una grave degradazione del recall. Di conseguenza, gli aggiornamenti a tempo zero di inattività (zero-downtime) richiedono deployment blue/green a doppio indice, apprendimento della compatibilità (come l'addestramento retrocompatibile o gli adattatori di trasformazione) o pipeline di reindicizzazione a fasi.
In un flusso di lavoro di reindicizzazione blue/green standard, processi batch offline calcolano nuovi embedding per l'intera galleria e costruiscono un nuovo indice vettoriale (come HNSW (Hierarchical Navigable Small Worlds) o IVF (Inverted File Index)). Mentre la ricostruzione è in corso, il traffico di ricerca live continua a interrogare l'indice legacy attivo. I nuovi elementi in ingresso vengono gestiti tramite scrittura duale o log di change data capture (CDC) in streaming, in modo che entrambi gli indici rimangano attuali. Una volta che il nuovo indice è stato validato tramite traffico shadow e caricato in memoria (warmed in memory), il traffico passa atomicamente al nuovo encoder e indice, dopodiché l'indice obsoleto viene messo fuori servizio.
In alternativa, l'apprendimento retrocompatibile (backward-compatible learning) vincola il nuovo encoder di query ad allinearsi con lo spazio della galleria legacy, consentendo aggiornamenti immediati del modello di query mentre si esegue un popolamento asincrono della galleria nel tempo.
class MultimodalRetrievalRouter:
def __init__(self, v1_service, v2_service, dual_write=True):
self.v1 = v1_service # Model v1 + Index v1
self.v2 = v2_service # Model v2 + Index v2
self.active_version = "v1"
self.dual_write = dual_write
def search(self, query_multimodal):
# Route query strictly to the encoder matching the active index
if self.active_version == "v1":
return self.v1.search(query_multimodal)
return self.v2.search(query_multimodal)
def ingest_new_item(self, item):
# Dual-write during migration window so the new index is up-to-date at cutover
self.v1.index_item(item)
if self.dual_write and self.v2.is_ready_for_ingest:
self.v2.index_item(item)