Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

ChatGPTのGPT-4Vを使ってSQL文を画像から作成する

igaです。
ポケモンsleepを継続していますが、カビゴン評価がマスターになれません。


ChatGPTが見たり、聞いたり、話したりできるようになる、と言われている「GPT-4 with vision (GPT-4V)」が使えるようになったので、早速使ってみたいと思います。
openai.com


今回は、データベースのテーブル関連図を画像ファイルでもらった想定で、画像からテーブルのDDLが生成できるかを確認してみます。

やりたいこと

以下のような、テーブルの関連図とサンプルデータが描かれた画像ファイルをもらいました。

この画像ファイルをChatGPT-4に渡して、SQLDDLが生成できるか確認します。

画像を解釈できるか確認する

いきなりDDLを作らせる前に、まずは画像ファイルに書かれたテーブル構造を、マークダウンで出力してもらいます。

プロンプトの入力欄の左に絵のアイコン(画像の赤で囲ったところ)をクリックすると、ファイル選択のダイアログが表示されるので、ChatGPTにアップロードする画像ファイルを選択します。
この入力に対するChatGPTの応答は以下のようになりました。


「取得元のデータ構造を基盤」と出力されたところは、実際には「取得元のデータ構造と関係」と書いてありました。
また、「銀の」と出力されたところは、実際には「銅の」と書いてありました。
それ以外は画像に描かれた文字を読み取ってマークダウンとして出力してくれました。

マークダウンからDDLを作成してもらう

先ほどの入力に続けて、以下の指示を入力します。
データ型についても、ChatGPTに推測してもらいます。

取得元のテーブルについて、SQLのDDLを出力してください。
データ型は、各カラムの値から推測して適切と思われる型で定義してください。

これに対して、ChatGPTの応答は以下のようになりました。


DDLを出力した後には、データ型についての説明が出力されましたが、そこは割愛します。

DDLの内容は以下の通りです。

CREATE TABLE player (
    id INT PRIMARY KEY,
    player_name VARCHAR(50) NOT NULL,
    hp INT NOT NULL,
    mp INT NOT NULL
);

CREATE TABLE equipment (
    player_id INT REFERENCES player(id),
    equip_id INT NOT NULL,
    equip_type VARCHAR(10) CHECK (equip_type IN ('head', 'body')),
    PRIMARY KEY (player_id, equip_type)
);

CREATE TABLE head_item (
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL
);

CREATE TABLE body_item (
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL
);

PKになりそうなカラムには「PRIMARY KEY」の制約がつけられていたり、equipmentテーブルのplayer_idplayerテーブルのidを参照しているので外部制約が設定されています。
投入したいデータに合わせた制約が設定されているので、DDLは問題なく生成できました。

取得したいデータ構造のSQLを生成してもらう

続いて、このテーブルをJOINして「取得したいデータ構造」になるように取得するためのSQL文を生成してもらいます。


(この後に、SQLの動作について解説していますが、その部分は割愛します)

生成されたSQL文は以下の通りです。

SELECT 
    p.id,
    p.player_name,
    p.hp,
    p.mp,
    hi.name AS head_item_name,
    bi.name AS body_item_name
FROM 
    player p
LEFT JOIN 
    equipment e_head ON p.id = e_head.player_id AND e_head.equip_type = 'head'
LEFT JOIN 
    head_item hi ON e_head.equip_id = hi.id
LEFT JOIN 
    equipment e_body ON p.id = e_body.player_id AND e_body.equip_type = 'body'
LEFT JOIN 
    body_item bi ON e_body.equip_id = bi.id;

生成されたSQL文は動作すると思われますが、実際に動かしてみないと分かりません。
サンプルデータとして、画像に書いてあった内容をSQLのINSERT文にしてもらいます。

マークダウンの内容からINSERT文を生成してもらう

先ほどの入力に続けて、以下のプロンプトを入力します。

生成されたSQL文は以下の通りです。

-- playerテーブルのデータ
INSERT INTO player (id, player_name, hp, mp) VALUES
(1, 'プレイヤー1', 40, 8);

-- equipmentテーブルのデータ
INSERT INTO equipment (player_id, equip_id, equip_type) VALUES
(1, 3, 'head'),
(1, 3, 'body'),
(2, 1, 'head'),
(2, 1, 'body'),
(3, 2, 'body');

-- head_itemテーブルのデータ
INSERT INTO head_item (id, name) VALUES
(1, '鉄の帽子'),
(2, '銀のかぶと'),
(3, 'シルバーヘルム');

-- body_itemテーブルのデータ
INSERT INTO body_item (id, name) VALUES
(1, '鉄の服'),
(2, '銀のよろい'),
(3, 'シルバーアーマー');

生成してもらったDDLとINSERT文をPostgreSQLに対して実行したところ、問題なくデータが登録できました。
(INSERT文でplayerテーブルのid=2と3のレコードは手で追加しました)

テーブルをJOINするSQL文を実行したところ、問題なく結果を取得することができました。
SQLの実行結果は以下の通りです。

db=# SELECT
    p.id,
    p.player_name,
    p.hp,
    p.mp,
    hi.name AS head_item_name,
    bi.name AS body_item_name
FROM
    player p
LEFT JOIN
    equipment e_head ON p.id = e_head.player_id AND e_head.equip_type = 'head'
LEFT JOIN
    head_item hi ON e_head.equip_id = hi.id
LEFT JOIN
    equipment e_body ON p.id = e_body.player_id AND e_body.equip_type = 'body'
LEFT JOIN
    body_item bi ON e_body.equip_id = bi.id;
 id | player_name | hp | mp | head_item_name |  body_item_name
----+-------------+----+----+----------------+------------------
  1 | プレイヤー1 | 40 |  8 | シルバーヘルム | シルバーアーマー
  2 | プレイヤー2 | 32 | 18 | 鉄の帽子       | 鉄の服
  3 | プレイヤー3 | 50 |  0 |                | 銀のよろい
(3 rows)

まとめ

今回は、ChatGPT-4に画像からテーブル構造を読み込んでSQLを生成してもらいました。
元の画像はExcelで作った図も文字もきれいでしたが、読み取った結果は多少修正が必要でした。
生成してもらったSQL文は問題なく実行できて、DDLについては制約も指定してくれました。
ここまでの精度でSQL文を生成してくれるのであれば、SQLの文法を忘れてしまってもChatGPTに助けてもらうことが出来そうです。


Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Kaggle Grandmasterと一緒に働きたエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの採用 - Wantedlywww.wantedly.com