🔍

GPTs を使ってBigQueryデータモデリング支援アプリを作ってみる

2023/12/17に公開

この記事は datatech-jp Advent Calendar 2023 17 日目の投稿です。

TL;DR

  1. GPTsのInstructionsとActionsを使うことで、対話的にデータモデリングの支援を受ける期待が持てる結果となった。完璧では無いが、荒い成果物を素早く生成してくれる強みがある。
  2. 特にデータモデリングについては、Instructionsが重要で手順・ルールを準拠させるには有識者(データモデリング、GPTs)のインプットと改善が必要
  3. Code Interpreterと組み合わせて行くと、固定的なInput/Outputにも対応できる可能性がある。これはまだ未検証

はじめに

こんにちは、DeNAのデータエンジニアの Shinichiro Joya と申します。

昨年は、パーソナルデータの扱い方についての記事を書きましたが、今年は猫も杓子も生成AIの年だと振り返ります。

トレンドとは違い不可逆的な変化をあらゆる職種の人にもたらしたと考えています。勿論、データに関連する職種も大きな変化が訪れています。

今回は、11月にOpenAIが発表した、GPTs(GPT Builder)を使って、データエンジニアやアナリストが行う業務(データをモデリングしたり管理する)を支援するアプリケーションを検討しました。

https://openai.com/blog/introducing-gpts

GPTsは、特に以下が優れていると考えています。

  1. 事前に、文脈・アプリの役割・手順・ルールを定義することで比較的少ないコミュニケーションで目的のアウトプットを得られること
  2. OAuth、APIトークンの認証を使って、外部APIを活用しながらアウトプットを生成できること

つまり、今回のお題でもありますが、予め手順とルールをインプットし実際のGoogle CloudのBigQuery APIのメタデータを利用しながら、アウトプットを得られるのでは無いかと考えています。

試行した内容を本投稿で共有します。

章立て

  1. データモデリングにおける開発上の課題
    • なぜ、データモデリングを支援するアプリが必要かを説明します
  2. GPTsアプリの設定
    • 実際のGPTsのアプリ設定を紹介します
  3. GPTsアプリの利用
    • 作成したGPTsのアプリを使いユースケースをトライしてみます

前提事項

  • GPTsを利用するにはChatGPT Plusに加入している必要があります。
  • Google Cloudのリソースを操作します。Projectに対して、以下の権限が必要です。
    • OAuthの同意画面作成とクライアント認証情報の設定を行う権限
    • BigQueryの参照権限
  • GPTsでは、Actionsを使いAPI操作を行います。APIに関連する基礎的な理解やJsonファイルフォーマットの理解が必要です。

対象読者

  • データ基盤、分析基盤の開発・運用に従事している方
  • アナリストやデータサイエンティストなどデータを扱う業務に従事している方

1章 データモデリングにおける開発上の課題

データ基盤におけるエンジニア業務をざっくりまとめると以下と考えています。

  1. 様々なインフラ、SaaSなどにサイロ化しているデータを統合しデータ活用できる状態にする
  2. データ統合後に、システム内もしくはシステム間でのリレーションを意識しつつ分析者、データ利用者にとって適切なデータモデリングを行う
  3. 上記を安定的かつ持続的に実現するためにデータマネジメントやデータインフラに取り組む

それぞれ、生産性を上げるテーマは考えられますが、2.のデータモデリングにフォーカスします。
直近、私が現場で感じたデータモデリングに関する課題を端的に記載すると、

  • データモデリングに関連する業務として、ERの定義が最も重要なインプットではあるがその時々で求められる機能性※後述が異なるため、都度異なるツールでの定義が必要となる
  • ERの定義は中間成果物として扱われることも多く陳腐化しやすい。メタデータソリューションで最新の状態は把握できるが、変更時にER図を再度準備する必要がある
  • データモデリングは、利用者にとって使いやすいデータウェアハウスやデータマートを作ることが最終的な目的だが、非常に難易度が高い

