L’integrazione delle API di OpenAI con il linguaggio Java rappresenta una combinazione potente e versatile per sviluppare applicazioni basate su intelligenza artificiale (AI). In questo articolo, esploreremo che cos’è l’intelligenza artificiale, come può essere implementata tramite le RESTful API di OpenAI e come un Java developer può trarre vantaggio da queste tecnologie.
Cos’è l’Intelligenza Artificiale?
Prima di entrare nei dettagli tecnici, è utile comprendere che cos’è l’intelligenza artificiale. L’intelligenza artificiale AI è un campo della computer science che si occupa della creazione di macchine capaci di svolgere compiti che, normalmente, richiedono l’intelligenza umana.
Il linguaggio Java: cos’è e a cosa serve
Il linguaggio Java è uno dei linguaggi di programmazione più diffusi al mondo. Sviluppato da Sun Microsystems (ora parte di Oracle Corporation), Java è noto per la sua portabilità, robustezza e sicurezza.
Java è un linguaggio orientato agli oggetti, ampiamente utilizzato nel mondo della programmazione informatica. Si tratta di un linguaggio multi-piattaforma, sicuro ed affidabile. Viene utilizzato in moltissimi contesti come sviluppo di app desktop, tecnologie lato server, big data e, non per ultimo, intelligenza artificiale.
Per chi vuole diventare un programmatore informatico, imparare Java è un passo fondamentale verso una carriera in settori come lo sviluppo di applicazioni enterprise, il web development e, più recentemente, l’integrazione con tecnologie di intelligenza artificiale.
Integrazione delle API di OpenAI con Java
In questo contesto, le API di OpenAI offrono agli sviluppatori Java un’opportunità straordinaria per sfruttare le capacità avanzate dell’intelligenza artificiale nelle loro applicazioni. Queste API possono essere utilizzate per una varietà di scopi, come la generazione di testo, la creazione di immagini, la trascrizione audio e molto altro.
Grazie alla potenza di Java e alla versatilità delle API di OpenAI, è possibile creare soluzioni innovative che trasformano semplici applicazioni in strumenti avanzati basati su AI. Se il concetto di API dovesse essere poco familiare per te, non preoccuparti: proviamo, ora, a definire che cos’è un API RESTful e, in seguito, vediamo come integrarle con Java.
Cos’è un’API RESTful?
Le RESTful API sono una tipologia di web service API che utilizza i principi del REST (Representational State Transfer) per la comunicazione tra client e server.
REST si basa su una serie di vincoli e linee guida che garantiscono che le API siano semplici, scalabili e facili da mantenere.
Le API RESTful utilizzano i metodi HTTP standard come GET, POST, PUT, DELETE, tra gli altri, per eseguire operazioni come la lettura, la creazione, l’aggiornamento e la cancellazione di risorse. Le risorse, che possono essere dati o servizi, sono identificate da URL univoci e vengono trasferite tra client e server in formati standard come JSON o XML.
Uno degli aspetti chiave di un’API RESTful è la sua natura stateless, il che significa che ogni richiesta da parte del client al server deve contenere tutte le informazioni necessarie per comprendere e processare la richiesta stessa. Il server non conserva lo stato delle sessioni tra le richieste, rendendo l’API più efficiente e riducendo la complessità del sistema.
Questa architettura rende le API RESTful particolarmente adatte per applicazioni web moderne, poiché sono flessibili e possono essere facilmente consumate da una vasta gamma di client, come browser, applicazioni mobili e altri servizi web. L’adozione diffusa delle API RESTful nel settore dello sviluppo software è dovuta alla loro semplicità d’uso, scalabilità e allineamento con i protocolli web standard.
Come integrare le API di OpenAI con Java.
Per integrare le API di OpenAI con Java, ci si deve servire del Token di OpenAI che possiamo generare dal sito consultando questo questo link.
Possiamo generare due tipi di token: account personali e di servizio.
Il token personale si spiega da sé. I token per gli account di servizio vengono utilizzati per bot o applicazioni che possono essere collegate ai progetti OpenAI.
Anche se funzionerebbero entrambi, un token personale è sufficiente per il nostro scopo.
Il codice che vedremo, utilizza una libreria open source, sviluppata da terzi in Java, disponibile su GitHub (anche se, purtroppo, dal 6 giugno 2024 non ha – e non avrà – più aggiornamenti.) Puoi guardare il codice sorgente ed installare la libreria andando su questo link. Non dimenticare di settare le dipendenze!
Prima di iniziare, dobbiamo generare una OPENAI_TOKEN, in modo tale che la nostra applicazione si possa connettere con le API di OpenAI. Per farlo dobbiamo generare il token dal sito.
Tuttavia, dovremmo fare attenzione al token che stiamo generando. Gli esempi che vediamo sulla repo di github utilizzano le variabili di ambiente. Questa potrebbe non essere la soluzione migliore per larga scala, ma funziona bene per piccoli script personali.
Durante le esecuzioni, non abbiamo necessariamente bisogno di identificare la variabile di ambiente per l’intera macchina; possiamo utilizzare le configurazioni nel nostro IDE.
Possiamo generare due tipi di token: account personali e di servizio. Il token personale è autoesplicativo. I token per gli account di servizio sono utilizzati per bot o applicazioni che possono essere connesse ai progetti OpenAI. Sebbene entrambi funzionerebbero, un token personale è sufficiente per il nostro scopo.
Per partire, utilizzando le nostre API nel linguaggio Java, l’entry point è il seguente:
String token = "OPENAI_TOKEN"; OpenAiService service = new OpenAiService(token); Successivamente creiamo una richiesta utilizzando ChatCompletionRequest. La configurazione minima richiede di fornire solo messaggi e un modello: ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest .builder() .model(GPT_3_5_TURBO_0301.getName()) .messages(messages) .build(); @Getter @AllArgsConstructor public enum ModelEnum { GPT_3_5_TURBO("gpt-3.5-turbo"), GPT_3_5_TURBO_0301("gpt-3.5-turbo-0301"), GPT_4("gpt-4"), GPT_4_0314("gpt-4-0314"), GPT_4_32K("gpt-4-32k"), GPT_4_32K_0314("gpt-4-32k-0314"), GPT_4_1106_preview("gpt-4-1106-preview"); private String name; }
È essenziale scegliere il modello che si adatta alle nostre esigenze e incide anche sui costi. Dobbiamo quindi fare una scelta ragionevole.
List<ChatMessage> messages = new ArrayList<>(); ChatMessage systemMessage = new ChatMessage(ChatMessageRole.SYSTEM.value(), PROMPT); messages.add(systemMessage);
La classe ChatMessage è quella che ci consente di generare messaggi e iniziare a rendere il chatbot “parlante”.
La parte interessante è che inviamo una raccolta di messaggi. Anche se nelle chat normali comunichiamo inviando messaggi uno per uno, in questo caso è più simile ai thread di posta elettronica.
Il sistema funziona al completamento e aggiunge il messaggio successivo alla catena. In questo modo possiamo mantenere il contesto della conversazione. Possiamo considerarlo stateless. Tuttavia, ciò significa che dobbiamo passare i messaggi per mantenere il contesto.
Allo stesso tempo, possiamo andare in un altro modo e creare un assistente. Con questo approccio, memorizziamo i messaggi nei thread e non sarà necessario inviare avanti e indietro l’intera cronologia.
Come accennato in precedenza, i ruoli sono cruciali affinché ChatGPT comprenda il contesto della conversazione. Possiamo usarli per identificare gli attori dietro i messaggi. In questo modo possiamo aiutare ChatGPT a interpretare correttamente i messaggi. I ChatMessage supportano quattro ruoli: chat, system, assistant e function.
public enum ChatMessageRole { SYSTEM("system"), USER("user"), ASSISTANT("assistant"), FUNCTION("function"); private final String value; ChatMessageRole(final String value) { this.value = value; } public String value() { return value; } }
Possiamo pensare ai token come alla quantità di informazioni che possiamo elaborare e alla quantità che vogliamo ottenere in risposta. Possiamo impedire al modello di generare risposte enormi limitando il numero di token nella risposta con dei semplici settaggi.
Non c’è una mappatura diretta tra le parole e i token perché ogni modello li elabora in modo leggermente diverso. Questo parametro limita la risposta a un numero specifico di token. L’utilizzo dei valori predefiniti potrebbe consentire risposte eccessive e aumentare le fatture per l’utilizzo. Pertanto, è una buona pratica configurarlo in modo esplicito.
Attenzione a non confondere il concetto di token appena spiegato con il token utilizzato per sfruttare le API di OpenAI creato al primo step.
ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest .builder() .model(MODEL) .maxTokens(MAX_TOKENS) .messages(messages) .build();
All’interno di un progetto, possiamo sfruttare questo codice e interagire tramite il chatbot con un tipico cmd.
Gli strumenti di intelligenza artificiale sono ottimi e ci aiutano a migliorare le applicazioni e ad automatizzare le attività quotidiane, dall’elaborazione delle e-mail alla creazione di liste della spesa fino all’ottimizzazione dell’istruzione. Java fornisce un paio di modi per interagire con le API OpenAI tramite restful API e openai-java è una di queste librerie.
Tuttavia, è importante ricordare che i modelli generativi come chat gpt 4, nonostante siano abbastanza convincenti, sono soggetti ad allucinazioni. Pertanto, è nostra responsabilità ricontrollare le informazioni emesse da questa AI generativa.
Vuoi saperne di più sul linguaggio Java? Abbiamo preparato per te una guida a Java in italiano: corri a scoprirla!
Se, invece, ad incuriosirti maggiormente è l’universo dell’intelligenza artificiale generativa, scopri il nostro corso di prompt design!