Crea il tuo assistente Vision Chat con LLaVA

Crea il tuo assistente di Chat Vision con LLaVA

Inizia con i modelli di conversazione multimodali utilizzando il modello LLaVA open-source.

Foto di Izabela Kraus su Unsplash

Introduzione

I Large Language Models si sono dimostrati una tecnologia rivoluzionaria. Numerose applicazioni che sfruttano le loro capacità sono già state sviluppate e se ne prevedono molte altre in futuro. Una delle applicazioni più interessanti dei Large Language Models è il loro utilizzo come assistenti intelligenti capaci di aiutare gli utenti umani in una varietà di compiti. I modelli di chat addestrati con la messa a punto delle istruzioni e il Reinforcement Learning from Human Feedback (RLHF) hanno dimostrato capacità molto promettenti nel seguire le istruzioni umane e nel svolgere i compiti assegnati. Tuttavia, sono limitati nella loro applicabilità a compiti solo basati sul linguaggio.

I modelli di conversazione multimodali mirano a sfruttare il potere dei Large Language Models per affrontare problemi che richiedono la combinazione del linguaggio naturale con altre modalità per essere risolti. In particolare, i modelli di visione linguaggio hanno ricevuto sempre più attenzione dall’introduzione delle capacità di visione a GPT-4V. Potenziare le capacità di linguaggio naturale di GPT-4 con la comprensione delle immagini ha portato a un potente assistente di chat che può aiutare gli utenti con compiti che richiedono sia la comprensione della visione che del linguaggio. Sebbene le capacità di visione di GPT-4V siano impressionanti, i modelli chiusi limitano il potenziale di ricerca e sperimentazione con questa tecnologia straordinaria. Fortunatamente, sono comparsi alcuni modelli open-source che portano il potere dei modelli di linguaggio della visione alla comunità in modo facile da accessibile e trasparente. Questi modelli continuano anche la tendenza all’aumento della focalizzazione sull’efficienza del calcolo e della memoria, una tendenza già vista per i Large Language Models open-source. Questa è una caratteristica importante perché facilita l’adozione diffusa di questi modelli.

In questo tutorial, illustrerò il processo di creazione di un assistente di chat per la visione utilizzando il modello LLaVA (Large Language and Vision Assistant) presentato nel paper Visual Instruction Tuning. Prima darò una breve introduzione al modello LLaVA e ai suoi miglioramenti, prima di discutere un’implementazione di codice semplice di un assistente di chat per la visione utilizzando il codice fornito nel repository ufficiale. Presenterò poi alcuni esempi che ho creato per mostrare le capacità e i limiti del modello.

LLaVA

Il modello LLaVA è stato presentato nel paper Visual Instruction Tuning, e successivamente migliorato in Improved Baselines with Visual Instruction Tuning (anche indicato come LLaVA-1.5). L’idea dietro di esso è estrarre i embedding visivi da un’immagine e trattarli allo stesso modo degli embedding provenienti dai token del linguaggio, alimentandoli a un Large Language Model. Intuitivamente, possiamo pensare che l’immagine sarà descritta con “parole” che il modello linguistico utilizzerà per generare la sua risposta. Per scegliere le giuste “parole”, il modello utilizza un encoder visivo pre-addestrato CLIP per estrarre gli embedding visivi e li proietta nello spazio degli embedding di parole del modello linguistico. L’ultima operazione viene effettuata con un connettore visione-linguaggio, che inizialmente è stato scelto come uno strato lineare semplice nel primo paper Visual Instruction Tuning, e successivamente sostituito con un Multilayer Perceptron (MLP) più espressivo in Improved Baselines with Visual Instruction. L’architettura del modello è rappresentata di seguito.

Architettura del modello LLaVA. La proiezione W è uno strato lineare semplice in LLaVA o un MLP in LLaVA-1.5. Immagine estratta dall'articolo Visual Instruction Tuning.

