Bookshelf 分析: Gemini を使用して BigQuery と生成 AI で SQL アプリケーションを構築

1. はじめに

本を読むのは好きだけれど、選択肢が多すぎて困っている方へ。AI 搭載アプリが、最適な本をおすすめするだけでなく、選択したジャンルに基づいてあらすじを提供し、内容を簡単に紹介してくれるとしたらどうでしょう。この Codelab では、Gemini を活用した BigQuery、Gemini、Cloud Functions を使用して、このようなアプリを作成する方法について説明します。

プロジェクトの概要

このユースケースは、次の 4 つの主要なコンポーネントが中心です。

  • 書籍データベース: インターネット アーカイブの書籍の BigQuery 一般公開データセットを包括的な書籍カタログとして使用します。
  • AI Summarization Engine: 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. 要件

プロジェクトを作成する

上記の条件付きステップに記載のリンクを使用して、すでに請求先アカウントを有効にし、プロジェクトを作成している場合は、以下の手順をスキップできます。

  1. Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します。
  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

Cloud Shell をアクティブにする

  1. Cloud Shell(Google Cloud で動作するコマンドライン環境)を使用します。この環境には bq がプリロードされています。

Cloud コンソールで、右上にある [Cloud Shell をアクティブにする] をクリックします。6757b2fb50ddcc2d.png

  1. Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。Cloud Shell で次のコマンドを実行して、認証されたことを確認します。

gcloud auth list

  1. Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。

gcloud config list project

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

gcloud config set project <YOUR_PROJECT_ID>

gcloud コマンドとその使用方法については、ドキュメントをご覧ください。

4. Gemini for Google Cloud と必要な API を有効にする

Gemini を有効にする

  1. Gemini for Google Cloud の Marketplace にアクセスして API を有効にします。次のコマンドも使用できます。

gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID

  1. Gemini のページにアクセスして、[Start chatting] をクリックします。

その他の必要な API を有効にする

どのように有効にするのでしょうか?Gemini に聞いてみましょう。ただし、その前に以下の点に注意してください。

注: LLM は非決定的です。そのため、これらのプロンプトを試しているときに受け取るレスポンスがスクリーンショット内のレスポンスとは異なる場合があります。

Google Cloud コンソールの右上の「Gemini を開く」アイコン(検索バーの横)をクリックして、Gemini チャット コンソールに移動します。

[ここにプロンプトを入力] に次の質問を入力します。

gcloud コマンドを使用して BigQuery API と Vertex AI API を有効にする方法

次の画像に示すようなレスポンスが返されます。

19c3fd78530794d9.png

コピーして(コマンド スニペットの上部にあるコピーアイコンを使用できます)、Cloud Shell ターミナルで実行し、各サービスを有効にします。

  • bigquery.googleapis.com
  • aiplatform.googleapis.com

5. 書籍データの BigQuery 一般公開データセットを探索する

まず、多数のインターネット アーカイブの書籍に関する情報が含まれている BigQuery の公開データセットについて理解しましょう。

この一般公開データセットは、BigQuery エクスプローラ ペインにあります。BigQuery コンソールを開くと左側に表示されます。

39e2ac03cc99cbac.png

検索バーに「gdelt-bq」または「internetarchivebooks」と入力し、[すべてのプロジェクトを検索] をクリックします。検索結果を開き、下の画像のように [internetarchivebooks] をスター付きにします。

68dba68a79cddfc9.png

データセットを開き、gdelt-bq.internetarchivebooks をクリックして、「1920」テーブルのデータをプレビューします。このテーブルには、アーカイブされた 1920 年の書籍が含まれています。

以降のセクションで使用するスキーマを確認するには、次のクエリを実行します。

select * from  `gdelt-bq.internetarchivebooks.1920` limit 5;

この Codelab では、次の 3 つのフィールドを使用します。

  • BookMeta_Title(タイトル)
  • Themes(「;」で区切られたテーマ)
  • BookMeta_FullText(書籍の全文)

6. 「bookshelf」という名前の新しい BigQuery データセットを作成する

プロジェクトの下にデータセットを作成し、このラボで作成するすべてのデータベースと分析オブジェクトを格納します。BigQuery データセットを作成する方法を Gemini に尋ねてみましょう。API を有効にする手順で、ブラウザの別のタブで Gemini チャットを開いている必要があります。まだ設定していない場合は、今すぐ設定できます。https://console.cloud.google.com に移動して Google Cloud コンソールに移動します。上部の検索バーのすぐ横に Gemini アイコンが表示されます。クリックするとチャットが開きます。

26e1491322855614.png

次のようにプロンプトを入力します。

こちらがプロンプトです。

How to create a BigQuery dataset?

以下がそのレスポンスです。

f7a989cc9a01009.png

レスポンスに記載されている手順に沿って、アクティブなプロジェクトに「bookshelf」という名前のデータセットを作成しましょう。

BigQuery データセットを作成するには、次の操作を行います。

  1. Google Cloud Console の [BigQuery] ページに移動します。
  2. [エクスプローラ] パネルでプロジェクト ID をクリックします。
  3. [データセットを作成] をクリックします(プロジェクト ID の横にあるその他アイコンをクリックすると表示されるオプションにあります)。
  4. データセット名として「bookshelf」と入力します。
  5. ロケーションを「US(マルチリージョン)」に設定します。
  6. 回答のステップ 3、4、5、6 では、デフォルトのオプションのままにします。
  7. [データセットを作成] をクリックします。

