Blog Viewer

Invocazione di un Modello LLM sul Servizio IBM Watsonx.ai Utilizzando IBM Cloud Code Engine

By Paolo Bianchini posted Mon November 20, 2023 03:00 AM

  

In questo post, esploreremo il processo di chiamata di un modello LLM (Linguistic Language Model) tramite il servizio IBM Watsonx.ai, sfruttando la potenza e la flessibilità di IBM Cloud Code Engine. Vedremo come integrare efficientemente questa soluzione nella nostra architettura cloud, ottimizzando le risorse e garantendo prestazioni affidabili per le nostre applicazioni basate su linguaggio naturale.

Intro

I modelli linguistici stanno diventando sempre più popolari per compiti di comprensione e generazione del linguaggio naturale. IBM Watsonx.ai è un servizio basato su cloud che offre accesso a potenti modelli linguistici, come i Large Language Models (LLM). Watsonx.ai fa parte della piattaforma IBM watsonx, che unisce nuove capacità di intelligenza artificiale generativa, alimentate da modelli di base e apprendimento automatico tradizionale, in un potente ambiente che copre l'intero ciclo di vita dell'IA. Con watsonx.ai, è possibile addestrare, convalidare, ottimizzare e distribuire facilmente intelligenza artificiale generativa, modelli di base e capacità di apprendimento automatico, riducendo i tempi di sviluppo e l'utilizzo di dati in modo significativo. In questo articolo, spiegheremo un codice Python che interagisce con un LLM ospitato su IBM Watsonx.ai utilizzando IBM Cloud Code Engine. Questo codice crea un'interfaccia di chatbot semplice per interagire con il modello.

Prerequisiti

Prima di immergerti nel codice, assicurati di avere i seguenti prerequisiti:

  1. Account IBM Cloud: Avrai bisogno di un account IBM Cloud per accedere al servizio Watsonx.ai e a IBM Cloud Code Engine.
  2. ID Progetto: All'interno del tuo account IBM Cloud, effettuerai il deployment del servizio Watsonx, creerai un progetto e lo assocerai a un servizio Watson Machine Learning.
  3. Chiave API: Per utilizzare la libreria Python dei modelli di base, avrai bisogno di una chiave API IBM Cloud. Puoi crearne una nel tuo account IBM Cloud. Per creare una chiave API per la tua identità utente nella console IBM Cloud, vai su Gestisci > Accesso (IAM) > Chiavi API e clicca su Crea una chiave API IBM Cloud. Per motivi di sicurezza, la chiave API è disponibile solo per essere copiata o scaricata al momento della creazione. Se la chiave API viene persa, dovrai crearne una nuova.
  4. IBM Cloud Code Engine: Configura un ambiente IBM Cloud Code Engine per eseguire questo codice

Il Codice Python

Si tratta di una semplice applicazione di chatbot creata utilizzando la libreria Streamlit.

import streamlit as st
from ibm_watson_machine_learning.foundation_models import Model
import json
import os

st.title('Watsonx Chatbot 🤖')
st.caption("🚀 A chatbot powered by watsonx.ai - rel 13")

with st.sidebar:
    watsonx_api_key = st.text_input("Watsonx API Key", key="watsonx_api_key", value=os.environ.get("API_KEY"), type="password")
    watsonx_url = st.text_input("Watsonx URL", key="watsonx_url", value="https://us-south.ml.cloud.ibm.com", type="default")   
    #TODO: change this to a select box with more than one model
    watsonx_model = st.text_input("Model", key="watsonx_model", value="meta-llama/llama-2-70b-chat", type="default")   
    watsonx_model_params = st.text_input("Params", key="watsonx_model_params", value='{"decoding_method":"sample", "max_new_tokens":200, "temperature":0.5}', type="default" )
if not watsonx_api_key:
    st.info("Please add your watsonx API key to continue.")
else :
    st.info("setting up to use: " + watsonx_model)
    my_credentials = { 
        "url"    : watsonx_url, 
        "apikey" : watsonx_api_key
    }
    params = json.loads(watsonx_model_params)      
    project_id  = os.environ.get("PRJ_ID")
    space_id    = None
    verify      = False
    model = Model( watsonx_model, my_credentials, params, project_id, space_id, verify )   
    if model :
        st.info("done")
 
if 'messages' not in st.session_state: 
    st.session_state.messages = [{"role": "assistant", "content": "How can I help you?"}] 

