Usa Pixtral 12B per query AI multimodali in Python con watsonx

In questo tutorial scoprirai come applicare il modello multimodale Pixtral 12B di Mistral AI ora disponibile su watsonx.ai per attività multimodali come l'aggiunta delle didascalie e la risposta visiva a domande.

Pixtral 12B

Nel settembre 2024, Mistral AI ha lanciato Pixtral 12B, un modello linguistico di grandi dimensioni (LLM) open-source con licenza Apache 2.0.

Con 12 miliardi di parametri, il modello multimodale è costruito sul Nemo 12B LLM di Mistral AI. Pixtral 12B ha due componenti: il codificatore di visione per tokenizzare le immagini e un decodificatore a trasformatore multimodale per prevedere il seguente token di testo data una sequenza di testo e immagini. Il codificatore di visione ha 400 milioni di parametri e supporta dimensioni di immagine variabili.

Il modello eccelle in molteplici casi d'uso, inclusa la comprensione di grafici, diagrammi, grafici e documenti ad alta risoluzione, che possono essere utilizzati per compiti di risposta a domande documentali, seguito di istruzioni o retrieval-augmented generation (RAG) (RAG) compiti. Inoltre, Pixtral 12B ha una finestra contestuale da 128.000 token, che consente il consumo simultaneo di più immagini.

In termini di benchmark, Pixtral 12B supera vari modelli, tra cui Qwen2-VL, Gemini-1.5 Flash 8B e Claude-3 Haiku. Per alcuni benchmark, tra cui DocVQA (ANLS) e VQAv2 (VQA Match), il modello supera GPT-4o di OpenAI e Claude-3.5 Sonnet.

Oltre a poter eseguire Pixtral 12B su watsonx.ai, il modello è disponibile anche tramite Hugging Face, su Le Chat, il chatbot conversazionale di Mistral, o con endpoint API tramite La Plateforme di Mistral.

Passaggi

Consulta questo video di IBM Tecnologia su YouTube che ti guida attraverso le seguenti istruzioni di configurazione nei passaggi 1 e 2.

Passaggio 1. Configurare il tuo ambiente

Sebbene sia possibile scegliere tra diversi strumenti, questo tutorial è più adatto a un Jupyter Notebook. I Jupyter Notebook sono ampiamente utilizzati nella data science per combinare codice con varie fonti di dati come testo, immagini e visualizzazioni dei dati.

Questo tutorial ti guida come configurare un account IBM per utilizzare un Jupyter Notebook.

  1. Accedi a watsonx.ai usando il tuo account IBM Cloud. Ricordache Pixtral 12B è attualmente disponibile solo nelle regioni IBM Europe di Francoforte e Londra.

  2. Crea un progetto watsonx.ai.

    Puoi ottenere l'ID del tuo progetto dall'interno del tuo progetto. Clicca sulla scheda Gestisci. Quindi, copia l'ID del progetto dalla sezione Dettagli della pagina Generali. Per questo tutorial ti serve questo ID.

  3. Crea un Jupyter Notebook.

    Questo passaggio aprirà un ambiente notebook in cui potrai copiare il codice da questo tutorial per implementare autonomamente la regolazione del prompt. In alternativa, puoi scaricare questo notebook sul tuo sistema locale e caricarlo nel tuo progetto watsonx.ai come asset. Questo Jupyter Notebook insieme ai set di dati utilizzati sono disponibili su GitHub.

    Per evitare conflitti di dipendenza tra pacchetti Python, consigliamo di impostare un ambiente virtuale.

Passaggio 2. Configura un servizio watsonx.ai runtime e una chiave API

  1. Crea un'istanza di servizio watsonx.ai Runtime (scegli il piano Lite, che è un'istanza gratuita).
  2. Genera una chiave API.
  3. Associa il servizio watsonx.ai Runtime al progetto che hai creato in watsonx.ai.

Passaggio 3. Installare e importare le librerie pertinenti e configurare le tue credenziali

Abbiamo bisogno di alcune librerie e moduli per questo tutorial. Assicurati di importare le seguenti e, se non sono installate, puoi risolvere il problema con una rapida installazione pip.

#installations
%pip install image | tail -n 1
%pip install -U "ibm_watsonx_ai>=1.1.14" | tail -n 1

#imports
import requests
import base64
import getpass