Uno dei vantaggi del metodo è che utilizzando un codificatore di visione preaddestrato e un modello di linguaggio preaddestrato, è necessario apprendere solo il connettore visione-linguaggio (che è un modulo leggero) da zero. In particolare, l’addestramento di LLaVA consiste in due fasi:

  • Preaddestramento per l’allineamento delle caratteristiche: sia il codificatore di visione preaddestrato che il modello di linguaggio vengono congelati e vengono aggiornati solo i pesi del connettore visione-linguaggio. Tutti i campioni di addestramento consistono di coppie di testo-immagine confezionate in una conversazione a singola chiamata. Questa fase mira ad addestrare il connettore visione-linguaggio per allineare le rappresentazioni incorporanti del codificatore di visione con le rappresentazioni del testo del modello di linguaggio.
  • Fine-tuning con istruzioni visive: in questa fase, solo i pesi del codificatore di visione vengono congelati mentre il connettore visione-linguaggio e il modello di linguaggio vengono affinati insieme. Il modello viene affinato su compiti di seguire le istruzioni basate sull’immagine. È interessante notare che alcuni di questi dati sono stati creati utilizzando l’GPT4 solo per il linguaggio al fine di creare campioni di istruzioni a partire dalla didascalia delle immagini e dalle coordinate delle caselle di delimitazione delle entità raffigurate.

Implementazione del Chatbot di visione

Creare un chatbot di visione utilizzando il codice fornito nel repository ufficiale è abbastanza semplice. Il repository fornisce anche modelli di chat standardizzati che possono essere utilizzati per analizzare gli input nel formato corretto. Seguire il formato corretto utilizzato nell’addestramento è essenziale per la qualità della risposta generata dal modello. Il template esatto dipende dal modello di linguaggio utilizzato. Il template per LLaVA-1.5 con un modello di linguaggio Vicuna preaddestrato avrà questo aspetto:

Una chat tra un utente curioso e un assistente di intelligenza artificiale. L'assistente fornisce risposte utili, dettagliate e cortesi alle domande dell'utente. UTENTE: <im_start><image><im_end> Richiesta dell'utenteASSISTENTE: Risposta dell'assistenteUTENTE: Altra richiesta

Le prime righe sono il prompt di sistema generale utilizzato dal modello. I token speciali <im_start>, <image> e <im_end> vengono utilizzati per indicare dove saranno posizionate le rappresentazioni embeddanti dell’immagine.

Il chatbot può essere definito in una semplice classe Python.