for message in st.session_state.messages: 
    st.chat_message(message['role']).markdown(message['content'])

prompt = st.chat_input('Pass Your Prompt here')

if prompt: 
    st.chat_message('user').markdown(prompt)
    st.session_state.messages.append({'role':'user', 'content':prompt})
    if model :
        response = model.generate_text(prompt)
    else :
        response = "You said: " + prompt
    
    st.chat_message('assistant').markdown(response)
    st.session_state.messages.append({'role':'assistant', 'content':response})

Analizziamo il codice Python passo dopo passo:

  1. Importazione delle Dipendenze: Il codice inizia importando le librerie necessarie, tra cui Streamlit per la creazione dell'interfaccia del chatbot e la libreria ibm_watson_machine_learning per interagire con il servizio Watsonx.ai.
  2. Configurazione di Streamlit: Viene creata un'applicazione Streamlit con un titolo e una didascalia per fornire informazioni sul chatbot.
  3. Input nella Barra Laterale: Il codice crea una barra laterale con campi di input per la chiave API di Watsonx, l'URL di Watsonx, il nome del modello e i parametri del modello. La chiave API può essere inserita manualmente o fornita come variabile di ambiente. L'URL predefinito di Watsonx è impostato su "https://us-south.ml.cloud.ibm.com", e vengono forniti anche il nome del modello e i parametri.
  4. Credenziali e Inizializzazione del Modello: Se viene fornita la chiave API, il codice configura le credenziali di Watsonx e inizializza il modello utilizzando la chiave API, l'URL, il nome del modello e i parametri forniti. Verifica anche gli ID del progetto e dello spazio.
  5. Storico dei Messaggi: Una variabile di stato di sessione, "messages", viene utilizzata per memorizzare la cronologia della conversazione del chatbot. Se questa variabile non esiste, viene inizializzata con un messaggio predefinito dal chatbot.
  6. Interazione con l'Utente: Il codice gestisce l'interazione dell'utente consentendo loro di inserire prompt. Quando un utente inserisce un prompt, viene aggiunto alla cronologia della chat, e il chatbot genera una risposta utilizzando il modello inizializzato.
  7. Generazione di Risposte: Se il modello viene inizializzato con successo, il prompt dell'utente viene utilizzato per generare una risposta dal modello. Se l'inizializzazione del modello fallisce, viene generata una semplice risposta di eco.
  8. Visualizzazione delle Risposte: L'input dell'utente e la risposta del chatbot vengono visualizzati nell'interfaccia della chat

Esecuzione del Codice su IBM Cloud Code Engine

Il deployment di un'applicazione da un repository Git su IBM Cloud Code Engine è un processo diretto che sfrutta l'integrazione della piattaforma con i sistemi di controllo del codice basati su Git. Per iniziare, è necessario creare un progetto su IBM Cloud Code Engine. All'interno del progetto sarai in grado di creare un'applicazione e connetterla al tuo repository Git. Una volta connessa, è possibile configurare trigger di deployment per compilare e distribuire automaticamente l'applicazione ogni volta che vengono apportate modifiche al ramo specificato del repository Git. Questa integrazione semplifica il processo di deployment, garantendo che l'applicazione sia sempre aggiornata con le ultime modifiche al codice.

Per il deployment della nostra applicazione, sceglieremo una build basata su Dockerfile. Una build Docker crea un container in base a come viene descritto nel Dockerfile. Il Dockerfile viene quindi committato insieme al codice sorgente per creare il container.

Sebbene tu possa utilizzare entrambe le strategie per la tua build, potresti scegliere Dockerfile, ad esempio, se:

  • Il tuo ambiente di sviluppo non è supportato da Buildpacks.
  • La build del tuo progetto deve installare pacchetti aggiuntivi nel container.

Questo Dockerfile è utilizzato per creare un'immagine Docker per l'esecuzione di un'applicazione Python utilizzando Streamlit. Streamlit è una popolare libreria Python per la creazione di applicazioni web con codice minimo, spesso utilizzata per la visualizzazione dei dati e interfacce web interattive.

# app/Dockerfile

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt ./
COPY *.py ./

