ML.GENERATE_TEXT 関数を使用してテキストを生成する

このドキュメントでは、Vertex AI モデルを表す BigQuery ML リモートモデルを作成し、そのリモートモデルを ML.GENERATE_TEXT 関数と組み合わせてテキストを生成する方法について説明します。

対応しているリモートモデルのタイプは次のとおりです。

選択した Vertex AI モデルに応じて、オブジェクト テーブルからの非構造化データ入力または標準テーブルからのテキスト入力に基づき、テキストを生成できます。

必要なロール

リモートモデルを作成してテキストを生成するには、次の Identity and Access Management(IAM)ロールが必要です。

  • BigQuery データセット、テーブル、モデルの作成と使用: プロジェクトに対する BigQuery データ編集者(roles/bigquery.dataEditor)。
  • BigQuery 接続の作成、委任、使用: プロジェクトに対する BigQuery 接続管理者(roles/bigquery.connectionsAdmin)。

    デフォルト接続が構成されていない場合は、CREATE MODEL ステートメントの実行時に作成して設定できます。これを行うには、プロジェクトに対する BigQuery 管理者(roles/bigquery.admin)が必要です。詳細については、デフォルト接続を構成するをご覧ください。

  • 接続のサービス アカウントに権限を付与する: Vertex AI エンドポイントを含むプロジェクトに対するプロジェクト IAM 管理者(roles/resourcemanager.projectIamAdmin)。これは、モデル名をエンドポイントとして指定して作成するリモートモデルの現在のプロジェクトです。これは、エンドポイントとして URL を指定して作成したリモートモデルの URL で識別されるプロジェクトです。

    リモートモデルを使用してオブジェクト テーブルの非構造化データを分析し、オブジェクト テーブルで使用する Cloud Storage バケットが Vertex AI エンドポイントとは異なるプロジェクトにある場合は、オブジェクト テーブルで使用される Cloud Storage バケットに対するストレージ管理者(roles/storage.admin)も必要です。

  • BigQuery ジョブを作成する: プロジェクトに対する BigQuery ジョブユーザー(roles/bigquery.jobUser)。

これらの事前定義ロールには、このドキュメントのタスクを実行するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

  • データセットを作成する: bigquery.datasets.create
  • 接続を作成、委任、使用する: bigquery.connections.*
  • サービス アカウントの権限を設定する: resourcemanager.projects.getIamPolicyresourcemanager.projects.setIamPolicy
  • モデルを作成して推論を実行する。
    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.models.updateMetadata

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

始める前に

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

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

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

    Enable the APIs

データセットを作成する

リソースを格納する BigQuery データセットを作成します。

コンソール

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

    [BigQuery] ページに移動

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

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

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

    • [データセット ID] に、データセットの名前を入力します。

    • [ロケーション タイプ] で、データセットのロケーションを選択します。

    • [データセットを作成] をクリックします。

bq

  1. 新しいデータセットを作成するには、--location フラグを指定した bq mk コマンドを使用します。

    bq --location=LOCATION mk -d DATASET_ID

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

    • LOCATION: データセットのロケーション
    • DATASET_ID は、作成するデータセットの ID です。
  2. データセットが作成されたことを確認します。

    bq ls

接続を作成する

デフォルトの接続が構成されているか、BigQuery 管理者ロールが付与されている場合は、この手順をスキップできます。

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

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

コンソール

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

    [BigQuery] に移動

  2. [エクスプローラ] ペインで、[ データを追加] をクリックします。

    [データを追加] の UI 要素。

    [データを追加] ダイアログが開きます。

  3. [フィルタ条件] ペインの [データソースのタイプ] セクションで、[ビジネス アプリケーション] を選択します。

    または、[データソースを検索] フィールドに「Vertex AI」と入力します。

  4. [特徴量データソース] セクションで、[Vertex AI] をクリックします。

  5. [Vertex AI モデル: BigQuery フェデレーション] ソリューション カードをクリックします。

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

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

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

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

  10. [接続情報] ペインで、次の手順で使用するサービス アカウント 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

google_bigquery_connection リソースを使用します。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

次の例では、US リージョンに my_cloud_resource_connection という名前の Cloud リソース接続を作成します。


# This queries the provider for project information.
data "google_project" "default" {}

# This creates a cloud resource connection in the US region named my_cloud_resource_connection.
# Note: The cloud resource nested object has only one output field - serviceAccountId.
resource "google_bigquery_connection" "default" {
  connection_id = "my_cloud_resource_connection"
  project       = data.google_project.default.project_id
  location      = "US"
  cloud_resource {}
}

Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。

Cloud Shell を準備する

  1. Cloud Shell を起動します。
  2. Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。

    このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。

ディレクトリを準備する

Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。

  1. Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は .tf にする必要があります(例: main.tf)。このチュートリアルでは、このファイルを main.tf とします。
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。

    新しく作成した main.tf にサンプルコードをコピーします。

    必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。

  3. 環境に適用するサンプル パラメータを確認し、変更します。
  4. 変更を保存します。
  5. Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
    terraform init

    最新バージョンの Google プロバイダを使用する場合は、-upgrade オプションを使用します。

    terraform init -upgrade

