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

1. Introdução

Neste codelab, crie um gerador de poses com tecnologia de IA usando Java, Spring Boot, banco de dados do Cloud Spanner e a API Vertex AI Imagen. O usuário vai inserir um comando, e o aplicativo vai gerar uma pose com base nesse comando. 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.

A lista de serviços usados é:

  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 os dados do Spanner como uma API de serviço
  • Um aplicativo Java Spring Boot para o caso de uso de geração de imagens usando o Imagen
  • Uma interface interativa para a entrada e resposta do comando

2. Requisitos

  • Use um navegador, como o Chrome ou o Firefox.
  • Tenha um projeto na nuvem 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 na nuvem. 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, 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. Acesse a página do Cloud Spanner com seu projeto na nuvem 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 page.
  2. Insira os detalhes conforme mostrado na imagem a seguir e clique em CRIAR:

f869fcbb922027a5.png

  1. Depois de criado, 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 DDL a seguir na seção MODELOS DE 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 serão criados como resultado da última etapa. Agora vamos inserir algumas linhas na tabela Yoga_Poses para que possamos 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, conforme mostrado na imagem abaixo:

c86774e8fd32eca0.png

  1. Execute as seguintes 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 nossa instância, banco de dados, tabela e dados do Spanner criados e prontos para o aplicativo.

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

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

  1. Inicialize o aplicativo Spring Boot. Para inicializar esse aplicativo do zero, siga este blog. Para clonar do repositório e entrar em ação, basta executar o comando abaixo no terminal do Cloud Shell:
git clone https://github.com/AbiramiSukumaran/spanner-springb

Isso criou o projeto spanner-springb na sua máquina do Cloud Shell. Para entender os componentes do app, acesse o blog.

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

./mvnw package

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

Transmita os parâmetros necessários e verifique se o aplicativo está implantado. O URL do serviço gerado precisa listar os dados criados no Spanner.

5. Inicializar um aplicativo gerador de poses com o Spring Boot, o Spanner e o 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á está familiarizado com a estrutura do projeto Spring Boot e a importância dela. Portanto, vamos pular direto para a clonagem do repositório na sua máquina do Cloud Shell executando o comando abaixo no terminal do Cloud Shell:
git clone https://github.com/AbiramiSukumaran/genai-posegen

Isso criou 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 Thymeleaf que cuidam da integração de dados com a interface do usuário. Há três métodos de serviço nessa classe: 1) para receber a entrada do comando, 2) para processar a solicitação e invocar a API Imagen e 3) para processar a resposta do Imagen.

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

Os arquivos HTML Index e getImage na pasta de modelos 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 Vertex AI Imagen 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

Leia mais sobre os recursos do Imagen aqui. Ele retorna a resposta no formato de string codificada em Base64. Para convertê-lo 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 acessá-la. No nosso caso, usei a abordagem JSON das Application Default Credentials. Você pode implementá-la executando o comando abaixo no terminal do Cloud Shell e seguindo as instruções que aparecem no terminal:

gcloud auth application-default login

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

Faça o download do 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. Leia mais sobre a autenticação aqui.

Interface do usuário Usamos o Thymeleaf como o mecanismo de modelo para analisar e renderizar dados nos arquivos de modelo de front-end e para adicionar um design elegante à interface do usuário. Ele é semelhante ao HTML, mas oferece suporte a 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 tópico e adicione um comando de substituição 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 aplicativo. Navegue até a pasta do projeto no terminal do Cloud Shell usando o comando, crie e implante para teste localmente na máquina do Cloud Shell com os três comandos a seguir, um por vez:

cd genai-posegen

./mvnw package

./mvnw spring-boot:run

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

gcloud run deploy source .

Transmita os parâmetros necessários e verifique se o aplicativo está implantado.

7. Demonstração

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

92bdb22109b2f756.gif

8. Liberar espaço

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 desligar para excluir o projeto.
  4. Se você não quiser excluir o projeto, exclua a instância do Spanner navegando até a instância que acabou de criar para esse 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 navegar até a página de serviços do Cloud Run, selecionar os serviços criados neste projeto e clicar no botão "Excluir" 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 fizemos? Isso está disponível para você contribuir. Você pode implementar duas funções do Cloud Functions em Java para executar os dois métodos que podem ser encontrados no arquivo getimage.html: salvar pose no banco de dados e fazer upload de métodos de imagem. Confira a documentação do Imagen na Vertex AI para saber mais sobre o modelo.