Elder Vergel
Hola Alejandro, viendo tu solución del método Delete, no estoy seguro si siempre deba responder Ok aun si la película no existe.
Mi propuesta fue validar si existe justo antes de eliminarla, en caso de que no, responde con 404
Integrar inteligencia artificial en una API con Spring Boot es más sencillo de lo que parece cuando usas LangChain4j. Aquí construyes un sistema de recomendaciones con IA que sugiere películas de Platzi Play según los gustos del usuario, conectando un modelo LLM con tu base de datos mediante tools. Es ideal si ya tienes una API REST y quieres llevarla al siguiente nivel.
Cómo eliminar una película con DeleteMapping en Spring Boot
Antes de entrar a la parte de IA, conviene revisar el endpoint de borrado. La anotación @DeleteMapping recibe el id mediante @PathVariable y delega la operación al repositorio.
La respuesta es un ResponseEntity<Void> con Void en mayúscula, porque debe ser una clase tipo objeto. El método del servicio no retorna nada: solo elimina la película.
ResponseEntity.ok().build().MovieEntityRepository llamas a this.crudMovieEntity.deleteById(id).¿Por qué se usa Void en ResponseEntity al borrar? Porque el método no retorna datos, solo confirma que la operación se ejecutó.
Voidindica que el cuerpo de la respuesta está vacío.
Qué es un AI Service en LangChain4j y cómo se configura
El corazón del sistema vive en PlatziPlayAIService, una interfaz anotada con @AIService de LangChain4j. Dentro defines un método generateMoviesSuggestions que retorna un String y recibe el mensaje del usuario anotado con @UserMessage.
El truco está en el @SystemMessage, donde describes el rol del modelo con triples comillas para escribir en varias líneas. El prompt usado fue: Eres un experto en cine que recomienda películas personalizadas según los gustos del usuario. Debes recomendar máximo tres películas. No incluyas películas que estén por fuera de la plataforma de Platzi.
Con eso le das contexto al LLM y restringes su comportamiento a tu catálogo.
Cómo exponer el servicio de IA en un controlador REST
El controlador necesita un endpoint POST en /suggest. Inyectas el servicio con private final PlatziPlayAIService aiService y lo añades al constructor; Spring lo resuelve gracias a la anotación @AIService.
Para recibir las preferencias creas un Data Transfer Object como record: SuggestRequestDTO(String userPreferences). El método retorna ResponseEntity.ok(this.aiService.generateMoviesSuggestions(suggestRequest.userPreferences())).
¿Qué es un DTO en Spring Boot? Un Data Transfer Object es una estructura que transporta datos entre capas. Usar un
recordlo hace inmutable y conciso, ideal para requests y responses.
Cómo conectar la base de datos con la IA usando @Tool
Aquí ocurre la verdadera magia. En MovieService, sobre el método getAll que recupera todas las películas, agregas la anotación @Tool de LangChain4j con la descripción: Busca todas las películas que existan dentro de la plataforma.
Con esa simple anotación, LangChain4j entiende cuándo invocar ese método. El modelo decide por sí mismo llamarlo durante el ciclo de vida de la petición, recibe el resultado como toolExecutionResult y arma una respuesta personalizada con datos reales de tu base de datos.
Qué resultados entrega el sistema de recomendaciones con IA
Al probar desde Postman con la preferencia Me gustan las películas del espacio o las que están ambientadas en Nueva York, la API recomienda tres títulos del catálogo:
Con otra petición como Me gustan las animadas que sean emotivas, sugiere Coco, Toy Story y Shrek, incluyendo año y duración recuperados de la base de datos. Solo la descripción la genera el modelo.
¿Cómo sabe la IA qué películas existen en la plataforma? Gracias a la anotación
@Tool, el modelo invoca automáticamente el método que consulta la base de datos y usa esos resultados como contexto para responder.
Por qué LangChain4j abre posibilidades infinitas en una API
El flujo completo demuestra cómo una anotación bien colocada convierte un endpoint tradicional en una experiencia conversacional. El modelo GPT-4 mini funciona como orquestador, tu base de datos como fuente de verdad y LangChain4j como puente.
Esto te permite construir asistentes, recomendadores o buscadores semánticos sin escribir lógica compleja de integración. La librería gestiona el ciclo de la petición, las llamadas a tools y la composición final de la respuesta.
¿Qué tipo de recomendador construirías tú con esta arquitectura? Cuéntame en los comentarios qué dominio te gustaría conectar con un LLM.
Elder Vergel
Hola Alejandro, viendo tu solución del método Delete, no estoy seguro si siempre deba responder Ok aun si la película no existe.
Mi propuesta fue validar si existe justo antes de eliminarla, en caso de que no, responde con 404
juan arenas
Hola, para el metódo delete, no sería más recomendable enviar un código 204 ( no content ) ?
FERNANDO OROZCO
Hola Juan, esta es mi opinion, asi que no lo tomes como regla. El usuario no esta esperando un contenido de respuesta, literalmente esta borrando.
Tenemos 2 posibles casos cuando intentamos eliminar, el primero es que el dato no existe en la base de datos, en ese caso podemos retornar un 404, ya que no se encontro lo que queriamos borrar, o podemos retornar un 200, ya que aunque no se borro nada, el resultado es el mismo.
En el segundo caso el dato si se encontro y fue efectivamente eliminado, en este caso un 200 es lo correcto.
Martín Alfredo Yela
Hola, es mejor un 204. Si envías un 200 estás diciendo que todo ha ido bien y que hay contenido en el body. Con un 204 estás diciendo que todo ha ido bien y que no tienes nada que devolver, que es lo que pasa al borrar un recurso.
Otra cosa sería que quisieras devolver un mensaje o algún dato adicional; en ese caso sí tendría sentido un 200.
En caso de que no se haya encontrado lo mejor es devolver un 404, si devuelves un 200 se puede entender como que se ha podido realizar lo solicitado, cuando no es así
Dimas Arley Lopez Espinosa
Hola Alejandro, me pareció genial esta clase.
Quisiera saber si puedo de alguna forma hacer que langChain4j busque la información o la respuesta a una petición por ejemplo en un libro pdf que previamente este alojado en alguna carpeta o en la nube, es decir que solo de respuestas pero basado en la informacion de ese pdf, no se si sea posible. Gracias
Alejandro Ramírez
ProfesorDimas, mira este enlace que te puede servir:
sebastian oyanedel
es similar al N8N para creacion de agentes ia y conectarlo con herramientas => tools que buena don gracias
Andres Rivas
Muy buena esta clase. Un ejemplo practivo de como usar AI
Máximo Conejo
Aprecio mucho hayas enseñado ese potencial de Java, es mucho mas sencillo que realizar un MCP server, no sé si esto se puede categorizar como un MCP ya que veo que utiliza tools, pero fue increíble, pensar que con un prompt puedo consultar datos internos y ejecutar análisis todo en el mismo código, gracias por compartirlo
Alejandro Ramírez
ProfesorAhora imagina todo lo que puedes construir con esto 🚀
Fabian Bohorquez Heredia
YEI YEI YEI
Jairo Delgado
Simplemente genial
Roberto Iván Pineda Hernández
Hola a todos,
Excelente clase, se aprende como conecta la IA con nuestro proyecto de sprigboot y asi potenciar nuestros desarrollos.
Les agrego nuevamente la pagina de langchain4j para que indaguen mas
Roberto Iván Pineda Hernández
Hola Alejandro,
Quisiera saber que plugins utilizas en Intellij para que te muestre las sugerencias y los temas para los colores de variables que tienes en el curso.
Me interesa bastante el que te da las sugerencias porque ayuda mucho en tiempos de desarrollo.
Saludos,
Johan Steven Atencia Baena
Hola, Alejandro: ¿cómo estás?
¿Hay cursos de LangChain4j con Java en Platzi? Creo que a muchos nos gustaría ver no solo que la IA nos haga sugerencias, sino también que almacene las conversaciones.
Alejandro Ramírez
ProfesorNo, todavía no tenemos, pero sería genial tener un curso específico para eso. ¿Qué dicen, les gustaría? 🙌
ANDRES ALFONSO MIRA MEJIA
✅