変更を適用する

  1. 構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
    terraform plan

    必要に応じて構成を修正します。

  2. 次のコマンドを実行します。プロンプトで「yes」と入力して、Terraform 構成を適用します。
    terraform apply

    Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。

  3. Google Cloud プロジェクトを開いて結果を表示します。 Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。

サービス アカウントにアクセス権を付与する

リモートモデルが使用する接続のサービス アカウントに Vertex AI ユーザー ロールを付与する必要があります。リモートモデルを使用してオブジェクト テーブルデータからテキストを生成する場合は、オブジェクト テーブルが使用する接続のサービス アカウントにも Vertex AI ユーザー ロールを付与する必要があります。

リモートモデル接続のサービス アカウントにロールを付与する

接続のサービス アカウントに Vertex AI ユーザー ロールを付与します。

リモートモデルの作成時にエンドポイントを URL(endpoint = 'https://us-central1-aiplatform.googleapis.com/v1/projects/myproject/locations/us-central1/publishers/google/models/gemini-2.0-flash' など)として指定する場合は、URL に指定する同じプロジェクト内でこのロールを付与してください。

リモートモデルの作成時にモデル名(endpoint = 'gemini-2.0-flash' など)を使用してエンドポイントを指定する場合は、リモートモデルを作成するプロジェクト内でこのロールを付与してください。

別のプロジェクトでロールを付与すると、「bqcx-1234567890-wxyz@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. [保存] をクリックします。

gcloud

gcloud projects add-iam-policy-binding コマンドを使用します。

gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.user' --condition=None

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

  • PROJECT_NUMBER: プロジェクトの番号
  • MEMBER: 先ほどコピーしたサービス アカウント ID

オブジェクト テーブル接続のサービス アカウントにロールを付与する

リモートモデルを使用してオブジェクト テーブルデータからテキストを生成する場合は、オブジェクト テーブル接続のサービス アカウントに Vertex AI ユーザーロールを付与します。

オブジェクト テーブル接続のサービス アカウントを確認する手順は次のとおりです。

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

    [BigQuery] に移動

  2. [エクスプローラ] ペインで、オブジェクト テーブルを含むデータセットを開きます。

  3. オブジェクト テーブルを選択します。

  4. エディタペインで、[詳細] タブをクリックします。

  5. [接続 ID] フィールドの接続名をメモします。

  6. [エクスプローラ] ペインで、[外部接続] フォルダを開きます。

  7. オブジェクト テーブルの [接続 ID] フィールドの接続と一致する接続を選択します。

  8. [サービス アカウント ID] フィールドの値をコピーします。

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

コンソール

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

    [IAM と管理] に移動

  2. [追加] をクリックします。

    [プリンシパルを追加] ダイアログが開きます。

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

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

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

gcloud

gcloud projects add-iam-policy-binding コマンドを使用します。

gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.user' --condition=None

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

  • PROJECT_NUMBER: プロジェクトの番号
  • MEMBER: 先ほどコピーしたサービス アカウント ID

パートナー モデルを有効にする

このステップは、Anthropic Claude、Llama、Mistral AI モデルを使用する場合にのみ必要です。

  1. Google Cloud コンソールで、Vertex AI の [Model Garden] ページに移動します。

    Model Garden に移動

  2. 使用する Claude モデルを検索またはブラウジングします。

  3. モデルカードをクリックします。

  4. モデルページで [有効にする] をクリックします。

  5. 必要な有効化情報を記入し、[次へ] をクリックします。

  6. [利用規約] セクションで、チェックボックスをオンにします。

  7. [同意する] をクリックして利用規約に同意し、モデルを有効にします。

オープンモデルをデプロイする

サポートされているオープンモデルを使用する場合は、まずそのモデルを Vertex AI にデプロイする必要があります。詳細については、オープンモデルをデプロイするをご覧ください。

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

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

オープンモデル

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

    [BigQuery] に移動

  2. SQL エディタを使用してリモートモデルを作成します。

    CREATE OR REPLACE MODEL
    `PROJECT_ID.DATASET_ID.MODEL_NAME`
    REMOTE WITH CONNECTION {DEFAULT | `PROJECT_ID.REGION.CONNECTION_ID`}
    OPTIONS (ENDPOINT = 'https://ENDPOINT_REGION-aiplatform.googleapis.com/v1/projects/ENDPOINT_PROJECT_ID/locations/ENDPOINT_REGION/endpoints/ENDPOINT_ID');

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

    • PROJECT_ID: プロジェクト ID。
    • DATASET_ID: モデルを保存するデータセットの ID。このデータセットは、使用している接続と同じロケーションに存在する必要があります。
    • MODEL_NAME: モデルの名前。
    • REGION: 接続で使用されるリージョン。
    • CONNECTION_ID: BigQuery 接続の ID。

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

    • ENDPOINT_REGION: オープンモデルがデプロイされているリージョン。
    • ENDPOINT_PROJECT_ID: オープンモデルがデプロイされているプロジェクト。
    • ENDPOINT_ID: オープンモデルで使用される HTTPS エンドポイントの ID。エンドポイント ID は、[オンライン予測] ページでオープンモデルを探して、その [ID] フィールドの値をコピーすることで取得できます。

