Utilizzo di LIT per analizzare modelli Gemma in Keras

1. Introduzione

I prodotti di IA generativa sono relativamente nuovi e i comportamenti di un'applicazione possono variare più delle forme precedenti di software. Ciò rende importante sondare i modelli di machine learning in uso, esaminare esempi del comportamento del modello ed esaminare le sorprese.

Lo strumento di interpretabilità dell'apprendimento (LIT; sito web, GitHub) è una piattaforma per il debug e l'analisi dei modelli ML al fine di capire perché e come si comportano in un determinato modo.

In questo codelab, imparerai a utilizzare LIT per ottenere di più dal modello Gemma di Google. Questo codelab dimostra come utilizzare la saleence della sequenza, una tecnica di interpretabilità, per analizzare diversi approcci di prompt engineering.

Obiettivi di apprendimento:

  1. Comprensione della saleenza della sequenza e dei suoi usi nell'analisi del modello.
  2. È in corso la configurazione di LIT per Gemma per calcolare gli output dei prompt e la salienza della sequenza.
  3. Utilizzo della salienza della sequenza attraverso il modulo LM Salience per comprendere l'impatto delle progettazione dei prompt sugli output del modello.
  4. I test hanno ipotizzato miglioramenti dei prompt in LIT e vederne l'impatto.

Nota: questo codelab utilizza l'implementazione di KerasNLP di Gemma e TensorFlow v2 per il backend. Ti consigliamo vivamente di utilizzare un kernel GPU per continuare.

Demo della UI LIT

2. La salience della sequenza e i suoi usi nell'analisi del modello

I modelli generativi da testo a testo, come Gemma, assumono una sequenza di input sotto forma di testo tokenizzato e generano nuovi token che sono tipici follow-on o completamenti di tale input. Questa generazione avviene un token alla volta, aggiungendo (in un loop) ciascun token appena generato all'input più eventuali generazioni precedenti finché il modello non raggiunge una condizione di arresto. Ad esempio, quando il modello genera un token di fine sequenza (EOS) o raggiunge la lunghezza massima predefinita.

I metodi di salience sono una classe di tecniche di IA spiegabile (XAI) che possono dirti quali parti di un input sono importanti per il modello per le diverse parti del suo output. LIT supporta i metodi di sabilità per varie attività di classificazione, che spiegano l'impatto di una sequenza di token di input sull'etichetta prevista. La salienza della sequenza generalizza questi metodi in modelli generativi da testo a testo e spiega l'impatto dei token precedenti sui token generati.

Utilizzerai il metodo norma L2 di Grad L per la salienza della sequenza, che analizza i gradienti del modello e fornisce una grandezza dell'influenza che ogni token precedente ha sull'output. Questo metodo è semplice ed efficiente ed è stato mostrato avere un buon rendimento nella classificazione e in altre impostazioni. Maggiore è il punteggio della rilevanza, maggiore è l'influenza. Questo metodo viene utilizzato all'interno di LIT perché è ben compreso e ampiamente utilizzato nella community di ricerca sull'interpretabilità.

I metodi più avanzati per la salienza basati sul gradiente includono Grad ⋅ Input e gradienti integrati. Sono disponibili anche metodi basati sull'ablazione, come LIME e SHAP, che possono essere più solidi ma molto più costosi da calcolare. Consulta questo articolo per un confronto dettagliato dei diversi metodi di salienza.

Scopri di più sulla scienza dei metodi della salienza in questo video introduttivo interattivo esplorabile sulla salienza.

3. Importazioni, ambiente e altro codice di configurazione

Ti consigliamo di seguire questo codelab nel nuovo Colab. Consigliamo di utilizzare un tempo di esecuzione dell'acceleratore, poiché caricherai un modello in memoria, ma tieni presente che le opzioni dell'acceleratore variano nel tempo e sono soggetti a limitazioni. Colab offre abbonamenti a pagamento se vuoi accedere ad acceleratori più potenti. In alternativa, potresti utilizzare un runtime locale se la tua macchina ha una GPU appropriata.