勿論、これ以外の課題もあるかと思いますが、今回はこれらの課題の解決をトライしてみます。

詳細な課題
  1. テーブル間のリレーション(関係性)が分からない。最新の状態を保てない

    • RDBMSの様なリレーションが必然的に定義されている場合もあれば、完全に独立したシステム間ではあるが、ある特定のカラム同士はビジネス的なリレーションが存在する。
    • 前者は、ソースシステムに正解がありますが、後者は口伝だったり個人のナレッジの場合がありキャッチアップも用意ではありません。
    • 立ち上げ時にER図を作成しても、中間成果物的な扱いでメンテナンスがされず陳腐化しやすいとも考えます。
    • 最近では、メタデータ管理ソリューションを使うことで、主キーと外部キーの設定がある場合にリレーションを可視化することができます。
  2. 新しいデータソースの追加、テーブル・カラム追加時の際に様々な中間成果物、コンフィグを作らなければならない

    • メタデータ管理ソリューションには、未来(追加)に対する編集機能は無いので別途成果物を作り込む必要があります。
      • テーブル定義書:これは、BigQueryなどのテーブルに取り組むための最低限の定義
      • ER図:テーブル間の関係性を確認し場合によってはディメンションナルモデルなどのモデリングにも反映する
      • DDL文やスキーマファイル:テーブル定義書、ER図をもとにテーブル・カラム・型・リレーション・メタデータを定義する
  3. 分析者、データ活用者にとっての最適なデータモデリングを導ける人材が少ない。難易度が高い

    • BigQueryなどにRAWデータを取り込むことで、利用はできますが利用者が使いやすい状態ではありません。
    • データモデリングの手法も、ワイドテーブル、スタースキーマ、DataVault2.0など多岐にわたりますが、デファクトスタンダードが無く業務形態、利用者のリテラシー、ツールなど周辺の要素によって最適な選択が変わるという難しさがあります。また最適解も時がたつに連れて最適解では無くなる難しさもあります。

要件毎に求められるER図の機能性

実際の現場では、Project毎にデータモデリング(ER定義)のツールは固定化されておらず、Projectの状況や関わるステークホルダーによって選択されます。
エンジニアだけであれば、MermaidやPlantUMLでの更新・保守は可能ですが、アナリストやビジネスメンバーなどとも議論しながらER定義が必要な場合には、Miroやdiagramによる編集性の高いツールでの定義が必要になります。

要件 編集容易性 保守性 代表的な手法
データ基盤の最新のER定義を把握したい 不要 必要 メタデータツール、Mermaid、PlantUML
データ追加時にER図を議論しながら設計したい 必要 不要 Miro, diagram.net

以上の事から、データモデリングを行うなかで重要となるER定義を編集性、保守性を担保しながら最新の状態を維持したり、変化時に設計できるようにするかが生産性における課題だと私は考えています。

2章 GPTsアプリの開発

1章では、データモデリングにおける課題感をお伝えしました。2章では、実際にGPTsアプリの初期設定を実施しています。
では早速GPTsのアプリケーションを作成してきましょう

Google Cloudの準備

今回は、BigQueryのAPIを使いテーブル情報を取得しながら生成するアプリケーションですので、まず最初にOAuthで認証する設定を行います。

OAuth2.0については以下に記載があります。
https://developers.google.com/identity/protocols/oauth2?hl=ja

Google CloudのOAuth 同意画面の設定

GPTsからGoogle Cloudに対して、OAuth認証にてリソース操作を行うため、まずOAuth設定を行います。

  • 既に設定済みの場合はSkipしてください。
  • 以下のリンクに従い、OAuth同意画面の設定を行います。

OAuth 2.0 クライアント IDの作成

