🌟

Dataform での Gemini によるコード生成機能を試してみました

2024/07/01に公開

はじめに

こんにちは、クラウドエース データソリューション部の田中です。

クラウドエース データソリューション部 について

クラウドエースの IT エンジニアリングを担う システム開発統括部 の中で、特にデータ基盤構築・分析基盤構築からデータ分析までを含む一貫したデータ課題の解決を専門とするのが データソリューション部 です。
弊社では、新たに仲間に加わってくださる方を募集しています。もし、ご興味があれば エントリー をお待ちしております!

データソリューション部では、Google Cloud が提供しているデータ領域のプロダクトについて、新規リリースをキャッチアップするための調査報告会を毎週実施しています。
新規リリースの中でも、特に重要と考えるリリースを記事としてまとめ、本ページのように公開しています。

今回紹介するリリースは、2024 年 5 月 10 日にリリースされた「Dataform にて Gemini がコーディングを助けてくれるようになりました」というものです。
該当リリースはこちらからご覧ください。
これにより、Dataform を用いたデータパイプラインの作成時に、生成 AI の力を借りることができます。

Dataform とは

Dataform は BigQuery でデータ変換などを行うデータパイプラインの開発・バージョン管理・テストといったことができるサービスです。
BigQuery 上で動作する SQL と JavaScript を使ってデータパイプラインを構築することができます。

例えば、現時点で以下のようなことができます。

  • BigQuery に対して発行する SQL を記述する
  • それらを順序立てて実行するワークフローを作成する
  • 作成したワークフローの中で、入ってくるデータに対してテストを実行する
  • 作成した SQL やワークフローのバージョンを管理する

詳しくはこちらの公式ドキュメントも併せてご確認ください。

Gemini とは

Gemini は Google の開発した生成 AI であり、Google Cloud にもさまざまなところで組み込まれています。
Google Cloud に統合された Gemini について、詳しくはこちらもご覧ください。

今回のリリースについて

改めて、今回のリリースについてご紹介します。

できるようになったこと

Dataform のクエリエディターにて、「Help me code」というボタンが追加されました。

画面のスクリーンショット
赤枠で囲まれた部分のボタンです

これをクリックした後の画面でプロンプトを入力することで、Gemini が SQL を生成してくれるようになりました。

同種の機能はすでに BigQuery Studio からでも利用可能でしたが、それが Dataform でも利用可能になったイメージです。

制限

この記事を執筆した 2024 年 6 月 27 日の時点では、英語によるプロンプトのみ対応しています。

料金

ドキュメントにはこの機能(Gemini in BigQuery) について、料金の話が書かれていません。
また、Dataform や BigQuery、Gemini for Google Cloud の料金に関するページを確認しましたが、そのどれにもこの機能に関する記述は見つけられませんでした。
ただ私が今回検証に使用した Google Cloud プロジェクト課金額を確認した限りでは、この機能に関する課金は発生していないようでした。
こちらの機能は、現時点では無料で利用できると言えそうです。
また、Dataform 自体は無料で利用できます。

ただし、BigQuery におけるクエリ実行など、Dataform 外に存在するリソースを Dataform から利用する場合は、そのリソースの料金体系に従って料金が発生します。
BigQuery の料金体系については、こちらの公式ドキュメントをご覧ください。

やってみた

では、実際にこの機能を使って SQL を書いてもらいましょう。少し下準備が必要なので、それを行ってから実際に SQL を生成してもらうところに進みます。

準備

準備としては、API の有効化とデータの用意の 2 つを行っていきます。

Dataform において Gemini を有効化する手順

まず、Google Cloud 上の BigQuery、Dataform の API を有効化します。
すでに有効化しているものがあれば、スキップで問題ありません。

今回は新規にプロジェクトを用意したので、最初に BigQuery API の有効化から行っていきます。
Google Cloud の Web コンソールから BigQuery のページに移動し、下記画像の ENABLE をクリックします。

BigQuery API の有効化画面

Dataform の API も同様に Dataform のページに移動し、Web コンソールから有効化していきます。

Dataform API の有効化画面

次に、Gemini in BigQuery を有効にする必要があります。

まず、Gemini in BigQuery をまだ有効にしていない場合、こちらの Google フォームから、プレビューへの参加を申し込む必要があります。
こちらの公式ドキュメントにもあるように、この作業は Google Cloud プロジェクトの管理者が行うことをおすすめします。

週単位で機能の有効化処理などが行われるようですので、申し込んでから数日待つことになるかもしれません。
申込みが受理されたら通知が来るとのことです。

なお、今回の記事作成にあたっては実は Google フォームからの申し込みをしていません。
というのも、新たにプロジェクトを作った時点ですでに次の手順に進めるようになっていたためです。
これがなぜなのかはわかりませんが、この申し込みが(Google Cloud 上の)組織単位であり、私の所属するクラウドエースの組織がすでに申し込みを完了していた可能性や、上記のドキュメントに「注: SQL コードの生成データ キャンバスは、すべてのプロジェクトで使用できます。これらの機能を使用するために、アクセス権をリクエストする必要はありません。」とあるように、今回の実施内容が「SQL コードの生成」にあたる可能性が考えられます。

受理されると、BigQuery ツールバーにて Gemini のアイコンが選択可能になっているはずです。

BigQuery ツールバー
画像右上の赤枠で囲った部分です

最後に、Gemini in BigQuery のために、Cloud Companion API を有効化します。
ツールバーから Gemini のボタンをクリックします。

すると、下記のように Gemini for Google Cloud の Trusted Tester Program への参加確認画面が表示されます。
チェックボックスにチェックを入れて、次へ進みます。