from PIL import Image
from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai.foundation_models import ModelInference

Inserisci i WATSONX_EU_APIKEY  e WATSONX_EU_PROJECT_ID che hai creato nei passaggi 1 e 2 eseguendo la cella successiva. Imposteremo anche l'URL che funge da endpoint dell'API.

WATSONX_EU_APIKEY = getpass.getpass("Please enter your watsonx.ai Runtime API key (hit enter): ")
WATSONX_EU_PROJECT_ID = getpass.getpass("Please enter your project ID (hit enter): ")
URL = "https://eu-gb.ml.cloud.ibm.com"

Possiamo utilizzare la classe Credenziali per incapsulare le credenziali passate.

credentials = Credentials(
    url=URL,
    api_key=WATSONX_EU_APIKEY
)

Passaggio 4. Codificare le immagini

In questo tutorial lavoreremo con diverse immagini per applicazioni AI multimodali, come la didascalia delle immagini e il rilevamento degli oggetti. Puoi accedere alle immagini che utilizzeremo tramite i seguenti URL. Memorizziamo questi URL in un elenco per codificarli in modo iterativo.

url_image_1 = 'https://assets.ibm.com/it-it/is/image/ibm/img_2803copy?$original$'
url_image_2 = 'https://assets.ibm.com/it-it/is/image/ibm/img_2857?$original$'
url_image_3 = 'https://assets.ibm.com/it-it/is/image/ibm/1ab001c5-751d-45aa-8a57-d1ce31ea0588?$original$'
url_image_4 = 'https://assets.ibm.com/it-it/is/image/ibm/langchain?$original$&fmt=png-alpha'

image_urls = [url_image_1, url_image_2, url_image_3, url_image_4]

Per comprendere meglio i nostri dati di input, mostriamo le immagini.

for idx, url in enumerate(image_urls):
    print(f'url_image_{idx}')
    display(Image.open(requests.get(url, stream=True).raw))

Output

url_image_0

Un campo di fiori rosa

url_image_1

Una donna che lavora con il suo notebook

url_image_2

Una donna e la sua macchina sulla neve

url_image_3

Un diagramma

Per codificare queste immagini in modo digeribile per l'LLM, codificheremo le immagini in byte che poi decoderemo in rappresentazione UTF-8.

encoded_images = []

for url in image_urls:
    encoded_images.append(base64.b64encode(requests.get(url).content).decode("utf-8"))

Passaggio 5. Configura la richiesta API e l'LLM

Ora che le nostre immagini possono essere passate al LLM, configuriamo una funzione per le chiamate API Watsonx. La funzione augment_api_request_body prende la query utente e l'immagine come parametri e completa il corpo della richiesta API. Utilizzeremo questa funzione in ogni iterazione.

def augment_api_request_body(user_query, image):
    messages = [
        {
            "role": "user",
            "content": [{
                "type": "text",
                "text": 'You are a helpful assistant. Answer the following user query in 1 or 2 sentences: ' + user_query
            },
            {
                "type": "image_url",
                "image_url": {
                    "url": f"data:image/jpeg;base64,{image}",
                }
            }]
        }
    ]

return messages

Istanziamo l'interfaccia del modello usando la classe ModelInference. In questo tutorial useremo il modello mistralai/pixtral-12b.

model = ModelInference(
    model_id="mistralai/pixtral-12b",
    credentials=credentials,
    project_id=WATSONX_EU_PROJECT_ID,
    params={
        "max_tokens": 200
        }
    )

Passaggio 6. Acquisizione delle immagini

Ora possiamo scorrere le nostre immagini per vedere le descrizioni di testo prodotte dal modello in risposta alla domanda "Cosa sta succedendo in questa immagine?"

for i in range(len(encoded_images)):
        image = encoded_images[i]
        user_query = "What is happening in this image?"
        messages = augment_api_request_body(user_query, image)
        response = model.chat(messages=messages)
        print(response['choices'][0]['message']['content'])

Output

L'immagine raffigura un campo di fiori colorato in piena fioritura sotto un cielo azzurro e limpido, con il sole che splende luminoso, creando una scena serena e pittoresca.

Nell'immagine, una persona è seduta a un tavolo e utilizza un laptop tenendo in mano una carta di credito. Ci sono delle mele in una ciotola sul tavolo accanto al laptop.