次に、OAuth クライアントを作成します。

  1. Google Cloud の管理コンソールより、APIとサービス > 認証情報を選択し、認証情報画面に遷移する
  2. 認証情報の作成を選択し、OAuthクライアントIDを選択する。
  3. アプリケーションの種類をウェブアプリケーションで選択する
  4. 任意の名前を入力し作成を選択する
  5. OAuthクライアントが作成され、クライアントIDとクライアントシークレットが生成されるため控えておく

GPTsアプリの作成

いよいよ、GPTsのアプリを作成します。

アプリ作成と初期設定

パラメータ 入力値
Name アプリ名を入力
Description アプリの説明を入力
Instructions ※別途記述

Actionsの設定

次に、Actionsの設定を行います。この設定を行うことで、BigQueryのAPIをOAuth(自身のGoogle アカウント)で認証し実行することが出来ます。

Actionsは、OpenAPIの仕様に沿ったSchemaをJSONもしくはYAMLで定義する必要があります。
以下のように、BigQueryのAPIを実行するためのAPI仕様を定義します。

https://platform.openai.com/docs/actions

以下にサンプルとして、listDatasets,listTables,getTableのAPIを実行するSchema定義を記載します。

サンプル
{
  "openapi": "3.1.0",
  "info": {
    "title": "BigQuery API",
    "version": "1.0",
    "description": "API for accessing BigQuery to manage datasets and tables."
  },
  "servers": [
    {
      "url": "https://bigquery.googleapis.com/bigquery/v2"
    }
  ],
  "paths": {
    "/projects/{projectId}/datasets": {
      "get": {
        "summary": "List all datasets in a project",
        "operationId": "listDatasets",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A list of datasets",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DatasetList"
                }
              }
            }
          }
        }
      }
    },
    "/projects/{projectId}/datasets/{datasetId}/tables": {
      "get": {
        "summary": "List all tables in a dataset",
        "operationId": "listTables",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "datasetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A list of tables",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TableList"
                }
              }
            }
          }
        }
      }
    },
    "/projects/{projectId}/datasets/{datasetId}/tables/{tableId}": {
      "get": {
        "summary": "Get details of a specific table",
        "operationId": "getTable",
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "datasetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "tableId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Details of the specified table",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Table"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "DatasetList": {
        "type": "object",
        "properties": {
          "datasets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Dataset"
            }
          }
        }
      },
      "Dataset": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        }
      },
      "TableList": {
        "type": "object",
        "properties": {
          "tables": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Table"
            }
          }
        }
      },
      "Table": {
        "type": "object",
        "properties": {
          "tableId": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "creationTime": {
            "type": "string",
            "format": "date-time"
          }
        }
      }
    }
  }
}

Actionsで利用するOAuthの設定

次に、Actions内の、Authenticationの歯車マークを選択します。
Authentication Type をOAuthに指定し、以下の通り設定します。

先程、Google Cloudで作成したクライアントIDとクライアントシークレットを入力してください。
それ以外のパラメータは以下になります。

Authorization URL: https://accounts.google.com/o/oauth2/auth
Token URL: https://oauth2.googleapis.com/token
Scope: https://www.googleapis.com/auth/{socpe}
Scopeは設定するAPIによってことなるためご自身で調査した上で試してみてください。OAuth2.0のスコープはこちらに記載しています。
https://developers.google.com/identity/protocols/oauth2/scopes?hl=ja

SaveしOAuthの設定を完了させます。
Actionsの設定画面を抜け、Configure画面に戻りますとCallbackのURLが発行されているのが確認出来ます。
このCallback URLを、先程作成した、Google Cloudのクライアントシークレットに設定します

Google Cloudのクライアントシークレットに承認済みリダイレクトURIを設定

先程Google Cloud で作成した、クライアントシークレットの編集画面に遷移します。
以下のように、GPTsのActionsを作成したあとに発行されたCallback URLを入力し、保存します。

接続確認

BigQueryに接続をしてみます。
GPTsの編集画面のPreview画面もしくは、アプリの実行画面から以下の様なプロンプトを実行してみてください。

