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 app de ese tipo con BigQuery, Gemini y Cloud Functions potenciadas por 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 1.0 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.
Dividiremos la implementación en 3 codelabs:
Codelab 1: Usa Gemini para compilar una Cloud Function en Java para una aplicación de Gemini.
Codelab 2: Usa Gemini para compilar apps en SQL con BigQuery y la IA generativa.
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 apps en SQL con BigQuery y la IA generativa
Qué compilarás
Crearás un
- Modelo remoto en BigQuery que invoca el extremo text-bison-32k de Vertex AI para identificar el género (o tema) del libro a partir de una lista de palabras clave separadas por ";" en la tabla.
- Función remota en BigQuery que invocará de forma remota la Cloud Function de IA generativa implementada.
- Usa el modelo y la función remotos para resumir el tema y el texto de un libro con consultas de SQL, y escribe los resultados en una tabla nueva del conjunto de datos de la biblioteca.
- Implementarás estos pasos con la ayuda de Gemini
3. Requisitos
- Un navegador, como Chrome o Firefox.
- Un proyecto de Google Cloud con la facturación habilitada.
- Resulta útil si tienes implementada una Cloud Function como parte del codelab de la parte 1 Usa Gemini para compilar una Cloud Function en Java para una aplicación de Gemini.
- Condicional: Si en este momento tienes acceso al vínculo sin cargo de créditos de Google Cloud (que te proporcionó el organizador del taller), sigue las instrucciones de la siguiente página para completar los pasos ACTIVACIÓN DE CRÉDITOS y CREACIÓN DEL PROYECTO con antelación. Si no tienes ese vínculo, continúa con los pasos que se indican a continuación para los requisitos previos del proyecto y la facturación:
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.
- En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.
- 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
- 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: 
- Una vez que estés conectado a Cloud Shell, deberías ver que ya se autenticó y que el proyecto ya se configuró con tu ID de proyecto. En Cloud Shell, ejecuta el siguiente comando para confirmar que tienes la autenticación:
gcloud auth list
- En Cloud Shell, ejecuta el siguiente comando para confirmar que el comando gcloud conoce tu proyecto.
gcloud config list project
- 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 for Google Cloud y las APIs necesarias
Habilitar Gemini
- Navega a Marketplace de Gemini for Google Cloud para habilitar la API. También puedes usar el siguiente comando:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- 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.
Escribe esta pregunta en la sección "Ingresa una instrucción aquí":
¿Cómo habilito las APIs de BigQuery y Vertex AI con el comando de gcloud?
Obtienes la respuesta como se ve en la siguiente imagen:

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
- aiplatform.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.
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.

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:
.
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 un nuevo conjunto de datos de BigQuery llamado bookshelf
Queremos crear un conjunto de datos en el proyecto para almacenar todos los objetos de base de datos y análisis que crearemos en este lab. Preguntémosle a Gemini cómo crear un conjunto de datos de BigQuery. Ya deberías tener abierto tu chat de Gemini en otra pestaña del navegador desde el paso de habilitación de las APIs. Si no lo hiciste, puedes hacerlo ahora. Navega a la consola de Google Cloud en https://console.cloud.google.com y verás el ícono de Gemini junto a la barra de búsqueda en la parte superior. Haz clic en él para abrir el chat.

Ingresa la instrucción como se muestra a continuación.
Esta es mi instrucción:
How to create a BigQuery dataset?
Esta es la respuesta:

Sigue los pasos que se describen en la respuesta para crear un conjunto de datos llamado "bookshelf" en tu proyecto activo.
Para crear un conjunto de datos de BigQuery, sigue estos pasos:
- Ve a la página de BigQuery en la consola de Google Cloud.
- En el panel Explorador, haz clic en el ID de tu proyecto.
- Haz clic en Crear conjunto de datos (debería aparecer en las opciones cuando hagas clic en los 3 puntos junto al ID de tu proyecto).
- Ingresa el nombre del conjunto de datos como "bookshelf".
- Establece la ubicación como "US(multirregión)".
- En los pasos 3, 4, 5 y 6 de la respuesta, deja las opciones predeterminadas.
- Haz clic en CREAR CONJUNTO DE DATOS.
Se creará tu conjunto de datos y aparecerá en el panel del Explorador. El conjunto de datos de “estantería” se puede ver de la siguiente manera:
7. Crea un modelo remoto para invocar el LLM de Vertex AI (text-bison-32k)
A continuación, debemos crear un modelo en BigQuery que invoque el modelo "text-bison-32k" de Vertex AI. El modelo ayudará a identificar un tema común y el contexto del libro a partir de la lista de palabras clave de cada libro del conjunto de datos.
Hagámosle esta pregunta a Gemini. Para ello, navega a la pestaña en la que tienes abierta la consola de chat de Gemini y escribe la siguiente instrucción:
¿Cómo conectarás BigQuery y Vertex AI para llamar al extremo del LLM (text-bison-32k) en BigQuery?
La respuesta es la siguiente:

La respuesta incluye información precisa, como los pasos que incluyen el uso de la instrucción CREATE MODEL, el uso de la conexión de BigQuery y la definición del extremo. La instrucción de búsqueda es precisa para mí, pero eso no significa que recibirás el mismo resultado exacto, ya que, como se trata de un modelo de lenguaje grande, es posible que obtengas respuestas en diferentes formatos, volúmenes y profundidades. Si no ves todos los detalles que recibí, no dudes en hacer preguntas de seguimiento en el chat. Por ejemplo, proporciona más detalles sobre cómo crear el recurso de conexión o por qué falta el atributo de conexión, o bien cómo me conecto de BigQuery a Vertex AI, etcétera.
A continuación, se muestra un ejemplo de mensaje de seguimiento (úselo solo si necesita un seguimiento; si la primera respuesta que recibió es suficiente, continúe con ella):
What about the connection? How will I connect from BigQuery to Vertex AI?
A continuación, se muestra la respuesta:

Sigue los pasos de la respuesta para crear una conexión de BigQuery:
- Navega a la consola de BigQuery.
- En el panel Explorador de BigQuery, haz clic en el botón "+AGREGAR" y, luego, en "Conexiones a fuentes de datos externas".
- En este punto, se te pedirá que habilites la API de BigQuery Connection. Haz clic en HABILITAR API:

- Haz clic en "Conexiones a fuentes de datos externas" y deberías ver la diapositiva de la fuente de datos externa, como se muestra a continuación . En la lista de fuentes externas, selecciona la fuente "Vertex AI".

