Incorporare e riordinare modelli multimodali con Sentence Transformers v5.4
Sentence Transformers è una libreria Python rinomata per l'uso e l'addestramento di modelli di embedding e reranker, cruciali per applicazioni come la generazione aumentata dal recupero (RAG - Retrieval Augmented Generation), la ricerca semantica e molte altre. Con il recente aggiornamento alla versione v5.4, le sue capacità si sono espanse in modo significativo, permettendo agli sviluppatori di codificare e confrontare testi, immagini, audio e video attraverso la stessa familiare API. Questo progresso apre le porte a nuove frontiere nell'elaborazione multimodale, facilitando la creazione di sistemi più sofisticati e intelligenti.
Nel cuore di questa innovazione ci sono i modelli di embedding multimodale e i modelli reranker multimodale. I primi mappano gli input provenienti da diverse modalità – siano essi testo, immagini, audio o video – in uno spazio di embedding condiviso. Ciò significa che, indipendentemente dalla modalità originale, tutti i dati vengono convertiti in vettori numerici comparabili. I secondi, invece, si specializzano nel calcolare il punteggio di rilevanza di coppie miste-modalità, permettendo di determinare quanto un elemento di una modalità sia pertinente a un elemento di un'altra. Queste nuove funzionalità abilitano casi d'uso avanzati come il recupero visivo di documenti, la ricerca cross-modale e la costruzione di pipeline RAG che operano su diverse modalità contemporaneamente.
Modelli di Embedding Multimodale: Oltre il Testo
I modelli di embedding tradizionali sono stati a lungo il pilastro della ricerca semantica basata su testo, convertendo il testo in vettori a dimensione fissa. Questa rappresentazione vettoriale permette di misurare la somiglianza tra diversi testi. I modelli di embedding multimodale estendono questo concetto mappando input da diverse modalità (testo, immagini, audio o video) in un unico spazio di embedding condiviso. Questo significa che è ora possibile confrontare una query di testo con documenti immagine (o viceversa) utilizzando le stesse funzioni di somiglianza a cui si è già abituati. L'obiettivo è superare le limitazioni dei sistemi unimodali, offrendo una comprensione più olistica e contestuale dei dati.
Modelli Reranker Multimodale: Affinare la Rilevanza
In modo analogo, i modelli reranker tradizionali (noti anche come Cross Encoder) sono stati impiegati per calcolare i punteggi di rilevanza tra coppie di testi. Questi modelli, pur essendo più lenti degli embedding, offrono una maggiore accuratezza nel determinare la pertinenza. I reranker multimodali portano questa capacità a un livello superiore, potendo assegnare un punteggio a coppie in cui uno o entrambi gli elementi sono immagini, documenti combinati testo-immagine o altre modalità. Ad esempio, è possibile confrontare una query di testo con documenti immagine per trovare la corrispondenza più pertinente, trovare clip video che corrispondono a una descrizione testuale, o costruire pipeline RAG che funzionano su diverse modalità in modo integrato. Questo è particolarmente utile per scenari in cui la precisione del recupero è critica e la velocità del modello di embedding iniziale può essere affinata da un reranker più potente.
Installazione e Requisiti Hardware
Per sfruttare le capacità multimodali, sono necessarie alcune dipendenze aggiuntive. L'installazione di queste "extra" è modulare, permettendo agli utenti di includere solo le modalità di cui hanno bisogno. Si raccomanda di consultare la documentazione ufficiale per i dettagli specifici sull'installazione. È importante notare che i modelli basati su VLM (Vision-Language Model) come Qwen3-VL-2B richiedono una GPU con almeno ~8 GB di VRAM, mentre le varianti 8B possono richiedere circa ~20 GB. Se non si dispone di una GPU locale, si consiglia di utilizzare un servizio GPU basato su cloud o Google Colab. Su CPU, questi modelli saranno estremamente lenti; i modelli solo testo o i modelli CLIP sono più adatti per l'inferenza su CPU.
Caricare un Modello di Embedding Multimodale
Caricare un modello di embedding multimodale è un processo identico al caricamento di un modello solo testo. La sintassi rimane familiare e intuitiva:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("model_name", revision="v5.4")
L'argomento revision è attualmente richiesto poiché le pull request di integrazione per questi modelli sono ancora in sospeso. Una volta che saranno state fuse, sarà possibile caricarli senza specificare una revisione. Il modello rileva automaticamente quali modalità supporta, quindi non è necessaria alcuna configurazione aggiuntiva. Per un controllo più granulare su aspetti come la risoluzione delle immagini o la precisione del modello, si possono utilizzare Processor e Model kwargs.
Codifica di Input Multimodali
Con un modello multimodale caricato, il metodo model.encode() accetta immagini insieme al testo. Le immagini possono essere fornite come URL, percorsi di file locali o oggetti PIL Image. Di seguito sono elencati i formati di input supportati:
- Stringhe (per il testo)
- Elenchi di stringhe
- URL (per immagini o video accessibili via web)
- Elenchi di URL
- Oggetti PIL Image (per immagini processate in memoria)
- Elenchi di oggetti PIL Image
- Percorsi di file locali (per immagini, audio, video)
- Elenchi di percorsi di file locali
- Dizionari multimodali (per combinare testo e immagini/altre modalità)
- Elenchi di dizionari multimodali
Poiché il modello mappa sia il testo che le immagini nello stesso spazio vettoriale, è possibile calcolare le somiglianze tra gli embedding di testo e gli embedding di immagine. Ad esempio:
from sentence_transformers import SentenceTransformer
from PIL import Image
model = SentenceTransformer("model_name", revision="v5.4")
embeddings = model.encode([
"A green car parked in front of a yellow building",
Image.open("car.jpg"), # Assumendo che car.jpg esista
"A bee on a pink flower",
Image.open("bee.jpg"), # Assumendo che bee.jpg esista
])
# Calcolare le similarità (omesso per brevità, ma possibile con la libreria)
Come previsto, "un'auto verde parcheggiata di fronte a un edificio giallo" è più simile all'immagine dell'auto (0.51), e "un'ape su un fiore rosa" è più simile all'immagine dell'ape (0.67). I "negativi duri" ("un'auto rossa che guida su un'autostrada", "una vespa su un tavolo di legno") ricevono correttamente punteggi più bassi. Si potrebbe notare che anche i migliori punteggi di corrispondenza (0.51, 0.67) non sono molto vicini a 1.0. Questo è dovuto al divario di modalità: gli embedding provenienti da diverse modalità tendono a raggrupparsi in regioni separate dello spazio. Le similarità cross-modali sono tipicamente inferiori a quelle intra-modali (ad esempio, testo-testo), ma l'ordinamento relativo è preservato, quindi il recupero funziona comunque bene.
Metodi Specializzati per il Recupero: encode_query() e encode_document()
Per le attività di recupero, encode_query() e encode_document() sono i metodi raccomandati. Molti modelli di recupero premettono diverse istruzioni a seconda che l'input sia una query o un documento, in modo simile a come i modelli di chat potrebbero applicare diversi prompt di sistema a seconda dell'obiettivo. Gli autori del modello possono specificare i loro prompt nella configurazione del modello, e encode_query()/encode_document() caricano e applicano automaticamente quello corretto. Sotto il cofano, entrambi sono semplici wrapper intorno a encode(); gestiscono solo la selezione del prompt. Questi metodi accettano gli stessi tipi di input di encode() (immagini, URL, dizionari multimodali, ecc.) e passano gli stessi parametri. Per i modelli senza prompt specializzati per query/documento, si comportano in modo identico a encode(). Ecco un esempio di come appare il recupero cross-modale:
from sentence_transformers import SentenceTransformer
from PIL import Image
model = SentenceTransformer("model_name", revision="v5.4")
query_embedding = model.encode_query("A car in front of a building")
document_embeddings = model.encode_document([
Image.open("car_photo.jpg"),
"A drone flying high in the sky",
Image.open("building_photo.jpg")
])
# Calcolare e confrontare le similarità
Utilizzo dei Reranker Multimodali (CrossEncoder)
I modelli reranker multimodali (CrossEncoder) valutano la rilevanza tra coppie di input, dove ogni elemento può essere testo, un'immagine, audio, video o una combinazione. Tendono a superare i modelli di embedding in termini di qualità, ma sono più lenti poiché elaborano ogni coppia individualmente. I reranker multimodali pre-addestrati attualmente disponibili si concentrano sugli input testo e immagine, ma l'architettura supporta qualsiasi modalità che il modello sottostante può gestire.
Il metodo rank() valuta e classifica un elenco di documenti rispetto a una query, supportando modalità miste:
from sentence_transformers import CrossEncoder
from PIL import Image
reranker = CrossEncoder("reranker_model_name", revision="v5.4")
query = "A car on a street"
documents = [
Image.open("car_on_street.jpg"), # Document 0
Image.open("bee_on_flower.jpg"), # Document 1
"A car driving on a highway", # Document 2
{"text": "A car parked in a European city.", "image": Image.open("car_city.jpg")} # Document 3
]
results = reranker.rank(query, documents)
# results[0] conterrà il punteggio più alto, indicando il documento più rilevante.
Il reranker identifica correttamente l'immagine dell'auto (documento 0) come il risultato più rilevante, seguito dal documento combinato testo+immagine su un'auto in una città europea (documento 3). L'immagine dell'ape (documento 1) ottiene il punteggio più basso. Tenere presente che il divario di modalità può influenzare i punteggi assoluti: i punteggi delle coppie testo-immagine possono occupare un intervallo diverso rispetto ai punteggi testo-testo o immagine-immagine. È possibile verificare quali modalità un reranker supporta utilizzando modalities e supports(), proprio come con i modelli di embedding. È anche possibile utilizzare predict() per ottenere i punteggi di rilevanza grezzi per coppie specifiche di input.
Recupero Ibrido: Embedding + Reranker
Un modello comune consiste nell'utilizzare un modello di embedding per un recupero iniziale veloce, quindi affinare i risultati migliori con un reranker. Poiché gli embedding del corpus sono pre-calcolati, il recupero iniziale è rapido anche su milioni di documenti. Il reranker fornisce quindi una valutazione più accurata sul set di candidati più piccolo, combinando la velocità del recupero iniziale con la precisione del reranking.
Tipi di Input Supportati e Messaggi in Stile Chat
I modelli multimodali accettano una varietà di formati di input. Come accennato, per model.encode() sono supportati stringhe, URL, oggetti PIL Image e percorsi di file locali, oltre a elenchi di questi e dizionari multimodali. È possibile verificare quali modalità un modello supporta utilizzando la proprietà modalities e il metodo supports(). La modalità "message" indica che il modello accetta input di messaggi in stile chat con contenuto intercalato. In pratica, raramente è necessario utilizzarla direttamente. Quando si passano stringhe, URL o dizionari multimodali, il modello li converte internamente nel formato di messaggio appropriato. Sentence Transformers supporta due formati di messaggio:
{"text": "...", "image": "..."}: un semplice dizionario che combina testo e un'immagine.[{"role": "user", "content": [{"type": "text", "text": "..."}, {"type": "image", "image": "..."}]}]: un formato più dettagliato, simile a quello delle API di chat, che specifica ruoli e tipi di contenuto.
Il formato viene rilevato automaticamente dal modello di chat template del modello. Poiché tutti gli input vengono convertiti nello stesso formato di messaggio internamente, è possibile mescolare i tipi di input in una singola chiamata encode(). Se un modello non segue nessuno dei due formati e si desidera il controllo completo, è possibile passare dizionari di messaggi grezzi con le chiavi role e content direttamente. Questo bypassa la conversione automatica del formato e passa i messaggi direttamente a processor.apply_chat_template().
Processor e Model Kwargs
Potrebbe essere necessario controllare i limiti della risoluzione dell'immagine o la precisione del modello. È possibile utilizzare processor_kwargs e model_kwargs durante il caricamento del modello. Ad esempio, per impostare una specifica risoluzione per le immagini o una precisione numerica (es. bfloat16):
from sentence_transformers import SentenceTransformer
model = SentenceTransformer(
"model_name",
revision="v5.4",
processor_kwargs={"image_resolution": 224},
model_kwargs={"torch_dtype": "bfloat16"}
)
Nella versione v5.4 di Sentence Transformers, tokenizer_kwargs è stato rinominato in processor_kwargs per riflettere che i modelli multimodali utilizzano processori anziché solo tokenizer. Il vecchio nome è ancora accettato ma deprecato. Per maggiori dettagli su questi argomenti, si rimanda alla documentazione di riferimento dell'API di SentenceTransformer.
Modelli Multimodali Supportati in v5.4
Ecco i modelli multimodali supportati nella v5.4, disponibili anche nella collection v5.4 integrations su Hugging Face:
- Qwen3-VL-2B
- Qwen3-VL-8B
- Qwen3-VL-2B-chat
- Qwen3-VL-8B-chat
- Phi3-V
- Idefics2
- MiniCPM-V-2-DPO
- DINOv2-base
- CLIP-ViT-L-14
È da notare che i semplici modelli CLIP, come CLIP-ViT-L-14, funzionano ancora bene su hardware con risorse limitate, rendendoli accessibili per una vasta gamma di applicazioni.
Prospettive Future
Nei prossimi giorni verrà rilasciato un nuovo blogpost dedicato all'addestramento e al finetuning di modelli multimodali, promettendo ulteriori approfondimenti per gli sviluppatori e i ricercatori. Nel frattempo, si consiglia di sperimentare con l'inferenza sui modelli pre-addestrati o di iniziare a esplorare le possibilità di addestramento utilizzando la documentazione esistente. L'aggiornamento v5.4 di Sentence Transformers segna un passo significativo verso sistemi di intelligenza artificiale più versatili e potenti, capaci di comprendere e interagire con il mondo attraverso una pluralità di sensi digitali.