その他のすべてのモデル

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

    [BigQuery] に移動

  2. SQL エディタを使用してリモートモデルを作成します。

    CREATE OR REPLACE MODEL
    `PROJECT_ID.DATASET_ID.MODEL_NAME`
    REMOTE WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
    OPTIONS (ENDPOINT = 'ENDPOINT');

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

    • PROJECT_ID: プロジェクト ID。
    • DATASET_ID: モデルを保存するデータセットの ID。このデータセットは、使用している接続と同じロケーションに存在する必要があります。
    • MODEL_NAME: モデルの名前。
    • REGION: 接続で使用されるリージョン。
    • CONNECTION_ID: BigQuery 接続の ID。

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

    • ENDPOINT: 使用する Vertex AI モデルのエンドポイント。

      事前トレーニング済みの Vertex AI モデル、Claude モデル、Mistral AI モデルの場合は、モデルの名前を指定します。これらのモデルの一部では、モデルの特定のバージョンを名前の一部として指定できます。サポートされている Gemini モデルでは、グローバル エンドポイントを指定して可用性を向上させることができます。

      Llama モデルの場合は、openapi/<publisher_name>/<model_name> 形式の OpenAI API エンドポイントを指定します。例: openapi/meta/llama-3.1-405b-instruct-maas

      対応しているモデルの名前とバージョンについては、ENDPOINT をご覧ください。

      指定する Vertex AI モデルは、リモートモデルを作成するロケーションで使用できる必要があります。詳細については、ロケーションをご覧ください。

標準テーブルのデータからテキストを生成する

標準テーブルからのプロンプト データを使って、ML.GENERATE_TEXT 関数でテキストを生成します。

Gemini

