先輩エンジニアが作ったクエリ問題集をChatGPTに解かせてみた

:::note info
この記事は[LITALICO Engineers Advent Calendar 2022](https://qiita.com/advent-calendar/2022/litalico) 10日目の記事です
:::
:::note warn
記事内容は検証が不十分な点が多々あります。
この記事を参考に実務等で使用する場合は自己責任でお願いします。
:::

# はじめに
この記事を書くに至った経緯を少し書きます。
最初に注意しておきますと、この記事の著者はAIや機械学習に関してはほぼ知識のない素人です。

## 先輩が作られたクエリ問題集

[LITALICO Engineers Advent Calendar 2022](https://qiita.com/advent-calendar/2022/litalico) カレンダー2の3,4,5日目の記事は同じ開発チームの先輩@ti_aiutoさんが書かれています。これらの記事ではデータ分析に入門したい人向けにBigQueryの問題が50問も紹介されています。

https://qiita.com/ti_aiuto/items/638595a148e7d16dd70f

自分はクエリを書くのがあまり得意ではないので、これを参考に勉強させてもらえると良さそうだなと思っていました。

## ChatGPT
最近巷でChatGPTなるものが流行っているようなので自分も使ってみたいと思っていました。
ChatGPTの説明に関しては他にも色々な記事で紹介されていると思うので、ここではリンクを貼るにとどめておきます。
下記のリンク先ページ内の「TRY CHATGPT」を押すと使用できます。

https://openai.com/blog/chatgpt/

初めはchatbotで遊ぶように人と会話をするような感覚で楽しんでいたのですが、下の記事を読んでコードも書けることを知りました。もしかすると、自分の苦手なクエリも書いてくれるのではとワクワクしました。

https://qiita.com/sakasegawa/items/82069c97a1ee011c2d1e

## とりあえず戦わせてみる

クエリを勉強するのは良さそうですが、50問解くのは大変そうです。
また、いきなりクエリを書く目的でChatGPTをつかうのも正しい回答が得られるのか不安です。
そこで、とりあえずChatGPTに問題集を解いてもらえばいいのではと邪な考えを働かせてしまいました。
もし完璧に解けるのであれば自分で問題を解かずに済みますし、クエリを書く目的で安心してChatGPTを使用できます。

この記事では不遜ながら先輩の記事内にある問題をChatGPTに解かせてみました。
このテーマで記事を書くことについて、快く承諾してくださった先輩の@ti_aiutoさんありがとうございます！

# 先に結論
* 初級編に載っている程度の簡単なクエリならChatGPT任せても良さそう。
* BigQuery用のクエリを書く場合に使えるかどうかは分からなかった。
    * 少なくとも今回の入力方法ではできない。
* 書きたい内容が複雑になってくるとそもそもやりたいことができるクエリか判断が付きづらくなってくるので、安心するには**結局勉強が必要そう。**

まあ、そうですよね…

でも自分で手を動かす前に今回作成したテンプレートを使って簡単に試すのは良さそうだし、吐き出されたクエリを実際に使うときに注意すべき点も少し見えたので、そう思うに至った具体的な内容を以下に書きます！


# 実際に解かせてみた
## 入力画面と出力のイメージ
![Cursor_と_ChatGPT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285876/ac58bee8-95bb-c3c5-6979-edb6078d1607.png)

ChatGPTでは上の画像のように、自分の入力した質問に対して返答が返ってきます。
今回は返答の中にあるクエリが問題集の回答例と同様のものになっているか確認しました。

具体的な入力内容やそのルールについて次に書いていきます。


## 解いた問題

* [データ分析入門者のためのBigQuery50本ノック(初級編)](https://qiita.com/ti_aiuto/items/638595a148e7d16dd70f)に載っている24問。(中級編と実践編はやっていない。)

## 入力のルール

- テーブルの説明は自前で作成。問題文をくっつけて入力する。
- 同じテーブルを使う問題が続く場合、2問目以降は問題文だけを入力する。
- テーブルと問題文の規則は以下の通り。


### テーブル

記事テーブルを以下のテンプレートに当てはめて入力。`hogehoge`, `hoge`, `fuga`, `piyo` の部分はそれぞれのテーブル情報によって変わる。

```
hogehogeテーブルは次の「」内に読点区切りで書かれたカラム名のカラムをそれぞれ持っています。「hoge、fuga、piyo」
```

また、15問目以降のアクセスログテーブルに関しては、上の文章の前に以下の文章を追加した。`hogehoge`の部分は`また、それぞれのテーブルは` に置き換わっている。

```
access_log_transform_日付という名前の整形済みアクセスログテーブルが複数あります。ただし、テーブル名内の「日付」にはログが取られた日付を表す数値が入ります。例えば2022年10月22日のログが含まれるテーブルの名前は `access_log_transform_20221022` となります。
また、それぞれのテーブルは...
```

### 問題文
* 問題のうち、前の問題の解答を受けて改めて出題する形式はChatGPTが解釈しやすいように書き換えた。
    例)「(8)の結果について~」→「先程の結果について」
* 問題文を記事からスプレッドシートにコピペしてまとめ、データクリーンアップ機能を使って空白文字の削除のみ行った。(もしかしたら不要だったかも。)

![chatGPTに入力する値_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285876/966c3071-d547-fff5-325a-c9ec1253c3df.png)


## 結果の分類

O: 回答がほぼ一致している
△: 回答が一部異なるが題意を満たしている
X: 題意を満たしていない

の3つに分類する。

# 結果と感想

## 結果
出力結果を記事内の解答と比較したところ、以下のように分類されました。

O: 14 問
△: 9 問
X: 0 問

全く見当違いな出力が無かったことが今回の結果の驚きでした。
以下、何問かピックアップして具体的な中身を紹介します。

## Oに分類したもの
* 解答とは異なる位置に改行が入っている。
* テーブル名やカラム名が日本語。
    * そもそも入力したテーブル名やカラム名が日本語なのでこれは仕方がないということで O に分類しました。

例)
![chatGPTに入力する値_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285876/a284da1e-6670-7a5d-e370-b704dce746df.png)


## △に分類したもの
1. 解答にBigQueryの独自記法の差分が含まれるもの(7/9が該当)
例1) UNION ALL と _TABLE_SUFFIX の違い (複数のテーブルを縦に積む処理の違い)
![chatGPTに入力する値_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285876/ef917744-7c71-9c4b-ffd8-b2c20c01a94c.png)
例2) REGEXP と REGEXP_CONTAINS の違い ![chatGPTに入力する値_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285876/1ac9bf48-52c5-7cfe-5db8-796a47b7fbc6.png)
例3) DATA_FORMAT と　FORMAT_TIMESTAMP の違い ![chatGPTに入力する値_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285876/094c37bc-cbeb-da57-03e6-1b208f7edc3e.png)
2. ASでつけた名前を使いこなせていないもの(1/9が該当)
例)
![chatGPTに入力する値_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285876/9a50995e-cd9f-8489-c5d5-3dcec6db9ec5.png)
3. 書き方が冗長なもの(1/9が該当)
例)
![chatGPTに入力する値_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285876/1e8dbbe5-7bc3-b243-43b7-51a56f7b01bf.png)