- Escribe un ID de conexión (puede ser el que elijas, pero, por ahora, configúralo como "bq-vx" y la región (multirregional "US").
- Haz clic en "Crear conexión".

- Después de crear la conexión, haz clic en "Ir a la conexión".
- En la página de información de conexión, copia el ID de la cuenta de servicio, ya que lo usaremos en los pasos posteriores.
- Ahora que se creó la conexión, asignemos permisos a este ID de cuenta de servicio que copiamos para poder usar Vertex AI.
- En la página de la consola de Google Cloud, abre Google Cloud IAM o navega al vínculo.
- Haz clic en Otorgar acceso en la sección Ver por principales.

- En el cuadro de diálogo Grant Access, ingresa el ID de la cuenta de servicio que anotamos antes en el cuadro de texto New principals.
- Establece el rol como "Usuario de Vertex AI".

Se crea la conexión requerida. Se otorga el permiso necesario para que la principal (cuenta de servicio de la conexión) use Vertex AI desde BigQuery.
Ejecuta la siguiente instrucción DDL(lenguaje de definición de datos) que representa la creación de un objeto de BD, en este caso, MODEL en el editor de consultas de BigQuery.
CREATE OR REPLACE MODEL bookshelf.llm_model
REMOTE WITH CONNECTION `us.bq-vx`
OPTIONS (ENDPOINT = 'text-bison-32k');
Como alternativa al paso anterior, puedes pedirle a Gemini que sugiera una consulta para crear el modelo que invoca el modelo "text-bison-32k".
Nota: Si usaste un nombre diferente para tu conexión, reemplaza "us.bq-vx" por ese nombre en la instrucción DDL anterior. Esta consulta crea el modelo remoto en el conjunto de datos "bookshelf" que creamos anteriormente.
8. Crea una función remota que invoque la función de Cloud Functions de Java
Ahora crearemos una función remota en BigQuery con la Cloud Function en Java que creamos en el codelab 1 de esta serie para implementar el modelo de Gemini. Esta función remota se usará para resumir el contenido del libro.
Nota: Si no realizaste este codelab o no implementaste esta Cloud Function, puedes omitir este paso y pasar al siguiente tema (que es resumir el tema de los libros con el modelo remoto).
Ve a la consola de BigQuery y pega la siguiente instrucción DDL en el editor de consultas (puedes crear una nueva pestaña del editor de consultas haciendo clic en el botón +).

A continuación, se incluye el DDL que puedes copiar. Recuerda reemplazar el extremo por el extremo de Cloud Functions implementado (creado a partir del lab 1). Si no tienes un extremo, puedes reemplazar los caracteres enmascarados en el siguiente DDL por "abis-345004" para fines de demostración.
CREATE OR REPLACE FUNCTION
`bookshelf.GEMINI_REMOTE_CALL` (context STRING) RETURNS STRING
REMOTE WITH CONNECTION `us.bq-vx`
OPTIONS (
endpoint = 'https://us-central1-****-******.cloudfunctions.net/remote-gemini-call' );
Navega a la consola de BigQuery en la plataforma de Google Cloud y abre una nueva pestaña del editor de consultas. En el editor de consultas de BigQuery, pega la instrucción DDL anterior. Después de ejecutar la consulta, verás la siguiente respuesta:

Ahora que se crearon el modelo y la función, probemos estos dos objetos de BigQuery ejecutándolos en una consulta SELECT.
9. Resume temas con el modelo remoto
Usemos el modelo remoto que creamos "bookshelf.llm_model" para generar una palabra clave consolidada para el libro a partir de la lista de temas proporcionada:
SELECT * FROM ML.GENERATE_TEXT(MODEL `bookshelf.llm_model`,
(
SELECT
CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
FROM `gdelt-bq.internetarchivebooks.1920` LIMIT 1
));
Paso opcional: El resultado del campo de resultado generado por LLM está anidado. Agreguemos algunos parámetros del LLM y el atributo "flatten_json_output" a la búsqueda. Usar el atributo "flatten_json_output" ayuda a quitar la estructura anidada del campo de resultado generado por el LLM.
SELECT * FROM ML.GENERATE_TEXT ( MODEL `bookshelf.llm_model`, (
SELECT CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt FROM `gdelt-bq.internetarchivebooks.1920` limit 1),
STRUCT( 0.2 AS temperature, 100 AS max_output_tokens, TRUE AS flatten_json_output));
Ahora, ejecuta la consulta SELECT en el Editor de BigQuery y verifica el resultado. Limitamos el resultado de la consulta a 1 para realizar pruebas. El resultado se muestra de la siguiente manera:

10. Resume el texto completo de los libros con la función remota
Ahora intentaremos resumir el libro ejecutando la Cloud Function bookshelf.GEMINI_REMOTE_CALL que creamos anteriormente.
Nota: Si omitiste la creación de la FUNCIÓN remota (el tema anterior de este codelab), recuerda omitir también la llamada a la función bookshelf.GEMINI_REMOTE_CALL en la consulta SELECT.
Usa la consulta SELECT que llama a la función remota (GEMINI_REMOTE_CALL) que creamos antes. La llamada a esta función, GEMINI_REMOTE_CALL, incluye una instrucción que solicita un resumen del texto del libro:
select BookMeta_Title, `bookshelf.GEMINI_REMOTE_CALL` (
CONCAT('This is about a book. The title of the book is this: ', BookMeta_Title, ' . The theme of the book is as follows: ', Themes, 'The following text contains an excerpt from the book. Summarize it in less than 5 lines to create the gist. If you do not have a summary, use the title and themes to make up a short summary. DO NOT RETURN EMPTY RESPONSE. ', SUBSTR(BookMeta_FullText, 5000, 10000))) Summary
from `gdelt-bq.internetarchivebooks.1920` where Themes like '%EDUCATION%' limit 1;
Ten en cuenta que tomamos una subcadena del texto completo del libro para generar el resumen.
El resultado de la búsqueda es el siguiente:

11. Almacena datos de libros en una tabla
Ahora que probamos las llamadas al LLM (modelo y función remotos) desde BigQuery solo con consultas en SQL, creemos una tabla de BigQuery para almacenar los datos de la "biblioteca" con estadísticas de temas, en el mismo conjunto de datos que el modelo y la función remotos.
En realidad, podríamos incluir tanto la llamada al modelo LLM como la llamada a la función remota en este paso. Sin embargo, como marcamos la llamada a la función remota (que invoca a Cloud Functions) como un paso opcional, solo usaremos las estadísticas del modelo remoto.
Esta es la consulta que usaremos:
SELECT
BookMeta_Title, Themes, ml_generate_text_llm_result Context
FROM
ML.GENERATE_TEXT (
MODEL `bookshelf.llm_model`,
(
SELECT
BookMeta_Title,
Themes,BookMeta_FullText,
CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
FROM `gdelt-bq.internetarchivebooks.1920` limit 5),
STRUCT(
0.2 AS temperature,
100 AS max_output_tokens,
TRUE AS flatten_json_output));
Cuando ejecutas la consulta en el editor de BigQuery, el resultado es el siguiente:

Ahora, pidámosle a Gemini que cree una tabla llamada “bookshelf.books” a partir de la consulta anterior. Navega a la consola de chat de Gemini en la consola de Google Cloud y, luego, ingresa la siguiente instrucción.
Esta es la instrucción que usaremos:
Create a BigQuery table named bookshelf.books from this SELECT query:
SELECT
BookMeta_Title, Themes, ml_generate_text_llm_result Context
FROM
ML.GENERATE_TEXT (
MODEL `bookshelf.llm_model`,
(
SELECT
BookMeta_Title,
Themes,BookMeta_FullText,
CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
FROM `gdelt-bq.internetarchivebooks.1920` limit 5),
STRUCT(
0.2 AS temperature,
100 AS max_output_tokens,
TRUE AS flatten_json_output));
La respuesta del chat de Gemini es la siguiente:

Aquí tienes la consulta en caso de que quieras copiarla directamente desde aquí:
CREATE TABLE bookshelf.books (
BookMeta_Title STRING,
Themes STRING,
ml_generate_text_llm_result STRING
) AS (
SELECT
BookMeta_Title,
Themes,
ml_generate_text_llm_result Context
FROM
ML.GENERATE_TEXT (
MODEL `bookshelf.llm_model`,
(
SELECT
BookMeta_Title,
Themes,
BookMeta_FullText,
CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
FROM `gdelt-bq.internetarchivebooks.1920`
LIMIT 5
),
STRUCT(
0.2 AS temperature,
100 AS max_output_tokens,
TRUE AS flatten_json_output
)
)
);
Después de ejecutar la consulta en el editor de BigQuery, el resultado es el siguiente:

Eso es todo. Ahora, consulta la tabla y experimenta con los datos para obtener más estadísticas.
12. ¡Felicitaciones!
¡Felicitaciones! Completamos correctamente lo siguiente y también usamos Gemini en algunos pasos del proceso:
- Se creó un modelo remoto en BigQuery que invoca el extremo "text-bison-32k" de Vertex AI para identificar el género (o tema) del libro a partir de una lista de palabras clave separadas por ";" en la tabla.
- Se creó una función remota en BigQuery que invocará esta Cloud Function de IA generativa implementada de forma remota. Esta función tomará la instrucción como entrada y generará una cadena que resuma el libro en 5 líneas.
- Usé el modelo y la función remotos para resumir el tema y el texto de un libro con consultas de SQL, y escribí los resultados en una tabla nueva del conjunto de datos de la biblioteca.
- Como tarea de seguimiento, intenta usar Gemini para obtener el código SQL que borra los objetos creados en BigQuery. Esto abarcará el paso de limpieza.