SELECT *
FROM ML.GENERATE_TEXT(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  {TABLE PROJECT_ID.DATASET_ID.TABLE_NAME | (PROMPT_QUERY)},
  STRUCT(TOKENS AS max_output_tokens, TEMPERATURE AS temperature,
  TOP_P AS top_p, FLATTEN_JSON AS flatten_json_output,
  STOP_SEQUENCES AS stop_sequences,
  GROUND_WITH_GOOGLE_SEARCH AS ground_with_google_search,
  SAFETY_SETTINGS AS safety_settings,
  REQUEST_TYPE AS request_type)
);

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

  • PROJECT_ID: プロジェクト ID。
  • DATASET_ID: モデルを格納するデータセットの ID。
  • MODEL_NAME: モデルの名前。
  • TABLE_NAME: プロンプトを含むテーブルの名前。このテーブルには、prompt という名前の列が必要です。または、エイリアスを使用して別の名前の列を使用することもできます。
  • PROMPT_QUERY: プロンプト データを提供するクエリ。このクエリは、prompt という名前の列を生成する必要があります。
  • TOKENS: INT64 値。レスポンスで生成できるトークンの最大数を設定します。この値は [1,8192] の範囲内である必要があります。 レスポンスを短くしたい場合は小さい値を、長くしたい場合は大きい値を指定します。デフォルトは 128 です。
  • TEMPERATURE: FLOAT64 値。トークン選択のランダム性の度合いを制御します。[0.0,1.0] の範囲内の値にする必要があります。デフォルトは 0 です。

    temperature の値が低いほど、確定的で自由度や創造性を抑えたレスポンスが求められるプロンプトに適しています。一方、temperature の値が高いほど、より多様で創造的な結果を導くことができます。temperature0 の値は確定的であり、最も高い確率のレスポンスが常に選択されることを意味します。

  • TOP_P: FLOAT64 値。[0.0,1.0] の範囲内の値にする必要があります。これは、トークンが選択される確率を特定する際に役立ちます。ランダムな回答を減らしたい場合は小さい値を、ランダムな回答を増やしたい場合は大きい値を指定します。デフォルトは 0.95 です。
  • FLATTEN_JSON: 生成されたテキストと安全性属性を別々の列で返すかどうかを決定する BOOL 値。デフォルトは FALSE です。
  • STOP_SEQUENCES: ARRAY<STRING> 値。指定された文字列がモデルからのレスポンスに含まれている場合に、その文字列を削除します。文字列は、大文字と小文字の区別を含めて完全に一致します。デフォルトは空の配列です。
  • GROUND_WITH_GOOGLE_SEARCH: Vertex AI モデルがレスポンスを生成するときに [Google 検索によるグラウンディング](/vertex-ai/generative-ai/docs/grounding/overview#ground-public) を使用するかどうかを決定する BOOL 値。グラウンディングを使用すると、モデルは回答の生成時にインターネットから追加情報を使用できるため、モデルの回答をより具体的で事実に基づくものにできます。flatten_json_output とこのフィールドの両方が True に設定されている場合、結果に追加の ml_generate_text_grounding_result 列が含まれ、モデルが追加情報の収集に使用したソースが示されます。デフォルトは FALSE です。
  • SAFETY_SETTINGS: レスポンスのフィルタリングに使用するコンテンツ セーフティのしきい値を構成する ARRAY<STRUCT<STRING AS category, STRING AS threshold>> 値。構造体の最初の要素は有害性カテゴリを指定し、構造体の 2 番目の要素は対応するブロックのしきい値を指定します。モデルは、これらの設定に違反するコンテンツを除外します。各カテゴリを指定できるのは 1 回のみです。たとえば、STRUCT('HARM_CATEGORY_DANGEROUS_CONTENT' AS category, 'BLOCK_MEDIUM_AND_ABOVE' AS threshold)STRUCT('HARM_CATEGORY_DANGEROUS_CONTENT' AS category, 'BLOCK_ONLY_HIGH' AS threshold) の両方を指定することはできません。特定のカテゴリに安全性設定がない場合は、BLOCK_MEDIUM_AND_ABOVE 安全性設定が使用されます。 サポートされているカテゴリは次のとおりです。
    • HARM_CATEGORY_HATE_SPEECH
    • HARM_CATEGORY_DANGEROUS_CONTENT
    • HARM_CATEGORY_HARASSMENT
    • HARM_CATEGORY_SEXUALLY_EXPLICIT
    サポートされているしきい値は次のとおりです。
    • BLOCK_NONE制限付き
    • BLOCK_LOW_AND_ABOVE
    • BLOCK_MEDIUM_AND_ABOVE(デフォルト)
    • BLOCK_ONLY_HIGH
    • HARM_BLOCK_THRESHOLD_UNSPECIFIED
    詳しくは、安全性カテゴリブロックのしきい値の定義をご覧ください。
  • REQUEST_TYPE: Gemini モデルに送信する推論リクエストのタイプを指定する STRING 値。リクエストの種類によって、リクエストで使用する割り当てが決まります。有効な値は以下のとおりです。
    • DEDICATED: ML.GENERATE_TEXT 関数はプロビジョンド スループットの割り当てのみを使用します。プロビジョンド スループットの割り当てが使用できない場合、ML.GENERATE_TEXT 関数はエラー Provisioned throughput is not purchased or is not active を返します。
    • SHARED: プロビジョンド スループットの割り当てを購入している場合でも、ML.GENERATE_TEXT 関数では動的共有割り当て(DSQ)のみが使用されます。
    • UNSPECIFIED: ML.GENERATE_TEXT 関数は、次のように割り当てを使用します。
      • プロビジョンド スループットの割り当てを購入していない場合、ML.GENERATE_TEXT 関数は DSQ 割り当てを使用します。
      • プロビジョンド スループットの割り当てを購入している場合、ML.GENERATE_TEXT 関数は最初にプロビジョンド スループットの割り当てを使用します。リクエストがプロビジョンド スループットの割り当てを超えると、オーバーフロー トラフィックは DSQ 割り当てを使用します。
    • デフォルトは UNSPECIFIED です。

      詳細については、Vertex AI プロビジョニング スループットを使用するをご覧ください。

    例 1

    次の例は、これらの特性を持つリクエストを示しています。

    • articles テーブルの body 列のテキストの概要を求めます。
    • モデルからの JSON レスポンスを解析し、個別の列に分割します。
    SELECT *
    FROM
      ML.GENERATE_TEXT(
        MODEL `mydataset.text_model`,
        (
          SELECT CONCAT('Summarize this text', body) AS prompt
          FROM mydataset.articles
        ),
        STRUCT(TRUE AS flatten_json_output));

    例 2

    次の例は、これらの特性を持つリクエストを示しています。

    • クエリを使用して、プロンプトの接頭辞とテーブル列を連結する文字列を連結して、プロンプト データを作成します。
    • 短いレスポンスを返します。
    • モデルからの JSON レスポンスを解析して個別の列に分割したりはしません。
    SELECT *
    FROM
      ML.GENERATE_TEXT(
        MODEL `mydataset.text_model`,
        (
          SELECT CONCAT(question, 'Text:', description, 'Category') AS prompt
          FROM mydataset.input_table
        ),
        STRUCT(
          100 AS max_output_tokens,
          FALSE AS flatten_json_output));

    例 3

    次の例は、これらの特性を持つリクエストを示しています。

    • プロンプトに prompts テーブルの prompt 列を使用します。
    • モデルからの JSON レスポンスを解析し、個別の列に分割します。
    SELECT *
    FROM
      ML.GENERATE_TEXT(
        MODEL `mydataset.text_model`,
        TABLE mydataset.prompts,
        STRUCT(TRUE AS flatten_json_output));

    例 4

    次の例は、これらの特性を持つリクエストを示しています。

    • プロンプトに prompts テーブルの prompt 列を使用します。
    • 短いレスポンスを返します。
    • JSON レスポンスを個別の列にフラット化します。
    • レスポンスのグラウンディング用に一般公開のウェブデータを取得して返します。
    • 2 つの安全性設定を使用して、安全でないレスポンスを除外します。
    SELECT *
    FROM
      ML.GENERATE_TEXT(
        MODEL `mydataset.text_model`,
        TABLE mydataset.prompts,
        STRUCT(
          100 AS max_output_tokens, 0.5 AS top_p,
          TRUE AS flatten_json_output,
          TRUE AS ground_with_google_search,
          [STRUCT('HARM_CATEGORY_HATE_SPEECH' AS category,
            'BLOCK_LOW_AND_ABOVE' AS threshold),
          STRUCT('HARM_CATEGORY_DANGEROUS_CONTENT' AS category,
            'BLOCK_MEDIUM_AND_ABOVE' AS threshold)] AS safety_settings));

    例 5

    次の例は、これらの特性を持つリクエストを示しています。

    • プロンプトに prompts テーブルの prompt 列を使用します。
    • より長いレスポンスを返します。
    • JSON レスポンスを個別の列にフラット化します。
    SELECT *
    FROM
      ML.GENERATE_TEXT(
        MODEL `mydataset.flash_2_model`,
        TABLE mydataset.prompts,
        STRUCT(
          0.4 AS temperature, 8192 AS max_output_tokens,
          TRUE AS flatten_json_output));

    例 6

    次の例は、これらの特性を持つリクエストを示しています。

    • articles テーブルの body 列のテキストの概要を求めます。
    • JSON レスポンスを個別の列にフラット化します。
    • レスポンスのグラウンディング用に一般公開のウェブデータを取得して返します。
    • 2 つの安全性設定を使用して、安全でないレスポンスを除外します。
    SELECT *
    FROM
      ML.GENERATE_TEXT(
        MODEL `mydataset.text_model`,
        (
          SELECT CONCAT('Summarize this text', body) AS prompt
          FROM mydataset.articles
        ),
        STRUCT(
          .1 AS TEMPERATURE,
          TRUE AS flatten_json_output, TRUE AS ground_with_google_search,
          [STRUCT('HARM_CATEGORY_HATE_SPEECH' AS category,
            'BLOCK_LOW_AND_ABOVE' AS threshold),
          STRUCT('HARM_CATEGORY_DANGEROUS_CONTENT' AS category,
            'BLOCK_MEDIUM_AND_ABOVE' AS threshold)] AS safety_settings));

Claude

SELECT *
FROM ML.GENERATE_TEXT(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  {TABLE PROJECT_ID.DATASET_ID.TABLE_NAME | (PROMPT_QUERY)},
  STRUCT(TOKENS AS max_output_tokens, TOP_K AS top_k,
  TOP_P AS top_p, FLATTEN_JSON AS flatten_json_output)
);

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

  • PROJECT_ID: プロジェクト ID。
  • DATASET_ID: モデルを格納するデータセットの ID。
  • MODEL_NAME: モデルの名前。
  • TABLE_NAME: プロンプトを含むテーブルの名前。このテーブルには、prompt という名前の列が必要です。または、エイリアスを使用して別の名前の列を使用することもできます。
  • PROMPT_QUERY: プロンプト データを提供するクエリ。このクエリは、prompt という名前の列を生成する必要があります。
  • TOKENS: INT64 値。レスポンスで生成できるトークンの最大数を設定します。この値は [1,4096] の範囲内である必要があります。 レスポンスを短くしたい場合は小さい値を、長くしたい場合は大きい値を指定します。デフォルトは 128 です。
  • TOP_K: [1,40] の範囲内の INT64 値。これにより、モデルが選択を検討するトークンの初期プールが決まります。ランダムな回答を減らしたい場合は小さい値を、ランダムな回答を増やしたい場合は大きい値を指定します。値を指定しない場合、モデルは適切な値を決定します。
  • TOP_P: FLOAT64 値。[0.0,1.0] の範囲内の値にする必要があります。これは、トークンが選択される確率を特定する際に役立ちます。ランダムな回答を減らしたい場合は小さい値を、ランダムな回答を増やしたい場合は大きい値を指定します。値を指定しない場合、モデルは適切な値を決定します。
  • FLATTEN_JSON: 生成されたテキストと安全性属性を別々の列で返すかどうかを決定する BOOL 値。デフォルトは FALSE です。

例 1

次の例は、これらの特性を持つリクエストを示しています。

  • articles テーブルの body 列のテキストの概要を求めます。
  • モデルからの JSON レスポンスを解析し、個別の列に分割します。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.text_model`,
    (
      SELECT CONCAT('Summarize this text', body) AS prompt
      FROM mydataset.articles
    ),
    STRUCT(TRUE AS flatten_json_output));

例 2

次の例は、これらの特性を持つリクエストを示しています。

  • クエリを使用して、プロンプトの接頭辞とテーブル列を連結する文字列を連結して、プロンプト データを作成します。
  • 短いレスポンスを返します。
  • モデルからの JSON レスポンスを解析して個別の列に分割したりはしません。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.text_model`,
    (
      SELECT CONCAT(question, 'Text:', description, 'Category') AS prompt
      FROM mydataset.input_table
    ),
    STRUCT(
      100 AS max_output_tokens,
      FALSE AS flatten_json_output));

