Padroneggiare il futuro Valutare le architetture dati generate da LLM sfruttando le tecnologie IaC

Guidare il futuro Valutare le architetture dati generate da LLM tramite le tecnologie IaC

Valutare la suitablezza delle LLM nella generazione di Infrastructure as Code per la provisione, configurazione e deployment di applicazioni moderne

Foto di ZHENYU LUO su Unsplash

Introduzione

In questo articolo, affrontiamo la suitablezza delle LLM per sfruttare il ciclo di vita delle applicazioni reali, che vanno dalla provisione dell’infrastruttura alla gestione della configurazione e al deployment. Il codice sorgente risultante da questo sforzo è pubblicamente disponibile su GitHub¹¹. Le soluzioni di Infrastructure as Code (IaC) facilitano la gestione e la provisione dell’infrastruttura tramite il codice anziché tramite un processo manuale¹. Stanno diventando comuni e i principali fornitori di cloud hanno implementato la loro versione delle soluzioni IaC per interagire con i propri servizi. In questo senso, AWS CloudFormation, Google Cloud Deployment Manager e Azure Resource Manager Templates semplificano la provisione dei servizi cloud, eliminando la necessità per l’IT Operations di configurare manualmente server, database e reti. Tuttavia, queste molte possibilità introducono il rischio di bloccaggio del fornitore poiché la definizione della IaC richiesta per un determinato fornitore cloud non è portabile e dovrebbe essere tradotta se viene richiesto un diverso fornitore cloud. A questo proposito, strumenti come Terraform² o Pulumi³ forniscono un’astrazione sulle varie implementazioni dei diversi fornitori cloud e facilitano lo sviluppo di deployment portabili. In questo modo, il rischio di bloccaggio del fornitore è notevolmente ridotto e le organizzazioni possono reagire dinamicamente alle proprie esigenze senza incorrere in costi di implementazione significativi. Oltre a questo, ci sono numerosi vantaggi che le tecnologie IaC portano sul tavolo⁴:

  • Consistenza: consente l’automazione della provisione dell’infrastruttura consentendo deployment ripetibili.
  • Riduzione del rischio: promuove un approccio alle infrastrutture meno soggetto a errori, poiché le interviste manuali sono ridotte.
  • ottimizzazione dei costi: consente una più facile identificazione delle risorse non necessarie e una migrazione più veloce tra i fornitori di cloud, reagendo ai cambiamenti di fatturazione.
  • Miglior collaborazione: gli script possono essere integrati negli strumenti di controllo versione, promuovendo la collaborazione tra individui e team.

Tuttavia, il ciclo di vita dell’applicazione va oltre la provisione dell’infrastruttura. La seguente figura mostra il ciclo di vita dell’applicazione supportato dalle diverse tecnologie IaC⁵.

Il ciclo di vita dell'applicazione supportato dalle tecnologie Infrastructure as Code. | Fonte: Josu Diaz-de-Arcaya et al.⁵

In questo scenario, l’obiettivo delle tecnologie IaC va oltre la semplice provisione delle risorse infrastrutturali. Dopo aver configurato l’infrastruttura necessaria, la fase di gestione della configurazione garantisce che tutti i requisiti siano installati correttamente. Questa fase viene di solito completata con strumenti come ansible⁶, chef⁷ o puppet⁸. Infine, il deployment dell’applicazione supervisiona l’orchestrazione dell’applicazione sui vari dispositivi infrastrutturali.

Comprendere le LLM

Le Large Language Models (LLM) si riferiscono a una classe di modelli di intelligenza artificiale progettati per comprendere e generare testi simili a quelli scritti dall’uomo basandosi sull’input fornito loro. Questi modelli sono noti per il loro considerevole numero di parametri, che consentono loro di catturare complessi modelli e sfumature nel linguaggio⁹.

  • Generazione di testo: Il testo creato dalle LLM può essere coeso e pertinente rispetto al contesto circostante. Vengono impiegate per attività come il completamento di testi, la produzione di materiale e persino la scrittura creativa.
  • Comprensione del linguaggio: Le LLM sono in grado di comprendere ed estrarre informazioni dai testi. Sono in grado di analizzare l’atteggiamento, la classificazione dei testi e il recupero delle informazioni.
  • Traduzione: Le LLM possono tradurre testi da una lingua all’altra. Questo è molto utile per le applicazioni di traduzione automatica.
  • Risposta alle domande: Le LLM possono rispondere a domande basate su un contesto fornito. Sono utilizzate in chatbot e assistenti virtuali per rispondere alle query degli utenti.
  • Summarizzazione del testo: Le LLM possono sintetizzare lunghi brani di testo in riassunti più brevi e coerenti. Questo è utile per condensare le informazioni per una rapida comprensione.

