ML.GENERATE_TEXT 関数

このドキュメントでは、BigQuery テーブルに保存されているテキストに対して自然言語生成タスクを実行できる ML.GENERATE_TEXT 関数について説明します。言語タスクの例としては、次のものがあります。

  • 分類
  • 感情分析
  • エンティティの抽出
  • 抽出型の質問応答
  • 要約
  • 異なるスタイルでのテキストの書き換え
  • 広告コピーの生成
  • コンセプトのアイディエーション

この関数は、Vertex AI text-bison* 自然言語基盤モデルの 1 つを表す BigQuery ML リモートモデルにリクエストを送信します。LLM から出力された後、LLM のレスポンスを返します。関数の複数の引数は、LLM のレスポンスを形成するパラメータを提供します。

prompt パラメータには、モデルが分析するテキストを指定します。プロンプトの設計は、モデルが返すレスポンスに強く影響する可能性があります。詳細については、テキスト プロンプトを設計するをご覧ください。

構文

ML.GENERATE_TEXT(
MODEL `project_id.dataset.model`,
{ TABLE `project_id.dataset.table` | (query_statement) },
STRUCT(
  [number_of_output_tokens AS max_output_tokens]
  [, top_k_value AS top_k]
  [, top_p_value AS top_p]
  [, temperature AS temperature]
  [, flatten_json_output AS flatten_json_output])
)

引数

ML.GENERATE_TEXT は次の引数を取ります。

  • project_id: プロジェクト ID。

  • dataset: モデルを含む BigQuery データセット。

  • model: text-bison* Vertex AI LLM のいずれかを使用するリモートモデルの名前。このタイプのリモートモデルの作成方法については、ENDPOINT をご覧ください。

  • table: プロンプト データを含む BigQuery テーブルの名前。prompt という名前の列のテキストがモデルに送信されます。テーブルに prompt 列がない場合は、この引数に SELECT ステートメントを使用して、既存のテーブル列のエイリアスを指定します。使用可能な prompt 列がない場合は、エラーが発生します。

  • query_statement : プロンプト データの生成に使用される GoogleSQL クエリ。

  • max_output_tokens: モデルが出力するトークンの最大数を設定する [1,1024] の範囲内の INT64 値。レスポンスを短くしたい場合は小さい値を、長くしたい場合は大きい値を指定します。デフォルトは 50 です。

    トークンは 1 単語より小さく、4 文字程度です。100 トークンは約 60~80 語に対応します。

  • temperature: [0.0,1.0] の範囲内の FLOAT64 値で、レスポンス生成中のサンプリングに使用されます。これは、top_ktop_p が適用された場合に発生します。トークン選択のランダム性の度合いを制御します。temperature の値が低いほど、確定的で自由度や創造性を抑えたレスポンスが求められるプロンプトに適しています。一方、temperature の値が高いほど、より多様で創造的な結果を導くことができます。temperature 値の 0 は確定的であり、最も高い確率のレスポンスが常に選択されることを意味します。デフォルトは 1.0 です。

  • top_k: [1,40] の範囲内の INT64 値です。これにより、モデルが出力用にトークンを選択する方法を変更します。ランダムなレスポンスを減らしたい場合は小さい値を、ランダムなレスポンスを増やしたい場合は大きい値を指定します。デフォルトは 40 です。

    top_k 値が 1 の場合は、モデルの語彙内のすべてのトークンの中で、次に選択されるトークンが最も可能性が高いことを意味します。top_k 値が 3 の場合は、temperature 値を使用して最も可能性が高い 3 つのトークンの中から次のトークンが選択されます。

    トークン選択ステップごとに、確率が最も高い top_k トークンがサンプリングされます。次に、top_p 値に基づいてトークンがさらにフィルタされ、温度サンプリングを使用して最終的なトークンが選択されます。

  • top_p: [0.0,1.0] の範囲内の FLOAT64 値です。これにより、モデルが出力用にトークンを選択する方法を変更します。ランダムなレスポンスを減らしたい場合は小さい値を、ランダムなレスポンスを増やしたい場合は大きい値を指定します。デフォルトは 1.0 です。

    トークンは、確率の合計が top_p 値と等しくなるまで、(top_k 値に基づいて)最も確率の高いものから選択されます。たとえば、トークン A、B、C の確率が 0.30.20.1 で、top_p 値が 0.5 の場合、モデルは temperature 値を使用して A または B を次のトークンとして選択し、C を候補から外します。

  • flatten_json_output: 関数から返された JSON コンテンツを別の列に解析するかどうかを決定する BOOL 値です。デフォルトは FALSE です。

