In uno dei nostri articoli abbiamo già discusso di cosa siano gli embeddings e come essi siano utili nel mondo del machine learning. Adesso è arrivato il momento di fare un po' di pratica quindi in questo tutorial proveremo a generare embeddings grazie a Spring AI e ai modelli offerti da OpenAI.
Se siete nuovi del mondo Spring AI vi suggeriamo di seguire la nostra guida che spiega passo per passo come funziona il framework grazie ad esempi pratici. Partiremo dunque dal progetto di esempio che abbiamo creato nei precedenti articoli.
Tutorial embeddings in Spring AI
In questo esercizio useremo OpenAI per generare l’embedding di una parola o di una frase. A tal scopo creeremo un controller REST che prenda in input una stringa e restituisca in output la sua rappresentazione vettoriale.
Per prima cosa è necessario indicare a Spring AI quale dei vari modelli di embeddings offerti da OpenAI usare. Ad l’esempio useremo “text-embedding-3-small” che è quello più economico e genera vettori con 1536 dimensioni.
Per configurare correttamente il framework è sufficiente inserire la seguente proprietà nel file application.properties:
spring.ai.openai.embedding.options.model=text-embedding-3-small
A questo punto, non resta che implementare il nostro controller facendo uso dell’EmbeddingModel
offerto da SpringAI:
package com.example.aidemo.controller;
import java.util.List;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.embedding.EmbeddingResponse;
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 OpenAiEmbeddingController {
private final EmbeddingModel embeddingClient;
@Autowired
public OpenAiEmbeddingController(EmbeddingModel embeddingClient) {
this.embeddingClient = embeddingClient;
}
@GetMapping("/ai/embedding")
public EmbeddingResponse embed(@RequestParam(value = "message") String message) {
EmbeddingResponse embeddingResponse = this.embeddingClient.embedForResponse(List.of(message));
return embeddingResponse;
}
}
Come si può notare, il codice è veramente molto semplice e si commenta da solo.
Possiamo testare l’endpoint che abbiamo definito mediante il browser collegandosi a localhost e inserendo in query string il messaggio:
http://localhost:8080/ai/embedding?message=the cat is sleeping on the carpet
La risposta in formato JSON avrà un’aspetto simile al seguente:
{
"metadata": {
"completion-tokens": null,
"total-tokens": 7,
"model": "text-embedding-3-small",
"prompt-tokens": 7
},
"result": {
"index": 0,
"metadata": null,
"output": [
-0.03796489,
-0.068526104,
...,
-0.0016116675
]
}
]
}
Nella versione corrente di Spring AI non è ancora disponibile una funzionalità per il dimensional reduction pertanto, per ottenere embeddings di dimensione inferiore è necessario ricorrere a librerie esterne.
Se vi interessa l’argomento vi invito a leggere il prossimo articolo che mostra come funziona l’integrazione con un database vettoriale.