Análisis de estantería de libros: Usa Gemini para compilar una aplicación de Cloud Run en Java que lleve los datos de BigQuery a la Web

1. Introducción

¿Te gusta leer libros, pero te abruma la cantidad de opciones? Imagina tener una app potenciada por IA que no solo recomiende la lectura perfecta, sino que también ofrezca un resumen conciso según el género que elijas para darte una idea de la esencia del libro. En este codelab, te explicaré cómo compilar una aplicación de ese tipo con BigQuery, Vertex AI y Cloud Run con la asistencia de Gemini.

Descripción general del proyecto

Nuestro caso de uso se centra en estos 4 componentes clave:

  • Base de datos de libros: El vasto conjunto de datos públicos de BigQuery de libros de archivo en Internet funcionará como nuestro catálogo de libros completo.
  • Motor de resúmenes con IA: Google Cloud Functions, equipado con el modelo de lenguaje Gemini Pro, generará resúmenes detallados y personalizados para las solicitudes de los usuarios.
  • Integración con BigQuery: Una función remota en BigQuery que llama a nuestra Cloud Function para ofrecer resúmenes de libros y temas a pedido.
  • Interfaz de usuario: Una app web alojada en Cloud Run que ofrecerá una aplicación web para que los usuarios vean los resultados.

Dividimos la implementación completa del proyecto en 3 codelabs, y este codelab abarca el Codelab 3 de la siguiente lista:

Codelab 1: Usa Gemini para compilar una Cloud Function en Java para una aplicación de Gemini.

Codelab 2: Usa Gemini para compilar aplicaciones de IA generativa solo en SQL con BigQuery.

Codelab 3: Usa Gemini para crear una aplicación web de Spring Boot en Java que interactúe con BigQuery.

2. Usa Gemini para compilar una aplicación web de Spring Boot con BigQuery

Qué compilarás

  • Crearás el conjunto de datos y la tabla de BigQuery necesarios.
  • La aplicación web de Spring Boot en Java que interactúe con BigQuery para recuperar datos de libros y mostrarlos en la Web.
  • Esta app se implementará en Cloud Run.
  • Implementarás estos pasos con la ayuda de Gemini.

3. Requisitos

Crea tu proyecto

Puedes omitir los pasos que se indican a continuación si ya activaste una cuenta de facturación y creaste un proyecto con el vínculo mencionado en el paso condicional anterior.

  1. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.
  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Obtén información sobre cómo verificar si la facturación está habilitada en un proyecto.

Activa Cloud Shell

  1. Usarás Cloud Shell, un entorno de línea de comandos que se ejecuta en Google Cloud y que viene precargado con bq:

En la consola de Cloud, haz clic en Activar Cloud Shell en la esquina superior derecha:

6757b2fb50ddcc2d.png

  1. Una vez que tengas conexión con Cloud Shell, deberías ver que ya se te autenticó y que el proyecto ya se configuró con tu ID del proyecto. En Cloud Shell, ejecuta el siguiente comando para confirmar que tienes la autenticación:
gcloud auth list
  1. En Cloud Shell, ejecuta el siguiente comando para confirmar que el comando gcloud conoce tu proyecto.
gcloud config list project
  1. Si tu proyecto no está configurado, usa el siguiente comando para hacerlo:
gcloud config set project <YOUR_PROJECT_ID>

Consulta la documentación para ver los comandos y el uso de gcloud.

4. Cómo habilitar Gemini y las APIs necesarias

Habilita Gemini

  1. Navega a Gemini Marketplace para habilitar la API. También puedes usar el siguiente comando:

gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID

  1. Visita la página de Gemini y haz clic en "Comenzar a chatear".

Habilita otras APIs necesarias

¿Cómo haríamos eso? Preguntémosle a Gemini, ¿de acuerdo? Pero antes de eso, recuerda lo siguiente:

Nota: Los LLMs no son determinísticos. Así que, mientras pruebas estas instrucciones, la respuesta que recibas podría ser diferente a las que se muestran en la captura de pantalla.

Para ir a la consola de chat de Gemini, haz clic en el ícono "Abrir Gemini" que está en la esquina superior derecha, junto a la barra de búsqueda, en la consola de Google Cloud.

26e1491322855614.png

Escribe esta pregunta en la sección "Ingresa una instrucción aquí":

How do I enable the BigQuery and Cloud Run apis using gcloud command?

Obtienes la respuesta como se ve en la siguiente imagen:

b97a8a9fa9143b3f.png

Cópiala (puedes usar el ícono de copiar en la parte superior del fragmento de comando) y ejecútala en la terminal de Cloud Shell para habilitar los servicios correspondientes:

  • bigquery.googleapis.com
  • run.googleapis.com

5. Explora el conjunto de datos públicos de BigQuery para los datos de los libros

Para comenzar, familiarízate con el conjunto de datos públicos de BigQuery que contiene información de numerosos libros de archivo de Internet. Si no puedes llegar al conjunto de datos de internetarchivebooks desde este vínculo, sigue los pasos que se indican a continuación para explorar el conjunto de datos o, como alternativa, sigue esta documentación:

