Данные для генеративного искусственного интеллекта с помощью Spanner и Vertex AI Imagen API

1. Введение

В этом практическом занятии вы создадите генератор поз на основе ИИ, используя Java, Spring Boot, базу данных Cloud Spanner и API Vertex AI Imagen. Пользователь введёт запрос, и приложение сгенерирует позу на основе этого запроса. Мы также будем использовать данные из базы данных Spanner, предоставляемые через REST API. Это увлекательный и познавательный способ продемонстрировать возможности генеративного ИИ с Spring Boot в Google Cloud.

Использован следующий список услуг:

  1. Облачный гальник
  2. Vertex AI Image API
  3. Cloud Run

Блок-схема высокого уровня

60192bcbff4c39de.png

Что вы построите

Вы создадите

  • Java Spring Boot приложение для API Spanner, использующего данные как сервис.
  • Java Spring Boot приложение для генерации изображений с использованием Imagen.
  • Интерактивный пользовательский интерфейс для ввода запросов и ответов.

2. Требования

  • Браузер, например Chrome или Firefox.
  • Проект Google Cloud с включенной функцией выставления счетов.

Прежде чем начать

  1. В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud.
  2. Убедитесь, что для вашего облачного проекта включена функция выставления счетов. Узнайте, как проверить, включена ли функция выставления счетов для проекта.
  3. Убедитесь, что все необходимые API (Cloud Spanner API, Vertex AI API, Cloud Run API, Cloud Functions API) включены .
  4. Вы будете использовать Cloud Shell — среду командной строки, работающую в Google Cloud и поставляемую с предустановленным пакетом bq . Для получения информации о командах и использовании gcloud обратитесь к документации.

В консоли Cloud Console нажмите кнопку «Активировать Cloud Shell» в правом верхнем углу:

51622c00acec2fa.png

Если ваш проект не задан, используйте следующую команду для его настройки:

gcloud config set project <YOUR_PROJECT_ID>
  1. Для начала перейдите на страницу Cloud Spanner с вашим активным проектом Google Cloud.

3. Подготовка данных с помощью Spanner

Прежде чем создавать приложение, давайте завершим настройку базы данных, создав экземпляр Cloud Spanner, базу данных и таблицу. Вы можете обратиться к этой статье в блоге , чтобы узнать больше о возможностях Cloud Spanner, DDL, DML и многом другом. Вы можете выполнить следующие шаги, чтобы создать объекты базы данных, необходимые для этого проекта:

  1. Создайте экземпляр, нажав кнопку «СОЗДАТЬ ЭКЗЕМПЛЯР» на странице экземпляров.
  2. Введите данные, как показано на изображении ниже, и нажмите «СОЗДАТЬ»:

f869fcbb922027a5.png

  1. После создания базы данных на странице обзора экземпляра нажмите кнопку «СОЗДАТЬ БАЗУ ДАННЫХ».
  2. Укажите имя базы данных как "first-spanner-db", введите следующий DDL-скрипт в разделе "Шаблоны DDL" и нажмите "Отправить":
CREATE TABLE Yoga_Poses(
  Pose_Id   INT64 NOT NULL,
  Name  STRING(1024),
  Breath STRING(1024),
  Description STRING(1024)
) PRIMARY KEY(Pose_Id);

База данных и таблица должны быть созданы в результате последнего шага. Теперь давайте добавим несколько строк в таблицу Yoga_Poses, чтобы мы могли приступить к созданию нашего приложения Spring Boot.

  1. В левой панели «База данных» щелкните Spanner Studio и откройте новую вкладку редактора запросов, как показано на изображении ниже:

c86774e8fd32eca0.png

  1. Выполните следующие запросы 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');

Теперь у нас есть созданный экземпляр Spanner, база данных, таблица и данные, готовые к использованию в приложении.

4. Создайте REST API с использованием Spring Boot и Spanner для получения данных о позе.

Чтобы ознакомиться со Spring Boot и консолью Google Cloud, прочитайте этот блог .

  1. Создание приложения Spring Boot с нуля. Чтобы создать это приложение с нуля, следуйте инструкциям в этом блоге . Чтобы клонировать репозиторий и начать работу, просто выполните следующую команду в терминале Cloud Shell:
git clone https://github.com/AbiramiSukumaran/spanner-springb

В результате в вашей виртуальной машине Cloud Shell должен был быть создан проект spanner-springb. Чтобы понять компоненты приложения, ознакомьтесь с информацией в блоге .

  1. Давайте соберем и запустим приложение. Для этого выполните следующие команды в терминале облачной оболочки:
cd spanner-springb

./mvnw package

./mvnw spring-boot:run
  1. Разверните приложение в Cloud Run, чтобы оно стало доступно для приложения-генератора поз. Для этого выполните следующую команду в терминале облачной оболочки:
gcloud run deploy source .

Передайте необходимые параметры и убедитесь, что ваше приложение развернуто. Сгенерированный URL-адрес сервиса должен отображать данные, созданные в Spanner.

5. Bootstrap — приложение для генерации поз с использованием Spring Boot, Spanner и Imagen.

На этом этапе мы завершили верхнюю часть блок-схемы, то есть сделали данные Spanner доступными в качестве сервиса (REST API). Теперь давайте создадим клиентское приложение, которое будет получать данные Spanner, вызывать API IMAGEN с приглашением и возвращать закодированную в Base64 строку в виде изображения в пользовательский интерфейс.

  1. К этому моменту вы уже знакомы со структурой проекта Spring Boot и его значением. Поэтому мы быстро перейдем к клонированию репозитория на вашу машину Cloud Shell, выполнив следующую команду в терминале Cloud Shell:
git clone https://github.com/AbiramiSukumaran/genai-posegen

В результате в вашей виртуальной машине Cloud Shell должен был быть создан проект genai-posegen . Структура клонированного проекта отображается в редакторе Cloud Shell следующим образом:

b19a94f895f74c62.png

Класс PromptController на Java содержит вызов службы базы данных, реализацию бизнес-логики и вызов API генеративного ИИ Imagen. Этот класс взаимодействует с шаблонами Thymeleaf, которые обеспечивают интеграцию данных в пользовательский интерфейс. В этом классе есть 3 сервисных метода: 1) для получения ввода запроса, 2) для обработки запроса и вызова API Imagen и 3) для обработки ответа Imagen.

Prompt и Yoga — это POJO-классы, содержащие поля, геттеры и сеттеры для взаимодействия с API Imagen и API сервера данных Spanner соответственно.

HTML-файлы index и getImage, находящиеся в папке templates, содержат шаблоны пользовательского интерфейса и имеют зависимости от JS и CSS скриптов, расположенных в соответствующих папках.

Интеграция API Vertex AI Imagen. Для генерации изображений мы используем API Vertex AI Imagen в следующем формате:

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

Подробнее о возможностях Imagen можно прочитать здесь . Он возвращает ответ в формате строки, закодированной в Base64. Для преобразования его в изображение мы использовали метод `setAttribute` JavaScript (в файле `getImage.js`) для объекта изображения следующим образом в файле `getImage.HTML`:

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

Авторизация. Для доступа к API Imagen требуется включить аутентификацию с помощью токена Bearer. В нашем случае я использовал подход с JSON-данными по умолчанию для приложения. Вы можете реализовать это, выполнив следующую команду в терминале Cloud Shell и следуя инструкциям в терминале:

gcloud auth application-default login

Введите «Y» для аутентификации в вашей учетной записи. Предоставьте доступ и скопируйте код авторизации, который отобразится во всплывающем окне. После этого вы получите учетные данные приложения по умолчанию в JSON-файле, сохраненном в месте, аналогичном этому: /tmp/tmp.Fh0Gf4yF0V/application_default_credentials.json.

Загрузите файл или скопируйте содержимое JSON-файла, выполнив команду `cat` (`cat /tmp/tmp.Fh0Gf4yF0V/application_default_credentials.json`), и используйте его в приложении в методе `callImagen()` класса `PromptController.java`. Более подробную информацию об аутентификации можно найти здесь .

Пользовательский интерфейс. В качестве шаблонизатора мы использовали Thymeleaf для анализа и рендеринга данных в файлы шаблонов внешнего интерфейса, а также для придания элегантного дизайна пользовательскому интерфейсу. Он похож на HTML, но поддерживает больше атрибутов для работы с отображаемыми данными. Файл index.html содержит компоненты дизайна целевой страницы и позволяет пользователю выбрать тему и добавить подсказку для генерации нужного изображения.

6. Сборка и развертывание

Теперь, когда вы клонировали код и заменили значения заполнителей в соответствии с вашим проектом, регионом и учетными данными аутентификации, перейдем к сборке и развертыванию приложения. Перейдите в папку проекта в терминале Cloud Shell, используя команду, выполните сборку, а затем развертывание для тестирования локально на машине Cloud Shell, выполнив следующие 3 команды по очереди:

cd genai-posegen

./mvnw package

./mvnw spring-boot:run

Разверните приложение в Cloud Run, чтобы оно стало доступно в облаке. Для этого выполните следующую команду в терминале облачной оболочки в папке проекта:

gcloud run deploy source .

Передайте необходимые параметры и убедитесь, что ваше приложение развернуто.

7. Демонстрация

После развертывания приложения вы должны увидеть URL-адрес сервиса в терминале. Щелкните по ссылке и увидите, как ваше приложение для генерации изображений поз работает в бессерверной среде Google Cloud!

92bdb22109b2f756.gif

8. Уборка

Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, использованные в этой статье, выполните следующие действия:

  1. В консоли Google Cloud перейдите на страницу «Управление ресурсами» .
  2. В списке проектов выберите проект, который хотите удалить, и нажмите «Удалить».
  3. В диалоговом окне введите идентификатор проекта, а затем нажмите «Завершить», чтобы удалить проект.
  4. Если вы не хотите удалять проект, удалите экземпляр Spanner, перейдя к только что созданному для этого проекта экземпляру и нажав кнопку «УДАЛИТЬ ЭКЗЕМПЛЯР» в правом верхнем углу страницы обзора экземпляра.
  5. Вы также можете перейти на страницу служб Cloud Run, выбрать службы, созданные в этом проекте, и нажать кнопку «Удалить», чтобы удалить службы.

9. Поздравляем!

В этом блоге мы смогли реализовать полнофункциональное Spring Boot приложение, которое хранит и обрабатывает данные в Cloud Spanner, для генерации поз с использованием API Imagen от Google Cloud Vertex AI в интерактивном клиентском приложении, развернутом в Cloud Run. В разделе архитектурной диаграммы этого блога вы видите компонент Cloud Functions (Java), который мы так и не смогли реализовать? Он доступен для вас, если вы хотите внести свой вклад. Вы можете реализовать две Java Cloud Functions для выполнения двух методов, которые можно найти в файле getimage.html: сохранение позы в базу данных и загрузка изображения. Подробнее о модели Imagen можно узнать в документации Vertex AI .