Una persona è in piedi accanto a un'auto coperta di neve, e tiene un ombrello rosso per proteggersi dalla neve che cade.

L'immagine rappresenta un workflow per elaborare e memorizzare dati, probabilmente per il machine learning o l'analisi dei dati. Inizia con il caricamento dei dati sorgente (come documenti HTML o XML), la trasformazione dei dati in un formato adatto, l'embedding in vettori numerici, l'archiviazione di questi vettori in un database vettoriale e infine il recupero dei dati quando necessario.

Il modello Pixtral 12B è riuscito ad aggiungere la didascalia di ogni immagine con un dettaglio significativo.

Passaggio 7. Rilevamento degli oggetti

Ora che abbiamo dimostrato la capacità del modello di eseguire didascalie delle immagini nel passaggio precedente, poniamo al modello alcune domande che richiedono il rilevamento degli oggetti. Per quanto riguarda la seconda immagine, quella che raffigura la donna che fa acquisti online, chiederemo al modello: "Cosa ha la donna in mano?"

image = encoded_images[1]
user_query = "What does the woman have in her hand?"
messages = augment_api_request_body(user_query, image)
response = model.chat(messages=messages)
print(response['choices'][0]['message']['content'])

Output: La donna tiene una carta di credito in mano.

Il modello ha identificato correttamente l'oggetto nella mano della donna. Ora, chiediamo informazioni sul problema nell'immagine dell'auto coperta di neve.

image = encoded_images[2]
user_query = "What is likely the issue with this car?"
messages = augment_api_request_body(user_query, image)
response = model.chat(messages=messages)
print(response['choices'][0]['message']['content'])

Output: L'auto probabilmente è bloccata nella neve, il che rende difficile o impossibile spostarla.

Questa risposta evidenzia il valore dell'AI multimodale in ambiti come l'assicurazione. Il modello è riuscito a rilevare il problema dell'auto bloccata nella neve. Potrebbe essere uno strumento estremamente efficace per migliorare i tempi di elaborazione delle richieste assicurative.

Poi chiediamo al modello quali sono i passaggi dell'immagine del diagramma di flusso.

image = encoded_images[3]
user_query = "Name the steps in this diagram"
request_body = augment_api_request_body(user_query, image)
messages = augment_api_request_body(user_query, image)
response = model.chat(messages=messages)
print(response['choices'][0]['message']['content'])

Output: Il diagramma illustra un workflow che prevede diversi passaggi: "Carica", "Trasforma", "Incorpora", "Memorizza" e "Recupera." Questa sequenza probabilmente rappresenta un workflow per elaborare e memorizzare dati, trasformandoli in vettori incorporati per un storage e un recupero efficienti.

Fantastico! Il modello era in grado di individuare oggetti all'interno delle immagini a seguito delle richieste degli utenti. Ti invitiamo a provare altre query per dimostrare ulteriormente le prestazioni del modello.

Riepilogo

In questo tutorial, hai usato il modello Pixtral 12B per eseguire operazioni multimodali, inclusi i sottotitoli delle immagini e la risposta visiva a domande.

Per provare altri modelli multimodali, dai un'occhiata a questo tutorial sul modello multimodale Llama 3.2 di Meta su watsonx.ai.

Soluzioni correlate
IBM watsonx.ai

Addestra, convalida, adatta e implementa le funzionalità di AI generativa, foundation model e machine learning con IBM watsonx.ai, uno studio aziendale di nuova generazione per builder AI. Crea applicazioni AI in tempi ridotti e con una minima quantità di dati.

Scopri watsonx.ai
Soluzioni di intelligenza artificiale

Metti l'AI al servizio della tua azienda grazie all'esperienza leader di settore e alla gamma di soluzioni di IBM nel campo dell'AI.

Esplora le soluzioni AI
Servizi AI

Reinventa i flussi di lavoro e le operazioni critiche aggiungendo l'AI per massimizzare le esperienze, il processo decisionale in tempo reale e il valore di business.

Esplora i servizi AI
Fai il passo successivo

Ottieni l'accesso completo a funzionalità che coprono l'intero ciclo di vita dello sviluppo dell'AI. Crea soluzioni AI all'avanguardia con interfacce intuitive, workflow e accesso alle API e agli SDK standard di settore.

Esplora watsonx.ai Prenota una demo live