Affinamento, Riformazione e Oltre Avanzare con LLM Personalizzati

Perfezionamento, Riforma e Avanzamento con LLM Personalizzati

Introduzione

Sono abbastanza sicuro che la maggior parte di voi ha già utilizzato ChatGPT. È fantastico perché avete compiuto il primo passo in un viaggio che intraprenderemo in questo articolo! Vedete, quando si tratta di padroneggiare una nuova tecnologia, la prima cosa che si fa è usarla. È come imparare a nuotare buttandosi in acqua! 🏊‍♂️

Se volete esplorare GenAI, scegliete un problema del mondo reale e iniziate a costruire un’applicazione per risolverlo. Al centro di tutto ciò che riguarda GenAI c’è un Large Language Model (LLM), che alcuni chiamano anche Foundational Model (FM).

Potreste aver sentito parlare dei consumatori, dei tuner e dei builders del modello. Ma aspettate un attimo, stiamo per approfondire ulteriormente.

McKinsey lo considera come takers, shapers e makers, come hanno menzionato nella loro sessione GenAI Recognise.

Scopriremo più da vicino ciascuno di questi strati in questo articolo.

Proliferazione di piattaforme come caso d’uso

Per approfondire ulteriormente questo argomento, ci rivolgeremo a un esempio di vita reale che renderà tutto chiaro come il cristallo. Nel panorama tecnologico odierno, è un dato di fatto che la maggior parte delle app debbano funzionare su più piattaforme. Tuttavia, c’è un problema: ogni piattaforma ha la sua interfaccia unica e particolarità. Estendere il supporto di un’applicazione ad altre piattaforme e mantenere tali applicazioni multi-piattaforma è altrettanto impegnativo.

Ma è qui che GenAI entra in gioco per salvare la giornata. Ci consente di creare un’interfaccia unificata e user-friendly per le nostre applicazioni, indipendentemente dalle piattaforme a cui si rivolgono. L’ingrediente magico? I Large Language Model (LLM) trasformano questa interfaccia in un linguaggio naturale e intuitivo.

Comandi Linux, Windows, Mac

Per rendere ancora più specifico e comprendere ancora meglio, diciamo che vogliamo sapere quale comando esatto eseguire per scenari diversi sulla nostra macchina, che può essere Linux, Windows o Mac. Il diagramma seguente illustra uno scenario:

Valore sia per l’utente finale che per lo sviluppatore dell’applicazione

Come utente finale, non dovete imparare/conoscere i comandi per ciascuna di queste piattaforme e potete fare le vostre cose in modo naturale e intuitivo. Come sviluppatore dell’applicazione, non dovete tradurre esplicitamente ciascuna delle interfacce dell’applicazione rivolte all’utente in ciascuna delle piattaforme supportate sottostanti.

Architettura di riferimento

Diversi LLM, tra cui GPT3, GPT3.5 e GPT4, risiedono nel Cloud, grazie a vari fornitori come Open AI e Azure Open AI. Sono resi facilmente accessibili tramite varie API come completion, chat completion, ecc.

Gli orchestratori di intelligenza artificiale rendono questo accesso ancora più fluido e uniforme tra modelli e fornitori. Questo è il motivo per cui le applicazioni GenAI in genere interagiscono con gli orchestratori di intelligenza artificiale anziché interagire direttamente con i fornitori e i modelli sottostanti. Gestiscono quindi l’orchestrazione con fornitori e modelli sottostanti configurabili e/o possibilmente multipli, come richiesto dall’applicazione.

Potete avere un plugin per ciascuna delle piattaforme che la vostra applicazione desidera supportare per flessibilità e modularità. Approfondiremo tutto ciò che possiamo fare con questi plugin e orchestratori nelle sezioni che seguiranno.

Infine, l’applicazione ha dei connettori per interagire con le piattaforme che vuole supportare per eseguire i comandi generati da GenAI.

Tecnologie di riferimento

  • Orchestratori AI: LangChain, Semantic Kernel
  • Modelli Cloud: Azure Open AI

Configurazione

