AI in Java Costruire un clone di ChatGPT con Spring Boot e LangChain

IA in Java Costruire un clone di ChatGPT con Spring Boot e LangChain

Molte librerie per lo sviluppo di applicazioni AI sono principalmente scritte in Python o JavaScript. La buona notizia è che diverse di queste librerie hanno anche API in Java. In questo tutorial, ti mostrerò come costruire un clone di ChatGPT usando Spring Boot, LangChain e Hilla.

Il tutorial coprirà completamenti di chat sincroni semplici e completamenti di streaming più avanzati per una migliore esperienza utente.

Codice Sorgente Completato

Puoi trovare il codice sorgente dell’esempio nel mio repository GitHub.

Requisiti

  • Java 17+
  • Node 18+
  • Una chiave API di OpenAI in una variabile d’ambiente OPENAI_API_KEY

Crea un progetto Spring Boot e React, Aggiungi LangChain

Prima di tutto, crea un nuovo progetto Hilla usando l’interfaccia della riga di comando di Hilla. Questo creerà un progetto Spring Boot con un frontend React.

Apri il progetto generato nel tuo IDE. Quindi, aggiungi la dipendenza LangChain4j al file pom.xml:

Completamenti Semplici di Chat di OpenAI con Memoria Utilizzando LangChain

Inizieremo ad esplorare LangChain4j con un completamento di chat sincrono semplice. In questo caso, vogliamo chiamare l’API di completamento della chat di OpenAI e ottenere una singola risposta. Vogliamo anche tenere traccia di massimo 1.000 token della cronologia della chat.

Nel pacchetto com.example.application.service, crea una classe ChatService.java con il seguente contenuto:

  • @BrowserCallable rende la classe disponibile al frontend.
  • @AnonymousAllowed consente agli utenti anonimi di chiamare i metodi.
  • @Value inietta la chiave API di OpenAI dalla variabile d’ambiente OPENAI_API_KEY.
  • Assistant è l’interfaccia che useremo per chiamare l’API di chat.
  • init() inizializza l’assistente con una memoria di 1.000 token e il modello gpt-3.5-turbo.
  • chat() è il metodo che chiameremo dal frontend.

Avvia l’applicazione eseguendo il file Application.java nel tuo IDE, o con l’obiettivo predefinito di Maven:

Questo genererà i tipi TypeScript e i metodi di servizio per il frontend.

Successivamente, apri il file App.tsx nella cartella frontend e aggiornalo con il seguente contenuto:

  • Utilizziamo i componenti MessageList e MessageInput dalla libreria UI Hilla.
  • sendMessage() aggiunge il messaggio all’elenco dei messaggi e chiama il metodo chat() sulla classe ChatService. Quando viene ricevuta la risposta, viene aggiunta all’elenco dei messaggi.

Ora hai un’applicazione di chat funzionante che utilizza l’API di chat di OpenAI e tiene traccia della cronologia della chat. Funziona bene per i messaggi brevi, ma è lento per le risposte lunghe. Per migliorare l’esperienza utente, possiamo utilizzare invece un completamento di streaming, visualizzando la risposta man mano che viene ricevuta.

Completamenti di Chat di OpenAI con Memoria Utilizzando LangChain in Streaming

Aggiorniamo la classe ChatService per utilizzare un completamento di streaming:

Il codice è per lo più lo stesso di prima, con alcune differenze importanti:

  • Assistant ora restituisce un TokenStream invece di una Stringa.
  • init() utilizza streamingChatLanguageModel() invece di chatLanguageModel().
  • chatStream() restituisce un Flux<String> invece di una Stringa.

Aggiorna App.tsx con il seguente contenuto:

Il modello è lo stesso di prima, ma il modo in cui gestiamo la risposta è diverso. Invece di aspettare che la risposta venga ricevuta, iniziamo ad ascoltare pezzi della risposta. Quando viene ricevuto il primo pezzo, lo aggiungiamo come un nuovo messaggio. Quando vengono ricevuti pezzi successivi, li aggiungiamo all’ultimo messaggio.

Riavvia l’applicazione e dovresti vedere che la risposta viene visualizzata man mano che viene ricevuta.

Conclusione

Come puoi vedere, LangChain rende semplice costruire applicazioni IA alimentate da LLM in Java e Spring Boot.

Con la configurazione di base in atto, puoi estendere la funzionalità tramite l’aggiunta di operazioni in catena, l’aggiunta di strumenti esterni e altro ancora seguendo gli esempi sulla pagina GitHub di LangChain4j, collegata in precedenza in questo articolo. Scopri di più su Hilla nella documentazione di Hilla.