class AssistenteChatLLaVA:    def __init__(self,                 percorso_modello: str = 'liuhaotian/llava-v1.5-7b',                 dispositivi_mappati: str = 'auto',                 caricamento_a_8_bit: bool = True,                 **parametri_quantizzazione) -> None:        self.modello = None        self.tokenizer = None        self.processore_immagini = None        self.conv = None        self.conv_img = None        self.img_tensor = None        self.ruoli = None        self.stop_key = None        self.carica_modelli(percorso_modello,                         dispositivi_mappati=dispositivi_mappati,                         caricamento_a_8_bit=caricamento_a_8_bit,                         **parametri_quantizzazione)    def carica_modelli(self, percorso_modello: str,                    dispositivi_mappati: str,                    caricamento_a_8_bit: bool,                    **parametri_quantizzazione) -> None:        """Carica il modello, il processore e il tokenizer."""        configurazione_quantizzazione = BitsAndBytesConfig(**parametri_quantizzazione)        self.modello = LlavaLlamaForCausalLM.from_pretrained(percorso_modello,                                                           low_cpu_mem_usage=True,                                                           device_map=dispositivi_mappati,                                                           load_in_8bit=caricamento_a_8_bit,                                                           quantization_config=configurazione_quantizzazione)        self.tokenizer = AutoTokenizer.from_pretrained(percorso_modello,                                                       use_fast=False)        torre_visione = self.modello.get_vision_tower()        torre_visione.load_model()        torre_visione.to(device='cuda')        self.processore_immagini = torre_visione.processore_immagini        disable_torch_init()    def prepara_immagine(self, percorso_immagine: str) -> None:        """Carica ed elabora l'immagine."""        if percorso_immagine.startswith('http') or percorso_immagine.startswith('https'):            response = requests.get(percorso_immagine)            self.conv_img = Image.open(BytesIO(response.content)).convert('RGB')        else:            self.conv_img = Image.open(percorso_immagine).convert('RGB')        self.img_tensor = self.processore_immagini.preprocess(self.conv_img,                                                          return_tensors='pt'                                                          )['pixel_values'].half().cuda()    def genera_risposta(self, **parametri) -> str:        """Genera una risposta dalla conversazione corrente."""        prompt_grezza = self.conv.get_prompt()        input_ids = tokenizer_image_token(prompt_grezza,                                          self.tokenizer,                                          IMAGE_TOKEN_INDEX,                                          return_tensors='pt').unsqueeze(0).cuda()        criterio_stopping = KeywordsStoppingCriteria([self.stop_key],                                            self.tokenizer,                                            input_ids)        with torch.inference_mode():            output_ids = self.model.generate(input_ids,                                             images=self.img_tensor,                                             stopping_criteria=[criterio_stopping],                                             **parametri)        outputs = self.tokenizer.decode(            output_ids[0, input_ids.shape[1]:]        ).strip()        self.conv.messages[-1][-1] = outputs        return outputs.rsplit('</s>', 1)[0]    def ottieni_testo_conv(self) -> str:        """Restituisce il testo completo della conversazione."""        return self.conv.get_prompt()    def avvia_nuova_chat(self,                       percorso_immagine: str,                       richiesta: str,                       esegui_campionamento=True,                       temperatura=0.2,                       max_new_tokens=1024,                       usa_cache=True,                       **parametri) -> str:        """Avvia una nuova chat con una nuova immagine."""        modalità_conv = "v1"        self.prepara_immagine(percorso_immagine)        self.conv = conv_templates[modalità_conv].copy()        self.ruoli = self.conv.ruoli        primo_input = (DEFAULT_IM_START_TOKEN + DEFAULT_IMAGE_TOKEN +                       DEFAULT_IM_END_TOKEN + '\n' + richiesta)  # f"{self.ruoli[0]}: {richiesta}")        self.conv.append_message(self.ruoli[0], primo_input)        self.conv.append_message(self.ruoli[1], None)        if self.conv.sep_style == SeparatorStyle.TWO:            self.stop_key = self.conv.sep2        else:            self.stop_key = self.conv.sep        risposta = self.genera_risposta(esegui_campionamento=esegui_campionamento,                                      temperatura=temperatura,                                      max_new_tokens=max_new_tokens,                                      usa_cache=usa_cache,                                      **parametri)        return risposta    def continua_chat(self,                      richiesta: str,                      esegui_campionamento=True,                      temperatura=0.2,                      max_new_tokens=1024,                      usa_cache=True,                      **parametri) -> str:        """Continua la chat esistente."""        if self.conv is None:            raise RuntimeError("Nessuna conversazione esistente trovata. Avviare una nuova"                               "conversazione utilizzando il metodo `avvia_nuova_chat`.")        self.conv.append_message(self.ruoli[0], richiesta)        self.conv.append_message(self.ruoli[1], None)        risposta = self.genera_risposta(esegui_campionamento=esegui_campionamento,                                      temperatura=temperatura,                                      max_new_tokens=max_new_tokens,                                      usa_cache=usa_cache,                                      **parametri)        return risposta

Se sei familiare con la libreria transformers, riconoscerai molte delle caratteristiche comuni e le operazioni eseguite dovrebbero essere facili da capire. Scopriamo rapidamente i metodi della classe LLaVAChatBot definiti sopra.

  • load_models: questo metodo carica i modelli di linguaggio, il tokenizer e il processore di immagini con i parametri specificati per la quantizzazione utilizzando la libreria BitsAndBytes. Il codice fa uso del metodo from_pretrained utilizzato dai modelli dei transformers di Hugging Face. BitsAndBytes consente di quantizzare il modello a 8 bit o a 4 bit per ridurre i requisiti di memoria della GPU.
  • setup_image: carica l’immagine da un percorso locale o da un URL e la converte in un tensore utilizzando il processore di immagini.
  • generate_answer: questo metodo restituisce la risposta del modello continuando la conversazione corrente sull’immagine fornita. Ancora una volta, il metodo generate del modello LLaVa è analogo al metodo generate dei modelli dei transformers di Hugging Face.
  • get_conv_text: questo metodo restituisce il testo grezzo della conversazione fino a quel punto.
  • start_new_chat: questo è uno dei due principali metodi del chatbot, viene utilizzato per avviare una nuova conversazione con il modello. Crea una nuova conversazione data l’immagine e il prompt iniziale da passare al modello. Si occupa di impostare la conversazione utilizzando i template definiti nel repository seguendo il formato discusso nella sezione precedente.
  • continue_chat: l’altro metodo principale, continua una conversazione esistente sull’immagine.

Ho fornito il codice completo in questo notebook Colab in modo che tu possa provarlo tu stesso.

Esempi