例 3

次の例は、これらの特性を持つリクエストを示しています。

  • プロンプトに prompts テーブルの prompt 列を使用します。
  • モデルからの JSON レスポンスを解析し、個別の列に分割します。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.text_model`,
    TABLE mydataset.prompts,
    STRUCT(TRUE AS flatten_json_output));

Llama

SELECT *
FROM ML.GENERATE_TEXT(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  {TABLE PROJECT_ID.DATASET_ID.TABLE_NAME | (PROMPT_QUERY)},
  STRUCT(TOKENS AS max_output_tokens, TEMPERATURE AS temperature,
  TOP_P AS top_p, FLATTEN_JSON AS flatten_json_output,
  STOP_SEQUENCES AS stop_sequences)
);

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

  • PROJECT_ID: プロジェクト ID。
  • DATASET_ID: モデルを格納するデータセットの ID。
  • MODEL_NAME: モデルの名前。
  • TABLE_NAME: プロンプトを含むテーブルの名前。このテーブルには、prompt という名前の列が必要です。または、エイリアスを使用して別の名前の列を使用することもできます。
  • PROMPT_QUERY: プロンプト データを提供するクエリ。このクエリは、prompt という名前の列を生成する必要があります。
  • TOKENS: INT64 値。レスポンスで生成できるトークンの最大数を設定します。この値は [1,4096] の範囲内である必要があります。 レスポンスを短くしたい場合は小さい値を、長くしたい場合は大きい値を指定します。デフォルトは 128 です。
  • TEMPERATURE: FLOAT64 値。トークン選択のランダム性の度合いを制御します。[0.0,1.0] の範囲内の値にする必要があります。デフォルトは 0 です。

    temperature の値が低いほど、確定的で自由度や創造性を抑えたレスポンスが求められるプロンプトに適しています。一方、temperature の値が高いほど、より多様で創造的な結果を導くことができます。temperature0 の値は確定的であり、最も高い確率のレスポンスが常に選択されることを意味します。

  • TOP_P: FLOAT64 値。[0.0,1.0] の範囲内の値にする必要があります。これは、トークンが選択される確率を特定する際に役立ちます。ランダムな回答を減らしたい場合は小さい値を、ランダムな回答を増やしたい場合は大きい値を指定します。デフォルトは 0.95 です。
  • FLATTEN_JSON: 生成されたテキストと安全性属性を別々の列で返すかどうかを決定する BOOL 値。デフォルトは FALSE です。
  • STOP_SEQUENCES: ARRAY<STRING> 値。指定された文字列がモデルからのレスポンスに含まれている場合に、その文字列を削除します。文字列は、大文字と小文字の区別を含めて完全に一致します。デフォルトは空の配列です。

例 1

次の例は、これらの特性を持つリクエストを示しています。

  • articles テーブルの body 列のテキストの概要を求めます。
  • モデルからの JSON レスポンスを解析し、個別の列に分割します。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.text_model`,
    (
      SELECT CONCAT('Summarize this text', body) AS prompt
      FROM mydataset.articles
    ),
    STRUCT(TRUE AS flatten_json_output));

