Dados para IA generativa com o Spanner e a API Vertex AI Imagen

1. Introdução

Neste codelab, você vai criar um gerador de poses com tecnologia de IA usando Java, Spring Boot, banco de dados Cloud Spanner e a API Vertex AI Imagen. O usuário vai inserir um comando, e o aplicativo vai gerar uma pose com base nele. Também vamos usar dados do banco de dados do Spanner expostos como uma API REST. É uma maneira divertida e educativa de demonstrar os recursos da IA generativa com o Spring Boot no Google Cloud.

Os serviços usados são:

  1. Cloud Spanner
  2. API Vertex AI Imagen
  3. Cloud Run

Diagrama de fluxo de alto nível

60192bcbff4c39de.png

O que você vai criar

Você vai criar

  • Um aplicativo Java Spring Boot para a API Spanner Data as a Service
  • Um aplicativo Java Spring Boot para o caso de uso de geração de imagens usando o Imagen
  • Uma interface do usuário interativa para o comando e a resposta

2. Requisitos

  • Use um navegador, como o Chrome ou o Firefox.
  • Tenha um projeto do Google Cloud com o faturamento ativado.

Antes de começar

  1. No console do Google Cloud, na página de seletor de projetos, selecione ou crie um projeto do Google Cloud.
  2. Verifique se o faturamento está ativado para seu projeto do Cloud. Saiba como verificar se o faturamento está ativado em um projeto.
  3. Verifique se todas as APIs necessárias (API Cloud Spanner, API Vertex AI, API Cloud Run e API Cloud Functions) estão ativadas.
  4. Você vai usar o Cloud Shell, um ambiente de linha de comando executado no Google Cloud que vem pré-carregado com bq. Consulte a documentação para ver o uso e os comandos gcloud.

No console do Cloud, clique em "Ativar o Cloud Shell" no canto superior direito:

51622c00acec2fa.png

Se o projeto não estiver definido, use este comando:

gcloud config set project <YOUR_PROJECT_ID>
  1. Navegue até a página Cloud Spanner com seu projeto ativo do Google Cloud para começar.

3. Como preparar dados com o Spanner

Antes de criar o app, vamos concluir a configuração do banco de dados criando uma instância, um banco de dados e uma tabela do Cloud Spanner. Consulte este blog para ler mais detalhes sobre os recursos do Cloud Spanner, DDL, DML e muito mais. Siga as etapas abaixo para criar os objetos de banco de dados necessários para este projeto:

  1. Crie uma instância clicando em CRIAR INSTÂNCIA na página de instâncias.
  2. Insira os detalhes conforme mostrado na imagem a seguir e clique em CRIAR:

f869fcbb922027a5.png

  1. Depois de criada, na página de visão geral da instância, clique em CRIAR BANCO DE DADOS.
  2. Forneça o nome do banco de dados como "first-spanner-db", insira o seguinte DDL na seção "MODELOS DDL" e clique em "ENVIAR":
CREATE TABLE Yoga_Poses(
  Pose_Id   INT64 NOT NULL,
  Name  STRING(1024),
  Breath STRING(1024),
  Description STRING(1024)
) PRIMARY KEY(Pose_Id);

O banco de dados e a tabela devem ser criados como resultado da última etapa. Agora vamos inserir algumas linhas na tabela "Yoga_Poses" para criar nosso aplicativo Spring Boot.

  1. Clique em "Spanner Studio" no painel "Banco de dados" à esquerda e abra uma nova guia do editor de consultas, como mostrado na imagem abaixo:

c86774e8fd32eca0.png

  1. Execute estas consultas INSERT:
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(1, 'STAND', 'INHALE AND EXHALE', 
'STAND WITH YOUR FEET HIP WIDTH APART AND ARMS RESTING BY THE SIDES');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(2, 'PLANK', 'INHALE OR EXHALE', 
'PLANT YOUR TOES AND PALMS ON THE MAT WITH BODY PARALLEL TO THE GROUND');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(3, 'SIT', 'INHALE AND EXHALE', 
'SIT ON THE FLOOR LEGS CROSSED');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(4, 'BEND', 'EXHALE', 
'FOLD FORWARD AS YOU STAND, HANDS REACHING TO THE FLOOR');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(5, 'PUSH UP', 'EXHALE', 
'PLANK WITH ELBOWS ON MAT');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(6, 'SEATED FORWARD BEND', 'EXHALE', 
'FOLD FORWARD AS YOU SIT, HANDS TRYING TO REACH THE FEET');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(7, 'LUNGE', 'EXHALE', 
'ONE LEG TO THE FRONT 90 DEGREES TO THE FLOOR AND THE BACK LEG STRAIGHT');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(8, 'COURTESY LUNGE', 'INHALE', 
'ONE LEG TO THE FRONT 90 DEGREES TO THE FLOOR AND THE BACK KNEE TOUCHING THE FLOOR');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(9, 'BANK BEND', 'INHALE', 
'STAND WITH ARMS UP AND BODY BENT BACKWARDS, ARCHING YOUR SPINE, LOOKING AT THE SKY');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(10, 'BICEP ACTION', 'INHALE AND EXHALE', 
'CURL, PRESS AND WORK YOUR BICEPS');

Agora temos a instância, o banco de dados, a tabela e os dados do Spanner criados e prontos para o aplicativo.

4. Criar uma API REST com Spring Boot e Spanner para dados de postura

Para se familiarizar com o Spring Boot e o console do Google Cloud, confira este blog.

  1. Inicialize o app Spring Boot. Para fazer isso do zero, siga este blog. Para clonar do repositório e começar a trabalhar, execute o comando abaixo no terminal do Cloud Shell:
git clone https://github.com/AbiramiSukumaran/spanner-springb

Isso deve ter criado o projeto spanner-springb na sua máquina do Cloud Shell. Para entender os componentes do app, leia o blog.

  1. Vamos criar e executar o app. Para isso, execute os seguintes comandos no terminal do Cloud Shell:
cd spanner-springb

./mvnw package

./mvnw spring-boot:run
  1. Implante o app no Cloud Run para que ele fique disponível para o app gerador de poses. Para fazer isso, execute o seguinte comando no terminal do Cloud Shell:
gcloud run deploy –source .

Transmita os parâmetros obrigatórios e verifique se o app foi implantado. O URL do serviço gerado precisa listar os dados criados no Spanner.

5. Inicializar um app gerador de poses com Spring Boot, Spanner e Imagen

Neste ponto, concluímos a parte superior do diagrama de fluxo, ou seja, disponibilizar os dados do Spanner como um serviço (API REST). Agora vamos criar um aplicativo cliente que invoca os dados do Spanner, chama a API Imagen com um comando e retorna a string codificada em Base64 como uma imagem para a interface do usuário.

  1. A essa altura, você já conhece a estrutura do projeto Spring Boot e a importância dela. Vamos clonar o repositório na máquina do Cloud Shell executando o comando abaixo no terminal do Cloud Shell:
git clone https://github.com/AbiramiSukumaran/genai-posegen

Isso deve ter criado o projeto genai-posegen na sua máquina do Cloud Shell. A estrutura do projeto clonado aparece assim no editor do Cloud Shell:

b19a94f895f74c62.png

A classe Java PromptController tem a invocação do serviço de banco de dados, a implementação da lógica de negócios e a invocação da API de IA generativa do Imagen. Essa classe interage com os modelos do Thymeleaf, que cuidam da integração de dados à interface do usuário. Há três métodos de serviço nessa classe: 1) para receber a entrada de comando, 2) para processar a solicitação e invocar a API Imagen e 3) para processar a resposta da Imagen.

Prompt e Yoga são as classes POJO que contêm os campos, getters e setters para interagir com a API Imagen e a API do servidor de dados do Spanner, respectivamente.

Os arquivos HTML index e getImage na pasta "templates" contêm os modelos da interface do usuário e têm dependências de scripts JS e CSS nas respectivas pastas.

Integração da API Imagen da Vertex AI: para o caso de uso de geração de imagens, estamos usando a API Imagen da Vertex AI no seguinte formato:

https://<<region>>- aiplatform.googleapis.com/v1/projects/<<your-project-id>>/locations/<<region>>/publishers/google/models/imagegeneration:predict

Saiba mais sobre os recursos do Imagen aqui. Ele retorna a resposta no formato de string codificada em Base64. Para converter em imagem, usamos o método javascript setattribute (no arquivo getImage.js) no objeto de imagem da seguinte maneira no arquivo getImage.HTML:

poseImage.setAttribute('src', "data:image/jpg;base64," + baseStr64);

Autorização: a API Imagen exige que você tenha a autenticação de token de portador ativada para acessar. No nosso caso, usei a abordagem JSON das Application Default Credentials. Para implementar, execute o comando abaixo no terminal do Cloud Shell e siga as instruções que aparecem nele:

gcloud auth application-default login

Digite "Y" para autenticar com sua conta. Permita o acesso e copie o código de autorização mostrado no pop-up. Assim que você fizer isso, vai receber as credenciais padrão do aplicativo no arquivo JSON salvo em um local semelhante a este: /tmp/tmp.Fh0Gf4yF0V/application_default_credentials.json.

Baixe o arquivo ou copie o conteúdo do arquivo JSON executando o comando cat (cat /tmp/tmp.Fh0Gf4yF0V/application_default_credentials.json) e use-o no aplicativo no método callImagen() da classe PromptController.java. Saiba mais sobre a autenticação neste link.

Interface do usuário: usamos o Thymeleaf como mecanismo de modelo para analisar e renderizar dados nos arquivos de modelo de front-end e adicionar um design elegante à interface do usuário. Ele é semelhante ao HTML, mas aceita mais atributos para trabalhar com dados renderizados. O index.html contém os componentes de design da página de destino e permite que o usuário selecione o tema e adicione um comando substituto para gerar a imagem desejada.

6. Criar e implantar

Agora que você clonou o código e substituiu os valores dos marcadores de posição conforme aplicável ao seu projeto, região e credenciais de autenticação, vamos criar e implantar o app. Navegue até a pasta do projeto no terminal do Cloud Shell usando o comando, crie e implante para testar localmente na máquina do Cloud Shell com os três comandos a seguir, um por um:

cd genai-posegen

./mvnw package

./mvnw spring-boot:run

Implante o app no Cloud Run para que ele fique disponível na nuvem. Para fazer isso, execute o seguinte comando no terminal do Cloud Shell dentro da pasta do projeto:

gcloud run deploy –source .

Transmita os parâmetros obrigatórios e verifique se o app foi implantado.

7. Demonstração

Depois que o app for implantado, o URL do serviço vai aparecer no terminal. Clique no link e veja seu app de geração de imagens de poses em execução sem servidor no Google Cloud.

92bdb22109b2f756.gif

8. Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados nesta postagem, siga estas etapas:

  1. No console do Google Cloud, acesse a página Gerenciar recursos.
  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir.
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.
  4. Se você não quiser excluir o projeto, exclua a instância do Spanner. Para isso, navegue até a instância que você acabou de criar para este projeto e clique no botão "EXCLUIR INSTÂNCIA" no canto superior direito da página de visão geral da instância.
  5. Você também pode acessar a página de serviços do Cloud Run, selecionar os serviços criados neste projeto e clicar no botão de exclusão para excluir os serviços.

9. Parabéns

Neste blog, conseguimos trazer o aplicativo Spring Boot de pilha completa que armazena e processa dados no Cloud Spanner para gerar poses usando a API Imagen da Vertex AI do Google Cloud em um aplicativo cliente interativo implantado no Cloud Run. Na seção de diagrama de arquitetura deste blog, você vê o componente do Cloud Functions (Java), que nunca chegamos a usar. Se quiser contribuir, essa é uma boa opção. É possível implementar duas funções do Cloud em Java para executar os dois métodos encontrados no arquivo getimage.html: salvar pose no banco de dados e fazer upload de imagem. Confira a documentação do Imagen na Vertex AI para saber mais sobre o modelo.