Puedes encontrar este conjunto de datos públicos en el panel del explorador de BigQuery. Podrás encontrarlo a la izquierda cuando llegues a la consola de BigQuery.

39e2ac03cc99cbac.png

Escribe "gdelt-bq" o "internetarchivebooks" en la barra de búsqueda y haz clic en BUSCAR EN TODOS LOS PROYECTOS. Expande el resultado y destaca libros de archivo de Internet como se muestra en la siguiente imagen:

68dba68a79cddfc9.png.

Expande el conjunto de datos, haz clic en gdelt-bq.internetarchivebooks y, luego, obtén una vista previa de los datos de la tabla 1920. Esta tabla incluye libros de archivo del año 1920.

Para ver el esquema que usaremos en secciones posteriores, ejecuta la siguiente consulta:

select * from  `gdelt-bq.internetarchivebooks.1920` limit 5;

Utilizaremos los siguientes tres campos para nuestro codelab:

  • BookMeta_Title (título)
  • Themes (temas separados por ";")
  • BookMeta_FullText (texto completo del libro)

6. Crea la plantilla básica de Cloud Run en Java con Gemini

Para abrir el editor de Cloud Shell, haz clic en el ícono Abrir editor en la esquina superior derecha de la terminal de Cloud Shell (por lo general, prefiero abrir la terminal y el editor en pestañas separadas en paralelo para poder escribir código en una y compilar en otra).

edd258384bc74f1f.png

Una vez que tengas el editor abierto, asegúrate de que el logotipo de Gemini, ubicado en la esquina inferior derecha de la consola del editor, esté activo (y no cancelado). Además, asegúrate de que tu proyecto de Google Cloud, en la esquina inferior izquierda, apunte al proyecto activo actual con el que quieres trabajar. Si están inactivos, haz clic en ellos, autoriza los proyectos y selecciona el proyecto de Google Cloud al que deseas dirigirlos para activarlos.

Una vez que ambos estén activos, haz clic en el nombre del proyecto en la esquina inferior izquierda y, en la lista emergente que se abre, titulada "Cloud Code", desplázate hacia abajo hasta "Nueva aplicación".

db998cc557e83f40.png

En la lista, selecciona la aplicación de Cloud Run. En la lista que aparece, selecciona Java:

c7748de85120507b.png

En la lista resultante, escribe el nombre del proyecto "bookshelf-web" en lugar de helloworld y haz clic en Aceptar.

7c58c764277c571f.png

¡Felicitaciones! Iniciaste tu aplicación sencilla de Cloud Run en Java con Gemini y no hiciste mucho más que habilitar y activar los parámetros de configuración, ¿estamos de acuerdo?

Esta es la estructura del proyecto que deberías ver:

e6be37bbee730bd1.png

Ahora puedes implementar la aplicación. Pero no es por eso que comenzamos esto. Aún debemos incluir la funcionalidad principal de la aplicación web, que es recuperar los datos de análisis de la base de datos de BigQuery y mostrarlos en la Web.

Para ello, puedes agregar más instrucciones y desarrollar tu código de forma incremental con Gemini o escribir la lógica por tu cuenta. Voy a combinar ambos métodos.

7. Agrega dependencias para usar BigQuery en la app web

Ahora que la aplicación se inició, está todo listo para realizar cambios en la fuente y las propiedades de la aplicación. Primero, agreguemos las dependencias. Pidamos a Gemini que recomiende.

En el editor de Cloud Code, asegúrate de que la barra de estado muestre Gemini activo en la esquina inferior derecha y el proyecto activo de Google Cloud seleccionado en la esquina inferior izquierda.

En el editor de Cloud Code, navega al archivo pom.xml, justo encima de la etiqueta </dependencies>, y escribe el siguiente comentario de instrucción:

171d1c40ff8124e8.png

<!-- What maven dependency should I include to access BigQuery in the app-->

Obtuve este resultado, como se muestra en la siguiente imagen:

2df51efd655a3557.png

Pegaré la dependencia aquí para mayor comodidad Si, en tu caso, la sugerencia tiene una etiqueta de versión, puedes ignorarla.

<dependency>
 <groupId>com.google.cloud</groupId>
 <artifactId>google-cloud-bigquery</artifactId>
</dependency>

8. Actualiza la fuente para enviar los datos de la estantería de libros a la Web

Reemplaza el código HelloWorldController.java por lo siguiente:

package cloudcode.helloworld.web;
import java.util.UUID;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.JobId;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableResult;
import com.google.cloud.bigquery.FieldValueList;


@RestController
public final class HelloWorldController {


  /**
   * Create an endpoint for the landing page
   * @return the BigQuery analytics results string to the web
   */