In questa sezione, raccoglierò alcuni esempi interessanti ottenuti durante i test delle capacità del modello. Tutti gli esempi in questo post sono stati creati utilizzando il modello llava-v1.5-7b con quantizzazione a 8 bit.

Per cominciare, vediamo le capacità del modello di descrivere e comprendere le immagini. Di seguito ho chiesto al modello di descrivere un’immagine raffigurante una tigre bianca.

Foto di Joshua J. Cotten su Unsplash
Una chat tra un utente curioso e un assistente di intelligenza artificiale. L'assistente fornisce risposte utili, dettagliate e cortesi alle domande dell'utente. UTENTE: <im_start><image><im_end>Descrivi l'immagine nei dettagli. ASSISTENTE: L'immagine mostra una tigre bianca distesa su una superficie rocciosa, probabilmente un muro di pietra o una roccia. La tigre sembra rilassata e a suo agio nel suo ambiente. La posizione della tigre copre una parte significativa dell'immagine, dal lato sinistro fino quasi a tutto il lato destro. La superficie rocciosa fornisce uno sfondo naturale e accidentato per la scena.</s></s>UTENTE: Cosa rende unica questa tigre? ASSISTENTE: Questa tigre è unica perché è una tigre bianca, che è una variazione estremamente rara e visivamente impressionante della specie. Le tigri bianche sono nate con una mutazione genetica che fa sì che il loro pelo sia prevalentemente bianco, mentre il resto del corpo è una miscela di strisce arancioni e nere. Questo aspetto distintivo le distingue dalle tigri comuni a strisce arancioni e nere.</s></s>

Il modello sembra essere in grado di descrivere l’immagine in dettaglio e anche di ragionare sul soggetto dell’immagine, valutando correttamente che una tigre bianca è un evento raro.

Successivamente, ho testato se il modello è in grado di fornire all’utente istruzioni pratiche per svolgere varie attività. Questo è ciò che distingue un modello di “captioning” da un vero assistente di chat per la visione. Ad esempio, può il modello fornire ricette dagli ingredienti presenti in un’immagine? Il risultato è riportato di seguito.

Foto di ThermoPro su Unsplash
Una chat tra un utente curioso e un assistente virtuale. L'assistente fornisce risposte utili, dettagliate e educate alle domande dell'utente. UTENTE: <im_start><image><im_end>Cosa posso cucinare con questi ingredienti? ASSISTENTE: Con gli ingredienti mostrati sul tavolo, puoi preparare una deliziosa cena arrosto. La carne, che è un pezzo grande di manzo, può essere condita e cotta in forno, mentre le verdure, incluse carote, patate e cipolle, possono essere arrostite insieme alla carne. Puoi anche preparare un contorno con le patate, carote e cipolle, che può essere servito insieme alla cena arrosto. La presenza di una ciotola di salsa suggerisce che puoi usarla come salsa per intingere o per esaltare i sapori dell'arrosto e delle verdure. Nel complesso, questa combinazione di ingredienti offre un pasto abbondante e saporito che può essere apprezzato con famiglia e amici.</s></s>UTENTE: La ricetta che hai suggerito può essere inclusa in una dieta vegetariana? ASSISTENTE: La ricetta che ho suggerito, che prevede l'arrosto di un grosso pezzo di manzo e verdure, non è adatta a una dieta vegetariana. La carne è la principale fonte di proteine del piatto e non è adatta ai vegetariani che evitano di consumare carne. Tuttavia, puoi comunque creare un pasto adatto ai vegetariani utilizzando le verdure e la salsa disponibili sul tavolo. Ad esempio, puoi preparare un arrosto di verdure con carote, patate e cipolle e servirlo insieme a un contorno di purè di patate o una salsa a base di verdure. In questo modo, puoi comunque gustare i sapori e le consistenze del piatto senza includere la carne.</s></s>UTENTE: Puoi suggerire una ricetta vegetariana con modifiche minime agli ingredienti rappresentati? ASSISTENTE: Certamente! Ecco una ricetta vegetariana che può essere realizzata utilizzando gli ingredienti presenti sul tavolo: Medley di Verdure Arrosto con SalsaIngredienti:* Carote* Patate* Cipolle* Olio d'oliva* Sale* Pepe* Erbe aromatiche (come timo, rosmarino o prezzemolo)* Salsa (opzionale)Istruzioni:1. Preriscalda il forno a 200°C.2. Sbuccia e lava carote, patate e cipolle. Tagliale a pezzi di dimensioni mordi-e-fuggi.3. In una grande ciotola, condisci le verdure con olio d'oliva, sale e pepe.4. Disponi le verdure uniformemente su una teglia ricoperta da carta da forno.5. Cuoci le verdure nel forno preriscaldato per 20-25 minuti, o finché saranno tenere e leggermente dorate.6. Se desideri, prepara una salsa combinando ingredienti come pomodori, aglio e erbe aromatiche. Puoi utilizzare questa salsa come salsa per intingere o per esaltare i sapori delle verdure arrosto.7. Servi il medley di verdure arrosto insieme a un contorno di purè di patate o una salsa a base di verdure.Questa ricetta vegetariana ti permette di gustare i sapori e le consistenze delle verdure arrosto senza includere la carne. La salsa può essere facilmente personalizzata secondo le tue preferenze, e il piatto può essere accompagnato da una varietà di contorni, come il purè di patate o una salsa a base di verdure.</s></s>