Tra le capacità sopra menzionate, ci concentreremo sulla generazione di testo. In particolare, nella sua capacità di produrre il codice IaC corretto in base ai prompt di input, i Large Language Models (LLM) hanno compiuto significativi progressi nel campo dell’elaborazione del linguaggio naturale, ma hanno anche sollevato diverse sfide e preoccupazioni. Alcune delle principali questioni e preoccupazioni associate ai LLM di quel periodo includono:

  • Preconcetti ed equità: i LLM possono apprendere i preconcetti presenti nei dati su cui vengono addestrati, il che può portare a risultati prevenuti o non equi.
  • Disinformazione e fuorviamento: i LLM possono generare informazioni false o fuorvianti, contribuendo alla diffusione di disinformazione online. Questi modelli hanno il potenziale per creare contenuti che appaiono credibili ma sono factualmente errati.
  • Sicurezza e privacy: i LLM possono essere utilizzati impropriamente per generare contenuti maligni, come testi deepfake, notizie false o e-mail di phishing.

La seguente tabella mostra un confronto tra vari LLM¹⁰

Generazione di IaC con LLM

Per testare le prestazioni attuali degli strumenti LLM nel campo di IaC, è stato progettato uno scenario di utilizzo. L’obiettivo finale è quello di costruire un’API in una macchina virtuale utilizzando il framework FastAPI che consente al cliente di eseguire operazioni di ricerca ed eliminazione su un cluster Elasticsearch tramite metodi HTTP. Il cluster sarà composto da tre nodi, ognuno nella propria macchina virtuale, e in un’altra macchina sarà presente Kibana, un tool di amministrazione per il cluster che supporta visualizzazioni. Tutto ciò deve essere nell’AWS cloud. La seguente immagine mostra questa architettura:

Scenario di utilizzo progettato per testare la fattibilità di IaC generata da LLM

La sfida è completare con successo i seguenti tre compiti utilizzando gli strumenti LLM. In questo articolo, abbiamo utilizzato ChatGPT di OpenAI.

  1. Codice Terraform per costruire un’infrastruttura con cinque macchine virtuali su AWS.
  2. Codice sorgente dell’applicazione FastAPI per eseguire operazioni di ricerca ed eliminazione di documenti attraverso i metodi HTTP dell’API.
  3. Codice Ansible per il deployment e l’installazione di un cluster Elasticsearch su tre nodi, Kibana su un altro nodo e un’applicazione FastAPI sull’ultimo nodo rimanente.

Compito #1

Per questa sfida, abbiamo utilizzato il seguente prompt:

Devo creare, tramite Terraform, cinque macchine virtuali presso un provider di cloud pubblico a tua scelta. Lo scopo di queste macchine virtuali è il seguente: tre di esse sono per il deployment di un cluster Elasticsearch, che deve elaborare 2G di dati al giorno; un’altra macchina è per Kibana; e l’ultima è per il deployment di un’applicazione FastAPI. Dovresti scegliere l’hardware per ogni macchina virtuale e il provider di cloud per ogni macchina virtuale. Per le variabili che non conosci, utilizza delle variabili segnaposto. Utilizza istanze economiche.

La risposta iniziale è stata un buon tentativo, ma abbiamo dovuto continuare ad iterare. Ad esempio, volevamo che tutte le variabili fossero definite in un file separato, il che ha portato alla seguente immagine.

Estratto del codice di variables.tf, che contiene le variabili da configurare.

Allo stesso modo, vorremmo conoscere gli indirizzi IP del deployment e vogliamo che questa configurazione sia in un file separato.

Estratto del codice di output.tf, contenente gli indirizzi IP delle macchine virtuali appena create.

L’AI ha fatto un ottimo lavoro nel descrivere le istanze che desideravamo, nonché nella loro configurazione con i gruppi di sicurezza richiesti.