データセットが作成され、エクスプローラ パネルに表示されます。「bookshelf」データセットは次のようになります。

7. Vertex AI LLM(text-bison-32k)を呼び出すリモートモデルを作成します。

次に、BigQuery で「text-bison-32k」Vertex AI モデルを呼び出すモデルを作成する必要があります。このモデルは、データセット内の各書籍のキーワードのリストから、書籍の共通テーマやコンテキストを特定するのに役立ちます。

Gemini にこの質問をしましょう。これを行うには、Gemini チャット コンソールを開いているタブに移動し、次のプロンプトを入力します。

BigQuery と Vertex AI を接続して、BigQuery で LLM エンドポイント(text-bison-32k)を呼び出すにはどうすればよいですか。

レスポンスの例を次に示します。

41904e30ce92b436.png

レスポンスには、CREATE MODEL ステートメントの使用、BigQuery 接続の使用、エンドポイントの定義などの手順など、正確な情報が含まれます。クエリ文は正確ですが、大規模言語モデルであるため、フォーマット、量、深さが異なる回答が返される場合があります。受け取った詳細情報がすべて表示されていない場合は、チャットでフォローアップの質問をしてください。たとえば、接続リソースの作成方法、接続属性がない理由、BigQuery から Vertex AI に接続する方法などについて詳しく説明します。

フォローアップ プロンプトの例を次に示します(フォローアップが必要な場合にのみ使用してください。最初の回答で十分な場合は、そのまま対応してください)。

What about the connection? How will I connect from BigQuery to Vertex AI?

レスポンスは次のとおりです。

2ed9b3ed96b11bc9.png

レスポンスの手順に沿って、BigQuery 接続を作成しましょう。

  1. BigQuery コンソールに移動します。
  2. BigQuery の [エクスプローラ] ペインで、[+ 追加] ボタンをクリックし、[外部データソースへの接続] をクリックします。
  3. この時点で、BigQuery Connection API を有効にするよう求められます。[API を有効にする] をクリックします。

ded96126495ffe9.png

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

434cdbbb3a9436f2.png

  1. 接続 ID を入力します(任意の ID を使用できますが、現時点では「bq-vx」に設定し、リージョン(マルチリージョンの場合は「US」)を指定します)。
  2. [Create Connection] をクリックします。

d3a2aeebc3ecdfae.png

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

5317eed5da0bb8c5.png

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

f213db33d220aa5f.png

必要な接続が作成されます。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 の関数を使用して、BigQuery にリモート関数を作成し、Gemini モデルを実装します。このリモート関数は、書籍のコンテンツの要約を生成するために使用されます。

注: この Codelab を視聴していない場合や、この Cloud Functions の関数をデプロイしていない場合は、この手順をスキップして次のトピック(リモートモデルを使用して書籍のテーマを要約する)に進んでください。

BigQuery コンソールに移動し、クエリエディタに次の DDL ステートメントを貼り付けます(+ ボタンをクリックして、新しいクエリエディタのタブを作成できます)。

a54c0b0014666cac.png

コピーできる 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 Platform の BigQuery コンソールに移動し、新しいクエリエディタ タブを開きます。BigQuery クエリエディタに、上記の DDL ステートメントを貼り付けます。クエリを実行すると、次のようなレスポンスが表示されます。

a023d5691acf6f.png

モデルと関数が作成されたので、これらの 2 つの BigQuery オブジェクトを SELECT クエリで実行してテストします。

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 に制限しました。結果は次のように表示されます。

9b0d33eca61a73d2.png

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;

なお、要約の生成には、書籍の全文の部分文字列を使用しています。

クエリの結果は次のとおりです。

658bb0a9c9cf0938.png

11. 書籍データをテーブルに格納する

これで、BigQuery からの両方の LLM 呼び出し(リモートモデルと関数)を SQL クエリのみを使用してテストしました。次に、リモートモデルと関数と同じデータセットに、テーマの分析情報を含む「本棚」データを保存する 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 エディタでクエリを実行すると、結果は次のようになります。

2c6e08e75a680867.png

次に、上記のクエリから「bookshelf.books」という名前のテーブルを作成するように Gemini に指示します。Google Cloud コンソールの Gemini チャット コンソールに移動し、次のプロンプトを入力します。

使用するプロンプトは次のとおりです。

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 チャットのレスポンスは次のとおりです。

df6595a4b14f7b9.png

クエリを直接コピーする場合は、次のクエリを使用します。

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 エディタでクエリを実行すると、結果は次のようになります。

2d1ce716f844b7ad.png

これで、テーブルをクエリしてデータを操作し、詳細な分析情報を確認します。

12. 完了

これで、以下の手順を完了し、一部のステップでも Gemini を使用しました。

  • BigQuery にリモートモデルを作成し、Vertex AI の「text-bison-32k」エンドポイントを呼び出して、テーブル内の「;」で区切られたキーワードのリストから書籍のジャンル(またはテーマ)を特定します。
  • デプロイされたこの生成 AI Cloud Functions の関数をリモートで呼び出すリモート関数を BigQuery に作成する。この関数は、プロンプトを入力として受け取り、書籍の要約を 5 行の文字列として出力します。
  • リモートモデルと関数を使用して、SQL クエリで書籍のテーマとテキストを要約し、結果を書籍データセットの新しいテーブルに書き込みました。
  • フォローアップ アサインメントとして、Gemini を使用して BigQuery で作成されたオブジェクトを削除する SQL を取得してみてください。これでクリーンアップ ステップになります。