出力

ML.GENERATE_TEXT は、入力テーブルと次の列を返します。

  • ml_generate_text_result: モデルへの projects.locations.endpoints.predict 呼び出しからの JSON レスポンス。生成されたテキストは content 要素に格納されます。安全性属性safetyAttributes 要素に格納されます。この列は、flatten_json_outputFALSE の場合に返されます。
  • ml_generate_text_llm_result: モデルへの projects.locations.endpoints.predict 呼び出しによって返される生成テキストを含む STRING 値。この列は、flatten_json_outputTRUE の場合に返されます。
  • ml_generate_text_rai_result: モデルへの projects.locations.endpoints.predict 呼び出しによって返される安全性属性を含む STRING 値。この列は、flatten_json_outputTRUE の場合に返されます。
  • ml_generate_text_status: 対応する行の API レスポンス ステータスを含む STRING 値。オペレーションが成功した場合、この値は空になります。

ロケーション

ML.GENERATE_TEXT は、関数が参照するリモートモデルと同じリージョンで実行する必要があります。リモートモデルは、次のロケーションtext-bison* モデルに基づいてのみ作成できます。

  • asia-northeast3
  • asia-southeast1
  • eu
  • europe-west1
  • europe-west2
  • europe-west3
  • europe-west4
  • europe-west9
  • us
  • us-central1
  • us-west4

割り当て

Cloud AI サービスのテーブル値関数の割り当てと上限をご覧ください。

例 1

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

  • 単一のプロンプトを提供します。
  • 候補の中でより長い生成テキストをレスポンスとして返します。
  • 候補の中でより確率の低い生成テキストをレスポンスとして返します。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.llm_model`,
    (SELECT 'What is the purpose of dreams?' AS prompt),
    STRUCT(
      0.8 AS temperature,
      1024 AS max_output_tokens,
      0.95 AS top_p,
      40 AS top_k));

例 2

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

  • prompt という名前のテーブル列からプロンプト データを提供します。
  • 候補の中でより短い生成テキストをレスポンスとして返します。
  • 候補の中でより確率の高い生成テキストをレスポンスとして返します。
  • JSON レスポンスを個別の列にフラット化します。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL
      `mydataset.llm_model`
        TABLE `mydataset.prompt_table`,
    STRUCT(
      0.2 AS temperature, 75 AS max_output_tokens, 0.3 AS top_p, 15 AS top_k, TRUE AS flatten_json_output));

例 3

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

  • prompt というエイリアスを持つ question という名前のテーブル列からプロンプト データを提供します。
  • 候補の中でやや長い生成テキストをレスポンスとして返します。
  • 候補の中で中程度の確率の生成テキストをレスポンスとして返します。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.llm_model`,
    (SELECT question AS prompt FROM `mydataset.prompt_table`),
    STRUCT(
      0.4 AS temperature, 750 AS max_output_tokens, 0.5 AS top_p, 30 AS top_k));

例 4

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

  • 文字列とテーブルの列を連結して、プロンプト データを提供します。
  • 候補の中でより長い生成テキストをレスポンスとして返します。
  • 候補の中でより確率の高い生成テキストをレスポンスとして返します。
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.llm_model`,
    (
      SELECT
        CONCAT(
          'Classify the sentiment of the following text as positive or negative.Text:',
          input_column,
          'Sentiment:') AS prompt
      FROM `mydataset.input_table`
    ),
    STRUCT(
      0.1 AS temperature,
      1000 AS max_output_tokens,
      0.1 AS top_p,
      10 AS top_k));

次のステップ