Nota: potresti visualizzare alcuni avvisi nel modulo

ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
bigframes 0.21.0 requires scikit-learn>=1.2.2, but you have scikit-learn 1.0.2 which is incompatible.
google-colab 1.0.0 requires ipython==7.34.0, but you have ipython 8.14.0 which is incompatible.

Puoi ignorarle.

Installare LIT e Keras NLP

Per questo codelab, avrai bisogno di una versione recente di keras (3) keras-nlp (0.8.0) e lit-nlp (1.1) e di un account Kaggle per scaricare il modello di base.

!pip install -q -U lit-nlp
!pip uninstall -y umap-learn
!pip install -q -U keras-nlp
!pip install -q -U keras

Accesso a Kaggle

Per accedere a Kaggle, puoi archiviare il tuo file delle credenziali di kaggle.json all'indirizzo ~/.kaggle/kaggle.json o eseguire quanto segue in un ambiente Colab. Per ulteriori dettagli, consulta la documentazione del pacchetto kagglehub.

import kagglehub

kagglehub.login()

Assicurati di accettare anche il contratto di licenza per Gemma.

4. Configurazione dei modelli LIT

import os

os.environ["KERAS_BACKEND"] = "tensorflow"
import keras
import keras_nlp

# Run at half precision.
keras.config.set_floatx("bfloat16")
model_name = 'gemma_instruct_2b_en'
gemma_model = keras_nlp.models.GemmaCausalLM.from_preset(model_name)

Il seguente codice inizializza i wrapper LIT per supportare la salienza nel modello Gemma. Il framework LIT li fa riferimento come modelli, ma in questo caso si tratta solo di endpoint diversi per lo stesso gemma_model sottostante che hai caricato sopra. Ciò consente a LIT di calcolare generazioni, tokenizzazione e salience on demand.

from lit_nlp.examples.models import instrumented_keras_lms

batch_size = 1
max_sequence_length = 512
init_models = instrumented_keras_lms.initialize_model_group_for_salience
models = init_models(model_name, gemma_model,
                     batch_size=batch_size,
                     max_length=max_sequence_length)

5. Configurazione di set di dati LIT

Gemma è un modello generativo da testo a testo che prende input di testo e genera output di testo. I modelli di LIT presuppongono che i set di dati forniranno i seguenti campi per supportare la generazione:

  • prompt: l'input di un KerasGenerationModel.
  • target: una sequenza target facoltativa, ad esempio "dati empirici reali" (oro) o una risposta pregenerata dal modello.

LIT include un piccolo insieme di sample_prompts con esempi provenienti da alcune fonti diverse, ad esempio:

  • GSM8K: risoluzione dei problemi di matematica in classe con esempi few-shot.
  • Benchmark Gigaword: generazione di titoli per una raccolta di brevi articoli.
  • Prompt costituzionali: generazione di nuove idee su come utilizzare gli oggetti con linee guida/confini.

Puoi anche caricare facilmente i tuoi dati sotto forma di file .jsonl contenente record con campi prompt e facoltativamente target (esempio) o da qualsiasi formato utilizzando l'API Dataset di LIT.

Esegui la cella in basso per caricare i prompt di esempio.

from lit_nlp.examples.datasets import lm as lm_data

datasets = {
  'sample_prompts': lm_data.PromptExamples(
      lm_data.PromptExamples.SAMPLE_DATA_PATH
  ),
}

6. Configurazione della UI LIT

LIT è uno strumento interattivo per la comprensione dei modelli, che consente la valutazione human-in-the-loop e il probe del comportamento del modello. La UI LIT agevola questa interazione consentendoti di:

  • per visualizzare in tempo reale i set di dati e gli output del modello
  • eseguire metodi di salienza per comprendere i token di input che determinano il comportamento del modello e
  • creare controfattuale per verificare le ipotesi.

