1. はじめに
本を読むのは好きだけれど、選択肢が多すぎて困っている方へ。AI 搭載アプリが、最適な本をおすすめするだけでなく、選択したジャンルに基づいてあらすじを提供し、内容を簡単に紹介してくれるとしたらどうでしょう。この Codelab では、Gemini のサポートのもと、BigQuery、Gemini、Gemini を搭載した Cloud Functions を使用してそのようなアプリをビルドする方法について説明します。
プロジェクトの概要
このユースケースは、次の 4 つの主要なコンポーネントが中心です。
- 書籍データベース: インターネット アーカイブの書籍の BigQuery 一般公開データセットを包括的な書籍カタログとして使用します。
- AI サマリー エンジン: Gemini 1.0 Pro 言語モデルを搭載した Google Cloud Functions が、ユーザーのリクエストに合わせて有益な要約を生成します。
- BigQuery の統合: BigQuery 内のリモート関数。Cloud Functions を呼び出して、オンデマンドで書籍の要約とテーマを配信します。
- ユーザー インターフェース: Cloud Run でホストされるウェブアプリ。ユーザーが結果を確認するためのウェブ アプリケーションを提供します。
実装を 3 つの Codelab に分割します。
Codelab 1: Gemini を使用して、Gemini アプリケーション用の Java Cloud Functions の関数をビルドする
Codelab 2: Gemini を使用して、BigQuery と生成 AI で SQL アプリをビルドする
Codelab 3: Gemini を使用して、BigQuery とやり取りする Java Spring Boot ウェブ アプリケーションを作成する
2. Gemini を使用して BigQuery と生成 AI で SQL アプリを構築する
作成するアプリの概要
このチュートリアルでは、
- BigQuery のリモートモデル。Vertex AI text-bison-32k エンドポイントを呼び出して、テーブル内の「;」で区切られたキーワードのリストから書籍のジャンル(またはテーマ)を特定します。
- デプロイされた生成 AI Cloud Functions をリモートで呼び出す BigQuery のリモート関数。
- リモートモデルと関数を使用して、SQL クエリで本のテーマとテキストを要約し、結果を書棚データセットの新しいテーブルに書き込みます。
- これらの手順は、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 for Google Cloud と必要な API を有効にする
Gemini を有効にする
- Gemini for Google Cloud の Marketplace に移動して、API を有効にします。次のコマンドも使用できます。
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- Gemini のページにアクセスして、[Start chatting] をクリックします。
その他の必要な API を有効にする
どのように有効にするのでしょうか?Gemini に聞いてみましょう。ただし、その前に以下の点に注意してください。
注: LLM は非決定的です。そのため、これらのプロンプトを試しているときに受け取るレスポンスがスクリーンショット内のレスポンスとは異なる場合があります。
Google Cloud コンソールの右上の「Gemini を開く」アイコン(検索バーの横)をクリックして、Gemini チャット コンソールに移動します。
[ここにプロンプトを入力] に次の質問を入力します。
gcloud コマンドを使用して BigQuery API と Vertex AI API を有効にするにはどうすればよいですか?
次の画像に示すようなレスポンスが返されます。

コピーして(コマンド スニペットの上部にあるコピーアイコンを使用できます)、Cloud Shell ターミナルで実行し、各サービスを有効にします。
- bigquery.googleapis.com
- aiplatform.googleapis.com
5. 書籍データの BigQuery 一般公開データセットを探索する
まず、多数のインターネット アーカイブの書籍に関する情報が含まれている BigQuery の公開データセットについて理解しましょう。
この一般公開データセットは、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. bookshelf という新しい BigQuery データセットを作成します。
このラボで作成するすべてのデータベース オブジェクトと分析オブジェクトを保存するために、プロジェクトにデータセットを作成します。Gemini に BigQuery データセットの作成方法を尋ねてみましょう。API を有効にする手順で、ブラウザの別のタブで Gemini チャットを開いているはずです。まだの場合は、今すぐ登録しましょう。https://console.cloud.google.com に移動して Google Cloud コンソールにアクセスします。上部の検索バーのすぐ横に Gemini アイコンが表示されます。クリックすると、チャットが開きます。