Sembra che il modello abbia una buona comprensione degli ingredienti presenti nell’immagine ed è anche in grado di collegare le singole parole a concetti più astratti (ad esempio, un pasto con carne non è vegetariano).

Vediamo ora come il modello può essere utilizzato per ottenere consigli. Questa è una caratteristica utile per ottenere nuove idee durante una fase di brainstorming e può fornire un vero valore all’utente. Nella conversazione seguente ho chiesto al modello suggerimenti per cambiare l’aspetto di un café.

Foto di Michał Mancewicz su Unsplash
Una chat tra un utente curioso e un assistente virtuale. L'assistente fornisce risposte utili, dettagliate e educate alle domande dell'utente. UTENTE: <im_start><image><im_end>Come posso rinnovare questo café per renderlo più vintage? ASSISTENTE: Per rendere il café dall'aspetto più vintage, puoi considerare i seguenti cambiamenti:1. Aggiorna l'illuminazione: Sostituisci l'attuale illuminazione con lampade o lanterne in stile vintage, che creeranno un'atmosfera calda e accogliente.2. Aggiungi decorazioni vintage: Incorpora oggetti d'antiquariato, come orologi vintage, opere d'arte o piatti decorativi, per creare un'ambientazione nostalgica.3. Utilizza mobili in stile vintage: Sostituisci gli sgabelli attuali con sedie o sgabelli in stile vintage, che possono aggiungere carattere e fascino allo spazio.4. Includi piante: Aggiungi più verde, come piante in vaso o rampicanti, per creare un'atmosfera lussureggiante e invitante.5. Aggiorna il bancone: Sostituisci il bancone attuale con un bancone in stile vintage, completo di retrobanco e piano ispirati al vintage.6. Utilizza bicchieri in stile vintage: Sostituisci i bicchieri attuali con bicchieri in stile vintage, come calici per il vino, boccali per la birra o shaker per cocktail.7. Aggiungi segnaletica in stile vintage: Sostituisci la segnaletica attuale con lavagne o insegne in stile vintage, che possono aggiungere un tocco di nostalgia allo spazio.8. Utilizza carta da parati o pittura in stile vintage: Applica carta da parati o pittura in stile vintage alle pareti, per creare un'atmosfera unica e affascinante. Implementando questi cambiamenti, il café apparirà più vintage e invitante, creando un'esperienza memorabile per i suoi clienti.</s></s>

Il consiglio sembra pertinente, anche se abbastanza generico, identificando gli elementi attuali che potrebbero essere modificati per conferire uno stile più vintage.

Continuiamo con qualcosa di pratico che possa aiutare gli utenti nelle loro attività quotidiane. Il modello può aiutare a scrivere annunci o elenchi?