RUN apt-get update && apt-get install -y \
    build-essential \
    curl \
    software-properties-common \
    git \
    && rm -rf /var/lib/apt/lists/*

RUN pip3 install -r requirements.txt

EXPOSE 8501

HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health

ENTRYPOINT ["streamlit", "run", "chat-app.py", "--server.port=8501", "--server.address=0.0.0.0"]

Analizziamo ogni sezione del Dockerfile:

1. FROM python:3.9-slim:
   - Questa linea specifica l'immagine Docker di base da utilizzare. In questo caso, è basata su Python 3.9-slim, una versione leggera di Python 3.9. Questa immagine è comunemente utilizzata per applicazioni Python per minimizzare la dimensione dell'immagine.

2. WORKDIR /app:
   - Questa linea imposta la directory di lavoro all'interno del container Docker su /app. Tutti i comandi successivi verranno eseguiti in questa directory.

3. COPY requirements.txt ./:
   - Questa linea copia il file requirements.txt dalla macchina host (la directory in cui si trova il Dockerfile) nella directory /app nel container. Questo file elenca tipicamente i pacchetti Python e le loro versioni richieste dall'applicazione. Nel nostro caso, il file delle esigenze conterrà due righe che fanno riferimento a: streamlit e ibm_watson_machine_learning.

4. COPY *.py ./:
   - Questa linea copia tutti i file Python (con estensione .py) dalla macchina host nella directory /app nel container. Questi sono i file del codice sorgente dell'applicazione.

5. RUN apt-get update && apt-get install -y ...:
   - Queste linee eseguono comandi del gestore di pacchetti Linux (`apt-get`) per aggiornare il repository dei pacchetti e installare diverse dipendenze di sistema necessarie per la compilazione e l'esecuzione dell'applicazione. Queste dipendenze includono build-essential, curl, software-properties-common e git. Dopo l'installazione, la cache dei pacchetti viene pulita (`rm -rf /var/lib/apt/lists/*`) per ridurre le dimensioni dell'immagine.

6. RUN pip3 install -r requirements.txt:
   - Questa linea utilizza pip3 per installare i pacchetti Python elencati in requirements.txt. Installa le librerie Python necessarie per l'esecuzione dell'applicazione Streamlit.

7. EXPOSE 8501:
   - Questa linea specifica che la porta 8501 deve essere esposta alla rete. Questa è la porta predefinita utilizzata dalle applicazioni Streamlit.

8. HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health:
   - Questa linea definisce un comando di controllo della salute per Docker. Utilizza curl per verificare lo stato di salute dell'applicazione tentando di accedere a un endpoint di salute specifico. Se il controllo della salute fallisce, il container viene considerato non sano.

9. ENTRYPOINT ["streamlit", "run", "chat-app.py", "--server.port=8501", "--server.address=0.0.0.0"]:
   - Questa linea specifica il comando che verrà eseguito quando il container Docker viene avviato. Esegue l'applicazione Streamlit chiamata chat-app.py e la configura per ascoltare sulla porta 8501 e accettare richieste da qualsiasi indirizzo di rete (`0.0.0.0`). Questo comando è ciò che avvia l'applicazione Streamlit quando il container Docker viene lanciato.

In sintesi, questo Dockerfile configura un ambiente per l'esecuzione di un'applicazione Python basata su Streamlit, installa le dipendenze di sistema e i pacchetti Python necessari, espone l'applicazione sulla porta 8501 e definisce un controllo della salute per il container Docker. Quando si crea e si esegue un container da questa immagine, verrà eseguita l'applicazione Streamlit specificata.

Passaggio di chiavi all'applicazione tramite variabili di ambiente utilizzano le configga

Inoltre, è possibile configurare variabili di ambiente, specificare configurazioni del container e ridimensionare l'applicazione secondo necessità, il tutto dall'interfaccia di IBM Cloud Code Engine. Questo consente agli sviluppatori di gestire e distribuire facilmente le proprie applicazioni con fiducia, sapendo che il loro codice è ospitato in modo sicuro nel cloud e può essere aggiornato senza soluzione di continuità tramite il repository Git.

Quando si distribuisce un'applicazione da un repository Git su IBM Cloud Code Engine, è essenziale sottolineare il valore di memorizzare informazioni sensibili, come chiavi API e ID progetto, come segreti all'interno del progetto Code Engine. Questi segreti possono essere condivisi in modo sicuro con l'applicazione facendo in modo che la piattaforma li inietti come variabili di ambiente nel contesto di esecuzione. Il valore aggiunto risiede nella sicurezza e nel controllo degli accessi della gestione dei segreti di IBM Cloud.

Memorizziamo le informazioni sensibili in una configga in modo da non doverle inserire nel codice.

Memorizzando i segreti come variabili di ambiente specifiche del progetto, si garantisce che le informazioni sensibili rimangano protette.

La gestione dei segreti di IBM Cloud è progettata per essere altamente sicura, con l'accesso limitato all'utente che li ha creati. Ciò significa che anche in un ambiente di sviluppo o deployment condiviso, solo gli utenti autorizzati possono accedere a questi segreti. Questo meccanismo di sicurezza robusto contribuisce a proteggere le credenziali sensibili, garantendo che non vengano esposte accidentalmente o a personale non autorizzato.

In sintesi, l'utilizzo della gestione dei segreti di IBM Cloud Code Engine per memorizzare e condividere chiavi API e ID progetto come variabili di ambiente fornisce uno strato di sicurezza robusto, garantendo che le informazioni sensibili rimangano confidenziali e accessibili solo a coloro che ne hanno bisogno, migliorando la postura complessiva della sicurezza della tua applicazione.

Gestione delle immagini docker e controlli di sicurezza

Una volta che l'immagine del container per la tua applicazione è stata creata, essa sarà pushata su IBM Cloud Container Registry. Il servizio IBM Cloud Container Registry offre una soluzione robusta e sicura per la gestione delle immagini Docker. Una delle sue caratteristiche più evidenti è l'Advisor di Vulnerabilità integrato, che migliora la sicurezza e la conformità delle immagini. Quando le immagini Docker vengono pushate su Container Registry, l'Advisor di Vulnerabilità le analizza automaticamente per individuare potenziali problemi di sicurezza e vulnerabilità. Esamina attentamente i pacchetti vulnerabili all'interno di specifiche immagini di base Docker e analizza le vulnerabilità note nelle impostazioni di configurazione dell'applicazione. Nel caso in cui vengano rilevate vulnerabilità, il servizio fornisce informazioni dettagliate su questi rischi di sicurezza. Questo feedback prezioso consente agli utenti di adottare misure proattive per risolvere prontamente i problemi di sicurezza, garantendo che i container non vengano distribuiti da immagini vulnerabili. Container Registry offre anche scalabilità e alta disponibilità, consentendo agli utenti di configurare il proprio spazio dei nomi di immagine all'interno di un registro privato multi-tenant, crittografato, ospitato e gestito da IBM. Gli utenti possono archiviare e condividere in modo sicuro immagini Docker private con altri nell'account IBM Cloud. Inoltre, Container Registry fornisce limiti di quota per storage e traffico di pull, inclusi storage e traffico di pull gratuiti fino a un limite specificato. Gli utenti possono impostare limiti di quota personalizzati per gestire in modo efficace il consumo di risorse, in linea con il proprio livello di pagamento preferito. Queste funzionalità combinate rendono IBM Cloud Container Registry una soluzione affidabile per la gestione, la sicurezza e la conformità delle immagini dei container

Goditi la tua conversazione con l'LLM

Per eseguire questo codice su IBM Cloud Code Engine:

  1. Deploy dell'Applicazione: Effettua il deployment del codice come un'applicazione Streamlit su IBM Cloud Code Engine. Assicurati di avere impostate le variabili di ambiente necessarie, inclusa la chiave API di Watsonx e l'ID del progetto.

  2. Accesso all'Applicazione: Una volta deployata, puoi accedere all'interfaccia del chatbot attraverso l'URL fornito.

  3. Interagisci con il Chatbot: Ora puoi interagire con il chatbot inserendo prompt nel campo di input. Il chatbot risponderà in base al modello LLM inizializzato.

Finestra creata dalla applicazione Python Streamlit con interazione verso un LLM su watsonx.ai

Conclusione

In questo articolo, abbiamo spiegato come utilizzare il codice Python per creare un'interfaccia di chatbot che interagisce con un modello LLM ospitato su IBM Watsonx.ai tramite IBM Cloud Code Engine. Seguendo i passaggi forniti, puoi configurare e eseguire questo codice per creare il tuo chatbot alimentato dai modelli linguistici di Watsonx.ai. Questo può essere uno strumento prezioso per vari compiti di comprensione e generazione del linguaggio naturale.

#GenerativeAI#watsonx#watsonx.ai#IBMCloud#code-engine#docker#how-to

0 comments
9 views

Permalink