LIT favorisce tutto questo all'interno della stessa interfaccia, riducendo l'attrito nel passaggio da uno strumento all'altro. Ciò è particolarmente utile per attività come l'ingegneria del prompt, che vedremo più avanti in questo codelab.

Questo layout di UI può essere utilizzato per qualsiasi altro modello linguistico generativo. Se ti interessano altre funzionalità oltre a quelle elencate qui, puoi trovare l'elenco completo qui.

from lit_nlp.api import layout
modules = layout.LitModuleName

LM_SALIENCE_LAYOUT = layout.LitCanonicalLayout(
    left={
        'Data Table': [modules.DataTableModule],
        'Datapoint Editor': [modules.DatapointEditorModule],
    },
    upper={  # if 'lower' not specified, this fills the right side
        'Salience': [modules.LMSalienceModule],
    },
    layoutSettings=layout.LayoutSettings(leftWidth=40),
    description='Custom layout for language model salience.',
)

Questo codice inizializza il server LIT. L'operazione potrebbe richiedere alcuni secondi, perché esegue anche il modello sui prompt di esempio e memorizza nella cache il risultato.

from lit_nlp import notebook as lit_notebook

lit_widget = lit_notebook.LitWidget(
    models=models,
    datasets=datasets,
    layouts={'default': LM_SALIENCE_LAYOUT},
    default_layout='default',
)

Ora puoi visualizzare la UI:

lit_widget.render(height=800)

Demo della UI LIT

Puoi anche aprire LIT come pagina intera in una nuova scheda. Esegui questo codice e fai clic sul link visualizzato:

lit_widget.render(open_in_new_tab=True)

Nota: se utilizzi LIT in un normale script .py, usa lit_nlp.dev_server.Server() anziché LitWidget per attivare un server autonomo. Per ulteriori dettagli, consulta la documentazione LIT.

7. Analisi di alcuni prompt shot per Gemma in LIT

Oggi, i prompt rappresentano tanto arte quanto scienza e LIT può aiutarti a migliorare empiricamente i prompt per i modelli linguistici di grandi dimensioni (LLM), come Gemma. Di seguito vedrai un esempio di come LIT può essere utilizzato per esplorare i comportamenti di Gemma, anticipare potenziali problemi e migliorarne la sicurezza.

Identifica gli errori in prompt complessi

Due delle tecniche di prompt più importanti per prototipi e applicazioni basati su LLM di alta qualità sono prototipi e applicazioni few-shot (inclusi esempi del comportamento desiderato nel prompt) e catena di pensiero (inclusa una forma di spiegazione o ragionamento prima dell'output finale dell'LLM). Tuttavia, creare un prompt efficace è spesso ancora impegnativo.

Considera ad esempio come aiutare una persona a valutare se gli piace il cibo in base ai suoi gusti. Un prototipo iniziale di modello di prompt di catena di pensiero potrebbe avere il seguente aspetto:

def analyze_menu_item_template(food_likes, food_dislikes, menu_item):
  return f"""Analyze a menu item in a restaurant.

## For example:

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Onion soup
Analysis: it has cooked onions in it, which you don't like.
Recommendation: You have to try it.

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Baguette maison au levain
Analysis: Home-made leaven bread in france is usually great
Recommendation: Likely good.

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Macaron in france
Analysis: Sweet with many kinds of flavours
Recommendation: You have to try it.

## Now analyze one more example:

Taste-likes: {food_likes}
Taste-dislikes: {food_dislikes}
Suggestion: {menu_item}
Analysis:"""

Hai individuato i problemi con questa richiesta? LIT ti aiuterà a esaminare il prompt con il modulo Salience LM.

8. Utilizza la rilevanza della sequenza per il debug

La salienza viene calcolata al livello più piccolo possibile (ad esempio, per ogni token di input), ma LIT può aggregare la salienza del token in intervalli più grandi più interpretabili, come righe, frasi o parole. Scopri di più sulla rilevanza e su come utilizzarla per identificare i bias involontari nel nostro articolo Saliency Explorable.

