DevTurtle logo DevTurtle

Spring AI – Chat tutorial con OpenAI

guide/ Guida Spring AI

Se sei un appassionato di Intelligenza Artificiale e vuoi imparare a creare un'applicazione di chat intelligente utilizzando Spring AI e OpenAI, sei nel posto giusto! In questo tutorial, ti guideremo passo dopo passo attraverso il processo di sviluppo di un'applicazione di chat utilizzando Spring AI e l'API di Chat Completion di OpenAI.

Configurazione del progetto

Prima di cominciare ti invitiamo a seguire il primo capitolo della nostra guida su Spring AI che spiega come creare un progetto da zero. Una volta inizializzato il progetto, dovresti avere la tua applicazione Spring Boot pronta con le dipendenze Maven relative ai moduli OpenAI e Spring Web importate:

XML
<dependency>
	<groupId>org.springframework.ai</groupId>
	<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Generazione API Key per OpenAI

La prima cosa da fare consiste nell’impostare un’API Key per autenticarsi alle API di OpenAI impostando nel file application.properties la proprietà “spring.ai.openai.api-key”. Se volete evitare di incollare la chiave in chiaro nel file potete fare riferimento ad una variabile d’ambiente come nell’esempio di seguito:

Plaintext
spring.ai.openai.api-key=${SPRING_AI_OPENAI_API_KEY}

Nel caso in cui il nome della variabile d’ambiente sia esattamente uguale a SPRING_AI_OPENAI_API_KEY la proprietà è opzionale in quanto Spring legge di default la variabile con questo nome. Se invece il nome della variabile è diverso allora è fondamentale specificare la proprietà.

Per generare l’API Key è necessario accedere alla console di OpenAI e selezionare la voce “API Keys” dal menù laterale:

OpenAI- Generate API Key
OpenAI- Generate API Key

Cliccando su “+ Create new secret key” e seguendo la procedura guidata è possibile creare la chiave in pochi click.

Creazione di un REST Controller

Per testare l’integrazione implementeremo un REST Controller nella nostra applicazione come nell’esempio riportato di seguito:

Java
package com.example.aidemo.controller;
import java.util.Map;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OpenAiRestController {

	private final ChatModel chatModel;
	
	@Autowired
    public OpenAiRestController(OpenAiChatModel chatModel) {
        this.chatModel = chatModel;
    }
	
	@GetMapping("/ai/generate")
    public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        return Map.of("generation", chatModel.call(message));
    }

}

Come potete vedere il controller è molto semplice e si limita ad esporre un GET endpoint “/ai/generate” dove è possibile passare un parametro “message” in query string. Esempio:

Plaintext
http://localhost:8080/ai/generate?message=Where is New York City located?

Avviando il server e collegandosi all’endpoint mediante browser si può facilmente testare il risultato:

JSON
{
  "generation": "New York City is located in the state of New York in the United States."
}

API Stream

In alternativa al metodo precedente, OpenAI consente anche una comunicazione di tipo API Stream.

Quando si parla di “stream API”, si fa riferimento a un’API che consente di ricevere dati in modo continuo piuttosto che in un’unica transazione. In pratica, l’utilizzo dello “stream API” consente di mantenere una connessione persistente con il server ricevendo dati in modo continuo lungo la durata della sessione. Ciò consente un’interazione più fluida e reattiva senza dover attendere una risposta singola e definitiva.

Per definire un endpoint di questo tipo con Spring AI è possibile fare riferimento a questo esempio:

Java
@GetMapping("/ai/stream")
public Flux<ChatResponse> stream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
	Prompt prompt = new Prompt(new UserMessage(message));
    return chatModel.stream(prompt);
}
git icon
Git RepositoryScarica il codice