Análise do Bookshelf: use o Gemini para criar aplicativos SQL com o BigQuery e a IA generativa

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úblico do BigQuery de livros do arquivo da Internet vai servir como nosso catálogo abrangente de livros.
  • Mecanismo de resumo por IA:o Google Cloud Functions, com o modelo de linguagem Gemini 1.0 Pro, gera resumos detalhados, personalizados de acordo com as solicitações 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 invoca a função do Cloud para 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 biblioteca.
  • Você vai implementar essas etapas com a ajuda do Gemini

3. Requisitos

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.

  1. No console do Google Cloud, na página de seletor de projetos, selecione ou crie um projeto do Google Cloud.
  2. 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

  1. 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: 6757b2fb50ddcc2d.png

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

  1. Execute o comando a seguir no Cloud Shell para confirmar se o comando gcloud sabe sobre seu projeto.

gcloud config list project

  1. 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 a API Gemini para Google Cloud e as APIs necessárias

Ativar o Gemini

  1. Acesse Gemini no Google Cloud Marketplace para ativar a API. Também é possível usar o seguinte comando:

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

  1. 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:

19c3fd78530794d9.png

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.

39e2ac03cc99cbac.png

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:

68dba68a79cddfc9.png.

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 novo conjunto de dados do BigQuery chamado "estante".

Queremos criar um conjunto de dados no projeto para armazenar todos os objetos de banco de dados e análise que criaremos neste laboratório. Vamos perguntar ao Gemini como criar um conjunto de dados do BigQuery. A conversa no Gemini já deve estar aberta em outra guia do navegador na etapa de ativação de APIs. Caso contrário, 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.

26e1491322855614.png

Insira o comando, conforme mostrado abaixo.

Este é meu comando:

How to create a BigQuery dataset?

Esta é a resposta:

f7a989cc9a01009.png

Vamos seguir as etapas descritas na resposta para criar um conjunto de dados chamado "estante" no seu projeto ativo.

Para criar um conjunto de dados do BigQuery, siga estas etapas:

  1. Acesse a página do BigQuery no console do Google Cloud.
  2. No painel Explorer, clique no ID do projeto.
  3. Clique em "Criar conjunto de dados" (deve estar nas opções listadas quando você clicar nos três pontos ao lado do ID do projeto).
  4. Insira o nome do conjunto de dados como "estante".
  5. Defina o local como "EUA(multirregião)".
  6. Para as etapas 3, 4, 5 e 6 da resposta, mantenha as opções padrão.
  7. Clique em CRIAR CONJUNTO DE DADOS.

O conjunto de dados será criado e vai aparecer no painel "Explorer". O conjunto de dados "estante" 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 da Vertex AI "text-bison-32k". 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 fazer essa pergunta ao Gemini. Para fazer isso, acesse a guia em que o console de chat do Gemini está aberto e digite o comando abaixo:

Como você vai conectar o BigQuery e a Vertex AI para chamar o endpoint LLM (text-bison-32k) no BigQuery?

A resposta é mostrada a seguir:

41904e30ce92b436.png

A resposta inclui informações precisas, como as etapas que incluem o uso da instrução CREATE MODEL, a conexão com o BigQuery e a definição do endpoint. A instruçã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 formatos, volumes e profundidades diferentes. Se você não encontrar todos os detalhes que recebi, sinta-se à vontade para fazer perguntas no chat. Por exemplo: forneça mais detalhes sobre como criar o recurso de conexão ou por que o atributo de conexão está ausente ou como se conectar do BigQuery à Vertex AI etc.

Este é um exemplo de instrução de acompanhamento (use apenas se você precisar de um acompanhamento. Se a primeira resposta recebida for suficiente, continue):

What about the connection? How will I connect from BigQuery to Vertex AI?

Esta é a resposta:

2ed9b3ed96b11bc9.png

Siga as etapas da resposta para criar uma conexão do BigQuery:

  1. Navegue até o console do BigQuery.
  2. No painel do BigQuery Explorer, clique no botão "+ ADICIONAR" e clique em "Conexões com fontes de dados externas".
  3. Nesse momento, você vai precisar ativar a API BigQuery Connection. Clique em ATIVAR API:

ded96126495ffe9.png

  1. Clique em "Conexões com fontes de dados externas" e você verá o slide Fonte de dados externa, como mostrado abaixo . Na lista de fontes externas, selecione "Vertex AI".

434cdbbb3a9436f2.png

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

d3a2aeebc3ecdfae.png

  1. Depois de criar a conexão, clique em "Acessar conexão".
  2. Na página de informações da conexão, copie o ID da conta de serviço, porque ele será usado nas próximas etapas.
  3. Agora que a conexão foi criada, vamos atribuir permissões a este ID da conta de serviço que copiamos para poder usar a Vertex AI.
  4. Na página do Console do Google Cloud, abra o IAM ou navegue até o link.
  5. Clique em Permitir acesso na seção Visualizar por principais.

5317eed5da0bb8c5.png

  1. Na caixa de diálogo Conceder acesso, insira o ID da conta de serviço que observamos anteriormente na caixa de texto Novos princípios.
  2. Defina a função como "Usuário da Vertex AI".

f213db33d220aa5f.png

A conexão necessária foi 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 do 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 e invocar o "text-bison-32k".

Observação:se você usou um nome diferente para a 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 o Cloud Function, pule esta etapa e passe para o próximo tópico, que é "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. Você pode criar uma nova guia do editor de consultas clicando no botão "+".

a54c0b0014666cac.png

Confira abaixo o DDL que você pode copiar. Substitua o endpoint pelo endpoint da função do Cloud implantado (criado no codelab 1). Se você não tiver um endpoint, poderá substituir os caracteres mascarados no 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 no Google Cloud Platform e abra uma nova guia "Editor de consultas". No editor de consultas do BigQuery, cole a instrução DDL acima. Você vai encontrar a seguinte resposta após executar a consulta:

a023d5691acf6f.png

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 a partir da lista de temas fornecida:

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 para o campo de resultado gerado pelo LLM é aninhado. Vamos adicionar alguns parâmetros de LLM e o atributo "flatten_json_output" à consulta. Usar o atributo "Flat_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 testes. O resultado é mostrado da seguinte maneira:

9b0d33eca61a73d2.png

10. Resumir o texto completo de livros usando a função remota

Agora vamos tentar resumir o livro executando a função de nuvem bookshelf.GEMINI_REMOTE_CALL que criamos anteriormente.

Observação:se você tiver pulado a criação de FUNÇÃO remota (o tópico anterior neste codelab), não se esqueça de pular a chamada de função bookshelf.GEMINI_REMOTE_CALL na consulta SELECT também.

Use a consulta SELECT que chama a função remota (GEMINI_REMOTE_CALL) que criamos anteriormente. A chamada para essa função, GEMINI_REMOTE_CALL, inclui uma solicitação 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:

658bb0a9c9cf0938.png

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 "biblioteca" com insights de temas no mesmo conjunto de dados do modelo remoto e da função.

Podemos incluir a chamada de modelo de LLM e a chamada de função remota nesta etapa. No entanto, como marcamos a chamada de função remota (que invoca a função do Cloud) como uma etapa opcional, só usaremos 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:

2c6e08e75a680867.png

Agora, vamos pedir para o Gemini criar uma tabela chamada "bookshelf.books" com base na consulta acima. Acesse o console do Gemini Chat no console do Google Cloud e insira o seguinte comando.

Esta é a instrução 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 do chat do Gemini é esta:

df6595a4b14f7b9.png

Esta é a consulta, caso você queira copiá-la diretamente:

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:

2d1ce716f844b7ad.png

Pronto! Agora, consulte a tabela e explore os dados para ter mais insights.

12. Parabéns

Parabéns! Concluímos as seguintes etapas e também usamos o Gemini em algumas delas:

  • Crie um modelo remoto no BigQuery que invoque 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 vai invocar remotamente essa função de IA generativa implantada do Cloud. Essa função vai usar o comando como entrada e gerar uma string que resume o livro em cinco linhas.
  • Usei 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 atividade complementar, tente usar o Gemini para acessar o SQL e excluir os objetos criados no BigQuery. Vamos abordar a etapa de limpeza.