## その他、分類時に考慮しなかったが気になった点
* 日本語で入力したカラム名がアルファベットに勝手に変換されていた。(上に載せた問題番号22など。)
* 入力文の中でBigQueryと明言していないのに、BigQueryの関数であるREGEXP_EXTRACTを使用している。(もしかすると他のクエリ方言に同じ関数があるのかも？)
![chatGPTに入力する値_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285876/c6d426bd-4033-d8c4-6e3f-4b27e71505df.png)

## 結果を見て思ったこと
* 思ったよりも正答率が高い。
* 返ってくるクエリは処理の効率が悪い可能性がある。
* 出力結果をBigQueryで使う場合はもっと良い関数があるかもしれない。
* カラムの名前が勝手に変わったり、BigQuery関数をいきなり使ってくるのはちょっと怖い。
    * 逆にChatGPTから出力されるクエリを使って構文エラーになった際はカラム名や使われている関数を確認すると良さそう。

# まとめ
* 簡単なクエリであればChatGPTは使えそう。
* しかし、確実なデータが欲しい場合は出てきた結果が正しいものか判断するにはSQLの知識は別途必要。
    * 列名を日本語で渡した場合は英語に書き換わることもある。
    * 使うDBによって方言があってそこに対応するのは人力になる。(BigQueryの独自記法や関数をChatGPTが使いこなせるのか自体は未検証。)
* SQLクエリの書き方でヒントが欲しい場合にテンプレートに当てはめて情報を入力すると効率よくクエリを書き進められそう。


# あとがき

結果自体は皆さんの手元でも確かめていただけると思うのでぜひやってみてください! 今後もAIはどんどん進化して、将来はAIを使いこなせるかどうかで生産性に差が生まれることは間違いないと思っています。AIと仲良くなる第一歩としてこの記事が皆さんの興味を引くきっかけになれれば嬉しいです。

本記事では結果を踏まえての考察や実践的な使い方まで深掘ることまではあまりできず、感想を書くだけに留まりました。これは自分の実力や知識不足からくるもので、今後の成長課題になりそうです。現時点では自分よりもっと技術の強いどなたかにおまかせしようと思います。(応用編、実務編に関しても解かせて記事に入れたかったのですが、その前に時間と体力にリミットがきてしまいました。)
個人的にはAIに全然詳しくない自分でも最新の技術を使えるという事実で十分にワクワクできたのが良かったです。
ここまで読んでくださってありがとうございます！

明日は @tanakashi さんと @michiokay さんの記事が公開されます。お楽しみに！