例 2

次の例は、これらの特性を持つリクエストを示しています。

  • クエリを使用して、プロンプトの接頭辞とテーブル列を連結する文字列を連結して、プロンプト データを作成します。
  • 短いレスポンスを返します。
  • モデルからの JSON レスポンスを解析して個別の列に分割したりはしません。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.text_model`,
    (
      SELECT CONCAT(question, 'Text:', description, 'Category') AS prompt
      FROM mydataset.input_table
    ),
    STRUCT(
      100 AS max_output_tokens,
      FALSE AS flatten_json_output));

例 3

次の例は、これらの特性を持つリクエストを示しています。

  • プロンプトに prompts テーブルの prompt 列を使用します。
  • モデルからの JSON レスポンスを解析し、個別の列に分割します。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.text_model`,
    TABLE mydataset.prompts,
    STRUCT(TRUE AS flatten_json_output));

Mistral AI

SELECT *
FROM ML.GENERATE_TEXT(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  {TABLE PROJECT_ID.DATASET_ID.TABLE_NAME | (PROMPT_QUERY)},
  STRUCT(TOKENS AS max_output_tokens, TEMPERATURE AS temperature,
  TOP_P AS top_p, FLATTEN_JSON AS flatten_json_output,
  STOP_SEQUENCES AS stop_sequences)
);

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

  • PROJECT_ID: プロジェクト ID。
  • DATASET_ID: モデルを格納するデータセットの ID。
  • MODEL_NAME: モデルの名前。
  • TABLE_NAME: プロンプトを含むテーブルの名前。このテーブルには、prompt という名前の列が必要です。または、エイリアスを使用して別の名前の列を使用することもできます。
  • PROMPT_QUERY: プロンプト データを提供するクエリ。このクエリは、prompt という名前の列を生成する必要があります。
  • TOKENS: INT64 値。レスポンスで生成できるトークンの最大数を設定します。この値は [1,4096] の範囲内である必要があります。 レスポンスを短くしたい場合は小さい値を、長くしたい場合は大きい値を指定します。デフォルトは 128 です。
  • TEMPERATURE: FLOAT64 値。トークン選択のランダム性の度合いを制御します。[0.0,1.0] の範囲内の値にする必要があります。デフォルトは 0 です。

    temperature の値が低いほど、確定的で自由度や創造性を抑えたレスポンスが求められるプロンプトに適しています。一方、temperature の値が高いほど、より多様で創造的な結果を導くことができます。temperature0 の値は確定的であり、最も高い確率のレスポンスが常に選択されることを意味します。

  • TOP_P: FLOAT64 値。[0.0,1.0] の範囲内の値にする必要があります。これは、トークンが選択される確率を特定する際に役立ちます。ランダムな回答を減らしたい場合は小さい値を、ランダムな回答を増やしたい場合は大きい値を指定します。デフォルトは 0.95 です。
  • FLATTEN_JSON: 生成されたテキストと安全性属性を別々の列で返すかどうかを決定する BOOL 値。デフォルトは FALSE です。
  • STOP_SEQUENCES: ARRAY<STRING> 値。指定された文字列がモデルからのレスポンスに含まれている場合に、その文字列を削除します。文字列は、大文字と小文字の区別を含めて完全に一致します。デフォルトは空の配列です。