次のようにプロンプトを入力します。
次のプロンプトを入力してみます。
How to create a BigQuery dataset?
以下がそのレスポンスです。

回答に記載されている手順に沿って、アクティブ プロジェクトに「bookshelf」という名前のデータセットを作成しましょう。
BigQuery データセットを作成する手順は次のとおりです。
- Google Cloud Console の [BigQuery] ページに移動します。
- [エクスプローラ] パネルでプロジェクト ID をクリックします。
- [データセットを作成] をクリックします(プロジェクト ID の横にあるその他アイコンをクリックすると、オプションが表示されます)。
- データセット名として「bookshelf」と入力します。
- ロケーションを [US(マルチリージョン)] に設定します。
- 回答のステップ 3、4、5、6 では、デフォルトのオプションのままにします。
- [データセットを作成] をクリックします。
データセットが作成され、[エクスプローラ] パネルに表示されます。「bookshelf」データセットは次のように表示されます。
7. Vertex AI LLM(text-bison-32k)を呼び出すリモートモデルを作成する
次に、Vertex AI モデル「text-bison-32k」を呼び出すモデルを BigQuery に作成する必要があります。このモデルは、データセット内の各書籍のキーワードのリストから、書籍の共通のテーマとコンテキストを特定するのに役立ちます。
Gemini にこの質問をしてみましょう。これを行うには、Gemini チャット コンソールが開いているタブに移動し、次のプロンプトを入力します。
BigQuery と Vertex AI を接続して、BigQuery で LLM エンドポイント(text-bison-32k)を呼び出すにはどうすればよいですか?
レスポンスの例を次に示します。

レスポンスには、CREATE MODEL ステートメントの使用、BigQuery 接続の使用、エンドポイントの定義などの手順を含む正確な情報が含まれます。クエリ ステートメントは私にとっては正確ですが、これは大規模言語モデルであるため、異なる形式、量、深さのレスポンスが返される可能性があるため、まったく同じ出力が返されるとは限りません。受け取ったすべての詳細が表示されない場合は、フォローアップの質問でチャットをプローブしてください。例: 接続リソースの作成方法の詳細、接続属性が見つからない理由、BigQuery から Vertex AI に接続する方法など。
フォローアップ プロンプトの例を次に示します(フォローアップが必要な場合にのみ使用します。最初の回答で十分な場合は、そのまま進めてください)。
What about the connection? How will I connect from BigQuery to Vertex AI?
レスポンスは次のとおりです。

レスポンスの手順に沿って、BigQuery 接続を作成します。
- BigQuery コンソールに移動します。
- BigQuery の [エクスプローラ] ペインで [+ 追加] ボタンをクリックし、[外部データソースへの接続] をクリックします。
- この時点で、BigQuery Connection API を有効にするよう求められます。[API を有効にする] をクリックします。

- [外部データソースへの接続] をクリックすると、下の図のように [外部データソース] スライドが表示されます。外部ソースのリストから、[Vertex AI] ソースを選択します。

- 接続 ID を入力します(任意の ID を使用できますが、ここでは「bq-vx」とリージョン(マルチリージョン「US」)に設定します)。
- [接続を作成] をクリックします。

- 接続を作成したら、[接続に移動] をクリックします。
- 接続情報ページで、サービス アカウント ID をコピーします。この ID は以降の手順で使用します。
- 接続が作成されたので、コピーしたサービス アカウント ID に Vertex AI を使用するための権限を割り当てましょう。
- Google Cloud コンソールのページから、Google Cloud IAM を開くか、リンクに移動します。
- [プリンシパル別に表示] セクションで、[アクセスを許可] をクリックします。

- [アクセス権の付与] ダイアログ ボックスの [新しいプリンシパル] テキスト ボックスに、先ほどメモしたサービス アカウント ID を入力します。
- ロールを「Vertex AI ユーザー」に設定します。