Iniziamo fornendo al prompt un nuovo input di esempio per le variabili prompt-template:

food_likes = """Cheese"""
food_dislikes = """Can't eat eggs"""
menu_item = """Quiche Lorraine"""

prompt = analyze_menu_item_template(food_likes, food_dislikes, menu_item)
print(prompt)

fewshot_mistake_example = {'prompt': prompt}  # you'll use this below
Analyze a menu item in a restaurant.

## For example:

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Onion soup
Analysis: it has cooked onions in it, which you don't like.
Recommendation: You have to try it.

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Baguette maison au levain
Analysis: Home-made leaven bread in france is usually great
Recommendation: Likely good.

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Macaron in france
Analysis: Sweet with many kinds of flavours
Recommendation: You have to try it.

## Now analyze one more example:

Taste-likes: Cheese
Taste-dislikes: Can't eat eggs
Suggestion: Quiche Lorraine
Analysis:

Se hai aperto la UI LIT nella cella sopra o in una scheda separata, puoi utilizzare l'editor Datapoint di LIT per aggiungere questo prompt:

Editor LIT Datapoint

Un altro modo è eseguire di nuovo il rendering del widget direttamente con il prompt di interesse:

lit_widget.render(data=[fewshot_mistake_example])

Da notare il sorprendente completamento del modello:

Taste-likes: Cheese
Taste-dislikes: Can't eat eggs
Suggestion: Quiche Lorraine
Analysis: A savoury tart with cheese and eggs
Recommendation: You might not like it, but it's worth trying.

Perché il modello suggerisce di mangiare qualcosa che hai chiaramente indicato che non puoi mangiare?

La saleenza della sequenza può aiutare a evidenziare il problema principale, che è nei nostri esempi few-shot. Nel primo esempio, il ragionamento della catena di pensiero nella sezione dell'analisi it has cooked onions in it, which you don't like non corrisponde al consiglio finale You have to try it.

Nel modulo LM Salience, seleziona "Sentences" (Frasi). e poi seleziona la riga dei consigli. L'interfaccia utente dovrebbe avere il seguente aspetto:

LIT Salience

Questo evidenzia un errore umano: il copia e incolla accidentale della parte del consiglio e l'impossibilità di aggiornarla.

Ora correggiamo il "Consiglio" nel primo esempio a Avoid e riprova. LIT ha questo esempio precaricato nei prompt di esempio, quindi puoi usare questa piccola funzione di utilità per recuperarlo:

def get_fewshot_example(source: str) -> str:
  for example in datasets['sample_prompts'].examples:
    if example['source'] == source:
      return example['prompt']
  raise ValueError(f'Source "{source}" not found in the dataset.')

lit_widget.render(data=[{'prompt': get_fewshot_example('fewshot-fixed')}])

Ora il completamento del modello diventa:

Taste-likes: Cheese
Taste-dislikes: Can't eat eggs
Suggestion: Quiche Lorraine
Analysis: This dish contains eggs and cheese, which you don't like.
Recommendation: Avoid.

Una lezione importante da imparare è che la prototipazione anticipata aiuta a rivelare rischi a cui potresti non pensare in anticipo e che la natura soggetta a errori dei modelli linguistici significa che è necessario progettare in modo proattivo gli errori. Ulteriori approfondimenti su questo argomento sono disponibili nella nostra guida Persone + IA sulla progettazione con l'IA.

Anche se il prompt corretto con pochi colpi è migliore, non è ancora del tutto corretto: indica correttamente all'utente di evitare le uova, ma il ragionamento non è corretto, afferma che non gli piacciono le uova, quando in realtà l'utente ha dichiarato di non poter mangiare uova. Nella sezione che segue viene spiegato come migliorare il rendimento.

9. Testare le ipotesi per migliorare il comportamento del modello