例 1

次の例は、これらの特性を持つリクエストを示しています。

  • articles テーブルの body 列のテキストの概要を求めます。
  • モデルからの JSON レスポンスを解析し、個別の列に分割します。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.text_model`,
    (
      SELECT CONCAT('Summarize this text', body) AS prompt
      FROM mydataset.articles
    ),
    STRUCT(TRUE AS flatten_json_output));

例 2

次の例は、これらの特性を持つリクエストを示しています。

  • クエリを使用して、プロンプトの接頭辞とテーブル列を連結する文字列を連結して、プロンプト データを作成します。
  • 短いレスポンスを返します。
  • モデルからの JSON レスポンスを解析して個別の列に分割したりはしません。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.text_model`,
    (
      SELECT CONCAT(question, 'Text:', description, 'Category') AS prompt
      FROM mydataset.input_table
    ),
    STRUCT(
      100 AS max_output_tokens,
      FALSE AS flatten_json_output));

例 3

次の例は、これらの特性を持つリクエストを示しています。

  • プロンプトに prompts テーブルの prompt 列を使用します。
  • モデルからの JSON レスポンスを解析し、個別の列に分割します。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.text_model`,
    TABLE mydataset.prompts,
    STRUCT(TRUE AS flatten_json_output));

オープンモデル

SELECT *
FROM ML.GENERATE_TEXT(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  {TABLE PROJECT_ID.DATASET_ID.TABLE_NAME | (PROMPT_QUERY)},
  STRUCT(TOKENS AS max_output_tokens,
   TEMPERATURE AS temperature, TOP_K AS top_k,
  TOP_P AS top_p, FLATTEN_JSON AS flatten_json_output)
);

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

  • PROJECT_ID: プロジェクト ID。
  • DATASET_ID: モデルを格納するデータセットの ID。
  • MODEL_NAME: モデルの名前。
  • TABLE_NAME: プロンプトを含むテーブルの名前。このテーブルには、prompt という名前の列が必要です。または、エイリアスを使用して別の名前の列を使用することもできます。
  • PROMPT_QUERY: プロンプト データを提供するクエリ。このクエリは、prompt という名前の列を生成する必要があります。
  • TOKENS: INT64 値。レスポンスで生成できるトークンの最大数を設定します。この値は [1,4096] の範囲内である必要があります。 レスポンスを短くしたい場合は小さい値を、長くしたい場合は大きい値を指定します。 値を指定しない場合、モデルは適切な値を決定します。
  • TEMPERATURE: FLOAT64 値。トークン選択のランダム性の度合いを制御します。[0.0,1.0] の範囲内の値にする必要があります。 値を指定しない場合、モデルは適切な値を決定します。

    temperature の値が低いほど、確定的で自由度や創造性を抑えたレスポンスが求められるプロンプトに適しています。一方、temperature の値が高いほど、より多様で創造的な結果を導くことができます。temperature0 の値は確定的であり、最も高い確率のレスポンスが常に選択されることを意味します。

  • TOP_K: [1,40] の範囲内の INT64 値。これにより、モデルが選択を検討するトークンの初期プールが決まります。ランダムな回答を減らしたい場合は小さい値を、ランダムな回答を増やしたい場合は大きい値を指定します。値を指定しない場合、モデルは適切な値を決定します。
  • TOP_P: FLOAT64 値。[0.0,1.0] の範囲内の値にする必要があります。これは、トークンが選択される確率を特定する際に役立ちます。ランダムな回答を減らしたい場合は小さい値を、ランダムな回答を増やしたい場合は大きい値を指定します。値を指定しない場合、モデルは適切な値を決定します。
  • FLATTEN_JSON: 生成されたテキストと安全性属性を別々の列で返すかどうかを決定する BOOL 値。デフォルトは FALSE です。

例 1

次の例は、これらの特性を持つリクエストを示しています。

  • articles テーブルの body 列のテキストの概要を求めます。
  • モデルからの JSON レスポンスを解析し、個別の列に分割します。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.text_model`,
    (
      SELECT CONCAT('Summarize this text', body) AS prompt
      FROM mydataset.articles
    ),
    STRUCT(TRUE AS flatten_json_output));