必要な接続が作成されます。プリンシパル(接続のサービス アカウント)が BigQuery から Vertex AI を使用するために必要な権限が付与されます。
BigQuery クエリ エディタで、DB オブジェクト(この場合は MODEL)の作成を表す次の DDL(データ定義言語)ステートメントを実行します。
CREATE OR REPLACE MODEL bookshelf.llm_model
REMOTE WITH CONNECTION `us.bq-vx`
OPTIONS (ENDPOINT = 'text-bison-32k');
上記の手順の代替として、Gemini に「text-bison-32k」モデルを呼び出すモデルを作成するクエリを提案するようリクエストすることもできます。
注: 接続に別の名前を使用した場合は、前の DDL ステートメントで「us.bq-vx」をその名前に置き換えます。このクエリは、先ほど作成したデータセット「bookshelf」にリモートモデルを作成します。
8. Java Cloud Functions を呼び出すリモート関数を作成する
このシリーズの Codelab 1 で作成した Java Cloud Functions の関数を使用して、Gemini モデルを実装する BigQuery のリモート関数を作成します。このリモート関数は、書籍の内容を要約するために使用されます。
注: この Codelab を見逃した場合や、この Cloud Functions をデプロイしていない場合は、この手順をスキップして、次のトピック(リモートモデルを使用して書籍のテーマを要約する)に進んでください。
BigQuery コンソールに移動し、クエリエディタに次の DDL ステートメントを貼り付けます([+] ボタンをクリックして新しいクエリエディタ タブを作成できます)。

コピーできる DDL は次のとおりです。エンドポイントは、デプロイした Cloud Functions エンドポイント(codelab 1 で作成)に置き換えてください。エンドポイントがない場合は、デモ用に次の DDL のマスクされた文字を「abis-345004」に置き換えることができます。
CREATE OR REPLACE FUNCTION
`bookshelf.GEMINI_REMOTE_CALL` (context STRING) RETURNS STRING
REMOTE WITH CONNECTION `us.bq-vx`
OPTIONS (
endpoint = 'https://us-central1-****-******.cloudfunctions.net/remote-gemini-call' );
Google Cloud プラットフォームで BigQuery コンソールに移動し、新しいクエリエディタ タブを開きます。BigQuery クエリエディタに、上記の DDL ステートメントを貼り付けます。クエリを実行すると、次のレスポンスが表示されます。

モデルと関数が作成されたので、SELECT クエリで実行して、これら 2 つの BigQuery オブジェクトをテストしてみましょう。
9. リモートモデルを使用してテーマを要約する
作成したリモートモデル「bookshelf.llm_model」を使用して、指定されたテーマのリストから書籍の統合キーワードを生成してみましょう。
SELECT * FROM ML.GENERATE_TEXT(MODEL `bookshelf.llm_model`,
(
SELECT
CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
FROM `gdelt-bq.internetarchivebooks.1920` LIMIT 1
));
省略可: LLM 生成結果フィールドの結果がネストされています。クエリに LLM パラメータと flatten_json_output 属性を追加してみましょう。「flatten_json_output」属性を使用すると、LLM で生成された結果フィールドからネストされた構造を削除できます。
SELECT * FROM ML.GENERATE_TEXT ( MODEL `bookshelf.llm_model`, (
SELECT CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt FROM `gdelt-bq.internetarchivebooks.1920` limit 1),
STRUCT( 0.2 AS temperature, 100 AS max_output_tokens, TRUE AS flatten_json_output));
次に、BigQuery エディタで SELECT クエリを実行し、結果を確認します。テスト用にクエリ結果を 1 つに制限しました。結果は次のように表示されます。

10. リモート関数を使用して書籍の全文を要約する
ここで、先ほど作成した bookshelf.GEMINI_REMOTE_CALL Cloud Functions を実行して、書籍の要約を試します。
注: リモート関数の作成(この Codelab の前のトピック)をスキップした場合は、SELECT クエリの bookshelf.GEMINI_REMOTE_CALL 関数呼び出しもスキップしてください。
前に作成したリモート関数(GEMINI_REMOTE_CALL)を呼び出す SELECT クエリを使用します。この関数(GEMINI_REMOTE_CALL)の呼び出しには、書籍のテキストの要約を求めるプロンプトが含まれています。
select BookMeta_Title, `bookshelf.GEMINI_REMOTE_CALL` (
CONCAT('This is about a book. The title of the book is this: ', BookMeta_Title, ' . The theme of the book is as follows: ', Themes, 'The following text contains an excerpt from the book. Summarize it in less than 5 lines to create the gist. If you do not have a summary, use the title and themes to make up a short summary. DO NOT RETURN EMPTY RESPONSE. ', SUBSTR(BookMeta_FullText, 5000, 10000))) Summary
from `gdelt-bq.internetarchivebooks.1920` where Themes like '%EDUCATION%' limit 1;
なお、書籍の全文のサブストリングを取得して、要約を生成しています。
クエリの結果は次のとおりです。

