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

Что вы построите
Вы создадите
- Java Spring Boot приложение для API Spanner, использующего данные как сервис.
- Java Spring Boot приложение для генерации изображений с использованием Imagen.
- Интерактивный пользовательский интерфейс для ввода запросов и ответов.
2. Требования
Прежде чем начать
- В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud.
- Убедитесь, что для вашего облачного проекта включена функция выставления счетов. Узнайте, как проверить, включена ли функция выставления счетов для проекта.
- Убедитесь, что все необходимые API (Cloud Spanner API, Vertex AI API, Cloud Run API, Cloud Functions API) включены .
- Вы будете использовать Cloud Shell — среду командной строки, работающую в Google Cloud и поставляемую с предустановленным пакетом bq . Для получения информации о командах и использовании gcloud обратитесь к документации.
В консоли Cloud Console нажмите кнопку «Активировать Cloud Shell» в правом верхнем углу:

Если ваш проект не задан, используйте следующую команду для его настройки:
gcloud config set project <YOUR_PROJECT_ID>
- Для начала перейдите на страницу Cloud Spanner с вашим активным проектом Google Cloud.
3. Подготовка данных с помощью Spanner
Прежде чем создавать приложение, давайте завершим настройку базы данных, создав экземпляр Cloud Spanner, базу данных и таблицу. Вы можете обратиться к этой статье в блоге , чтобы узнать больше о возможностях Cloud Spanner, DDL, DML и многом другом. Вы можете выполнить следующие шаги, чтобы создать объекты базы данных, необходимые для этого проекта:
- Создайте экземпляр, нажав кнопку «СОЗДАТЬ ЭКЗЕМПЛЯР» на странице экземпляров.
- Введите данные, как показано на изображении ниже, и нажмите «СОЗДАТЬ»:

- После создания базы данных на странице обзора экземпляра нажмите кнопку «СОЗДАТЬ БАЗУ ДАННЫХ».
- Укажите имя базы данных как "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.
- В левой панели «База данных» щелкните Spanner Studio и откройте новую вкладку редактора запросов, как показано на изображении ниже:

- Выполните следующие запросы 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, прочитайте этот блог .
- Создание приложения Spring Boot с нуля. Чтобы создать это приложение с нуля, следуйте инструкциям в этом блоге . Чтобы клонировать репозиторий и начать работу, просто выполните следующую команду в терминале Cloud Shell:
git clone https://github.com/AbiramiSukumaran/spanner-springb
В результате в вашей виртуальной машине Cloud Shell должен был быть создан проект spanner-springb. Чтобы понять компоненты приложения, ознакомьтесь с информацией в блоге .
- Давайте соберем и запустим приложение. Для этого выполните следующие команды в терминале облачной оболочки:
cd spanner-springb
./mvnw package
./mvnw spring-boot:run
- Разверните приложение в Cloud Run, чтобы оно стало доступно для приложения-генератора поз. Для этого выполните следующую команду в терминале облачной оболочки:
gcloud run deploy –source .
Передайте необходимые параметры и убедитесь, что ваше приложение развернуто. Сгенерированный URL-адрес сервиса должен отображать данные, созданные в Spanner.
5. Bootstrap — приложение для генерации поз с использованием Spring Boot, Spanner и Imagen.
На этом этапе мы завершили верхнюю часть блок-схемы, то есть сделали данные Spanner доступными в качестве сервиса (REST API). Теперь давайте создадим клиентское приложение, которое будет получать данные Spanner, вызывать API IMAGEN с приглашением и возвращать закодированную в Base64 строку в виде изображения в пользовательский интерфейс.
- К этому моменту вы уже знакомы со структурой проекта Spring Boot и его значением. Поэтому мы быстро перейдем к клонированию репозитория на вашу машину Cloud Shell, выполнив следующую команду в терминале Cloud Shell:
git clone https://github.com/AbiramiSukumaran/genai-posegen
В результате в вашей виртуальной машине Cloud Shell должен был быть создан проект genai-posegen . Структура клонированного проекта отображается в редакторе Cloud Shell следующим образом:

Класс 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!

8. Уборка
Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, использованные в этой статье, выполните следующие действия:
- В консоли Google Cloud перейдите на страницу «Управление ресурсами» .
- В списке проектов выберите проект, который хотите удалить, и нажмите «Удалить».
- В диалоговом окне введите идентификатор проекта, а затем нажмите «Завершить», чтобы удалить проект.
- Если вы не хотите удалять проект, удалите экземпляр Spanner, перейдя к только что созданному для этого проекта экземпляру и нажав кнопку «УДАЛИТЬ ЭКЗЕМПЛЯР» в правом верхнем углу страницы обзора экземпляра.
- Вы также можете перейти на страницу служб 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 .