1. はじめに
本を読むのは好きだけれど、選択肢が多すぎて困っている方へ。AI 搭載アプリが、最適な本をおすすめするだけでなく、選択したジャンルに基づいてあらすじを提供し、内容を簡単に紹介してくれるとしたらどうでしょう。この Codelab では、Gemini のサポートのもと、BigQuery、Vertex AI、Cloud Run を使用してそのようなアプリケーションをビルドする方法について説明します。
プロジェクトの概要
このユースケースは、次の 4 つの主要なコンポーネントが中心です。
- 書籍データベース: インターネット アーカイブの書籍の BigQuery 一般公開データセットを包括的な書籍カタログとして使用します。
- AI サマリー エンジン: Gemini-Pro 言語モデルを搭載した Google Cloud Functions が、ユーザーのリクエストに合わせて有益な要約を生成します。
- BigQuery の統合: BigQuery 内のリモート関数。Cloud Functions を呼び出して、オンデマンドで書籍の要約とテーマを配信します。
- ユーザー インターフェース: Cloud Run でホストされるウェブアプリ。ユーザーが結果を確認するためのウェブ アプリケーションを提供します。
プロジェクト実装全体を 3 つの Codelab に分割しました。この Codelab では、以下のリストにある Codelab 3 について説明します。
Codelab 1: Gemini を使用して、Gemini アプリケーション用の Java Cloud Functions の関数をビルドする
Codelab 2: Gemini を使用して、BigQuery で SQL のみの生成 AI アプリケーションをビルドする
Codelab 3: Gemini を使用して、BigQuery とやり取りする Java Spring Boot ウェブ アプリケーションを作成する
2. Gemini を使用して BigQuery 対応の Spring Boot ウェブ アプリケーションをビルドする
作成するアプリの概要
- 必要な BigQuery データセットとテーブルを作成します。
- BigQuery とやり取りして書籍データを取得し、ウェブ上に表示する Java Spring Boot ウェブ アプリケーション。
- このアプリは Cloud Run にデプロイされます。
- これらの手順は、Gemini のサポートを受けながら実装します。
3. 要件
- ブラウザ(Chrome、Firefox など)
- 課金を有効にした Google Cloud プロジェクト
- Codelab パート 1「Gemini を使用して、Gemini アプリケーション用の Java Cloud Functions の関数をビルドする」の一環で Cloud Functions をデプロイしておくと便利です。
- 条件付き: 現時点で、無料の Google Cloud クレジットのリンク(ワークショップの開催者がプロビジョニングしている可能性があります)にアクセスできる場合は、以下のページの手順に沿って、事前にクレジットの有効化とプロジェクトの作成を完了してください。このリンクがない場合は、以下のプロジェクトと課金の要件の手順に進みます。
プロジェクトを作成する
上記の条件付きステップに記載のリンクを使用して、すでに請求先アカウントを有効にし、プロジェクトを作成している場合は、以下の手順をスキップできます。
- Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します。
- Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
Cloud Shell をアクティブにする
- Cloud Shell(Google Cloud で動作するコマンドライン環境)を使用します。この環境には bq がプリロードされています。
Cloud コンソールで、[Cloud Shell をアクティブにする] をクリックします。
- Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。Cloud Shell で次のコマンドを実行して、認証されたことを確認します。
gcloud auth list
- Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project
- プロジェクトが設定されていない場合は、次のコマンドを使用して設定します。
gcloud config set project <YOUR_PROJECT_ID>
gcloud コマンドとその使用方法については、ドキュメントをご覧ください。
4. Gemini と必要な API を有効にする
Gemini を有効にする
- Gemini Marketplace にアクセスして API を有効にします。次のコマンドも使用できます。
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- Gemini のページにアクセスして、[Start chatting] をクリックします。
その他の必要な API を有効にする
どのように有効にするのでしょうか?Gemini に聞いてみましょう。ただし、その前に以下の点に注意してください。
注: LLM は非決定的です。そのため、これらのプロンプトを試しているときに受け取るレスポンスがスクリーンショット内のレスポンスとは異なる場合があります。
Google Cloud コンソールの右上の「Gemini を開く」アイコン(検索バーの横)をクリックして、Gemini チャット コンソールに移動します。
[ここにプロンプトを入力] に次の質問を入力します。
How do I enable the BigQuery and Cloud Run apis using gcloud command?
次の画像に示すようなレスポンスが返されます。
コピーして(コマンド スニペットの上部にあるコピーアイコンを使用できます)、Cloud Shell ターミナルで実行し、各サービスを有効にします。
- bigquery.googleapis.com
- run.googleapis.com
5. 書籍データの BigQuery 一般公開データセットを探索する
まず、多数のインターネット アーカイブの書籍に関する情報が含まれている BigQuery の公開データセットについて理解しましょう。このリンクから internetarchivebooks データセットにアクセスできない場合は、以下の手順に沿ってデータセットを調べるか、こちらのドキュメントをご覧ください。
この一般公開データセットは、BigQuery エクスプローラ ペインにあります。BigQuery コンソールを開くと左側に表示されます。
検索バーに「gdelt-bq」または「internetarchivebooks」と入力し、[すべてのプロジェクトを検索] をクリックします。検索結果を開き、下の画像のように [internetarchivebooks] をスター付きにします。
データセットを開き、gdelt-bq.internetarchivebooks をクリックして、「1920」テーブルのデータをプレビューします。このテーブルには、アーカイブされた 1920 年の書籍が含まれています。
以降のセクションで使用するスキーマを確認するには、次のクエリを実行します。
select * from `gdelt-bq.internetarchivebooks.1920` limit 5;
この Codelab では、次の 3 つのフィールドを使用します。
- BookMeta_Title(タイトル)
- Themes(「;」で区切られたテーマ)
- BookMeta_FullText(書籍の全文)
6. Gemini を使用して基本的な Java Cloud Run テンプレートを作成する
Cloud Shell ターミナルの右上にある [エディタを開く] アイコンをクリックして Cloud Shell エディタを開きます。ターミナルとエディタを別々のタブで同時に開き、一方でコードを記述し、もう一方でビルドする方法がおすすめです。
エディタを開いたら、エディタ コンソールの右下にある Gemini ロゴがアクティブになっていること(およびキャンセルされていないこと)を確認します。また、左下の Google Cloud プロジェクトが、作業する現在のアクティブなプロジェクトを参照していることを確認します。アクティブになっていない場合は、クリックして承認し、参照する Google Cloud プロジェクトを選択してアクティブにします。
両方がアクティブになったら、左下のプロジェクト名をクリックし、表示された [Cloud Code] というポップアップ リストで [New Application] までスクロールします。
リストで、Cloud Run アプリケーションを選択します。表示されたリストから [Java] を選択します。
表示されたリストで、「helloworld」ではなくプロジェクト名「bookshelf-web」を入力して、[OK] をクリックします。
今回は、シンプルな Java Cloud Run アプリケーションを Gemini でブートストラップしました。有効化とアクティベーションの構成以外ですることはほとんどありませんでしたね。
プロジェクトの構造は次のようになります。
これで、アプリケーションをデプロイできるようになりました。しかし、目的はそれではありません。まだ、BigQuery データベースから分析データを取得してウェブに表示するという、ウェブ アプリケーションの主要機能を追加する必要があります。
そのためには、プロンプトを追加して Gemini でコードを段階的に開発するか、自分でロジックを記述します。ここでは、両方を組み合わせて使用します。
7.ウェブアプリで BigQuery を使用するために依存関係を追加する
アプリケーションがブートストラップされ、アプリケーションのソースとプロパティを変更する準備が整いました。まず、依存関係を追加します。Gemini に推奨事項を尋ねてみましょう。
Cloud Code エディタのステータスバーの右下で Gemini がアクティブになっており、左下に選択中のアクティブな Google Cloud プロジェクトが表示されていることを確認します。
Cloud Code エディタで、pom.xml ファイルに移動し、</dependencies> タグのすぐ上に次のプロンプト コメントを入力します。
<!-- What maven dependency should I include to access BigQuery in the app-->
結果は次のようになります。
説明のため、依存関係をこちらに貼り付けます。バージョンタグが提案された場合は、無視してかまいません。
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-bigquery</artifactId>
</dependency>
8. 本棚データをウェブに表示するようにソースを更新する
HelloWorldController.java コードを次のように置き換えます。
package cloudcode.helloworld.web;
import java.util.UUID;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.JobId;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableResult;
import com.google.cloud.bigquery.FieldValueList;
@RestController
public final class HelloWorldController {
/**
* Create an endpoint for the landing page
* @return the BigQuery analytics results string to the web
*/
@GetMapping("/")
public String helloWorld() throws Exception {
/* Connect to bigquery and write a select SQL to fetch Title, Theme and Summary fields from the table `bookshelf.bookshelf_theme` if you have executed the codelab 1 of this series, if not just directly use records from gdelt-bq.internetarchivebooks.1920 table */
String query = "SELECT BookMeta_Title || ' (' || Themes || ') ' as summary from gdelt-bq.internetarchivebooks.1920 limit 10 ";
BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
QueryJobConfiguration queryConfig =
QueryJobConfiguration.newBuilder(query)
.setUseLegacySql(false)
.build();
// Create a job ID so that we can safely retry.
JobId jobId = JobId.of(UUID.randomUUID().toString());
Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).setJobId(jobId).build());
// Wait for the query to complete.
queryJob = queryJob.waitFor();
// Check for errors
if (queryJob == null) {
throw new RuntimeException("Job no longer exists");
} else if (queryJob.getStatus().getError() != null) {
throw new RuntimeException(queryJob.getStatus().getError().toString());
}
// Get the results.
TableResult result = queryJob.getQueryResults();
String responseString = "";
// Print all pages of the results.
for (FieldValueList row : result.iterateAll()) {
responseString += row.get("summary").getStringValue() + ". \n";
System.out.printf("%s\n", row.get("summary").getStringValue());
}
return responseString;
}
}
ソースファイルに次の変更を加えました。
- HelloWorldController.java で、@Controller を @RestController に更新しました。
- helloWorld() メソッドの内容を変更し、BigQuery の呼び出しや、書籍のタイトルとテーマをリスト表示するためにデータを取得するクエリの実行を追加しました。
- 読み込み時にインデックス ビュー テンプレートを返すのではなく、レスポンスを文字列としてウェブに返すように更新しました。
重要: 以下の項目を必ず更新してください
- HelloWorldControllerTests.Java ファイルを更新して、現在の mvc.perform(...) 呼び出しをコメントアウトします。
Gemini for Code の説明
コードを提供し、ソースファイルに加えた変更について説明しました。Gemini を使用すると、必要に応じてコードの説明やコードコメントを取得できます。以下の方法をお試しください。
- IDE で HelloWorldController.java ファイルを開き、IDE の Chat パネルに移動して、「説明してください」というプロンプトを入力します。Gemini が提供する詳細な説明をご確認ください。いつでも利用し、コードの説明を確認できます。
- コード内の特定のスニペットまたは行(@GetMapping("/") など)をハイライト表示し、「説明してください」というプロンプトを使用できます。選択したコード行またはスニペットについてのみ、詳細な説明が表示されます。
- コードを別の方法で照会するクエリも試せます。たとえば、次のコード行を選択します。
BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
そして「BigQuery の変数が null の場合、どうなりますか?」と質問します。4. コードの改善やリファクタリングについて Gemini のサポートを求めることもできます。たとえば、helloWorld() メソッドのコード全体を選択して、「このコードはどのように改善、リファクタリングできますか?」と尋ねます。Gemini の提案を確認します。
9.ビルドとデプロイ
Cloud Shell ターミナルに移動します。ターミナルで、プロジェクト ID が参照されていることを確認します。
cd コマンドを使用して、プロジェクト ディレクトリに移動します。
cd bookshelf-web
以下のコマンドを 1 つずつ実行して、アプリがローカルで実行されていることを確認します。
mvn package
mvn spring-boot:run
次に、[ウェブでプレビュー] ボタンをクリックし、下に示すように [ポート 8080 でプレビュー] オプションをクリックします。
Cloud Shell マシンでローカルに実行されているアプリを表示できることを確認します。
次に、このウェブ アプリケーションを Cloud Run にデプロイする方法について Gemini に尋ねてみましょう。Google Cloud コンソールで [Open Gemini] ボタンをクリックして Gemini Chat に移動します。
次のプロンプトを入力してみます。
What is the gcloud command to deploy my app to cloud run without having to containerize, only by giving the source file?
レスポンスは次のとおりです。
次のスニペットに示すように、gcloud コマンドのサービス名とリージョンのプレースホルダを置き換えます。
gcloud run deploy bookshelf-web --source . --allow-unauthenticated --region $REGION
Cloud Shell ターミナルでこのコマンドを実行します。いくつかのフォローアップ メッセージが表示されます。適切な回答を選択すると、デプロイの進行状況を確認できます。
数分後、アプリが Google Cloud にサーバーレスでデプロイされます。Cloud Run にデプロイされたアプリをクリックして、ウェブ上で結果を確認します。
10.完了
これで完了です。Gemini を使用して、Java Cloud Run ウェブ アプリケーションをビルド、デプロイ、テストし、本棚分析を実行できました。フォローアップ タスクとして、Google Cloud コンソールからデプロイされた Cloud Run サービスを削除する方法を Gemini に尋ね、その回答に従ってリソースをクリーンアップします。