Spanner と Vertex AI Imagen API を使用した生成 AI へのデータから

1. はじめに

この Codelab では、Java、Spring Boot、Cloud Spanner データベース、Vertex AI Imagen API を使用して AI を活用したポーズ ジェネレータを構築します。ユーザーがプロンプトを入力すると、アプリケーションはそのプロンプトに基づいてポーズを生成します。また、REST API として公開された Spanner データベースのデータも使用します。これは、Google Cloud で Spring Boot を使用して生成 AI の機能を実証する、楽しくて教育的な方法です。

使用されるサービスのリストは次のとおりです。

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

フローの概要図

60192bcbff4c39de.png

作成するアプリの概要

作成する内容

  • サービスとしての Spanner データ用の Java Spring Boot アプリケーション
  • Imagen を使用した画像生成ユースケース用の Java Spring Boot アプリケーション
  • プロンプト入力とレスポンスのインタラクティブなユーザー インターフェース

2. 必要なもの

  • ブラウザ(Chrome、Firefox など)
  • 課金を有効にした Google Cloud プロジェクト

始める前に

  1. Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します。
  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
  3. 必要な API(Cloud Spanner API、Vertex AI API、Cloud Run API、Cloud Functions API)がすべて有効になっていることを確認します。
  4. Cloud Shell(Google Cloud で動作するコマンドライン環境)を使用します。この環境には bq がプリロードされています。gcloud コマンドとその使用方法については、ドキュメントをご覧ください。

Cloud コンソールで、[Cloud Shell をアクティブにする] をクリックします。

51622c00acec2fa.png

プロジェクトが設定されていない場合は、次のコマンドを使用して設定します。

gcloud config set project <YOUR_PROJECT_ID>
  1. アクティブな Google Cloud プロジェクトで Cloud Spanner ページに移動して、開始します。

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);

データベースとテーブルは、最後の手順の結果として作成されます。それでは、Spring Boot アプリケーションの構築を進めるために、Yoga_Poses テーブルにいくつかの行を挿入しましょう。

  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. ポーズデータの Spring Boot と Spanner を使用して REST API を構築する

Spring Boot と Google Cloud コンソールについて理解を深めるには、こちらのブログをご覧ください。

  1. Spring Boot アプリをブートストラップする このアプリをゼロからブートストラップするには、こちらのブログをご覧ください。リポジトリからクローンを作成してアクションを開始するには、Cloud Shell ターミナルで次のコマンドを実行します。
git clone https://github.com/AbiramiSukumaran/spanner-springb

これにより、Cloud Shell マシンにプロジェクト spanner-springb が作成されます。アプリのコンポーネントについては、ブログをご覧ください。

  1. アプリをビルドして実行します。これを行うには、Cloud Shell ターミナルから次のコマンドを実行します。
cd spanner-springb

./mvnw package

./mvnw spring-boot:run
  1. ポーズ ジェネレータ アプリで使用できるように、Cloud Run にアプリをデプロイします。これを行うには、Cloud Shell ターミナルから次のコマンドを実行します。
gcloud run deploy –source .

必要なパラメータを渡し、アプリがデプロイされていることを確認します。生成されたサービス URL は、Spanner で作成されたデータを一覧表示できる必要があります。

5. Spring Boot、Spanner、Imagen を使用してポーズ生成アプリをブートストラップする

これで、フロー図の上部、つまり Spanner データをサービス(REST API)として利用できるようにする部分が完了しました。次に、Spanner データを呼び出し、プロンプトを使用して IMAGEN API を呼び出し、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 クラスには、データベース サービスの呼び出し、ビジネス ロジックの実装、Imagen の生成 AI API の呼び出しも含まれています。このクラスは、ユーザー インターフェースへのデータ統合を処理する Thymeleaf テンプレートとやり取りします。このクラスには 3 つのサービス メソッドがあります。1 つはプロンプト入力を取得するためのもの、2 つはリクエストを処理して Imagen API を呼び出すためのもの、3 つは Imagen レスポンスを処理するためのものです。

Prompt と Yoga は、それぞれ Imagen API と Spanner データサーバー API とのインターフェースとなるフィールド、ゲッター、セッターを含む POJO クラスです。