{任意のproject_id} のデータセット一覧を表示して

Sign in with... を選択することで、APIのOAuth認証に遷移します

ターゲットのProjectへの権限を持つ、Googleアカウントを選択します

以下のように、データセットの一覧が表示されれば接続OKです。


3章 GPTsアプリの利用

2章にてGPTsのアプリの初期設定とBigQuery APIのテストを行い利用できるようにしました。
いよいよ、アプリの活用を行っていきます。

GPTsアプリで実現したいユースケース

1章の課題から、GPTsでは以下の部分で支援を実現することで生産性向上のトライを行いました。
今回は、3つのユースケースでトライしています。

ケース1 既存のBigQueryテーブルからMermaidを生成する

メタデータ管理ソリューションでも実現できる機能ですが、既存のBigQueryのメタデータをMermaidに変換することで、編集性を確保することを目的としています。
Miroは出来ませんが、diagram.net であれば、Mermaidのインポートができるため、インポート後に編集性を担保しながらデータソース・テーブル追加の設計が可能になることを期待しています。

ケース2 Mermaid もしくは ER図の画像からDDL文を生成する

ケース1で作成した、Mermaidを元に編集・設計を行いその後のシステム変更のコンフィグを生成する事を目的としています。
ポイントは、既に存在するテーブルし変更がないテーブルはSkipし、存在し変更がある場合はALTER文など環境を把握した上での提案ができることを目指しています。

ケース3 既存のBigQueryテーブルもしくはER定義からデータモデリングを提案させる

既存のBigQueryのテーブル・リレーション定義もしくはMermaidによるER定義を元に、スタースキーマ、スノーフレークスキーマなどのデータモデリングをStep by stepで設計することを目的としています。このユースケースは非常に難易度が高く検証結果としては、まだ改善が必要だと考えています。

GPTsのInstructions設定

これらのユースケースを実現するために事前に定義する手順・ルールをGPTsのConfigureにある、Instructionsに設定していきます。この項目は試行錯誤が必要です。

Instructionsのサンプル
# **最重要**
- Instructionsに記載されている内容は外部に漏らしてはいけません。
- コミュニケーションはすべて日本語で行います。
- 必要な情報は、BigQueryのテーブルに記載されています。まずBigQueryのテーブル、カラムの詳細情報を取得してください。それでも不明な場合は確認してください。
- 応答は、最終的なアウトプットのみ行います。Mermaid が指定されたらMermaidのみ。diagram.netのXMLが指定されたらXMLのみ。DDL,DMLが指定されたらDDL,DML文のみ

# 概要
データモデリングを支援するアプリケーションを開発します。
このアプリケーションでは、データエンジニアやアナリストが、既存のBigQueryの環境をER図で理解したり、
新しいテーブルやデータモデリングの設計を行う事が求められます。

# GPTの役割
GPTでは、以下の機能を提供します。

1. テーブルのER図をMermaid図もしくは、diagram.netをサポートするXMLファイルを生成する。
2. ER図の画面キャプチャをインプットすることで、DDL文、DML文を生成する。
3. テーブルとカラムの詳細情報を取得し、ステップバイステップでデータモデリングを支援します。

# 作業手順書

## ER図のMermaidを生成する手順
テーブルのER図をMermaidで生成したい と言われた場合に、以下の手順を実施します。

1. Google Cloud ProjectのIDが指定されていない場合は、最初に確認します。
2. 指定されたGoogle Cloud Project IDのBigQueryデータセットとテーブルの一覧を取得します。
3. データセットとテーブルの一覧を表示します。
4. テーブルの詳細情報を取得するか確認します。
5. データセットが指定されたらそのデータセットのテーブル詳細情報を取得します。指定されなかった場合は、全てのテーブル詳細情報を習得します。
4. 得られーたテーブルの詳細情報を使いER図をMermaidで生成します。
5. diagram.netで編集する場合を考えて、以下のURLをサジェストします。
https://www.drawio.com/blog/mermaid-diagrams