Foto di Eugene Chystiakov su Unsplash
Una conversazione tra un utente curioso e un assistente di intelligenza artificiale. L'assistente fornisce risposte utili, dettagliate e cortesi alle domande dell'utente. UTENTE: <im_start><image><im_end>Scrivi un annuncio per questa sedia ASSISTENTE: Presentiamo la moderna e elegante sedia nera e di legno, perfetta per qualsiasi ambiente contemporaneo. Questa sedia presenta un sedile nero elegante e una base di legno, creando un contrasto sorprendente su qualsiasi sfondo. Il suo design minimalista la rende un'aggiunta versatile a qualsiasi stanza, che sia utilizzata come sedia da pranzo, come tavolino o come pezzo forte in uno spazio living. La robusta costruzione della sedia garantisce che possa resistere all'uso quotidiano, mentre le sue linee pulite e l'aspetto elegante conferiscono un tocco di raffinatezza a qualsiasi ambiente. Aggiorna il tuo spazio living con questa sedia elegante e funzionale oggi stesso.</s></s>UTENTE: Scrivi ora un annuncio per la stessa sedia, ma rivolto ai caffè ASSISTENTE: Attenzione proprietari di caffè e appassionati di design! Presentiamo la sedia nera e di legno, l'aggiunta perfetta all'area di seduta del tuo caffè. Questa sedia elegante e funzionale offre un tocco moderno al tuo locale, con il sedile nero elegante e la base di legno che creano un contrasto sorprendente su qualsiasi sfondo. Il suo design minimalista la rende una scelta versatile per qualsiasi ambiente caffè, che sia utilizzata come sedia da pranzo, come tavolino o come pezzo forte in un'area lounge. La robusta costruzione della sedia garantisce che possa resistere all'uso quotidiano, mentre le sue linee pulite e l'aspetto elegante conferiscono un tocco di raffinatezza a qualsiasi ambiente. Aggiorna l'atmosfera del tuo caffè con questa sedia elegante e funzionale oggi stesso.</s></s>

Il modello è in grado di individuare correttamente le caratteristiche della sedia e crea un annuncio accattivante, personalizzando correttamente la risposta per diversi target quando richiesto.

Come ultimo test, vediamo se le tecniche di sollecitazione che si sono dimostrate vantaggiose per i Large Language Models possono essere utilizzate anche con LLaVA. Di seguito è riportato un esempio di tentativo di sollecitazione zero-shot Chain of Thought.

Foto di Arnold Middelkoop su Unsplash
Una conversazione tra un utente curioso e un assistente di intelligenza artificiale. L'assistente fornisce risposte utili, dettagliate e cortesi alle domande dell'utente. UTENTE: <im_start><image><im_end>Il pesce raffigurato nell'immagine galleggerebbe se fosse gettato in acqua? Pensa passo dopo passo. ASSISTENTE: Il pesce raffigurato nell'immagine è una grande scultura o statua di pesce bianco, che giace a terra su un vialetto di mattoni vicino a un corpo d'acqua. Se fosse gettato nell'acqua, il pesce non galleggerebbe perché è un oggetto solido e inanimato. Affonderebbe sul fondo dell'acqua, poiché non è galleggiante a causa della sua composizione e dimensione. La posizione del pesce a terra e la sua mancanza di galleggiabilità rendono impossibile che galleggi sull'acqua.</s></s>UTENTE: Quale materiale potrebbe essere utilizzato per realizzare una scultura di pesce che galleggia sull'acqua? ASSISTENTE: Per realizzare una scultura di pesce che galleggia sull'acqua, si potrebbe utilizzare un materiale leggero e galleggiante come polistirene espanso o schiuma di polietilene. Questi materiali sono comunemente utilizzati per realizzare oggetti galleggianti come giubbotti di salvataggio, dispositivi di flottazione e galleggianti da pesca. Modellando la schiuma nella forma del pesce desiderato, riuscirebbe a galleggiare sulla superficie dell'acqua, simulando il comportamento di un vero pesce.</s></s>

Il modello è in grado di spiegare perché il pesce non galleggerebbe, identificando correttamente che non si tratta di un pesce vero. Segue anche l’istruzione di pensare passo dopo passo prima di dare la risposta finale. A titolo di confronto, ecco un esempio di conversazione senza il prompt “Pensa passo dopo passo”.

Una chat tra un utente curioso e un assistente di intelligenza artificiale. L'assistente fornisce risposte utili, dettagliate e cortesi alle domande dell'utente.
UTENTE: <im_start><image><im_end>Galleggia il pesce raffigurato nell'immagine se gettato nell'acqua?
ASSISTENTE: No, il pesce raffigurato nell'immagine non galleggerebbe se gettato nell'acqua. Si tratta di una grande scultura di pesce in pietra bianca, che non è un vero pesce e non possiede le proprietà di galleggiamento di un pesce naturale.</s></s>

