1. Introdução
Você gosta de ler livros, mas tem dificuldade em escolher um entre tantas opções? Imagine ter um app com tecnologia de IA que recomenda a leitura perfeita e oferece um resumo conciso com base no gênero escolhido, apresentando um pouco da essência do livro. Neste codelab, vou mostrar como criar um app assim usando o BigQuery, o Gemini e o Cloud Functions com tecnologia do Gemini.
Visão geral do projeto
Nosso caso de uso foca estes quatro componentes principais:
- Banco de dados de livros:o vasto conjunto de dados públicos de livros arquivados da Internet no BigQuery vai servir como nosso catálogo abrangente.
- Mecanismo de resumo de IA:o Google Cloud Functions, equipado com o modelo de linguagem Gemini 1.0 Pro, vai gerar resumos práticos de acordo com os pedidos dos usuários.
- Integração com o BigQuery: uma função remota dentro do BigQuery vai chamar nossa função do Cloud para entregar resumos e temas de livros sob demanda.
- Interface do usuário: um app da Web hospedado no Cloud Run vai oferecer um aplicativo da Web para que os usuários vejam os resultados.
Vamos dividir a implementação em três codelabs:
Codelab 1: use o Gemini para criar uma função do Cloud em Java para um aplicativo do Gemini.
Codelab 2:use o Gemini para criar apps SQL com o BigQuery e a IA generativa.
Codelab 3: use o Gemini para criar um aplicativo da Web em Java do Spring Boot que interage com o BigQuery.
2. Use o Gemini para criar apps SQL com o BigQuery e a IA generativa
O que você vai criar
Você vai criar um
- Modelo remoto no BigQuery que invoca o endpoint text-bison-32k da Vertex AI para identificar o gênero (ou tema) do livro em uma lista de palavras-chave separadas por ";" na tabela.
- Função remota no BigQuery que vai invocar a função do Cloud de IA generativa implantada remotamente.
- Use o modelo e a função remotos para resumir o tema e o texto de um livro com consultas SQL e gravar os resultados em uma nova tabela no conjunto de dados da estante de livros.
- Você vai implementar essas etapas com a ajuda do Gemini
3. Requisitos
- Use um navegador, como o Chrome ou o Firefox.
- Tenha um projeto do Google Cloud com o faturamento ativado.
- É útil implantar a função do Cloud no codelab da parte 1: Usar o Gemini para criar uma função do Cloud em Java para um aplicativo do Gemini.
- Condicional:se você já tiver acesso ao link de créditos sem custo financeiro do Google Cloud (que talvez tenha sido enviado pelo organizador do workshop), use as instruções na página abaixo para concluir a ATIVAÇÃO DOS CRÉDITOS e CRIAÇÃO DO PROJETO antes. Caso não tenha esse link, continue com as etapas de pré-requisito do projeto e do faturamento a seguir:
Criar seu projeto
Pule as etapas abaixo se você já tiver ativado uma conta de faturamento e criado um projeto usando o link mencionado na etapa condicional acima.
- No console do Google Cloud, na página de seletor de projetos, selecione ou crie um projeto do Google Cloud.
- Confira se o faturamento está ativado para seu projeto do Cloud. Saiba como verificar se o faturamento está ativado em um projeto.
Ativar o Cloud Shell
- Você vai usar o Cloud Shell, um ambiente de linha de comando executado no Google Cloud que vem pré-carregado com bq:
No console do Cloud, clique em "Ativar o Cloud Shell" no canto superior direito: 
- Depois de se conectar ao Cloud Shell, você vai ver que sua conta já está autenticada e que o projeto está configurado com seu ID do projeto. Execute o seguinte comando no Cloud Shell para confirmar se a conta está autenticada:
gcloud auth list
- Execute o comando a seguir no Cloud Shell para confirmar se o comando gcloud sabe sobre seu projeto.
gcloud config list project
- Se o projeto não estiver definido, use este comando:
gcloud config set project <YOUR_PROJECT_ID>
Consulte a documentação para ver o uso e os comandos gcloud.
4. Ativar o Gemini para Google Cloud e as APIs necessárias
Ativar o Gemini
- Acesse o Marketplace do Gemini para Google Cloud para ativar a API. Também é possível usar o seguinte comando:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- Acesse a página do Gemini e clique em "Iniciar conversa".
Ativar outras APIs necessárias
Como podemos fazer isso? Vamos perguntar para o Gemini. Mas, antes disso, não se esqueça:
Observação: os LLMs não são deterministas. Ao testar esses comandos, a resposta gerada pode ser diferente da que aparece na captura de tela.
Para acessar o console de conversa no Gemini, clique no ícone "Abrir Gemini" no canto superior direito, ao lado da barra de pesquisa no console do Google Cloud.
Digite esta pergunta na seção "Insira um comando aqui":
Como ativar as APIs do BigQuery e da Vertex AI usando o comando gcloud?
Você recebe a resposta como mostrado nesta imagem:

Copie (use o ícone de cópia na parte superior do trecho de comando) e execute isso no terminal do Cloud Shell para ativar os serviços correspondentes:
- bigquery.googleapis.com
- aiplatform.googleapis.com
5. Analisar o conjunto de dados público do BigQuery sobre livros
Para começar, conheça o conjunto de dados público do BigQuery que contém informações sobre vários livros da Internet.
Esse conjunto de dados público está no painel do BigQuery Explorer. Ele fica no lado esquerdo do console do BigQuery.

Digite "gdelt-bq" ou "internetarchivebooks" na barra de pesquisa e clique em PESQUISAR TODOS OS PROJETOS. Veja o resultado e marque os livros arquivados da Internet com estrela, conforme mostrado na imagem abaixo:
.
Abra o conjunto de dados, clique em "gdelt-bq.internetarchivebooks" e confira os dados na tabela de 1920. Essa tabela inclui os livros arquivados desse ano.
Para conferir o esquema que vamos usar nas próximas seções, execute a seguinte consulta:
select * from `gdelt-bq.internetarchivebooks.1920` limit 5;
Vamos usar os três campos a seguir para nosso codelab:
- BookMeta_Title (título)
- Themes (temas separados por ';')
- BookMeta_FullText (texto completo do livro)
6. Crie um conjunto de dados do BigQuery chamado "bookshelf".
Vamos criar um conjunto de dados no projeto para armazenar todos os objetos de banco de dados e de análise que vamos criar neste laboratório. Vamos perguntar ao Gemini como criar um conjunto de dados do BigQuery. Você já deve ter aberto a conversa no Gemini em outra guia do navegador na etapa de ativação das APIs. Se não tiver, faça isso agora. Acesse o console do Google Cloud em https://console.cloud.google.com. O ícone do Gemini vai aparecer ao lado da barra de pesquisa na parte de cima. Clique nele para abrir o chat.

Insira o comando conforme mostrado abaixo.
Este é meu comando:
How to create a BigQuery dataset?
Esta é a resposta:

Vamos seguir as etapas descritas na resposta para criar um conjunto de dados chamado "bookshelf" no seu projeto ativo.
Para criar um conjunto de dados do BigQuery, siga estas etapas:
- Acesse a página do BigQuery no console do Google Cloud.
- No painel "Explorer", clique no ID do projeto.
- Clique em "Criar conjunto de dados" (essa opção aparece quando você clica nos três pontos ao lado do ID do projeto).
- Insira o nome do conjunto de dados como "bookshelf".
- Defina o local como "EUA(multirregião)".
- Para as etapas 3, 4, 5 e 6 da resposta, deixe as opções padrão.
- Clique em CRIAR CONJUNTO DE DADOS.
Seu conjunto de dados será criado e vai aparecer no painel "Explorer". O conjunto de dados "estante de livros" pode ser visto da seguinte maneira:
7. Criar um modelo remoto para invocar o LLM da Vertex AI (text-bison-32k)
Em seguida, precisamos criar um modelo no BigQuery que invoque o modelo "text-bison-32k" da Vertex AI. O modelo vai ajudar a identificar um tema comum, o contexto do livro, na lista de palavras-chave de cada livro no conjunto de dados.
Vamos pedir ao Gemini para responder a esta pergunta. Para fazer isso, acesse a guia em que o console de conversa no Gemini está aberto e digite o comando abaixo:
Como você vai conectar o BigQuery e a Vertex AI para chamar o endpoint do LLM (text-bison-32k) no BigQuery?
A resposta é mostrada a seguir:

A resposta inclui informações precisas, como as etapas que incluem o uso da instrução CREATE MODEL, a conexão do BigQuery e a definição do endpoint. A declaração de consulta é precisa para mim, mas isso não significa que você vai receber exatamente a mesma saída, já que este é um modelo de linguagem grande e você pode receber respostas em diferentes formatos, volumes e níveis de detalhe. Se você não encontrar todos os detalhes que recebi, faça mais perguntas na conversa. Por exemplo: dê mais detalhes sobre como criar o recurso de conexão ou por que o atributo de conexão está faltando ou como me conecto do BigQuery à Vertex AI etc.
Confira um exemplo de comando de acompanhamento. Use apenas se precisar de um acompanhamento. Se a primeira resposta recebida for suficiente, siga com ela:
What about the connection? How will I connect from BigQuery to Vertex AI?
Esta é a resposta:

Siga as etapas da resposta para criar uma conexão do BigQuery:
- Navegue até o console do BigQuery.
- No painel do BigQuery Explorer, clique no botão "+ADICIONAR" e em "Conexões com fontes de dados externas".
- Neste ponto, será solicitado que você ative a API BigQuery Connection. Clique em ATIVAR API:

- Clique em "Conexões com fontes de dados externas". O slide "Fonte de dados externa" vai aparecer, como mostrado abaixo. Na lista de fontes externas, selecione "Vertex AI".

- Digite um ID de conexão. Pode ser um ID de sua escolha, mas, por enquanto, defina como "bq-vx" e a região (multirregião "US").
- Clique em "Criar conexão".

- Depois de criar a conexão, clique em "Acessar conexão".
- Na página de informações da conexão, copie o ID da conta de serviço, porque vamos usar esse ID nas etapas subsequentes.
- Agora que a conexão foi criada, vamos atribuir permissões ao ID da conta de serviço que copiamos para usar a Vertex AI.
- Na página do Console do Google Cloud, abra o Google Cloud IAM ou navegue até o link.
- Clique em Permitir acesso na seção Visualizar por principais.

- Na caixa de diálogo "Conceder acesso", insira o ID da conta de serviço que anotamos anteriormente na caixa de texto "Novos principais".
- Defina a função como "Usuário da Vertex AI".

A conexão necessária é criada. A permissão necessária é concedida ao principal (conta de serviço da conexão) para usar a Vertex AI no BigQuery.
Execute a seguinte instrução DDL(linguagem de definição de dados) que representa a criação de um objeto de banco de dados, neste caso, MODEL no editor de consultas do BigQuery.
CREATE OR REPLACE MODEL bookshelf.llm_model
REMOTE WITH CONNECTION `us.bq-vx`
OPTIONS (ENDPOINT = 'text-bison-32k');
Como alternativa à etapa acima, peça ao Gemini para sugerir uma consulta para criar o modelo de invocação do "text-bison-32k".
Observação:se você usou um nome diferente para sua conexão, substitua " us.bq-vx" por esse nome na instrução DDL anterior. Essa consulta cria o modelo remoto no conjunto de dados "bookshelf" que criamos anteriormente.
8. Criar uma função remota que invoca a função do Cloud em Java
Agora vamos criar uma função remota no BigQuery usando a função do Cloud em Java que criamos no codelab 1 desta série para implementar o modelo do Gemini. Essa função remota será usada para resumir o conteúdo do livro.
Observação:se você perdeu este codelab ou não implantou essa função do Cloud, pule esta etapa e passe para o próximo tópico (Resumir o tema dos livros usando o modelo remoto).
Acesse o console do BigQuery e cole a seguinte instrução DDL no editor de consultas. Para criar uma guia do editor de consultas, clique no botão "+".