Estratto del codice di main.tf, che contiene le macchine virtuali da approvvigionare

Ha anche creato le risorse necessarie per i gruppi di sicurezza desiderati e utilizzato segnaposti per definire le varie porte come variabili.

Estratto del codice di main.tf, che contiene i gruppi di sicurezza da utilizzare.

In generale, ChatGPT ha fatto un buon lavoro in questo compito. Tuttavia, ci è voluto un po’ per ottenere una configurazione valida e corretta per la configurazione di networking. Ad esempio, volevamo collegarci a ciascuna delle macchine virtuali approvvigionate, come indicato nel seguente modo.

Voglio avere accesso ssh a tutti loro dal mio laptop e l’istanza di kibana richiede l’accesso http e https dal mio laptop.

La prompt precedente ha prodotto un codice quasi corretto, poiché l’IA si è confusa con le politiche di ingresso ed uscita. Tuttavia, è stato facile individuare e correggere questo problema.

Dopo essere riusciti a raggiungere le macchine virtuali, abbiamo avuto il problema di non riuscire a connetterci ad esse a causa della mancanza di permessi. Ciò ha comportato una conversazione più lunga ed è stato più facile aggiungere queste righe da soli.

Task #2

Per questa sfida, abbiamo utilizzato il seguente prompt:

Devo creare un’applicazione FastAPI. Lo scopo di queste API è avere metodi per memorizzare un singolo documento json nel cluster di Elasticsearch, memorizzare più documenti e per eliminarli. Il cluster di Elasticsearch viene distribuito in 3 nodi ed ha un’autenticazione di base con l’utente “tecnalia” e la password “iac-llm”.

Il risultato di questo prompt è stato notevolmente positivo. L’app utilizza il pacchetto python per Elasticsearch¹² per interagire con il cluster di Elasticsearch ed è completamente valido. Dobbiamo solo ricordare di modificare gli indirizzi IP dei nodi in cui è distribuito il cluster. Nella seguente immagine, il primo metodo è stato creato per inserire un singolo documento in Elasticsearch.

Estratto di codice per il metodo di memorizzazione di un singolo documento.

Successivamente, il secondo metodo viene utilizzato per creare una memorizzazione in blocco di vari documenti in una singola chiamata.

Estratto di codice per il metodo di memorizzazione di più documenti.

Infine, l’ultimo metodo può essere utilizzato per eliminare un singolo documento dal cluster di Elasticsearch.

Estratto di codice per il metodo di eliminazione di un documento.

Riteniamo che questo esperimento sia stato molto positivo, in quanto seleziona correttamente una libreria appropriata per svolgere il compito. Tuttavia, ulteriori affinamenti manuali sono necessari per trasformare questo codice in un software pronto per la produzione.

Task #3

Per questa sfida, abbiamo utilizzato il seguente prompt:

Genera il codice di ansible per installare il cluster di Elasticsearch su tre nodi. Aggiungi anche un nodo di Kibana connesso al cluster.

Questo prompt ha fatto un buon lavoro nella produzione degli script ansible desiderati. Ha fatto un’ottima organizzazione del codice sorgente in vari file. Prima di tutto, l’inventario con i dettagli su tutti i nodi. Tenete presente che questo file deve essere adattato con gli indirizzi IP corretti generati nel Task #1.

Estratto di codice per inventory.ini

Poi, lo script principale di ansible per l’installazione di Elasticsearch viene visualizzato nella figura seguente. Rappresenta un estratto di esso, l’esempio completo può essere trovato nel repository¹¹.

Estratto di codice per elasticsearch_playbook.yml

D’altra parte, la necessaria configurazione per ciascuno dei nodi di Elasticsearch è stata generata in modo conveniente come file Jinja. In questo caso, abbiamo dovuto aggiungere manualmente le configurazioni path.logs e path.data poiché Elasticsearch non riusciva ad avviarsi a causa di problemi di permessi.

Estratto di codice per elasticsearch.yml.j2

Con una nota simile, ChatGPT è stato in grado di generare una configurazione simile per l’istanza di Kibana. Tuttavia, in questo caso abbiamo separato manualmente la configurazione in un file separato per comodità. Un estratto di questo file può essere visto nell’immagine seguente.