例 2

次の例は、これらの特性を持つリクエストを示しています。

  • クエリを使用して、プロンプトの接頭辞とテーブル列を連結する文字列を連結して、プロンプト データを作成します。
  • 短いレスポンスを返します。
  • モデルからの JSON レスポンスを解析して個別の列に分割したりはしません。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.text_model`,
    (
      SELECT CONCAT(question, 'Text:', description, 'Category') AS prompt
      FROM mydataset.input_table
    ),
    STRUCT(
      100 AS max_output_tokens,
      FALSE AS flatten_json_output));

例 3

次の例は、これらの特性を持つリクエストを示しています。

  • プロンプトに prompts テーブルの prompt 列を使用します。
  • モデルからの JSON レスポンスを解析し、個別の列に分割します。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.text_model`,
    TABLE mydataset.prompts,
    STRUCT(TRUE AS flatten_json_output));

オブジェクト テーブルのデータからテキストを生成する

Gemini モデルで ML.GENERATE_TEXT 関数を使用して、オブジェクト テーブルの非構造化データを分析します。プロンプト データは prompt パラメータで指定します。

SELECT *
FROM ML.GENERATE_TEXT(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  TABLE PROJECT_ID.DATASET_ID.TABLE_NAME,
  STRUCT(PROMPT AS prompt, TOKENS AS max_output_tokens,
  TEMPERATURE AS temperature, TOP_P AS top_p,
  FLATTEN_JSON AS flatten_json_output,
  STOP_SEQUENCES AS stop_sequences,
  SAFETY_SETTINGS AS safety_settings)
);

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

  • PROJECT_ID: プロジェクト ID。
  • DATASET_ID: モデルを格納するデータセットの ID。
  • MODEL_NAME: モデルの名前。これは Gemini モデルである必要があります。
  • TABLE_NAME: 分析するコンテンツを含むオブジェクト テーブルの名前。分析できるコンテンツの種類の詳細については、入力をご覧ください。

    オブジェクト テーブルで使用される Cloud Storage バケットは、モデルを作成し、ML.GENERATE_TEXT 関数を呼び出すプロジェクトに含まれている必要があります。オブジェクト テーブルで使用される Cloud Storage バケットを含むプロジェクトとは異なるプロジェクトで ML.GENERATE_TEXT 関数を呼び出す場合は、service-A@gcp-sa-aiplatform.iam.gserviceaccount.com サービス アカウントにバケットレベルでストレージ管理者ロールを付与する必要があります。

  • PROMPT: コンテンツの分析に使用するプロンプト。
  • TOKENS: INT64 値。レスポンスで生成できるトークンの最大数を設定します。この値は [1,4096] の範囲内である必要があります。 レスポンスを短くしたい場合は小さい値を、長くしたい場合は大きい値を指定します。 値を指定しない場合、モデルは適切な値を決定します。
  • TEMPERATURE: FLOAT64 値。トークン選択のランダム性の度合いを制御します。[0.0,1.0] の範囲内の値にする必要があります。 値を指定しない場合、モデルは適切な値を決定します。

    temperature の値が低いほど、確定的で自由度や創造性を抑えたレスポンスが求められるプロンプトに適しています。一方、temperature の値が高いほど、より多様で創造的な結果を導くことができます。temperature0 の値は確定的であり、最も高い確率のレスポンスが常に選択されることを意味します。

  • TOP_K: [1,40] の範囲内の INT64 値。これにより、モデルが選択を検討するトークンの初期プールが決まります。ランダムな回答を減らしたい場合は小さい値を、ランダムな回答を増やしたい場合は大きい値を指定します。値を指定しない場合、モデルは適切な値を決定します。
  • TOP_P: FLOAT64 値。[0.0,1.0] の範囲内の値にする必要があります。これは、トークンが選択される確率を特定する際に役立ちます。ランダムな回答を減らしたい場合は小さい値を、ランダムな回答を増やしたい場合は大きい値を指定します。値を指定しない場合、モデルは適切な値を決定します。
  • FLATTEN_JSON: 生成されたテキストと安全性属性を別々の列で返すかどうかを決定する BOOL 値。デフォルトは FALSE です。

この例では、feedback という名前のオブジェクト テーブルから音声コンテンツを翻訳して音声文字変換します。

SELECT * FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.audio_model`,
    TABLE `mydataset.feedback`,
      STRUCT('What is the content of this audio clip, translated into Spanish?' AS PROMPT,
      TRUE AS FLATTEN_JSON_OUTPUT));

この例では、invoices という名前のオブジェクト テーブルから PDF コンテンツを分類します。

SELECT * FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.classify_model`,
    TABLE `mydataset.invoices`,
      STRUCT('Classify this document based on the invoice total, using the following categories: 0 to 100, 101 to 200, greater than 200' AS PROMPT,
      TRUE AS FLATTEN_JSON_OUTPUT));