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

このドキュメントでは、Vertex AI の自然言語基盤モデルを参照する BigQuery ML リモートモデルを作成する方法について説明します。このモデルを ML.GENERATE_TEXT 関数と組み合わせて使用すると、BigQuery テーブルのテキストを分析できます。

必要な権限

  • 接続を作成するには、次の Identity and Access Management(IAM)ロールのメンバーシップが必要です。

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

    • resourcemanager.projects.setIamPolicy
  • BigQuery ML を使用してモデルを作成するには、次の IAM 権限が必要です。

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

    • テーブルに対する bigquery.tables.getData
    • モデルに対する bigquery.models.getData
    • bigquery.jobs.create

始める前に

  1. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  2. Google Cloud プロジェクトで課金が有効になっていることを確認します

  3. BigQuery, BigQuery Connection, and Vertex AI API を有効にします。

    API を有効にする

接続を作成する

クラウド リソース接続を作成し、接続のサービス アカウントを取得します。

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

コンソール

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

    [BigQuery] に移動

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

  3. [接続タイプ] リストで、[BigLake とリモート関数(クラウド リソース)] を選択します。

  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 {}
}        
次のように置き換えます。

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

接続の使用権限をサービス アカウントに付与します。権限を付与しないと、エラーが発生します。次のオプションのいずれかを選択します。

コンソール

  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

モデルを作成する

  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: 使用するテキストの LLM。例: ENDPOINT='text-bison-32k'

      モデル名に @version を追加すると、モデルの特定のバージョンを指定できます。例: text-bison@001。バージョンを指定しない場合は、モデルの最新バージョンが使用されます。

テキストを生成する

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

プロンプト列

テーブルの列を使用してプロンプトを入力することで、テキストを生成します。

SELECT *
FROM ML.GENERATE_TEXT(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  TABLE PROJECT_ID.DATASET_ID.TABLE_NAME,
  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 という名前のテーブルが必要です。または、エイリアスを使用して別の名前の列を使用することもできます。
  • TOKENS: モデルによって出力されるトークンの最大数を設定する [1,1024] の範囲内の INT64 値。レスポンスを短くしたい場合は小さい値を、長くしたい場合は大きい値を指定します。デフォルトは 50 です。
  • TEMPERATURE: トークン選択のランダム性の度合いを制御する [0.0,1.0] の範囲内の FLOAT64 値。デフォルトは 1.0 です。

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

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

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

  • プロンプトに prompts テーブルの prompt 列を使用します。
  • 短く、中程度の確率のレスポンスを返します。
  • 生成されたテキストと安全性属性を別々の列で返します。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.llm_model`,
    TABLE mydataset.prompts,
    STRUCT(
      0.4 AS temperature, 100 AS max_output_tokens, 0.5 AS top_p,
      40 AS top_k, TRUE AS flatten_json_output));

プロンプト クエリ

クエリを使用してプロンプトを入力することでテキストを生成します。

SELECT *
FROM ML.GENERATE_TEXT(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_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: モデルの名前。
  • PROMPT_QUERY: プロンプト データを提供するクエリ。
  • TOKENS: モデルによって出力されるトークンの最大数を設定する [1,1024] の範囲内の INT64 値。レスポンスを短くしたい場合は小さい値を、長くしたい場合は大きい値を指定します。デフォルトは 50 です。
  • TEMPERATURE: トークン選択のランダム性の度合いを制御する [0.0,1.0] の範囲内の FLOAT64 値。デフォルトは 1.0 です。

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

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

例 1

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

  • articles テーブルの body 列のテキストの概要を求めます。
  • やや長く、より高確率のレスポンスを返します。
  • 生成されたテキストと安全性属性を別々の列で返します。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.llm_model`,
    (
      SELECT CONCAT('Summarize this text', body) AS prompt
      FROM mydataset.articles
    ),
    STRUCT(
      0.2 AS temperature, 650 AS max_output_tokens, 0.2 AS top_p,
      15 AS top_k, TRUE AS flatten_json_output));

例 2

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

  • クエリを使用して、プロンプトの接頭辞とテーブル列を連結する文字列を連結して、プロンプト データを作成します。
  • 短く、中程度の確率のレスポンスを返します。
  • 生成されたテキストと安全性属性を別々の列で返しません。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.llm_model`,
    (
      SELECT CONCAT(question, 'Text:', description, 'Category') AS prompt
      FROM mydataset.input_table
    ),
    STRUCT(
      0.4 AS temperature, 100 AS max_output_tokens, 0.5 AS top_p,
      30 AS top_k, FALSE AS flatten_json_output));