  @GetMapping("/")
  public String helloWorld() throws Exception {
    /* Connect to bigquery and write a select SQL to fetch Title, Theme and Summary fields from the table `bookshelf.bookshelf_theme` if you have executed the codelab 1 of this series, if not just directly use records from gdelt-bq.internetarchivebooks.1920 table */

 
String query = "SELECT  BookMeta_Title || ' (' || Themes || ') ' as summary  from gdelt-bq.internetarchivebooks.1920 limit 10 ";


    BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    QueryJobConfiguration queryConfig =
        QueryJobConfiguration.newBuilder(query)
            .setUseLegacySql(false)
            .build();
    // Create a job ID so that we can safely retry.
    JobId jobId = JobId.of(UUID.randomUUID().toString());
    Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).setJobId(jobId).build());
    // Wait for the query to complete.
    queryJob = queryJob.waitFor();
    // Check for errors
    if (queryJob == null) {
      throw new RuntimeException("Job no longer exists");
    } else if (queryJob.getStatus().getError() != null) {
      throw new RuntimeException(queryJob.getStatus().getError().toString());
    }
    // Get the results.
    TableResult result = queryJob.getQueryResults();
    String responseString = "";
    // Print all pages of the results.
    for (FieldValueList row : result.iterateAll()) {
      responseString += row.get("summary").getStringValue() + ".         \n";
      System.out.printf("%s\n", row.get("summary").getStringValue());
    }
    return responseString;
  }
}

Realizamos los siguientes cambios en los archivos fuente:

  1. En HelloWorldController.java, se actualizó @Controller a @RestController.
  2. Se reemplazó el contenido del método helloWorld() para incluir la llamada a BigQuery, la ejecución de la consulta que recupera los datos para enumerar el título y los temas del libro.
  3. En lugar de mostrar la plantilla de vista de índice en la carga, se actualiza para devolver la respuesta como una cadena a la Web.

Nota importante: Recuerda actualizar la siguiente información.

  1. Actualiza el archivo HelloWorldControllerTests.Java para marcar como comentario la invocación actual mvc.perform(…).

Gemini para la explicación de código

Te proporcionamos el código y describimos los cambios que hicimos en los archivos fuente. También podrías haber usado Gemini para obtener explicaciones o comentarios de código según fuera necesario. Estas son algunas de las cosas que puedes probar:

  1. Con el archivo HelloWorldController.java abierto en el IDE, ve al panel de chat en el IDE y proporciona la siguiente instrucción: Explica esto. Mira la explicación detallada que ofrece Gemini. Puedes usar esta función en cualquier momento para obtener la explicación de código.
  2. Puedes destacar cualquier fragmento o línea específicos en el código [p. ej., @GetMapping("/")] y, luego, usar la siguiente instrucción: Explica esto. De este modo, se proporcionará una explicación detallada solo de la línea o el fragmento de código que seleccionaste.
  3. Incluso puedes probar algunas consultas que hagan preguntas sobre el código de otra manera. P. ej., puedes seleccionar la siguiente línea de código

BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

y hacer la siguiente consulta: "¿Qué sucederá si la variable de BigQuery es nula?". 4. También puedes solicitar mejoras de código o refactorización con la ayuda de Gemini. P. ej., puedes seleccionar todo el código para el método helloWorld() y enviar la siguiente instrucción: "¿Cómo mejoro o refactorizo este código?". Mira las sugerencias que proporciona Gemini.

9. Compila e implementa

Navega a la terminal de Cloud Shell. Asegúrate de que apunte a tu ID del proyecto en la terminal.

4b3392dd050340a3.png

Navega al directorio del proyecto con el comando cd:

cd bookshelf-web

Ejecuta los siguientes comandos uno por uno para asegurarte de que tu app se esté ejecutando de forma local.

mvn package

mvn spring-boot:run

Ahora, haz clic en el botón "Vista previa en la Web" y, luego, en la opción "Vista previa en el puerto 8080", como se muestra a continuación:

ea9464498b6bd9df.png

Asegúrate de que puedas ver la app ejecutándose de forma local en tu máquina de Cloud Shell.

Ahora preguntemos a Gemini cómo implementar esta aplicación web en Cloud Run. Haz clic en el botón "Abrir Gemini" en la consola de Google Cloud para navegar al chat de Gemini.

Esta es mi instrucción:

What is the gcloud command to deploy my app to cloud run without having to containerize, only by giving the source file?

La respuesta se muestra a continuación:

6f21c2d59b6dc416.png

Reemplacemos el nombre del servicio y los marcadores de posición de la región del comando gcloud como se muestra en el siguiente fragmento:

gcloud run deploy bookshelf-web --source . --allow-unauthenticated --region $REGION

Ejecuta este comando desde la terminal de Cloud Shell. Deberías ver algunas preguntas de seguimiento, seleccionar las respuestas adecuadas y poder ver la implementación en curso:

66f5d6e00c16a4db.png

Esto tarda unos minutos y la app se implementa en Google Cloud sin servidores. Haz clic en la app implementada de Cloud Run y visualiza el resultado en la Web:

fd342d8f16e664ab.png

10. Felicitaciones

¡Felicitaciones! Compilamos, implementamos y probamos correctamente una aplicación web de Cloud Run en Java para realizar el análisis de la estantería de libros con Gemini. Como tarea de seguimiento, pregúntale a Gemini cómo borrar el servicio de Cloud Run implementado de la consola de Google Cloud y sigue los pasos con los que responda para limpiar el recurso.