Confira abaixo o DDL que você pode copiar. Substitua o endpoint pelo endpoint implantado da função do Cloud (criado no codelab 1). Se você não tiver um endpoint, substitua os caracteres mascarados na DDL abaixo por "abis-345004" para fins de demonstração.
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' );
Navegue até o console do BigQuery na plataforma Google Cloud e abra uma nova guia do editor de consultas. No editor de consultas do BigQuery, cole a instrução DDL acima. Você vai ver a seguinte resposta depois de executar a consulta:

Agora que o modelo e a função foram criados, vamos testar esses dois objetos do BigQuery executando-os em uma consulta SELECT.
9. Resumir temas usando o modelo remoto
Vamos usar o modelo remoto que criamos, "bookshelf.llm_model", para gerar uma palavra-chave consolidada para o livro na lista de temas:
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
));
Etapa opcional: o resultado do campo gerado pelo LLM é aninhado. Vamos adicionar alguns parâmetros de LLM e o atributo "flatten_json_output" à consulta. Usar o atributo "flatten_json_output" ajuda a remover a estrutura aninhada do campo de resultado gerado pelo 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));
Agora, execute a consulta SELECT no editor do BigQuery e verifique o resultado. Limitamos o resultado da consulta a 1 para teste. O resultado é exibido da seguinte forma:

10. Resumir o texto completo de livros usando a função remota
Agora vamos tentar resumir o livro executando a função do Cloud bookshelf.GEMINI_REMOTE_CALL que criamos antes.
Observação:se você pulou a criação da FUNÇÃO remota (o tópico anterior deste codelab), pule também a chamada de função bookshelf.GEMINI_REMOTE_CALL na consulta SELECT.
Use a consulta SELECT que chama a função remota (GEMINI_REMOTE_CALL) criada anteriormente. A chamada para essa função, GEMINI_REMOTE_CALL, inclui um comando pedindo um resumo do texto do livro:
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;
Usamos uma substring do texto completo do livro para gerar o resumo.
O resultado da consulta é o seguinte:

11. Armazenar dados de livros em uma tabela
Agora que testamos as chamadas de LLM (modelo e função remotos) do BigQuery usando apenas consultas SQL, vamos criar uma tabela do BigQuery para armazenar os dados da "estante de livros" com insights de tema no mesmo conjunto de dados do modelo e da função remotos.
Na verdade, podemos incluir a chamada do modelo de LLM e a chamada de função remota nesta etapa. Mas como marcamos a chamada de função remota (que invoca o Cloud Functions) como uma etapa opcional, vamos usar apenas os insights do modelo remoto.
Esta é a consulta que vamos usar:
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));
Quando você executa a consulta no editor do BigQuery, o resultado é o seguinte:

Agora, vamos pedir ao Gemini para criar uma tabela chamada "bookshelf.books" com base na consulta acima. Acesse a conversa no Gemini no console do Google Cloud e insira o seguinte comando.
Este é o comando que vamos usar:
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));
A resposta da conversa no Gemini é a seguinte:

Esta é a consulta caso você queira copiá-la diretamente daqui:
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
)
)
);
Depois de executar a consulta no editor do BigQuery, o resultado é o seguinte:

Pronto! Agora consulte a tabela e analise os dados para ter mais insights.
12. Parabéns
Parabéns! Concluímos as seguintes etapas e usamos o Gemini em algumas delas:
- Criou um modelo remoto no BigQuery que invoca o endpoint "text-bison-32k" da Vertex AI para identificar o gênero (ou tema) do livro em uma lista de palavras-chave separadas por ";" na tabela.
- Criou uma função remota no BigQuery que invoca essa função do Cloud de IA generativa implantada remotamente. Essa função vai usar o comando como entrada e gerar uma string que resume o livro em cinco linhas.
- Usou o modelo e a função remotos para resumir o tema e o texto de um livro com consultas SQL e gravar os resultados em uma nova tabela no conjunto de dados da estante.
- Como uma atividade complementar, tente usar o Gemini para receber o SQL que exclui os objetos criados no BigQuery. Isso vai cobrir a etapa de limpeza.