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 aplicativo assim usando o BigQuery, a Vertex AI e o Cloud Run com a ajuda 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 Cloud Functions, equipado com o modelo de linguagem Gemini 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.
Dividimos toda a implementação do projeto em três partes, e esta se refere ao codelab 3 na lista abaixo:
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 aplicativos de IA generativa somente de SQL com o BigQuery.
Codelab 3: use o Gemini para criar um aplicativo da Web em Java do Spring Boot que interage com o BigQuery.
2. Usar o Gemini para criar um aplicativo da Web do Spring Boot com o BigQuery
O que você vai desenvolver
- Construa a tabela e o conjunto de dados necessários do BigQuery.
- Crie o aplicativo da Web em Java do Spring Boot que interage com o BigQuery para buscar dados de livros e é exibido na Web.
- Esse app é implantado no Cloud Run.
- 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 de IA generativa.
- Condicional: se você já tiver acesso ao link de créditos gratuitos 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 e as APIs necessárias
Ativar o Gemini
- Acesse o Gemini Marketplace 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":
How do I enable the BigQuery and Cloud Run apis using gcloud command?
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
- run.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. Se você não conseguir acessar o conjunto de dados internetArchivebooks pelo link, siga as etapas abaixo para analisar as informações ou consulte esta documentação:
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. Criar o modelo básico do Cloud Run em Java com o Gemini
Para abrir o editor do Cloud Shell, clique no ícone "Abrir editor" no canto superior direito do terminal do Cloud Shell. Geralmente, prefiro abrir o terminal e o editor em duas guias paralelas para escrever o código em uma e desenvolver em outra.
Depois de abrir o editor, confira se o logotipo do Gemini no canto inferior direito do console do editor está ativo (e não cancelado). Verifique também se o projeto do Google Cloud no canto inferior esquerdo aponta para o projeto ativo em que você quer trabalhar. Se estiverem inativos, clique neles, autorize, selecione o projeto do Google Cloud que você quer apontar e faça a ativação.
Quando ambos estiverem ativos, clique no nome do projeto no canto inferior esquerdo. Na lista pop-up chamada "Cloud Code", role para baixo até "Novo aplicativo".
Em seguida, selecione o aplicativo Cloud Run. Na lista exibida, selecione Java:
Na lista resultante, digite o nome do projeto "bookshelf-web" em vez de "helloworld" e clique em OK.
Oba! Você inicializou um aplicativo simples do Cloud Run em Java com o Gemini e não fez muito mais do que ativar e definir configurações, concorda?
Esta deve ser a estrutura do projeto:
Agora você já pode implantar o aplicativo. Mas não foi por isso que começamos. Ainda precisamos incluir a funcionalidade principal do aplicativo da Web, que é buscar os dados de análise no banco de dados do BigQuery e exibir na Web.
Para isso, você pode adicionar mais comandos e desenvolver seu código incrementalmente com o Gemini ou escrever a lógica por conta própria. Vou combinar as duas opções.
7. Adicionar dependências para usar o BigQuery no app da Web
Agora que o aplicativo foi inicializado, já podemos fazer mudanças na origem e nas propriedades do aplicativo. Primeiro vamos adicionar dependências. Vamos pedir a recomendação do Gemini.
No editor do Cloud Code, confira se a barra de status mostra que o Gemini e o projeto selecionado do Google Cloud estão ativos no canto inferior direito e esquerdo, respectivamente.
No editor Cloud Code, navegue até o arquivo pom.xml, logo acima da tag </dependencies>, e digite o seguinte comentário do comando:
<!-- What maven dependency should I include to access BigQuery in the app-->
Recebi esse resultado como mostrado na imagem abaixo:
Estou colando a dependência aqui para facilitar. Caso sua sugestão tenha uma tag de versão, ignore.
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-bigquery</artifactId>
</dependency>
8. Atualizar a origem para enviar os dados da estante de livros para a Web
Substitua o código HelloWorldController.java pelo seguinte:
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;
}
}
Fizemos as seguintes mudanças nos arquivos de origem:
- Em HelloWorldController.java, @Controller foi atualizado para @RestController.
- O conteúdo do método helloWorld() foi substituído para chamar o BigQuery e executar a consulta que busca os dados para listar o título e os temas do livro.
- Em vez de retornar o modelo de visualização de índice durante o carregamento, ele é atualizado para retornar a resposta como uma string para a Web.
Observação importante: não se esqueça de atualizar o conteúdo abaixo.
- Atualize o arquivo HelloWorldControllerTests.Java para comentar a invocação atual mvc.perform(...).
Explicação de código com o Gemini
Mostramos o código e descrevemos as mudanças que fizemos nos arquivos de origem. Você também pode usar o Gemini para ver explicações e/ou comentários sobre o código conforme necessário. Veja o que você pode testar:
- Com o arquivo HelloWorldController.java aberto no ambiente de desenvolvimento integrado, acesse o painel de conversa e envie o seguinte comando: Explain this. Confira a explicação detalhada que o Gemini gera. É possível usar isso a qualquer momento para saber mais sobre o código.
- Você pode destacar qualquer snippet ou linha específica no código (por exemplo, @GetMapping("/")) e usar o seguinte comando: Explain this. Essa opção explica em detalhes apenas a linha de código ou o snippet selecionado.
- Você pode até mesmo testar algumas consultas sobre o código de outra maneira. Por exemplo, selecione a seguinte linha de código:
BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
e pergunte What will happen if the bigquery variable is null?. 4. Também é possível solicitar melhorias ou refatoração do código com a ajuda do Gemini. Por exemplo, selecione todo o código para o método helloWorld() e dê o seguinte comando: How do I improve or refactor this code?. Confira as sugestões do Gemini.
9. Criar e implantar
Acesse o terminal do Cloud Shell. Confira se ele aponta para o ID do seu projeto no terminal.
Vá até o diretório do projeto usando o comando cd:
cd bookshelf-web
Execute os comandos abaixo um a um para garantir a execução local do app.
mvn package
mvn spring-boot:run
Agora clique no botão "Visualização na Web" e, em seguida, na opção "Visualizar na porta 8080", conforme mostrado abaixo:
Verifique se você consegue ver o app em execução localmente na sua máquina do Cloud Shell.
Agora vamos perguntar ao Gemini como implantar esse aplicativo da Web no Cloud Run. Acesse o Gemini Chat clicando no botão "Abrir Gemini" no console do Google Cloud.
Este é meu comando:
What is the gcloud command to deploy my app to cloud run without having to containerize, only by giving the source file?
Confira abaixo a resposta:
Substitua os marcadores de posição de nome do serviço e região no comando gcloud, conforme mostrado neste snippet:
gcloud run deploy bookshelf-web --source . --allow-unauthenticated --region $REGION
Execute o comando no terminal do Cloud Shell. Você vai receber algumas perguntas. Selecione as respostas adequadas para ver a implantação em andamento:
Leva alguns minutos para o app ser implantado no Google Cloud sem servidor. Clique no app implantado do Cloud Run e confira o resultado na Web:
10. Parabéns
Parabéns! Criamos, implantamos e testamos um aplicativo da Web em Java do Cloud Run para analisar estantes de livros usando o Gemini. Em seguida, pergunte ao Gemini como excluir o serviço do Cloud Run implantado pelo console do Google Cloud e siga as etapas para limpar o recurso.