IA en Quarkus: tu primer asistente con LangChain4j

LangChain4j y Quarkus te permiten integrar inteligencia artificial en Java de forma sorprendentemente simple. Vamos a crear un asistente que responde preguntas: tú le preguntas algo, él responde. Sin configurar servidores de IA, sin descargar modelos manualmente, sin complicaciones.


¿Qué es LangChain4j?

LangChain4j es una librería Java para integrar modelos de lenguaje (LLMs) en tus aplicaciones. Quarkus ofrece extensiones oficiales para LangChain4j que hacen la integración muy sencilla. Por ejemplo, puedes conectar con OpenAI, Anthropic, Hugging Face y otros proveedores.

Sin embargo, en este tutorial usamos Ollama, que ejecuta modelos de lenguaje directamente en tu máquina. Es gratis, todo corre local (sin enviar datos a servidores externos), y por lo tanto no necesitas crear cuentas ni API keys. Los modelos como llama3.2 son redes neuronales entrenadas con miles de millones de textos.

Lo mejor: Dev Services levanta Ollama automáticamente.


Requisitos

  • Java 17 ó 21 (soportadas por Quarkus)
  • Maven 3.9 o superior
  • Podman o Docker funcionando
  • Quarkus CLI

¿No cumples todos los requisitos? Revisa Entorno de desarrollo ideal para Quarkus donde explicamos cómo instalar todo fácilmente.

Si usas Podman, te sugerimos revisar Usando Podman con Quarkus: la configuración esencial

💡 La primera ejecución descarga la imagen de contenedor Ollama (~6GB) y el modelo de IA (~2GB). Ten paciencia.


Crear el proyecto

quarkus create app io.quarkiverso:ia-asistente \
  --extension=rest,langchain4j-ollama

Esto incluye:

  • REST: para exponer el endpoint
  • LangChain4j Ollama: integración con Ollama (activa Dev Services)

Entra al proyecto:

cd ia-asistente

Puedes descargar el código fuente completo en github.com/quarkiverso/ia-asistente


Crear el servicio de IA

Crea el archivo src/main/java/io/quarkiverso/Asistente.java:

package io.quarkiverso;

import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import io.quarkiverse.langchain4j.RegisterAiService;

@RegisterAiService
public interface Asistente {

    @SystemMessage("{personalidad}")
    String responder(@UserMessage String pregunta, String personalidad);
}

Básicamente, es una interfaz con dos anotaciones:

  • @RegisterAiService: registra el servicio de IA
  • @SystemMessage: define la personalidad (la recibimos como parámetro)
  • @UserMessage: la pregunta del usuario

Como resultado, Quarkus genera la implementación automáticamente.


Crear el endpoint

Crea el archivo src/main/java/io/quarkiverso/AsistenteResource.java:

package io.quarkiverso;

import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.QueryParam;
import org.eclipse.microprofile.config.inject.ConfigProperty;

@Path("/asistente")
public class AsistenteResource {

    @Inject
    Asistente asistente;

    @ConfigProperty(name = "personalidad")
    String personalidad;

    @GET
    public String preguntar(@QueryParam("pregunta") String pregunta) {
        return asistente.responder(pregunta, personalidad);
    }
}

Usamos @ConfigProperty para inyectar la personalidad desde application.properties y la pasamos al asistente.


Configurar la personalidad

Edita src/main/resources/application.properties:

# Personalidad del asistente (puedes cambiarla sin modificar codigo)
personalidad=Eres un asistente amable que responde en español de forma breve y clara.

# Otras personalidades de ejemplo:
# personalidad=Eres un experto en Java que responde con ejemplos de codigo.
# personalidad=Eres un chef que solo habla de recetas de cocina.
# personalidad=Eres un poeta que responde siempre en verso.

De esta manera, al externalizar la personalidad, puedes cambiarla sin modificar el código. El archivo tiene algunas personalidades de ejemplo comentadas, simplemente descomenta la que quieras probar.


Ejecutar

quarkus dev

Durante la primera ejecución verás que descarga el modelo. Esto puede tardar unos minutos dependiendo de tu conexión.

Pulling model llama3.2...

Una vez listo, verás:

Dev Services for Ollama started

Probar

En otra terminal:

curl 'http://localhost:8080/asistente?pregunta=Hola'

Respuesta (ejemplo):

¡Hola! ¿En qué puedo ayudarte hoy?

Prueba otras preguntas:

curl 'http://localhost:8080/asistente?pregunta=Quien%20creo%20Java'
curl 'http://localhost:8080/asistente?pregunta=Que%20es%20un%20microservicio'

¡Tu asistente de IA con LangChain4j y Quarkus está funcionando!


¿Qué pasó por detrás?

  1. Quarkus detectó langchain4j-ollama sin configuración
  2. Dev Services levantó un contenedor con Ollama
  3. Descargó el modelo llama3.2 automáticamente
  4. Tu interfaz Asistente se conectó al modelo
  5. Cada llamada envía la pregunta y recibe la respuesta

Todo esto sin escribir código de conexión, configurar URLs ni descargar modelos manualmente.


Configuración opcional

Además, si quieres usar un modelo diferente, edita application.properties agregando:

quarkus.langchain4j.ollama.chat-model.model-id=mistral

Modelos populares:

  • llama3.2 (por defecto, equilibrado)
  • tinyllama (ultraligero, respuestas rápidas pero simples)
  • mistral (rápido, bueno para código)
  • codellama (especializado en código)

Próximos pasos

  • Prueba diferentes personalidades y modelos
  • Explora el Dev UI en http://localhost:8080/q/dev-ui
  • Agrega Swagger UI y prueba el asistente directamente desde el navegador
    • quarkus extension add quarkus-smallrye-openapi
    • http://localhost:8080/q/swagger-ui

Código fuente: github.com/quarkiverso/ia-asistente