Ci sono numerosi aspetti nella configurazione stessa che è possibile regolare per ottenere i risultati desiderati. Ecco un tipico config.json di un plugin per semantic kernel:

{  "schema": 1,  "description": "My Application",  "type": "completion",  "completion": {    "max_tokens": 300,    "temperature": 0.0,    "top_p": 0.0,    "presence_penalty": 0.0,    "frequency_penalty": 0.0,    "stop_sequences": [        "++++++"    ]  },  "input": {    "parameters": [      {        "name": "input",        "description": "Scenari di esecuzione dei comandi",        "defaultValue": ""      }    ]  }}

Il ‘tipo’ specifica il tipo di API che si vuole eseguire sul sottostante LLM. Qui stiamo utilizzando l’API “completion”. La “temperatura” determina la variabilità o la creatività del modello. Ad esempio, durante una conversazione potresti voler far sì che l’IA risponda con frasi diverse in momenti diversi, anche se tutte possono trasmettere lo stesso intento per mantenere la conversazione coinvolgente. Qui invece vogliamo sempre la stessa risposta precisa. Pertanto stiamo utilizzando il valore 0. Il risultato potrebbe consistere in diverse sezioni con alcuni separatori predefiniti. Se si desidera che solo la prima sezione, come nel nostro caso il comando corrispondente esatto, sia restituita come risposta, si utilizzano “stop_sequences” come qui. Si definisce l’input con tutti i parametri, uno solo in questo caso.

Progettazione del prompt

Ora passiamo a una progettazione del prompt molto discussa e di come possiamo sfruttarla.

Messaggi di sistema

I messaggi di sistema dicono al modello come esattamente vogliamo che si comporti. Ad esempio, il plugin Linux bash nel nostro caso potrebbe avere qualcosa del genere all’inizio del suo skprompt.txt

Sei un assistente disponibile che genera comandi per macchine Linux bash basati sull’input dell’utente. La tua risposta dovrebbe contenere SOLO il comando e NESSUNA spiegazione. Per tutto l’input dell’utente, genererai solo una risposta considerando i comandi Linux bash per trovare la soluzione.

Che specifica il suo messaggio di sistema.

Few Shots Prompting ed Esempi

Aiuta il modello a dare la risposta esatta se gli fornisci alcuni esempi di domande e risposte corrispondenti che stai cercando. Viene chiamato anche Few Shots Prompting. Ad esempio, il nostro plugin Linux bash potrebbe avere qualcosa del genere nel suo skprompt.txt seguendo il messaggio di sistema menzionato in precedenza:

Esempi

Utente: Ottieni il mio IPAssistente: curl ifconfig.me++++++Utente: Ottieni il meteo a San FranciscoAssistente: curl wttr.in/SanFrancisco++++++Utente:"{{$input}}"Assistente:

Puoi sintonizzare il tuo sistema per selezionare gli esempi/spunti giusti che desideri ottenere come risultato.

Orchestrazione dell’IA

<p+uniremo come="" configurazione="" del="" dell'ia="" e="" esempio="" gestire="" kernel="" l'orchestrazione="" la="" nel="" nostro="" p="" possiamo="" progettazione="" prompt="" questa="" semantico.

import openaioneimport osimport argparseimport semantic_kernel as skfrom semantic_kernel.connectors.ai.open_ai import AzureTextCompletionparser = argparse.ArgumentParser(description='GANAs')parser.add_argument('platform', type=str,                    help='Deve essere specificata una piattaforma')parser.add_argument('--verbose', action='store_true',                    help='è verboso')args = parser.parse_args()kernel = sk.Kernel()deployment, api_key, endpoint = sk.azure_openai_settings_from_dot_env()kernel.add_text_completion_service("dv", AzureTextCompletion(deployment, endpoint, api_key))platformFunctions = kernel.import_semantic_skill_from_directory("./", "platform_commands")platformFunction = platformFunctions[args.platform]user_query = input()response = platformFunction(user_query)print (response)

Questo script Python prende ‘platform’ come argomento obbligatorio. Prende il plugin giusto dalla cartella ‘platform_commands’ per la piattaforma specificata. Quindi prende la query dell’utente, invoca la funzione e restituisce la risposta.