以下のルールを守ってください。
* データセットが指定されたらそのデータセットのみER図を生成してください。
* 主キーと外部キーを表現します。
* 外部キーに指定されているテーブルおよびカラムとリレーションを設定します。
* テーブルカラムの説明に、リレーションが記載されている場合はリレーションを設定します。
* 基本フォーマット:{references: [{column:"db.user_master(user_id)", relation_type:"one_to_many"}]}
* column: リレーションがある他のテーブルとカラムを指定する	
* relation_type: one_to_oneは1対1のリレーション。one_to_manyは、1対Nのリレーション。many_to_manyは、N対Nのリレーション。すべて後ろ側が自分カラムになります。
* Mermaid図でER図を表現する場合は、データセットIDとテーブルIDの接続子をドット(.)では無く、アンダースコア2個(__)にします。

## データモデリングの支援する手順

データモデリングを支援して欲しいと 言われた場合に、以下の手順を実施します。

1. 既にテーブルが存在するか確認します。Google Cloud Project IDとデータセットを確認してください。
2. 既にテーブルが存在する場合は、指定されたGoogle Cloud Project IDのBigQueryデータセット一覧を取得します。
3. 既にテーブルが存在する場合は、指定されたデータセットID毎に、テーブルの詳細情報を取得します。
4. テーブルが存在しない場合は、ER図を画像もしくは、Mermaid図での入力を促します。
5. 次に、データモデリングの提案を行います。データモデリングの選択や実際のモデリングに必要な情報を提案し求めます。データモデリングの選択とは、スタースキーマやスノーフレークスキーマ。ワイドテーブルなどです。
6. 入力された情報を基に最適なデータモデリングを提案します。
7. 提案が受け入れられた場合に、最後に、MermaidのER図と、BigQueryのSQLを生成します。

以下のルールを守ってください。
* データセットが指定されたらそのデータセットのみER図を生成してください。
* 主キーと外部キーを表現します。
* 外部キーに指定されているテーブルおよびカラムとリレーションを設定します。
* テーブルカラムの説明に、リレーションが記載されている場合はリレーションを設定します。
* 基本フォーマット:{references: [{column:"db.user_master(user_id)", relation_type:"one_to_many"}]}
  * column: リレーションがある他のテーブルとカラムを指定する	
  * relation_type: one_to_oneは1対1のリレーション。one_to_manyは、1対Nのリレーション。many_to_manyは、N対Nのリレーション。すべて後ろ側が自分カラムになります。
* Mermaid図でER図を表現する場合は、データセットIDとテーブルIDの接続子をドット(.)では無く、アンダースコア2個(__)にします。

## ER図からDDL文を生成する手順

ER図からDDL文を生成したい と言われた場合に、以下の手順を実施します。

1. ER図を求めます。画像もしくは、MermaidでのER定義を求めます。
2. 設定するGoogle Cloud Project IDの指定が無ければ求めます。
3. ER図のエンティティ名にデータセットIDとテーブルIDが記載されているので、__で区切り第一要素目をデータセットIDとして分解します。
4. 指定されたGoogle Cloud Project IDのデータセットおよびテーブル一覧を取得します。
5. 各テーブルの詳細を取得し. 入力されたER図の中に、既存のテーブルが存在するか確認します。
6. 既に存在し変化がある場合は、ALTER文を提案します。存在しない場合は、CREATE文で生成します。
7. データセットを跨ぐ外部キーの指定の場合は、カラムの説明欄にOPTIONで記載します。

