Gemini モデルと ML.GENERATE_TEXT 関数を使用してテキストを生成する

このチュートリアルでは、gemini-1.0-pro-002 モデルに基づいてリモートモデルを作成する方法について説明します。また、そのモデルを ML.GENERATE_TEXT 関数と組み合わせて bigquery-public-data.imdb.reviews 公開テーブルの映画レビューからキーワードを抽出し、感情分析を行う方法についても説明します。

必要な権限

  • データセットを作成するには、bigquery.datasets.create Identity and Access Management(IAM)権限が必要です。
  • 接続リソースを作成するには、次の IAM 権限が必要です。

    • bigquery.connections.create
    • bigquery.connections.get
  • 接続のサービス アカウントに権限を付与するには、次の権限が必要です。

    • resourcemanager.projects.setIamPolicy
  • モデルを作成するには、次の権限が必要です。

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.connections.delegate
  • 推論を実行するには、次の権限が必要です。

    • bigquery.models.getData
    • bigquery.jobs.create

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

  • BigQuery ML: You incur costs for the data that you process in BigQuery.
  • Vertex AI: You incur costs for calls to the Vertex AI service that's represented by the remote model.

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

BigQuery の料金の詳細については、BigQuery ドキュメントの BigQuery の料金をご覧ください。

Vertex AI の料金の詳細については、Vertex AI の料金のページをご覧ください。

始める前に

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.

    Enable the APIs

データセットを作成する

ML モデルを保存する BigQuery データセットを作成します。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] ページに移動

  2. [エクスプローラ] ペインで、プロジェクト名をクリックします。

  3. 「アクションを表示」> [データセットを作成] をクリックします。

    データセットを作成する。

  4. [データセットを作成する] ページで、次の操作を行います。

    • [データセット ID] に「bqml_tutorial」と入力します。

    • [ロケーション タイプ] で [マルチリージョン] を選択してから、[US (米国の複数のリージョン)] を選択します。

      一般公開データセットは US マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。

    • 残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。

      データセットの作成ページ。

接続を作成する

クラウド リソース接続を作成し、接続のサービス アカウントを取得します。前の手順で作成したデータセットと同じロケーションに接続を作成します。

次のオプションのいずれかを選択します。

コンソール

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. 接続を作成するには、[追加] をクリックし、続いて [外部データソースへの接続] をクリックします。

  3. [接続タイプ] リストで、[Vertex AI リモートモデル、リモート関数、BigLake(Cloud リソース)] を選択します。

  4. [接続 ID] フィールドに接続の名前を入力します。

  5. [接続を作成] をクリックします。

  6. [接続へ移動] をクリックします。

  7. [接続情報] ペインで、次の手順で使用するサービス アカウント ID をコピーします。