Estratto di codice per kibana_playbook.yml

Analogamente, il seguente file jinja che si riferisce all’istanza di Kibana sembra buono, anche se sarebbe meglio parametrizzare gli indirizzi IP.

Estratto di codice per kibana.yml.j2

In generale, abbiamo trovato ChatGPT estremamente bravo a produrre uno scheletro del progetto. Tuttavia, sono ancora necessarie molte azioni per trasformare quello scheletro in un’applicazione pronta per la produzione. A tal proposito, è richiesta una profonda competenza nelle tecnologie utilizzate per ottimizzare il progetto.

Conclusioni

Questo articolo affronta l’uso di LLM per supervisionare il ciclo di vita dell’applicazione. I pro e i contro di questo sforzo sono discussi nelle seguenti righe.

Pro

  • L’uso di LLM per il supporto delle varie fasi del ciclo di vita dell’applicazione è particolarmente vantaggioso per avviare il progetto, soprattutto in tecnologie ben note.
  • Lo scheletro iniziale è ben strutturato e fornisce strutture e metodologie che altrimenti non sarebbero state utilizzate.

Contro

  • LLM è soggetto al rischio di bias associato all’uso di soluzioni AI; in questo caso, ChatGPT ha scelto AWS rispetto ad altre opzioni simili.
  • Rifinire il progetto per renderlo pronto per la produzione può essere problematico ed è a volte più facile adattare il codice manualmente, il che richiede una conoscenza approfondita delle tecnologie utilizzate.

Ringraziamenti

Questo lavoro è finanziato dal progetto SIIRSE Elkartek (Sistemi industriali intelligenti robusti, sicuri ed etici per l’Industria 5.0: paradigmi avanzati per la specifica, il design, la valutazione e il monitoraggio) del Governo basco (ELKARTEK 2022 KK-2022/00007).

Contributo degli autori

La concettualizzazione, l’analisi, l’indagine e la scrittura sono un’opera congiunta di Juan Lopez de Armentia, Ana Torre e Gorka Zárate.

Riferimenti

  1. Cosa è Infrastructure as Code (IaC)? (2022). https://www.redhat.com/en/topics/automation/what-is-infrastructure-as-code-iac
  2. Terraform di HashiCorp. (n.d.). Recuperato il 5 ottobre 2023, da https://www.terraform.io
  3. Pulumi – Universal Infrastructure as Code. (n.d.). Recuperato il 5 ottobre 2023, da https://www.pulumi.com/
  4. I 7 maggiori vantaggi di Infrastructure as Code – DevOps. (n.d.). Recuperato il 5 ottobre 2023, da https://duplocloud.com/blog/infrastructure-as-code-benefits/
  5. Diaz-De-Arcaya, J., Lobo, J. L., Alonso, J., Almeida, A., Osaba, E., Benguria, G., Etxaniz, I., & Torre-Bastida, A. I. (2023). IEM: A Unified Lifecycle Orchestrator for Multilingual IaC Deployments ACM Reference Format. https://doi.org/10.1145/3578245.3584938
  6. Ansible è Automazione IT Semplice. (n.d.). Recuperato il 5 ottobre 2023, da https://www.ansible.com/
  7. Soluzioni di automazione DevOps del software Chef | Chef. (n.d.). Recuperato il 5 ottobre 2023, da https://www.chef.io/
  8. Infrastruttura Puppet e automazione IT su larga scala | Puppet di Perforce. (n.d.). Recuperato il 5 ottobre 2023, da https://www.puppet.com/
  9. Kerner, S. M. (n.d.). Cosa sono i Large Language Models? | Definizione da TechTarget. Recuperato il 5 ottobre 2023, da https://www.techtarget.com/whatis/definition/large-language-model-LLM
  10. Sha, A. (2023). 12 Migliori Large Language Models (LLMs) nel 2023 | Beebom. https://beebom.com/best-large-language-models-llms/
  11. Diaz-de-Arcaya, J., Lopez de Armentia, J., & Zarate, G. (n.d.). iac-llms GitHub. Recuperato il 5 ottobre 2023, da https://github.com/josu-arcaya/iac-llms
  12. Manutentori della Libreria Cliente Elastic. (2023). elasticsearch · PyPI. https://pypi.org/project/elasticsearch/