templates フォルダの index と getImage の HTML ファイルには、ユーザー インターフェースのテンプレートが含まれており、それぞれのフォルダに JS スクリプトと CSS スクリプトの依存関係があります。

Vertex AI Imagen API の統合 画像生成のユースケースでは、次の形式で Vertex AI の Imagen API を使用しています。

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

Imagen の機能について詳しくは、こちらをご覧ください。レスポンスは Base64 エンコード文字列形式で返されます。画像を変換するために、getImage.HTML ファイルで次のように、画像オブジェクトに対して javascript の setattribute メソッド(getImage.js ファイル内)を使用しました。

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

認可: Imagen API にアクセスするには、ベアラー トークン認証を有効にする必要があります。この例では、アプリケーションのデフォルト認証情報の JSON アプローチを使用しています。これを実装するには、Cloud Shell ターミナルから次のコマンドを実行し、ターミナルに表示される手順に沿って操作します。

gcloud auth application-default login

アカウントで認証するには「Y」と入力します。アクセスを許可し、ポップアップに表示された認証コードをコピーします。この操作を行うとすぐに、アプリケーションのデフォルト認証情報が JSON ファイルに保存されます。保存場所は /tmp/tmp.Fh0Gf4yF0V/application_default_credentials.json のようになります。

ファイルをダウンロードするか、cat コマンド(cat /tmp/tmp.Fh0Gf4yF0V/application_default_credentials.json)を実行して JSON ファイルの内容をコピーし、PromptController.java クラスの callImagen() メソッドのアプリケーションで使用します。認証について詳しくは、こちらをご覧ください。

ユーザー インターフェース: テンプレート エンジンとして Thymeleaf を使用して、データを解析してフロントエンド テンプレート ファイルにレンダリングし、ユーザー インターフェースにエレガントなデザインを追加しました。HTML に似ていますが、レンダリングされたデータを操作するための属性をより多くサポートしています。index.html にはランディング ページの設計コンポーネントが含まれており、ユーザーはトピックを選択してオーバーライド プロンプトを追加し、目的の画像を生成できます。

6. ビルドとデプロイ

コードを複製し、プロジェクト、リージョン、認証情報に合わせてプレースホルダの値を置き換えたので、アプリのビルドとデプロイに進みましょう。次の 3 つのコマンドを 1 つずつ使用して、Cloud Shell ターミナルでプロジェクト フォルダに移動し、ビルドしてから Cloud Shell マシンにローカルでデプロイします。

cd genai-posegen

./mvnw package

./mvnw spring-boot:run

アプリを Cloud Run にデプロイして、クラウドで利用できるようにします。これを行うには、プロジェクト フォルダ内の Cloud Shell ターミナルから次のコマンドを実行します。

gcloud run deploy –source .

必要なパラメータを渡し、アプリがデプロイされていることを確認します。

7. デモ

アプリがデプロイされると、ターミナルにサービス URL が表示されます。リンクをクリックすると、Google Cloud でサーバーレスで実行されているポーズ画像生成アプリが表示されます。

92bdb22109b2f756.gif

8. クリーンアップ

この投稿で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。
  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
  4. プロジェクトを削除しない場合は、このプロジェクト用に作成したインスタンスに移動し、インスタンスの概要ページの右上にある [インスタンスを削除] ボタンをクリックして、Spanner インスタンスを削除します。
  5. Cloud Run サービス ページに移動し、このプロジェクトで作成されたサービスを選択して削除ボタンをクリックし、サービスを削除することもできます。

9. 完了

このブログでは、Cloud Spanner でデータを保存して処理するフルスタック Spring Boot アプリケーションを、Cloud Run にデプロイされたインタラクティブ クライアント アプリケーションで Google Cloud Vertex AI の Imagen API を使用してポーズを生成できるようにしました。このブログのアーキテクチャ図のセクションに、Cloud Functions(Java)コンポーネントが表示されていますが、これはまだ実装していません。ご協力いただける場合は、ぜひご参加ください。2 つの Java Cloud Functions を実装して、getimage.html ファイルにある 2 つのメソッド(ポーズをデータベースに保存するメソッドと画像をアップロードするメソッド)を実行できます。モデルの詳細については、Vertex AI の Imagen のドキュメントをご覧ください。