In Come Costruire un'azione GPT Personalizzata per Comunicare con il Tuo Hardware e Costruire un Assistente di Laboratorio AI, abbiamo imparato come controllare il nostro hardware utilizzando l'Intelligenza Artificiale Generativa. Utilizzando azioni GPT personalizzate all'interno di ChatGPT, siamo stati in grado di dare a ChatGPT la capacità non solo di far lampeggiare i LED su un Raspberry Pi, ma anche di controllare e acquisire dati da strumenti di laboratorio. Questo significava che potevamo usare l'intelligenza artificiale come nostro assistente di laboratorio e anche elaborare per noi i dati che aveva acquisito dai nostri strumenti. In questo articolo stiamo facendo un passo avanti, permettendo all'Intelligenza Artificiale Generativa non solo di scrivere codice per noi, ma anche di eseguirlo su target embedded e ricevere feedback nel processo.
Utilizzare l'Intelligenza Artificiale Generativa per scrivere codice, anche per sistemi embedded, non è una novità. Esistono già una miriade di strumenti che suggeriscono o scrivono completamente il codice da zero. I modelli di linguaggio di grandi dimensioni più popolari, come ChatGPT, Gemini e Claude, sono diventati tutti piuttosto bravi a scrivere codice (vedi Gemini vs. ChatGPT: Chi Scrive Meglio il Codice? per un confronto). Scrivo da oltre un anno su ChatGPT che genera codice (vedi Utilizzare ChatGPT per i Test Automatizzati) e predico che è l'unico modo di sviluppare al giorno d'oggi. La vera sfida è inserire l'IA nel ciclo di sviluppo.
La generazione di codice ti porta fino a un certo punto, ma essere in grado di validare e assicurarsi che funzioni richiede un approccio diverso quando si tratta di Intelligenza Artificiale Generativa. Code Interpreter con ChatGPT fornisce un ambiente Python incapsulato che può, fino a un certo punto, eseguire il codice generato e validare che funzioni per te. Volevo fare un passo avanti e vedere se potessimo ottenere lo stesso risultato con i sistemi embedded. Ci sono due strade che si potrebbero intraprendere con ChatGPT di OpenAI. La strada più comune è creare un'applicazione a ciclo chiuso che utilizza l'API di OpenAI. Questo comporterebbe sollecitare e recuperare il codice dal Large Language Model (LLM) utilizzando l'API, compilarlo, caricarlo sull'Arduino e utilizzare codice personalizzato aggiuntivo per validare la funzionalità del codice generato. Ho deciso di prendere un approccio diverso utilizzando le azioni GPT per renderlo più un'esperienza di "pair programming". Ecco come appare quell'esperienza:
Figura 1: Esempio di azione GPT
Anche se l'esempio può essere banale (cioè far lampeggiare un LED integrato) la dimostrazione sopra riassume tutto. Sono stato in grado di dare istruzioni chiare al mio GPT personalizzato e ha seguito le direzioni esattamente come mi aspettavo. Sono stato anche in grado di confermare che ha effettivamente caricato sul mio dispositivo e fatto lampeggiare il LED a una frequenza di 1s. La cosa bella dell'usare un GPT personalizzato rispetto a un sistema a ciclo chiuso è che posso iterare abbastanza facilmente all'interno del prompt:
Figura 2: Iterazione sullo Sketch Arduino
Ora che hai visto alcuni esempi, diamo un'occhiata a come funziona tutto questo.
Proprio come abbiamo visto con altri articoli su GPT personalizzati, la configurazione delle Azioni GPT per questo progetto è, più o meno, la stessa. Il Dockerfile, Docker Compose, i certificati SSL e la struttura generale del repository non sono cambiati molto. Naturalmente il codice di progettazione stesso e il file YAML OpenAPI sono significativamente diversi (come ci si aspetterebbe).
Il cambiamento più grande che avviene in questo codice (rispetto agli esempi precedenti) è che introduciamo un "sottoprocesso" in Python per chiamare un programma esterno, in questo caso l'IDE Arduino. Il nostro file YAML OpenAPI (openapi.yaml) è ciò che fornisce la struttura a ChatGPT su quali informazioni dovrebbero essere consegnate e come dovrebbero essere consegnate. Guardando la sezione "components" alla fine del file YAML noterai le diverse parti dell'oggetto di ritorno che ci aspettiamo:
components:
schemas:
CodeSnippet:
type: object
properties:
language:
type: string
code:
type: string
description:
type: string
nullable: true
required:
- language
- code
Abbiamo chiesto a ChatGPT di fornire non solo il codice, ma anche il linguaggio e, opzionalmente, una descrizione di quel codice. Elaboriamo quel contenuto in app.py. Più importante dell'elaborazione del comando è che restituiamo anche risposte HTTP significative se qualcosa si interrompe nel processo. Questo aiuta a fornire contesto e a parlare la stessa "lingua" del server web/bot AI di ChatGPT.
L'implementazione, sebbene alquanto rudimentale, è molto semplice: scarichiamo lo snippet di codice in un file INO temporaneo, verifichiamo e/o lo carichiamo sull'Arduino e cancelliamo il file INO temporaneo. Ci sono, ovviamente, moltissimi modi in cui questo può andare storto, inclusa una quantità insormontabile di rischi per la sicurezza. È estremamente importante, come sempre, limitare l'ambiente di sviluppo e, se lo si apre al mondo esterno, implementare tutte le misure di sicurezza necessarie per garantire che l'ambiente sia sicuro.
Giusto per divertimento, ho anche implementato un comando di lettura seriale molto basilare che dà alla nostra azione GPT personalizzata la capacità di leggere dalla porta seriale dell'Arduino. Questo ci permette di verificare che la porta seriale funzioni senza controllare manualmente dal nostro computer. Uno scenario esemplificativo potrebbe essere se chiedi a ChatGPT di scrivere e caricare codice sul tuo Arduino dal tuo smartphone. Questo, naturalmente, può essere esteso a un'implementazione seriale di tipo get/set più formale in cui invii comandi e leggi le risposte tramite seriale (come implementato in Configurazione di un Progetto Hardware in Loop).
In questo articolo, abbiamo mostrato come l'IA possa fare più che semplicemente scrivere codice - può anche assicurarsi che il codice funzioni eseguendolo su dispositivi reali. È come avere uno sviluppatore che non solo scrive il tuo progetto per te, ma lo testa anche per assicurarsi che sia corretto. Con gli esempi che abbiamo usato, puoi vedere come questo potrebbe cambiare il modo in cui creiamo e testiamo i nostri progetti, rendendo le cose più veloci e semplici. Tutti i passaggi e il codice che abbiamo usato sono condivisi, quindi chiunque sia interessato può provarlo e vedere come l'IA potrebbe aiutare nel loro lavoro.
Scopri di più su questo progetto pionieristico e unisciti all'evoluzione su: https://gitlab.com/ai-examples/ai-arduino-code-builder.