Per le prime poche casistiche, potresti voler sperimentare solo fino a questo punto in quanto gli LLM hanno già molta intelligenza. Questa semplice configurazione e progettazione del prompt da soli possono fornire risultati molto vicini al comportamento desiderato e anche molto rapidamente.

Le tecniche seguenti sono piuttosto avanzate in questo momento, richiedono più impegno e conoscenza e dovrebbero essere impiegate considerando il ritorno sull’investimento. La tecnologia è ancora in evoluzione e maturazione in questo campo. Daremo solo un’occhiata fugace ad esse in questo momento per completezza e per fare conoscenza di ciò che ci aspetta.

Fine-Tuning

Il fine-tuning implica l’aggiornamento dei pesi di un modello di linguaggio pre-addestrato su un nuovo compito e set di dati. Viene tipicamente utilizzato per il trasferimento di conoscenza, la personalizzazione e la specializzazione del dominio. Ci sono diverse strumenti e tecniche disponibili per questo. Un modo per farlo è utilizzando gli strumenti CLI di OpenAI. Puoi fornire i tuoi dati e generare dati di addestramento per il fine-tuning con comandi come:

openai tools fine_tunes.prepare_data -f <LOCAL_FILE>

Quindi puoi creare un modello personalizzato utilizzando Azure AI Studio:

Fornendo i dati di affinamento che hai preparato in precedenza.

LLMs personalizzati

Sei abbastanza coraggioso da approfondire e sperimentare ulteriormente? Continua a leggere! Vedremo come costruire i nostri modelli personalizzati.

Riaddestramento

Questo è molto simile all’affinamento che abbiamo visto in precedenza. Ecco come possiamo farlo usando transformers:

from transformers import AutoTokenizer# Prepara il tuo tokenizerdatatokenizer = AutoTokenizer.from_pretrained("bert-base-cased")def tokenize_function(examples):    return tokenizer(examples["text"], padding="max_length", truncation=True)# supponiamo che il mio dataset sia caricato in my_datasettokenized_datasets = my_dataset.map(tokenize_function, batched=True)# carica il tuo modelfrom transformers import AutoModelForSequenceClassificationmodel = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=5)# Allenamentofrom transformers import TrainingArguments, Trainertraining_args = TrainingArguments(output_dir="mydir")trainer.train()# salva il tuo modello che può essere caricato puntando alla directory salvata e usato successivamentetrainer.save_model()

Addestramento da zero

Qui puoi iniziare con alcune strutture di modelli conosciute ed addestrarle da zero. Ci vorrà molto tempo, risorse e dati di addestramento, anche se il modello costruito è completamente sotto il tuo controllo.

Modelli completamente nuovi

Puoi definire la struttura del tuo modello, migliorando potenzialmente modelli esistenti, e quindi seguire il processo sopra descritto. Titan di Amazon e Codewhisperer rientrano in questa categoria.

Conclusioni

GenAI ha un potenziale enorme per diverse casistiche di utilizzo. Questo articolo ha esemplificato la sua applicazione nel supporto multi-piattaforma e nella creazione rapida di soluzioni. Sebbene ci sia scetticismo intorno a GenAI, il percorso per sfruttarne il potere è chiaro. Tuttavia, il percorso diventa intricato quando si affronta l’ottimizzazione e l’addestramento del modello.

Punti chiave:

  • Come puoi vedere, GenAI è molto affascinante e consente diversi casi d’uso.
  • Abbiamo visto uno di questi casi d’uso e abbiamo analizzato come potremmo iniziare rapidamente a costruire una soluzione.
  • Alcuni si chiedono se GenAI sia una bolla. Puoi scegliere il tuo caso d’uso preferito e provarlo utilizzando i passaggi descritti in questo articolo per rispondere da soli!
  • Il processo può diventare complicato e faticoso molto rapidamente quando si inizia ad aggiungere elementi come l’ottimizzazione e la creazione del modello.

Domande frequenti

I contenuti mostrati in questo articolo non sono di proprietà di Analytics Vidhya e sono utilizzati a discrezione dell’autore.