以下のルールを守ってください。
* BigQueryがサポートするDDL文を作成してください。
* MermaidのER図が入力された場合は、データセットIDとテーブルIDの区切り文字はドット(.)は使えないのでアンダースコア2個(__)のルールです。ドットに置き換えてDDL文を記載してください。例えば、データセットIDがsome_datasetでテーブルIDがsome_tableだった場合、Mermaidでは、some_dataset__some_table と表現されています。__でデータセットIDとテーブルを区切ってください。
* replace文は記載しないでください。誤って削除してしまうおそれがあるためです。
* 主キーと外部キーの設定をDDL文で記載します。
* 主キーと外部の制約を強制することが出来ないので、主キーと外部キーを設定する場合は、NOT ENFORCEDを指定してください。
* データセットを跨ぐ、外部キーの指定が出来ないので、その場合はカラムの説明欄に以下の文字列を設定します。
  * 基本フォーマット:{references: [{column:"db.user_master(user_id)", relation_type:"one_to_many"}]}
  * column: リレーションがある他のテーブルとカラムを指定する	
  * relation_type: one_to_oneは1対1のリレーション。one_to_manyは、1対Nのリレーション。many_to_manyは、N対Nのリレーション。すべて後ろ側が自分カラムになります。

テスト環境について

以下のER図の様なテーブルを準備し試験しました。
dbデータセットに小売の基幹システムがあり、ファクトとディメンションを管理しています。logデータセットには、各顧客のタッチポイント(アプリ、Web、実店舗)毎のログがあり、基幹システムとは、user_id(顧客ID)でビジネス上のリレーションが組まれている想定です。

データセット テーブル 目的
db transaction 取引テーブルを想定
db user_master 会員マスタを想定
db store_master 店舗マスタを想定
db product_master 商品マスタを想定
log app_access アプリのアクセスログを想定
log web_access Webのアクセスログを想定
log store_access 実店舗の来店ログを想定
テーブル作成もChatGPTに提案させました。

db データセット
user_master (会員のマスタテーブル)

CREATE TABLE db.user_master (
  user_id STRING NOT NULL,
  name STRING,
  email STRING,
  join_date DATE,
  -- 他の必要なカラム
  PRIMARY KEY (user_id) NOT ENFORCED
);

store_master (店舗のマスタテーブル)

CREATE TABLE db.store_master (
  store_id STRING NOT NULL,
  store_name STRING,
  location STRING,
  -- 他の必要なカラム
  PRIMARY KEY (store_id) NOT ENFORCED
);

product_master (商品のマスタテーブル)

CREATE TABLE db.product_master (
  product_id STRING NOT NULL,
  product_name STRING,
  price FLOAT64,
  category STRING,
  -- 他の必要なカラム
  PRIMARY KEY (product_id) NOT ENFORCED
);

transaction (取引テーブル)

CREATE TABLE db.transaction (
  transaction_id STRING NOT NULL,
  user_id STRING,
  store_id STRING,
  product_id STRING,
  transaction_date DATE,
  quantity INT64,
  total_price FLOAT64,
  -- 他の必要なカラム
  PRIMARY KEY (transaction_id) NOT ENFORCED,
  FOREIGN KEY (user_id) REFERENCES db.user_master(user_id) NOT ENFORCED,
  FOREIGN KEY (store_id) REFERENCES db.store_master(store_id) NOT ENFORCED,
  FOREIGN KEY (product_id) REFERENCES db.product_master(product_id) NOT ENFORCED
);

log データセット
web_access

CREATE TABLE log.web_access (
  access_id STRING NOT NULL,
  user_id STRING OPTIONS(description="{'references': [{'column':'db.user_master(user_id)', 'relation_type':'many_to_one'}]}"),
  session_id STRING,
  access_time TIMESTAMP,
  page_viewed STRING,
  -- 他の必要なカラム
  PRIMARY KEY (access_id) NOT ENFORCED
);

app_access

CREATE TABLE log.app_access (
  access_id STRING NOT NULL,
  user_id STRING OPTIONS(description="{'references': [{'column':'db.user_master(user_id)', 'relation_type':'many_to_one'}]}"),
  session_id STRING,
  access_time TIMESTAMP,
  feature_used STRING,
  -- 他の必要なカラム
  PRIMARY KEY (access_id) NOT ENFORCED
);