11. 書籍データをテーブルに保存する
SQL クエリのみを使用して BigQuery から LLM 呼び出し(リモートモデルと関数)の両方をテストしたので、リモートモデルと関数と同じデータセットに、テーマの分析情報を含む「本棚」データを保存する BigQuery テーブルを作成しましょう。
実際には、このステップに LLM モデルの呼び出しとリモート関数呼び出しの両方を含めることができます。ただし、リモート関数呼び出し(Cloud Functions を呼び出す)を省略可能なステップとしてマークしているため、リモートモデルの分析情報のみを使用します。
使用するクエリは次のとおりです。
SELECT
BookMeta_Title, Themes, ml_generate_text_llm_result Context
FROM
ML.GENERATE_TEXT (
MODEL `bookshelf.llm_model`,
(
SELECT
BookMeta_Title,
Themes,BookMeta_FullText,
CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
FROM `gdelt-bq.internetarchivebooks.1920` limit 5),
STRUCT(
0.2 AS temperature,
100 AS max_output_tokens,
TRUE AS flatten_json_output));
BigQuery エディタでクエリを実行すると、次のような結果が得られます。

次に、上記のクエリから「bookshelf.books」という名前のテーブルを作成するよう Gemini に指示します。Google Cloud コンソールの Gemini Chat コンソールに移動し、次のプロンプトを入力します。
使用するプロンプトは次のとおりです。
Create a BigQuery table named bookshelf.books from this SELECT query:
SELECT
BookMeta_Title, Themes, ml_generate_text_llm_result Context
FROM
ML.GENERATE_TEXT (
MODEL `bookshelf.llm_model`,
(
SELECT
BookMeta_Title,
Themes,BookMeta_FullText,
CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
FROM `gdelt-bq.internetarchivebooks.1920` limit 5),
STRUCT(
0.2 AS temperature,
100 AS max_output_tokens,
TRUE AS flatten_json_output));
Gemini Chat の回答は次のとおりです。

こちらから直接コピーする場合は、次のクエリを使用します。
CREATE TABLE bookshelf.books (
BookMeta_Title STRING,
Themes STRING,
ml_generate_text_llm_result STRING
) AS (
SELECT
BookMeta_Title,
Themes,
ml_generate_text_llm_result Context
FROM
ML.GENERATE_TEXT (
MODEL `bookshelf.llm_model`,
(
SELECT
BookMeta_Title,
Themes,
BookMeta_FullText,
CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
FROM `gdelt-bq.internetarchivebooks.1920`
LIMIT 5
),
STRUCT(
0.2 AS temperature,
100 AS max_output_tokens,
TRUE AS flatten_json_output
)
)
);
BigQuery エディタでクエリを実行すると、次のような結果が得られます。

これで、テーブルに対してクエリを実行し、データを操作して分析情報を取得します。
12. 完了
おめでとうございます!以下の作業を完了しました。また、プロセスのいくつかのステップで Gemini を使用しました。
- BigQuery にリモートモデルを作成し、Vertex AI の「text-bison-32k」エンドポイントを呼び出して、テーブル内の「;」で区切られたキーワードのリストから本のジャンル(またはテーマ)を特定しました。
- デプロイされた生成 AI Cloud Functions をリモートで呼び出す BigQuery のリモート関数を作成しました。この関数は、プロンプトを入力として受け取り、書籍を 5 行で要約した文字列を出力します。
- リモートモデルと関数を使用して、SQL クエリで本のテーマとテキストを要約し、結果を書棚データセットの新しいテーブルに書き込みました。
- フォローアップ課題として、Gemini を使用して BigQuery で作成されたオブジェクトを削除する SQL を取得してみてください。この手順では、クリーンアップの手順について説明します。