BigQueryからML.GENERATE_TEXT関数を使ってtext-bisonによる日本語のテキスト生成と感情分析をしてみる

BigQueryからML.GENERATE_TEXT関数を使い、text-bisonによる日本語のテキスト生成と感情分析を実行する流れを確認します。
2023.09.24

データアナリティクス事業本部 機械学習チームの鈴木です。

BigQueryからML.GENERATE_TEXT関数を使ってtext-bisonによるテキスト生成と感情分析を試してみるための環境準備と、簡単なサンプルの実行をしてみたのでご共有します。

本記事の内容

以下のチュートリアルを参考に、BigQueryからML.GENERATE_TEXT関数を使ってtext-bisonによる日本語のテキスト生成を実行する流れについて確認します。

BigQueryではML.GENERATE_TEXT関数を使ってtext-bisonを利用でき、PaLM2の日本語対応と共に既に一般提供開始となっております。

料金面での注意事項

Vertex AIにおける生成AIサポートの料金では、記事執筆時点でtext-bisonは入力・出力共に文字数に対して課金(1000文字あたり$0.0010)が発生します。個人的には、BigQueryから既にあるテーブルのデータを使うときは、最初はLIMIT句などでレコード数を少なめにして動作検証していき、要件に適していることが確認できれば、リクエストするテキストのレコード数は見積もった上で利用されるとよいかなと思います。

料金についての詳細は以下のガイドをご確認下さい。

text-bison利用のための準備

BigQueryからは、ML.GENERATE_TEXT関数を使って利用できますが、そのために必要だった接続などの準備について説明します。

1. 接続の追加

まずVertex AIのtext-bisonを利用するために接続を作成しました。

BigQueryのコンソールより外部データソースへの接続を押しました。

外部データソースへの接続

今回初めてだったためBigQuery Connection APIを有効にするのポップアップが表示されたので、APIを有効にするを押しました。

BigQuery Connection APIを有効にする

接続タイプはBigLakeとリモート関数(クラウドリソース)を選び、text-bisonをサポートしているロケーションとしてUSを選択しました。

外部データソースの詳細

作成された接続は、外部接続の下から確認できます。赤枠のサービスアカウントIDは次のステップで使用するので覚えておきます。

作成した外部接続

2. サービスアカウントへの権限付与

先に言及した、赤枠のサービスアカウントにtext-bisonを利用するためのロールを付与しました。

IAMからアクセス権を付与を押しました。

IAMでの操作1

新しいプリンシパルとして先ほどの赤枠のサービスアカウントIDを入力し、Vertex AIユーザーのロールを割り当てて保存しました。

IAMでの操作2

3. モデルの作成

以下のSQLを実行して、モデルを作成しました。データセットはあらかじめUSロケーションに空のbqml_llmデータセットを新規作成しておきました。

CREATE OR REPLACE MODEL bqml_llm.llm_model
  REMOTE WITH CONNECTION `us.generate_text_connection`
  OPTIONS (remote_service_type = 'CLOUD_AI_LARGE_LANGUAGE_MODEL_V1');

以下のようにモデルが作成されました。

作成されたモデル

ここまでで、BigQueryからtext-bisonを利用するための準備は完了です。

text-bisonの利用

早速text-bisonを使った動作確認をしてみました。今回は簡単な例ですが、日本語を入力とした単純なテキスト生成と、感情分析を行なってみました。

1. 単純なテキスト生成

まずは疎通確認を兼ねて簡単な例を試してみました。こんにちは、一言でお返事をください。というプロンプトでリクエストを送ってみて、どのようなテキストが生成されるのかを確認しました。

SELECT
  ml_generate_text_result['predictions'][0]['content'] AS generated_text,
  ml_generate_text_result['predictions'][0]['safetyAttributes']
    AS safety_attributes,
  * EXCEPT (ml_generate_text_result)
FROM
  ML.GENERATE_TEXT(
    MODEL `bqml_llm.llm_model`,
    (
      SELECT 'こんにちは、一言でお返事をください。' AS prompt
    ),
    STRUCT(
      0.2 AS temperature,
      100 AS max_output_tokens));

テキスト生成の結果

こんにちは!と返ってきました。簡単な生成例ですが、日本語でもプロンプトに対応した内容を生成してくれていることが伺えます。

2. 感情分析

次に、感情分析の例を試してみます。例えば、BigQueryに感情分析を行いたいテキストを保持したデータマートがあるとして、そのテキストをtext-bisonで感情分析するというようなユースケースを想定しました。

以下の2文について試してみました。

  • 今年は猛暑で毎日たまらなく暑かったですが、ようやく過ごしやすい気温になってくれて快適です。やったあ。
  • 今年は猛暑で毎日たまらなく暑かったので、大変でした。

一つ目の方は、ここ数日でやっと涼しくなったので嬉しいな〜と思い書いてみました。二つ目の方は、かなり長い間猛暑が続いたので大変だったなぁというどちらかというと後ろ向きな気持ちで書いてみました。

2例しかないのですが、前者はポジティブ、後者はネガティブと分析してくれれば、なんとなく動作がよさそうと言ってよいのではと思います。

以下のSQLで感情分析を実行してみました。プロンプトでperform sentiment analysis on the following text, return one the following categories: positive, negative:という文を頭にくっつけて、text-bisonに問い合わせをしました。これはチュートリアルを参考にしています。

WITH sample_texts AS (
  SELECT '今年は猛暑で毎日たまらなく暑かったですが、ようやく過ごしやすい気温になってくれて快適です。やったあ。' AS sample_text
  UNION ALL
  SELECT '今年は猛暑で毎日たまらなく暑かったので、大変でした。' AS sample_text
)
SELECT
  ml_generate_text_result['predictions'][0]['content'] AS generated_text,
  ml_generate_text_result['predictions'][0]['safetyAttributes']
    AS safety_attributes,
  * EXCEPT (ml_generate_text_result)
FROM
  ML.GENERATE_TEXT(
    MODEL `bqml_llm.llm_model`,
    (
      SELECT
        CONCAT('perform sentiment analysis on the following text, return one the following categories: positive, negative: ', sample_text) AS prompt
      FROM sample_texts
    ),
    STRUCT(
      0.2 AS temperature,
      100 AS max_output_tokens));

感情分析の結果

結果としては、書いた意図にあった感情を返してくれました。実際にシステムに組み込む場合は、より多くのテキストで意図通り分析をしてくれているか確認する必要はありますが、今回の例を通して適切に感情の分類を返してくれていそうなことが伺えます。

感情分析については、例えば英語ではGoogle Cloud Next '23のセッションでも感情分析の例は紹介されていました。これらの事例を参考にしつつ、自身のデータで動かしてみて判断するとよさそうです。

最後に

この記事では簡単な例を通して、BigQueryからML.GENERATE_TEXT関数を使い、text-bisonによるテキスト生成と感情分析を実行する流れを確認しました。

今回はSQLでダミーのデータを作ってtext-bisonで処理してみましたが、同様にBigQueryにあるデータを直接使ってSQLだけでテキスト生成や感情分析が完結することが分かり、とても便利だと思います。また、日本語に対応していることもとても大きなポイントです。