Trusted Tester Program 参加確認画面

すると API の有効化を求められるので、まだ有効になっていないものに関しては ENABLE ボタンをクリックして有効化していきます。

Cloud Companion API 有効化の画面

最終的に、BigQuery ツールバー上にある Gemini のアイコンをクリックして、下記のような画面が表示されれば、今回の準備は完了です。

準備完了画面

テーブル作成

テーブルを作成することは本記事の趣旨ではないため、具体的な手順は割愛します。
具体的な手順は、適宜公式ドキュメントをご確認ください。

今回は、BigQuery のパブリックデータセットに格納されている、2016 年の MLB レギュラーシーズンにおけるデータを使ってみます。

この中から必要なデータだけを取り出し、下記のようなスキーマを持つテーブルを 2 つ作成しました。
1 つはカラムの説明 (description) を含んだもの(以後、説明ありのテーブルのことを test_1 テーブルと呼びます)、もう 1 つは説明を省略したもの(以後、こちらは test_2 と呼びます)です。

gameId: STRING
homeTeamName: STRING
awayTeamName: STRING
homeTeamFinalRuns: INTERGER
awayTeamFinalRuns: INTERGER

あとで実験のために、それぞれのテーブルに対して SQL を生成してもらいます。
これにより、Dataform から利用できる Gemini において、こちらが何もしなくてもテーブルのメタデータを読んでくれるのか? を考えてみたいと思います。

プロンプトを与えてみる

では、用意したテーブルそれぞれにおいて、「シアトル・マリナーズが何勝したのか」をカウントする SQL を作ってもらおうと思います。

例えば、このようなプロンプトです。
このプロンプトでは、カラムの説明なしのテーブルに対して、SQL を生成してもらいます。

Given the `{my_project}.{my_dataset}.test_2` table, count how many games Seattle Mariners win.

これを実現するためには、下記の点を踏まえて SQL を生成しなければいけません。

  1. homeTeamName もしくは awayTeamName が「 Mariners 」であるレコードを抽出しなければならない
  2. homeTeamName が Mariners である場合、homeTeamRunsawayTeamRuns より大きいレコードをカウントする
  3. awayTeamName が Mariners である場合、awayTeamRunshomeTeamRuns より大きいレコードをカウントする

SQL を生成してもらうには、Dataform のクエリエディターにて、「Help me code」ボタンを押すところから始めます。
下記画像の赤枠で囲まれた部分です。

Help me code ボタン

このボタンを押すと、プロンプトを入力する画面が表示されます。

プロンプト入力画面

プロンプトを入力した後に GENERATE ボタンを押すと、Gemini が SQL を生成してくれます。
Gemini が生成した SQL は下記画像赤枠の INSERT ボタンを押すと、クエリエディター上の「Help me code」ボタンを押した行に挿入されます。

生成された SQL を確認する

Gemini の出力は利用規約により公開できませんが、こちらの場合、該当テーブルの中にどんな列があるのかを Gemini は読み取れていないようでした。
homeTeamName や awayTeamName といった、私が期待した文字列は SQL の中になかったです。また、たまに上記のポイント 2 や 3 を踏まえていない SQL が出力されてもいました。
5 回ほど同じプロンプトで試してみましたが、どうもこの傾向は一貫しているように見えました。

では次に、説明ありのテーブルに対して同じプロンプトを使って、同様に SQL を生成してもらいます。

Given the `{my_project}.{my_dataset}.test_1` table, count how many games Seattle Mariners win.

こちらの場合も同様に 5 回ほど試してみたのですが、大まかな傾向としてはそもそも SQL を生成してくれませんでした。
スキーマをくれたら SQL を生成する、というような内容の出力だったので、事前の想定にはなかったですがスキーマ付きのプロンプトを与えてみることにします。
プロンプトが長くなってしまったので、どんなプロンプトにしたのかについては下記の「与えたプロンプト」に記載しています。

与えたプロンプト
Given the `{my_project}.{my_dataset}.test_1` table, count how many games Seattle Mariners win.
The schema is shown below.
```json
[
  {
    "name": "gameId",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "Unique ID for each 2016 MLB regular season game.",
    "fields": []
  },
  {
    "name": "awayTeamName",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "This column contains the away team name in the game.",
    "fields": []
  },
  {
    "name": "homeTeamName",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "This column contains the home team name in the game.",
    "fields": []
  },
  {
    "name": "homeFinalRuns",
    "mode": "NULLABLE",
    "type": "INTEGER",
    "description": "The final score of the home team.",
    "fields": []
  },
  {
    "name": "awayFinalRuns",
    "mode": "NULLABLE",
    "type": "INTEGER",
    "description": "The final score of the away team.",
    "fields": []
  }
]

このプロンプトだと、問題ない SQL を生成してくれました。

まとめ

ここまで、Dataform にて Gemini がコード生成してくれるようになったことについて紹介しました。

個人的には、Gemini 側でテーブルのスキーマなどメタデータを読んでくれるのかなと思っていたので、もう少し楽に、あるいは雑に使えるものかと想像していました。
非エンジニアの方など「Help me code」機能が刺さりそうな方にとっては、期待した結果が得られない可能性も否めません。

ただし、本機能はまだプレビュー版です。GA になった際には、より強力な AI を利用できるようになっていることに期待したいです。

Dataform はデータパイプラインの管理ツールとしては dbt を追いかけている側面もありますが、今回ご紹介したような機能以外にも継続的にアップデートが入っています。
データパイプラインの管理ツール候補として、ぜひ検討してみてください。

Discussion