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

1. Introdução

Neste codelab, vamos criar um gerador de poses com tecnologia de IA usando Java, Spring Boot, banco de dados do Cloud Spanner e a API Imagen da Vertex AI. O usuário insere um comando e o aplicativo gera uma pose com base nesse comando. Também vamos usar dados do banco de dados do Spanner expostos como uma API REST. É uma forma 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 API de serviço
  • Um aplicativo Java Spring Boot para o caso de uso de geração de imagens usando o Imagen
  • Interface do usuário interativa para entrada e resposta de comandos

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 do 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, API Cloud Functions) estão ativadas
  4. Você usará o Cloud Shell, um ambiente de linha de comando em execução no Google Cloud que vem pré-carregado com bq. Consulte a documentação sobre comandos e uso da 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. Para começar, navegue até a página do Cloud Spanner com seu projeto ativo do Google Cloud

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. Acesse este blog para saber 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. Para criar uma instância, clique em "CRIAR INSTÂNCIA" na página das instâncias.
  2. Insira os detalhes como mostrado na imagem a seguir e clique em CRIAR:

f869fcbb922027a5.png

  1. Depois de criar, 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, conforme 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 a instância, o banco de dados, a tabela e os dados do Spanner foram criados e estão prontos para o aplicativo.

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

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

  1. Inicializar o aplicativo Spring Boot Para inicializar esse aplicativo do zero, siga este blog. Para clonar a partir do repositório e entrar em ação, basta executar o comando abaixo no seu 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, consulte o blog.

  1. Crie e execute o app. Para fazer isso, execute os comandos a seguir 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 isso, execute o seguinte comando no terminal do Cloud Shell:
gcloud run deploy –source .

Transmita os parâmetros necessários e verifique se o app foi implantado. O URL de 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, disponibilização dos dados do Spanner como serviço (API REST). Agora vamos criar um aplicativo cliente que invoca os dados da chave, chama a API IMAGEN com um comando e retorna a string codificada em Base64 como uma imagem para a interface do usuário.

  1. Até agora, você já está familiarizado com a estrutura do projeto Spring Boot e seu significado. Você vai 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 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 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 interagir com a API Imagen e a API do servidor de dados do Spanner, respectivamente.

Os arquivos HTML Index e getImage na pasta de modelos têm os modelos da interface do usuário e dependências dos 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 utilizando 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 codificado em Base64. Para convertê-la em sua imagem, usamos o método setattribute de javascript (no arquivo getImage.js) no objeto de imagem, conforme mostrado a seguir no arquivo getImage.HTML:

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

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

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 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 autenticação aqui.

Interface do usuário: usamos o Thymeleaf como o mecanismo de modelo para analisar e renderizar dados para os arquivos de modelo de front-end e adicionar um design elegante à interface do usuário. É 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 tópico 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 por 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 e o build. Depois, implante o build para teste localmente na máquina Cloud Shell executando estes três comandos, um a um:

cd genai-posegen

./mvnw package

./mvnw spring-boot:run

Implantar o app no Cloud Run para que fique disponível na nuvem. Para 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 app foi implantado.

7. Demonstração

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

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 acessando a que acabou de criar para o projeto e clique no botão "EXCLUIR INSTÂNCIA" no canto superior direito da página de visão geral da instância.
  5. Também é possível 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 excluí-los.

9. Parabéns

Neste blog, usamos o aplicativo Spring Boot de pilha completa que armazena e manipula 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 do diagrama de arquitetura deste blog, você vê o componente do Cloud Functions (Java), que nunca fizemos? Fique à vontade para fazer contribuições. Você pode implementar duas funções do Cloud 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.