Créer un chatbot avec Google Gemini Vertex AI et Quarkus
J’ai récemment créé une extension Quarkus qui permet d’accéder à Google Vertex AI.
Dans cet article, je vais utiliser cette extension pour créer un chatbot.
La première étape consiste à créer un projet Quarkus contenant les extensions REST et Google Cloud Vertex AI.
Voici les extensions à ajouter à votre fichier de dépendances :
<dependency> <groupId>io.quarkiverse.googlecloudservices</groupId> <artifactId>quarkus-google-cloud-vertex-ai</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-resteasy-reactive</artifactId> </dependency>
Ou plus simplement, voici un lien qui va vous permettre de créer un projet depuis code.quarkus.io.
L’extension permet d’injecter un objet VertexAI
dans une application Quarkus pour accéder au service Google Cloud Vertex AI. Ce service permet d’utiliser le modèle d’AI générative Gemini dans un projet Google Cloud.
Nous allons utiliser cette extension dans un endpoint REST pour coder un chatbot. Comme je n’aime pas trop développer des UI, je vais utiliser cURL pour appeler le chatbot.
Voici le code de départ pour un chatbot :
package fr.loicmathieu.quarkus.vertexai; // [...] imports omitted for brevity // 1. Standard REST endpoint available on /chat @Path("/chat") public class VertexAIResource { // 2. System message tellin the LLM it is a chatbot private static final String SYSTEM_INSTRUCTION = """ You are a chatbot named Loïc. Don't pretend you know everything but be helpful with a touch of humour."""; private GenerativeModel model; // 3. Injection of the provided VertexAI object @Inject VertexAI vertexAI; // 4. Init the model with Gemini 2.5 Flash @PostConstruct void initModel() { this.model = new GenerativeModel("gemini-2.5-flash", vertexAI) .withSystemInstruction(ContentMaker.fromString(SYSTEM_INSTRUCTION)); } // 5. Generate a chat response on each call to /chat @GET public String chat(@QueryParam("message") String message) throws IOException { var response = model.generateContent(message); // For simplicity: we only take the first part of the first candidate return response.getCandidatesList().getFirst() .getContent().getPartsList().getFirst().getText() + "\n"; } }
- Endpoint REST utilisant le standard JAX-RS disponible au path
/chat
de l’application. - Message système permettant de dire au modèle qu’il est un chatbot et lui demandant de répondre avec une touche d’humour.
- Injection du service
VertexAI
, ce service est fourni par l’extension Quarkus Google Cloud VertexAI. - Initialisation du modèle au post-construct du endpoint REST. On utilise ici Gemini Flash 2.5 car Gemini Flash est un modèle qui allie performance et maîtrise de coût ce que l’on veut pour un chatbot qui doit répondre rapidement et ne nécessite pas de raisonnement trop complexe.
- À chaque appel du endpoint, on va appeler le modèle et retourner la première réponse générée. Une application cas réel implémenterait certainement quelque chose de plus poussé.
Pour démarrer l’application en mode dev, vous pouvez utiliser le CLI Quarkus : quarkus dev
, l’application est alors disponible sur le port 8080.
Pour appeler le chatbot, j’utilise le cURL suivant : curl -G localhost:8080/chat --data-urlencode "message=A message?"
. Pour ceux qui ne connaissent pas, en utilisant -G
je force cURL a fait un GET, il va alors passer les données en tant que query-string dans l’URL. Cela permet d’éviter tout problème d’encodage des espaces en utilisant --data-urlencode
.
Voici un exemple de conversation :
Comme vous le voyez, tout se passe bien jusqu’à ce que je lui demande quel est mon nom ! Même si je viens de lui dire, il ne le connait pas, car il n’a pas de mémoire.
Nous allons ajouter une mémoire au chatbot pour pouvoir avoir une vraie conversation avec lui.
package fr.loicmathieu.quarkus.vertexai; // [...] Imports omitted for brevity // 1. Standard REST endpoint available on /chat @Path("/chat") public class VertexAIResource { // 2. System message tellin the LLM it is a chatbot private static final String SYSTEM_INSTRUCTION = """ You are a chatbot named Loïc. Don't pretend you know everything but be helpful with a touch of humour."""; private GenerativeModel model; private ChatSession chatSession; // 3. Injection of the provided VertexAI object @Inject VertexAI vertexAI; // 4. Init the model with Gemini 2.5 Flash @PostConstruct void initModel() { this.model = new GenerativeModel("gemini-2.5-flash", vertexAI) .withSystemInstruction(ContentMaker.fromString(SYSTEM_INSTRUCTION)); // For simplicity: we use a single chat session. // On real use cases, we should use one per user this.chatSession = this.model.startChat(); } // 5. Generate a chat response on each call to /chat @GET public String chat(@QueryParam("message") String message) throws IOException { var response = chatSession.sendMessage(message); // For simplicity: we only take the first part of the first candidate return response.getCandidatesList().getFirst() .getContent().getPartsList().getFirst().getText() + "\n"; } }
Avec une mémoire, le chatbot fonctionne beaucoup mieux !
Ici, j’ai utilisé une mémoire de chat unique pour toute l’application, stockée en mémoire (RAM). En cas réel, il faudra bien sûr utiliser une mémoire par utilisateur (ou session) de chat, idéalement stockée de manière persistante.
Ce sera tout pour aujourd’hui, nous avons découvert comment créer un chatbot en Quarkus avec Google VertexAI et le modèle Gemini.
Google VertexAI supporte de nombreuses autres fonctionnalités : RAG, multimodal completion, tools, … Vous trouverez plus d’information dans sa documentation.
Vous pouvez retrouver le code du projet sur GitHub : quarkus-vertexai-example.
Merci à Google d’avoir fourni des crédits Google Cloud pour écrire cet article.