bq

  1. コマンドライン環境で接続を作成します。

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID

    --project_id パラメータは、デフォルト プロジェクトをオーバーライドします。

    次のように置き換えます。

    接続リソースを作成すると、BigQuery は、一意のシステム サービス アカウントを作成し、それを接続に関連付けます。

    トラブルシューティング: 次の接続エラーが発生した場合は、Google Cloud SDK を更新します。

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. 後の手順で使用するため、サービス アカウント ID を取得してコピーします。

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID

    出力は次のようになります。

    name                          properties
    1234.REGION.CONNECTION_ID     {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
    

Terraform

main.tf ファイルに次のセクションを追加します。

 ## This creates a cloud resource connection.
 ## Note: The cloud resource nested object has only one output only field - serviceAccountId.
 resource "google_bigquery_connection" "connection" {
    connection_id = "CONNECTION_ID"
    project = "PROJECT_ID"
    location = "REGION"
    cloud_resource {}
}        
次のように置き換えます。

接続のサービス アカウントに権限を付与する

接続のサービス アカウントに Vertex AI ユーザーロールを付与します。このロールは、始める前にで作成または選択したプロジェクトで付与する必要があります。別のプロジェクトでロールを付与すると、「bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource」というエラーが発生します。

ロールを付与する手順は次のとおりです。

  1. [IAM と管理] ページに移動します。

    [IAM と管理] に移動

  2. [アクセス権を付与] をクリックします。

  3. [新しいプリンシパル] フィールドに、前の手順でコピーしたサービス アカウント ID を入力します。

  4. [ロールを選択] フィールドで、[Vertex AI]、[Vertex AI ユーザーロール] の順に選択します。

  5. [保存] をクリックします。

リモートモデルを作成する

Vertex AI モデルを表すリモートモデルを作成します。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで、次のステートメントを実行します。

CREATE OR REPLACE MODEL `bqml_tutorial.gemini_model`
  REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID`
  OPTIONS (ENDPOINT = 'gemini-1.0-pro-002');

次のように置き換えます。

  • LOCATION: 接続のロケーション
  • CONNECTION_ID: BigQuery 接続の ID

    Google Cloud コンソールで接続の詳細を表示する場合、これは [接続 ID] に表示される完全修飾接続 ID の最後のセクションの値です。例: projects/myproject/locations/connection_location/connections/myconnection

クエリが完了するまでに数秒かかります。完了後、モデル gemini_model が [エクスプローラ] ペインの bqml_tutorial データセットに表示されます。クエリは CREATE MODEL ステートメントを使用してモデルを作成するため、クエリの結果はありません。

キーワード抽出を行う

リモートモデルと ML.GENERATE_TEXT 関数を使用して、IMDB 映画レビューに対してキーワード抽出を行います。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力して、5 つの映画レビューでキーワード抽出を行います。

    SELECT
      ml_generate_text_result['candidates'][0]['content'] AS generated_text,
      ml_generate_text_result['candidates'][0]['safety_ratings']
        AS safety_ratings,
      * EXCEPT (ml_generate_text_result)
    FROM
      ML.GENERATE_TEXT(
        MODEL `bqml_tutorial.gemini_model`,
        (
          SELECT
            CONCAT('Extract the key words from the text below: ', review) AS prompt,
            *
          FROM
            `bigquery-public-data.imdb.reviews`
          LIMIT 5
        ),
        STRUCT(
          0.2 AS temperature,
          100 AS max_output_tokens));

    出力は次のようになります(わかりやすくするために、生成されていない列は省略しています)。

    +----------------------------------------+---------------------------------------------+-------------------------+----------------------------+-----+
    | generated_text                         | safety_ratings                              | ml_generate_text_status | prompt                     | ... |
    +----------------------------------------+---------------------------------------------+-------------------------+----------------------------+-----+
    | {"parts":[{"text":"## Key words:\n\n*  | [{"category":1,"probability":1,             |                         | Extract the key words from |     |
    | **Negative sentiment:** \"terribly     | "probability_score":0.28856909,             |                         | the text below: I had to   |     |
    | bad acting\", \"dumb story\", \"not    | "severity":1,"severity_score":0.1510278},   |                         | see this on the British    |     |
    | even a kid would enjoy this\",         | {"category":2,"probability":1,              |                         | Airways plane. It was      |     |
    | \"something to switch off\"\n*         | "probability_score":0.062445287,            |                         | terribly bad acting and    |     |
    | **Context:** \"British Airways plane\" | "severity":1,"severity_score":0.10393038},  |                         | a dumb story. Not even     |     |
    | \n* **Genre:** \"movie\" (implied)...  | {"category":3,"probability":2,...           |                         | a kid would enjoy this...  |     |
    +----------------------------------------+---------------------------------------------+-------------------------+----------------------------+-----+
    | {"parts":[{"text":"## Key words:\n\n*  | [{"category":1,"probability":1,             |                         | Extract the key words from |     |
    | **Movie:** The Real Howard Spitz\n*    | "probability_score":0.2995148,"severity":2, |                         | the text below: This is    |     |
    | **Genre:** Family movie\n*             | "severity_score":0.22354652},               |                         | a family movie that was    |     |
    | **Broadcast:** ITV station, 1.00 am\n* | {"category":2,"probability":1,"             |                         | broadcast on my local      |     |
    | **Director:** Vadim Jean\n*            | probability_score":0.13072868,              |                         | ITV station at 1.00 am a   |     |
    | **Main character:** Howard Spitz,      | "severity":1,"severity_score":0.07030385},  |                         | couple of nights ago.      |     |
    | a children's author who hates...       | {"category":3,"probability":2,"       ...   |                         | This might be a strange... |     |
    +----------------------------------------+---------------------------------------------+-------------------------+----------------------------+-----+
    

    結果には次の列が含まれます。

    • generated_text: 生成されたテキスト。
    • safety_ratings: 安全属性と、ブロック カテゴリのいずれかに応じたコンテンツがブロックされているかどうかに関する情報。安全性属性の詳細については、Vertex PaLM API をご覧ください。
    • ml_generate_text_status: 対応する行の API レスポンス ステータス。オペレーションが成功した場合、この値は空になります。
    • prompt: 感情分析に使用されるプロンプト。
    • bigquery-public-data.imdb.reviews テーブルのすべての列。
  3. 省略可: 前の手順で行ったように、関数から返された JSON を手動で解析するのではなく、flatten_json_output 引数を使用して、生成されたテキストと安全性属性を別々の列に返します。

    クエリエディタで、次のステートメントを実行します。

    SELECT
      *
    FROM
      ML.GENERATE_TEXT(
        MODEL `bqml_tutorial.gemini_model`,
        (
          SELECT
            CONCAT('Extract the key words from the text below: ', review) AS prompt,
            *
          FROM
            `bigquery-public-data.imdb.reviews`
          LIMIT 5
        ),
        STRUCT(
          0.2 AS temperature,
          100 AS max_output_tokens,
          TRUE AS flatten_json_output));

    出力は次のようになります(わかりやすくするために、生成されていない列は省略しています)。

    +----------------------------------------+----------------------------------------------+-------------------------+----------------------------+-----+
    | ml_generate_text_llm_result            | ml_generate_text_rai_result                  | ml_generate_text_status | prompt                     | ... |
    +----------------------------------------+----------------------------------------------+-------------------------+----------------------------+-----+
    | ## Keywords:                           | [{"category":1,"probability":1,              |                         | Extract the key words from |     |
    |                                        | "probability_score":0.29391089,"severity":1, |                         | the text below: I had to   |     |
    | * **Negative sentiment:**              | "severity_score":0.15584777},{"category":2,  |                         | see this on the British    |     |
    | "terribly bad acting", "dumb           | "probability":1,"probability_score":         |                         | Airways plane. It was      |     |
    | story", "not even a kid would          | 0.061311536,"severity":1,"severity_score":   |                         | terribly bad acting and    |     |
    | enjoy this", "switch off"              | 0.10320505},{"category":3,"probability":2,   |                         | a dumb story. Not even     |     |
    | * **Context:** "British                | "probability_score":0.60340...               |                         | a kid would enjoy this...  |     |
    +----------------------------------------+----------------------------------------------+-------------------------+----------------------------+-----+
    | ## Key words:                          | [{"category":1,"probability":1,              |                         | Extract the key words from |     |
    |                                        | "probability_score":0.16968086,"severity":1, |                         | the text below: This is    |     |
    | * **Movie:** The Real Howard Spitz     | "severity_score":0.13386749},{"category":2,  |                         | a family movie that was    |     |
    | * **Genre:** Family movie              | "probability":1,"probability_score":         |                         | broadcast on my local      |     |
    | * **Broadcast:** ITV, 1.00             | 0.14841709,"severity":1,"severity_score":    |                         | ITV station at 1.00 am a   |     |
    | am                                     | 0.062674366},{"category":3,"probability":1,  |                         | couple of nights ago.      |     |
    | - ...                                  | "probability_score":0.38116196,...           |                         | This might be a strange... |     |
    +----------------------------------------+----------------------------------------------+-------------------------+----------------------------+-----+
    

    結果には次の列が含まれます。

    • ml_generate_text_llm_result: 生成されたテキスト。
    • ml_generate_text_rai_result: 安全属性と、ブロック カテゴリのいずれかに応じたコンテンツがブロックされているかどうかに関する情報。安全性属性の詳細については、Vertex PaLM API をご覧ください。
    • ml_generate_text_status: 対応する行の API レスポンス ステータス。オペレーションが成功した場合、この値は空になります。
    • prompt: キーワード抽出に使用されるプロンプト。
    • bigquery-public-data.imdb.reviews テーブルのすべての列。

感情分析を行う

リモートモデルと ML.GENERATE_TEXT 関数を使用して、IMDB 映画レビューに対して感情分析を行います。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを実行して、5 つの映画レビューの感情分析を行います。

    SELECT
      ml_generate_text_result['candidates'][0]['content'] AS generated_text,
      ml_generate_text_result['candidates'][0]['safety_ratings']
        AS safety_ratings,
      * EXCEPT (ml_generate_text_result)
    FROM
      ML.GENERATE_TEXT(
        MODEL `bqml_tutorial.gemini_model`,
        (
          SELECT
            CONCAT(
              'perform sentiment analysis on the following text, return one the following categories: positive, negative: ',
              review) AS prompt,
            *
          FROM
            `bigquery-public-data.imdb.reviews`
          LIMIT 5
        ),
        STRUCT(
          0.2 AS temperature,
          100 AS max_output_tokens));

    出力は次のようになります(わかりやすくするために、生成されていない列は省略しています)。

    +--------------------------------------------+---------------------------------------------+-------------------------+----------------------------+-----+
    | generated_text                             | safety_ratings                              | ml_generate_text_status | prompt                     | ... |
    +--------------------------------------------+---------------------------------------------+-------------------------+----------------------------+-----+
    | {"parts":[{"text":"## Sentiment Analysis:  | [{"category":1,"probability":1,             |                         | perform sentiment analysis |     |
    | Negative \n\nThis text expresses a         | "probability_score":0.33895186,             |                         | on the following text,     |     |
    | strongly negative sentiment towards the    | "severity":1,"severity_score":0.10521054},  |                         | return one the following   |     |
    | movie. Here's why:\n\n* **Negative         | {"category":2,"probability":1,              |                         | negative: I  had to see    |     |
    | like \"terribly,\" \"dumb,\" and           | "probability_score":0.069163561,"severity"  |                         | this on the British        |     | 
    | \"not even\" to describe the acting...     | :1,"severity_score":0.093512312},...        |                         | Airways plane. It was...   |     | 
    +--------------------------------------------+---------------------------------------------+-------------------------+----------------------------+-----+
    | {"parts":[{"text":"## Sentiment Analysis:  | [{"category":1,"probability":1,             |                         | perform sentiment analysis |     |
    | Negative \n\nThis review expresses a       | "probability_score":0.35644665,             |                         | on the following text,     |     |
    | predominantly negative sentiment towards   | "severity":1,"severity_score":0.15253653},  |                         | return one the following   |     |
    | the movie \"The Real Howard Spitz.\"       | {"category":2,"probability":1,              |                         | categories: positive,      |     |
    | Here's why:\n\n* **Criticism of the film's | "probability_score":0.063948415,"severity"  |                         | negative: This is a family |     |
    | premise:** The reviewer finds it strange   | :1,"severity_score":0.047249716},           |                         | movie that was broadcast   |     |
    | that a film about a children's author...   | {"category":3,"probability":2,...           |                         | on my local ITV station... |     |
    +--------------------------------------------+---------------------------------------------+-------------------------+----------------------------+-----+
    

    結果には、キーワード抽出を行うで説明したものと同じ列が含まれます。

クリーンアップ

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.