Sebbene la risposta finale sia corretta, in questo caso l'esplicazione fornita è molto meno dettagliata e la risposta è data all'inizio della frase. Poiché il modello di linguaggio generativo utilizzato da LLaVA è causale, ciò significa che la risposta fornita non si basa sulla spiegazione successiva. Sarebbe interessante effettuare esperimenti più estesi per testare se Chain of Thought (CoT) possa, in generale, migliorare le prestazioni dei modelli vistalinguistici in compiti di ragionamento complessi simili a quanto osservato per i Large Language Models in Chain-of-Thought Prompting Elicits Reasoning in Large Language Models e Large Language Models are Zero-Shot Reasoners.

Limitazioni

LLaVA è molto potente, ma ha le sue limitazioni. Ad esempio, il modello è stato addestrato a utilizzare solo un'immagine per chat, quindi non è in grado di gestire conversazioni più complesse che richiedono interazioni con più immagini. Tuttavia, è importante notare che questa limitazione non è intrinseca all'architettura del modello e può essere corretta includendo dati di chat con più immagini durante l'addestramento. Durante i test, ho notato che il modello (almeno la versione quantizzata a 8 bit del modello 1.5 7b) ha difficoltà nel conteggio degli elementi in un'immagine e in generale nel gestire compiti numerici. Di seguito è riportato un esempio. A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions. UTENTE: <im_start><image><im_end>Quante auto ci sono nel parcheggio? ASSISTENTE: Ci sono diverse auto parcheggiate nel parcheggio.</s></s> UTENTE: Elenca i numeri dei posti occupati dalle auto. ASSISTENTE: I posti occupati dalle auto sono 66, 67, 68, 69, 70 e 71.</s></s> Il modello, come tutti i Large Language Models, è anche incline alle allucinazioni e può essere facilmente ingannato commettendo errori utilizzando prompt appropriati. Ad esempio, se gli viene fornita un'immagine del deserto e gli viene chiesto quale specie è il pesce nell'immagine, l'assistente allucina un pesce del deserto. A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions. UTENTE: <im_start><image><im_end>Dimmi quale specie è il pesce in questa immagine. ASSISTENTE: Il pesce in questa immagine è un pesce del deserto, una specie adattata a vivere in ambienti desertici.</s></s>

Conclusioni

LLaVA mostra una notevole capacità nella comprensione visione-linguaggio. Segna un chiaro passo avanti per modelli multimodali visione-linguaggio open source. Uno dei più grandi vantaggi di LLaVA è che è leggero da addestrare e affinare. Ad esempio, la formazione completa di LLaVA 1.5 13b ha richiesto solo 1,2M di dati e circa 1 giorno su un singolo nodo 8-A100. Ciò lo rende adatto per l’affinamento su domini specifici al fine di ottenere un assistente esperto, come è stato fatto, ad esempio, in LLaVA-Med: Addestramento di un grande assistente linguaggio-visione per la biomedicina in un solo giorno.

L’aggiunta di capacità di visione agli assistenti chat amplia l’area di applicazione di tali modelli, portando il loro potenziale rivoluzionario a compiti più complessi e sfumati. Trattare le caratteristiche delle immagini come token linguistici apre anche la possibilità di utilizzare tutte le tecniche avanzate di richiesta utilizzate con modelli di linguaggio solo testo e di espanderle ulteriormente. Ad esempio, si potrebbe ampliare la potenza di Generazione Arricchita da Recupero recuperando sia testi che immagini rilevanti per la conversazione. Infatti, utilizzando lo spazio di incorporamento immagine-testo condiviso di CLIP, è possibile recuperare documenti esterni ed immagini esterne a partire da un testo o una foto di input!

Un’altra direzione interessante per ampliare le capacità del modello è presentata in LLaVA-Interactive: Una demo completa per Chat, Segmentazione, Generazione e Modifica di Immagini. L’idea principale è quella di combinare le diverse capacità dei modelli di chat visione-linguaggio, dei modelli generativi di testo-immagine e degli altri modelli di visione (come i modelli di segmentazione delle immagini) per ottenere un assistente in grado di gestire input multimodali e generare output multimodali.

In conclusione, LLaVA ha segnato un passo importante per i modelli generativi multimodali open source, che hanno dimostrato notevoli capacità e stanno attirando molto interesse. Con l’adozione sempre più diffusa di modelli open source, credo che assisteremo presto a un rapido aumento delle nuove applicazioni di questi potenti modelli.

Grazie per aver letto! Se vuoi provare il codice tu stesso, puoi dare un’occhiata a questo notebook di Colab.