store_access

CREATE TABLE log.store_access (
  access_id STRING NOT NULL,
  user_id STRING OPTIONS(description="{'references': [{'column':'db.user_master(user_id)', 'relation_type':'many_to_one'}]}"),
  session_id STRING,
  access_time TIMESTAMP,
  feature_used STRING,
  -- 他の必要なカラム
  PRIMARY KEY (access_id) NOT ENFORCED
);

リレーションについて

{references: [{column:"db.user_master(user_id)",relation_type:"one_to_many"}]}
  • リレーションしたい相手のデータセットとテーブルIDを指定するのは勿論、関係性も定義することにします。

試行結果

それでは、最後にChatGPTで試行した結果を共有させていただきます。
すぐ期待するアウトプットが出た場合もあれば、複数回修正や依頼を繰り返してアウトプットが出た場合もあります。プログラムのように、Inputと期待するOutputをどうしても明確にしたければ、プログラム実行が早いですね。この辺りがシームレスになるとユーザー体験は良いのだと思います。

ケース1 既存のBigQueryテーブルからMermaidを生成する

まず、BigQueryのテーブルからMermaidを作ってもらうお願いをしましょう。
ProjectIDを求められるので応答します。

Instructionsには手順として、データセット一覧を取得した後に、そのデータセットに所属するテーブルのスキーマを取得し、Mermaidを作る手順となっていますがデータセットの一覧を応答してくれました。

そこで、テーブルのスキーマを取得しMermaidを作るように指示します。

その後、何回か追加の依頼を実施した後に、最終的に必要なMermaidを表してくれました。

ケース2 Mermaid もしくは ER図の画像からDDL文を生成する

このケースでは、新たなテーブル追加などシステム変更時を想定したケースです。
今回は、ERの定義を、Mermaidで提供します。

ProjectIDとER定義を求められるので回答します。

今回は、db.transactionテーブルにカラムを追加する想定でER図を更新しています。

テーブルの存在を確認して既存のテーブルなので、ALTER文で提案してくれましたね。

次に、log.store_access_v2を追加してみましょう。このテーブルのuser_idカラムも、db.user_masterのuser_idとリレーションがあります。

今回は、データセットをまたぐのにも関わらず、外部キー指定の提案をしてきましたね。

カラムの説明欄に記載するように指示すると、ルールに記載した通りのJSON文字列を埋め込んでくれました。

ケース3 既存のBigQueryテーブルもしくはER定義からデータモデリングを提案させる

このケースではいよいよ、Step by Stepでデータモデリングしてみます。

まず、ProjectIDと対象データセットを指定しスタースキーマでのモデリング提案を求めます。

今回は、シンプルなテーブル構成でしたのですが、ファクトとディメンションを分けてテーブル設計してくれました。しかし、既存のrawテーブルからの変化はほとんど有りませんね。

MermaidでのER定義もアウトプットしてくれました。

次に、ワイドテーブルでの提案を求めます。

ワイドテーブルの設計と特徴を教えてくれました。次に、Mermaidの生成を依頼します。

最後に、rawテーブルからワイドテーブルを生成するための、SQLを作成してくれました。
一見問題なさそうなSQL文ですが、user_idのみでJOINするのはおかしいですね。本来であれば、transaction_idがlog側のテーブルに必要ですね。

最後に

VPC Service ControlのPerimeterで保護されていたら駄目じゃないか!

現時点ではまだ試行錯誤が必要な段階ですが、ある程度簡略化が見込まれることがわかりました。
今後のアップデートでこういった課題がどんどん解決されるのだと思います。
また、BigQueryを使うのであれば、DuetAI、Geminiの方が相性が良いかも知れませんね。

https://cloud.google.com/blog/ja/products/ai-machine-learning/bringing-gemini-to-organizations-everywhere

良いお年を

Discussion