はじめに
こんにちは!
データエンジニアの森下です。今回はBigQuery MLからGeminiを使用したフリーテキストの分類についてお話しようと思います。BigQuery ML を業務で使うのは初めてでしたが、思ったより簡単に SQL から LLM を呼び出すことができ、業務への応用がしやすくなったと感じています。
BigQueryMLの概要
BigQuery MLは、Google CloudのBigQuery上で、SQLを使って機械学習モデルを直接作成・実行できる機能です。
通常、機械学習モデルの構築にはPythonを使って実装することが多いですが、BigQuery MLはデータアナリストをはじめとするSQLユーザーが、その延長線上で高度な予測分析を手軽に行うことを可能にします。
最大の特長は、分析対象のデータをBigQueryから移動させる必要がない点です。これにより、開発プロセスが大幅に高速化されるだけでなく、セキュリティも担保されます。CREATE MODELというSQL文を実行するだけで、顧客の購入予測(分類)、売上予測(回帰)、顧客セグメンテーション(クラスタリング)といったモデルを簡単に構築できます。ただし、よくある線形回帰や分類タスクは得意ですが、少しチューニングが必要なものについては、VertexAIなどを用いて個別にモデルを構築するほうがよいかと思います。
近年では、Vertex AIのLLMを呼び出すML.GENERATE_TEXT関数も登場し、文章の要約やキャッチコピーの生成といったタスクもSQLだけで完結できるようになりました。専門家でなくてもAI/MLの恩恵を受けられるようにする、データ活用の民主化を力強く推進するサービスです。
今回のテキスト分類について
弊社で保有しているITエンジニアの求人情報から、職種のカテゴライズを行います。この領域では、職種の数が数十以上になる上に、企業ごとに微妙に職種表現が異なるため、今回はそれらを一定の粒度でまとめることが目的となります。具体的には、異なる職種だが大きなカテゴリでまとめたい場合、似たような職種を1つのカテゴリに分類したい場合に、今回のタスクは有用になります。例は以下です。
- 大きなカテゴリで1つの職種にまとめる
- SRE、ネットワークエンジニア、DBエンジニアをインフラエンジニアにまとめたい場合
- 似たような職種1つにまとめる
- サーバーサイドエンジニアとバックエンドエンジニアを1つにまとめる
インプットとアウトプットは以下になります
- インプット
- 業務内容
- 必須要件
- 歓迎要件
- アウトプット
- プロンプトで指定する職種カテゴリ
具体的な実装
BQMLからGeminiを使えるようにする
公式ドキュメントはこちらです
権限さえあれば、以下のようなSQLを流して完了です。楽でよいですね
CREATE OR REPLACE MODEL `bqml_tutorial.gemini_model` REMOTE WITH CONNECTION DEFAULT OPTIONS (ENDPOINT = 'gemini-2.0-flash');
求人情報から職種を推定する
こんな感じのサンプルコードで動きます。Googleのサンプルコードの100倍ぐらいの長さのプロンプトを入れてますが、特に不自由なく動きました。
select 句で使用されている ml_generate_text_result にはjsonで実行結果が格納されています。推定した職種カテゴリーだけでなく、使用したトークン数、使用したモデルなども記載されています。実務で使用する際には、ml_generate_text_result['candidates'][0]['content'] でGeminiの出力結果を引っ張り出す必要があります。
ML.GENERATE_TEXT の詳細はこちらに記載があります。
SELECT
ml_generate_text_result
FROM
ML.GENERATE_TEXT(
MODEL `bqml_tutorial.gemini_model`,
(
SELECT
concat(
'以下の職務内容と求めるスキルに基づいて、最も適切な職種カテゴリーを以下のリストから一つだけ選んでください。',
'\n\n職種カテゴリーリスト:',
'\n- 汎用機SE',
'\n- web/オープンSE',
~~~~ 中略 ~~~~
'\n- その他it',
'\n\n職務内容: ',job.job_description_for_ml,
'\n\n求めるスキル: ',job.demand_skill_for_ml,
'\n\n予測される職種カテゴリー:'
) as prompt
FROM
data.jobs
LIMIT 5
),
STRUCT(
0.2 AS temperature,
100 AS max_output_tokens));
実行結果
このように、職務内容から指定した職種の中で何が適切かを判断してくれます。

注意事項
LLMにカテゴリ分類させているので、BigQueryMLの実行ごとに出力されるカテゴリが異なる可能性があります。使用用途に合わせて、LLMの回答をどこまで揺らぎを持ったものにするかを決定する temperature のパラメーターを調整する必要があります。
BigQueryで大量データを扱うときと同じですが、クエリ実行自体は動いてしまうので、意図しない大量課金は要注意です。BigQuery Editionsでのスロット管理等々が必要になるかと思います
最後に
LLMの台頭により、コーディングでもテキスト生成でも業務に革命が起きています。SQLを書くだけでGeminiを呼び出せる事によって、今まであまり活用しきれてなかったフリーテキストについても分析や業務効率化に繋がる施策を行うことができます。
非構造化データとして、音声データの分析を行う際に、まず音声文字起こし結果をフリーテキストとして保持しておく、というケースは今後もよくあるかと思います。
そういった場合、大量のフリーテキストを扱うのはなかなか大変でしたが、BigQuery MLを用いることで、適切にプロンプトチューニングを行えば、BigQueryのマシンパワーを使うことができ、大量のデータを素早くさばくことができます。
BigQuery ML自体は数年前からある機能ですが、LLMを使用できるようになったことで、より利用用途の幅が広がったのではないかと思います。
この記事が大量のフリーテキストデータと戦うデータエンジニアやデータアナリストの助けになれば幸いです。
We are hiring!
50以上のサービスを持つレバレジーズで、大量データを扱ったデータエンジニアリングに興味がある方はぜひご応募ください!