LIT ti consente di testare le modifiche ai prompt all'interno della stessa interfaccia. In questo caso, testerai l'aggiunta di una costituzione per migliorare il comportamento del modello. Le costituzioni si riferiscono a prompt di progettazione con principi che guidano la generazione del modello. I metodi recenti consentono persino la detrazione interattiva dei principi costituzionali.

Usiamo questa idea per migliorare ulteriormente il prompt. Nella parte superiore del prompt, aggiungi una sezione con i principi per la generazione, che ora inizia come segue:

Analyze a menu item in a restaurant.

* The analysis should be brief and to the point.
* The analysis and recommendation should both be clear about the suitability for someone with a specified dietary restriction.

## For example:

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Onion soup
Analysis: it has cooked onions in it, which you don't like.
Recommendation: Avoid.

...

lit_widget.render(data=[{'prompt': get_fewshot_example('fewshot-constitution')}])

Con questo aggiornamento, è possibile eseguire di nuovo l'esempio e osservare un output molto diverso:

Taste-likes: Cheese
Taste-dislikes: Can't eat eggs
Suggestion: Quiche Lorraine
Analysis: This dish contains eggs, which you can't eat.
Recommendation: Not suitable for you.

L'importanza del prompt può essere quindi riesaminata per avere un'idea del motivo di questo cambiamento:

LIT Salience

Nota che il consiglio è molto più sicuro. Inoltre, il messaggio "Non adatto a te" è influenzato dal principio di indicare chiaramente l'idoneità in base al regime alimentare e dall'analisi (la cosiddetta catena di pensiero). Ciò consente di avere un'ulteriore sicurezza che l'output stia accadendo per il motivo giusto.

10. Includi team non tecnici nel probe e nell'esplorazione del modello

L'interpretabilità è uno sforzo di squadra, che comprende competenze relative a XAI, norme, aspetti legali e altro ancora.

L'interazione con i modelli nelle prime fasi di sviluppo ha tradizionalmente richiesto competenze tecniche significative, il che rendeva più difficile per alcuni collaboratori accedervi e analizzarli. Storicamente non esistevano strumenti per consentire a questi team di partecipare alle prime fasi di prototipazione.

Attraverso LIT, la speranza è che questo paradigma possa cambiare. Come abbiamo visto in questo codelab, il mezzo visivo e la capacità interattiva di LIT di esaminare la rilevanza ed esplorare esempi possono aiutare diversi stakeholder a condividere e comunicare i risultati. In questo modo puoi includere una più ampia diversità di membri del team per l'esplorazione, il probe e il debug del modello. L'esposizione a questi metodi tecnici può migliorare la loro comprensione del funzionamento dei modelli. Inoltre, una serie più diversificata di competenze nel test iniziale del modello può aiutare a scoprire risultati indesiderati che possono essere migliorati.

11. Riepilogo

Riepilogo:

  • La UI LIT fornisce un'interfaccia per l'esecuzione interattiva del modello, consentendo agli utenti di generare direttamente output e testare "what if" diversi scenari. Questo è particolarmente utile per testare diverse varianti di prompt.
  • Il modulo Salience LM fornisce una rappresentazione visiva della salienza e fornisce granularità dei dati controllabile in modo da poter comunicare costrutti incentrati sull'uomo (ad esempio frasi e parole) anziché costrutti incentrati sul modello (ad es. token).

Quando trovi esempi problematici nelle valutazioni dei modelli, importali in LIT per il debug. Inizia analizzando la più grande unità sensibile di contenuti che pensi sia logicamente correlata all'attività di modellazione, usa le visualizzazioni per vedere in che punto il modello partecipa correttamente o in modo errato ai contenuti del prompt, quindi visualizza in dettaglio unità di contenuto più piccole per descrivere ulteriormente il comportamento errato che vedi e identificare le possibili correzioni.

Infine: Lit migliora costantemente. Scopri di più sulle nostre funzionalità e condividi i tuoi suggerimenti qui.