igaです。
ポケモンsleepを継続していますが、カビゴン評価がマスターになれません。
ChatGPTが見たり、聞いたり、話したりできるようになる、と言われている「GPT-4 with vision (GPT-4V)」が使えるようになったので、早速使ってみたいと思います。
openai.com
今回は、データベースのテーブル関連図を画像ファイルでもらった想定で、画像からテーブルのDDLが生成できるかを確認してみます。
やりたいこと
以下のような、テーブルの関連図とサンプルデータが描かれた画像ファイルをもらいました。
この画像ファイルをChatGPT-4に渡して、SQLのDDLが生成できるか確認します。
画像を解釈できるか確認する
いきなり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_idはplayerテーブルの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