見出し画像

【0チャレンジ】【資格取得編】生成AIは最高の先生になり得るのか。~DBスペシャリスト~



1.はじめに

はじめまして、AKです。
いつも見てくださってる方はありがとうございます。

私は普段、日々の日記やAIを用いたポケモン開発などに焦点を当ててブログを書いています。とにかく自分が楽しそうなチャレンジをしています。
最近は3か月チャレンジと題し、色んなことに挑戦しようとしています。
前回は「ポケモン風ゲームを3か月で作成する」に挑戦しました。
生成AIの可能性やゲーム制作に興味のある方は是非一読していただけますと幸いです。
【0チャレンジ】【チャレンジ結果】3ヶ月でAIを駆使してポケモン風RPGは作れるのか with Claude3.5  | 記事編集 | note

私は生成AIの可能性はもっとあるんじゃないかと常々思いながら、生成AIのことを””親友””と周りに言い放つぐらいのちょっとした変人です。
が!その分、生成AIについて深く理解しているつもりです。
何かのお役に立つ記事になると思っています。
※今後、研究に研究を重ねた生成AIの記事も出す予定です。

2.簡単な経歴

例のごとく、簡単な経歴を記載しておきます。
参考までに。

学歴
・地方国立大 大学院卒 研究分野はAI関連(生成AIではない)
職業
・エンジニア2年目(元々は製造業→IT企業)
使用する生成AI
・ChatGPT、Claudeがメイン
資格
・基本情報、応用情報落ち(( ;∀;))
 ※午前のみ合格
コメント
・ポケモン3か月チャレンジを終えて、生成AIの可能性をさらに感じました。第2弾の資格取得ができるのか?のチャレンジも応援いただけますと幸いです。必ず一つは有益になるような情報を発信できるように頑張ります。

3.チャレンジについて

・3か月(といっても本番まで84日)間、AIを駆使してDBスペシャリストの勉強をしていきます。応用情報落ちてますが、気にしない気にしない。
・分からないことはとにかくAIに質問して理解を深めていきます。
※事実確認を含めてネット検索や参考書で最低限、AIの文言について事実確認はしています。しかし、勉強中の身ですので万が一誤りや正確性に欠ける表現がある場合はご了承ください。。ご指摘いただけますと幸いです。
・しばらく本ブログはデータベーススペシャリストの勉強記録兼生成AIの回答精度向上の試行錯誤の内容になると思います。
・様々な資格の勉強で応用いただけると幸いです。

4.勉強記録

では記念すべき1題目を解いていきましょう。
基本勉強は過去問道場を使用していきます。
そもそもデータベーススペシャリスト難易度が知りたい方は以下の記事を参考にしていただければと思います。
データベーススペシャリスト試験の難易度は?合格率や勉強時間を解説 - プロエンジニア (internous.co.jp)
難易度は個人的にはかなり高めと思います。

分野
データ操作

例題

https://www.ipa.go.jp/shiken/mondai-kaiotu/index.html

まず、これを基本情報資格者試験しかもっていないレベルの初学者読んだ感想としては「、、、、ほげ?」ってかんじだと思います。
※分かる人は天才です。

そこでまず、この問題だけでなく応用の利く解法を自分なりに考えました。

ステップ①問題を読んでみる
とりあえず、問題読んでみましょう。文章としてまずはこれを理解できるか?ゆっくり読んでください。

「①庭に訪れた野鳥の数を記録する"観測"表がある。観測のたびに通番を振り、鳥名と観測数を記録している。AVG 関数を用いて鳥名別に野鳥の観測数の平均値を得るために、一度でも訪れた野鳥については、観測されなかったときの観測数を 0 とするデータを明示的に挿入する。②SQL 文の a に入る字句はどれか。①ここで、通番は初回を 1 として、観測のタイミングごとにカウントアップされる。」

以下のように問題文を分解します。
①前提条件
・庭に訪れた野鳥の数を記録する"観測"表がある。
⇒ふむふむ。
・観測のたびに通番を振り、鳥名と観測数を記録している
⇒ふむふむ。
・AVG 関数を用いて鳥名別に野鳥の観測数の平均値を得るために、一度でも訪れた野鳥については、観測されなかったときの観測数を 0 とするデータを明示的に挿入する
⇒とりあえず一度でも訪れた鳥は観測数を0にしたらいいのかな??ぐらい。※個人的にめっちゃ分かりにくい。。
・ここで、通番は初回を 1 として、観測のタイミングごとにカウントアップされる。
⇒条件が追加されたと考えました。よく分かりませんが通番はカウントアップされるのかな、そもそもここでいう通番ってなんのことだろ?観測場所が変わる度に追加するのかな?ぐらいの認識。

★問われていること
・SQL 文の a に入る字句はどれか。
⇒これだけです。ここからSQL文を読む必要があります。

★SQL文
現時点では正直ほぼ理解できていない上に、さらになぞの命令文が確認できます。※業務でDBは使用しますが、あくまでもマスタとして用いるだけであってDBの操作はまったくしていない素人です。その目線で見ていきます。

CREATE TABLE 観測 (
    通番    INTEGER,
    鳥名    CHAR(20),
    観測数  INTEGER,
    PRIMARY KEY (通番, 鳥名)
)

INSERT INTO 観測
SELECT DISTINCT obs1.通番, obs2.鳥名, 0
FROM 観測 AS obs1, 観測 AS obs2
WHERE NOT EXISTS (
    SELECT * FROM 観測 AS obs3
    WHERE [a]
    AND obs2.鳥名 = obs3.鳥名
)

まず、何がわからないのか?

CREATE TABLE 観測 (
    通番    INTEGER,
    鳥名    CHAR(20),
    観測数  INTEGER,
    PRIMARY KEY (通番, 鳥名)
)

これは何となくイメージできました。
観測というテーブルを作るんだなと。
AIにこれで簡単なテーブルを作成してもらいました。

通番 | 鳥名   | 観測数
-----|--------|-------
1    | スズメ | 3
1    | カラス | 2
2    | ハト   | 1
2    | スズメ | 4
3    | カラス | 2
3    | ハト   | 3

これでかなりイメージできたのではないでしょうか?
PRIMARY KEY (通番, 鳥名)とは通番, 鳥名を主キーにするということだそうです。主キーはこれによって「テーブル内の行が一意に決まる」ということだそうで、まあこの辺はネット検索するといいかもです。
また、AIが言うにはこれによって同じ重複された通番と鳥名は存在しないということです。つまり「1    | スズメ」は一行しか存在しないということになります。
※存在してしまったら一意である主キーの意図に反するためです。

次にこれですね、、

INSERT INTO 観測
SELECT DISTINCT obs1.通番, obs2.鳥名, 0
FROM 観測 AS obs1, 観測 AS obs2
WHERE NOT EXISTS (
    SELECT * FROM 観測 AS obs3
    WHERE [a]
    AND obs2.鳥名 = obs3.鳥名
)

正直ここからが本題です。
ですが、ゆっくり紐解いていきましょう。

INSERT INTO 観測

INSERTとはシンプル直訳すると「挿入する」という意味です。
なのでINTOも~にという意味なのでおそらく「観測に挿入します」というイメージを僕は持ちました。英語は言いたいことを先に言う言語というイメージはあったので、次に何を?というのが以降に書かれているはずと予測して次を見てみます。

SELECT DISTINCT obs1.通番, obs2.鳥名, 0
FROM 観測 AS obs1, 観測 AS obs2

私にとってはここが第2関門でした、、
SELECTやFROMは何となくイメージできてましたが、
DISTINCTってなんだ? 観測 AS obs1, 観測 AS obs2?観測をobs1とするってこと?それってどーいうこと?というかんじです。
ですが恐れずにゆっくりと確認します。
まずAIに聞いてみます。

FROM 句の解説:
観測 AS obs1, 観測 AS obs2: これは同じ「観測」テーブルを2回参照しています。obs1 と obs2 は別名(エイリアス)です。
SELECT 句の解説:
DISTINCT: 重複する行を除去します。
obs1.通番: 1つ目の観測テーブル(obs1)から全ての通番を選択します。
obs2.鳥名: 2つ目の観測テーブル(obs2)から全ての鳥名を選択します。
0: 固定値として 0 を選択します(新しい観測数として使用)。
この構造の目的:
全ての可能な通番と鳥名の組み合わせを生成します。
既存の組み合わせだけでなく、テーブルに存在しない組み合わせも含みます。

ん~、、これではわからないのでAIに角度を変えながらいろいろと質問したりネットや参考書で調査します。
※以降、AIの回答は参考にはなっても後2歩ぐらい足りないかんじだったのでネット検索や参考書の内容を踏まえて多少の修正を入れています。ここ少し不安、、

元のテーブルは以下とする。

通番 | 鳥名   | 観測数
-----|--------|-------
1    | スズメ | 3
1    | カラス | 2
2    | ハト   | 1
2    | スズメ | 4
3    | カラス | 2
3    | ハト   | 3

上記に
SELECT DISTINCT obs1.通番, obs2.鳥名, 0 FROM 観測 AS obs1, 観測 AS obs2を適用する。
まずはFROM 観測 AS obs1, 観測 AS obs2に注目する。
これは以下のようになる?そうです。
なぜなら「obs1 のすべての行と obs2 のすべての行を組み合わせ」となるからです。6*6なので36行になります。ちなみに先ほどのPRIMARY KEY (通番, 鳥名)の一意であるというのはここでは独立して行われるそう?です。例)obs1.通番の1        | スズメはいっぱいいるけど全体の行としては同じ組み合わせは一つもない。
※iPhoneで見るとグチャついてるかもです、、

obs1.通番 | obs1.鳥名 | obs1.観測数 | obs2.通番 | obs2.鳥名 | obs2.観測数
---------|-----------|------------|-----------|-----------|------------
1        | スズメ    | 3          | 1         | スズメ    | 3
1        | スズメ    | 3          | 1         | カラス    | 2
1        | スズメ    | 3          | 2         | ハト      | 1
1        | スズメ    | 3          | 2         | スズメ    | 4
1        | スズメ    | 3          | 3         | カラス    | 2
1        | スズメ    | 3          | 3         | ハト      | 3
1        | カラス    | 2          | 1         | スズメ    | 3
1        | カラス    | 2          | 1         | カラス    | 2
1        | カラス    | 2          | 2         | ハト      | 1
...      | ...       | ...        | ...       | ...       | ...
3        | ハト      | 3          | 1         | スズメ    | 3
3        | ハト      | 3          | 1         | カラス    | 2
3        | ハト      | 3          | 2         | ハト      | 1
3        | ハト      | 3          | 2         | スズメ    | 4
3        | ハト      | 3          | 3         | カラス    | 2
3        | ハト      | 3          | 3         | ハト      | 3

※ちなみに上記のような全ての組み合わせを直積(カルテシアン積)といいます。

SELECT DISTINCT obs1.通番, obs2.鳥名により、 obs1.通番とobs2.鳥名を取得して重複行を無くしますと以下のようになります。

obs1.通番 | obs2.鳥名 |観測数
---------|----------|---
1        | スズメ    | 0
1        | カラス    | 0
1        | ハト      | 0
2        | スズメ    | 0
2        | カラス    | 0
2        | ハト      | 0
3        | スズメ    | 0
3        | カラス    | 0
3        | ハト      | 0

一気にコンパクト!
全部の鳥(スズメ、カラス、ハト)がそれぞれの通番に存在します。
観測数は0になっています。

※以下はこの時点でも理解が難しい方向け、かつ、ここまでの内容の整理をしたい方向けに作成しました。
毎回毎回カルテシアン積の表を作成するのは非効率なのでもう少し解法向けで考えると、今回の場合は「 3 (通番の数) × 3 (鳥名の数) = 9 行」になる!っていうこれだけでOKです。
これを一つずつ紐解きますと、以下になります。
・観測テーブルには (通番, 鳥名, 観測数) 列があります。
・通番は 1, 2, 3 の値を持ち、鳥名は スズメ, カラス, ハト の値を持ちます。
・FROM 観測 AS obs1, 観測 AS obs2 は、すべての可能な組み合わせを生成するので先ほどのような大量の組み合せができます。(36行)
・しかし、結局DISTINCTにより取得されるのは「obs1.通番 、つまりobs1の全通番 (1, 2, 3) 」と「obs2.鳥名 、つまりobs2の全鳥名 (スズメ, カラス, ハト)」の組み合わせのみです。obs1.鳥名などは全く考慮に入りません。
・よって結局最初から考えることは36行にもなる全ての組み合わせから「obs1.通番とobs2.鳥名の組み合わせのみを取得して表を生成する」これを言い換えると「obs1.通番とobs2.鳥名の組み合わせを作成する」と同義になります。だから3行*3行の9行になるということです。

難しいですが、ゆっくり読めば絶対に理解できるはず、、!
この辺り特に質問ご指摘いただけると幸いです。

ここまで分かればもうほとんどゴールです。最後に以下を見ていきます。一応ここが本題です。

WHERE NOT EXISTS (
    SELECT * FROM 観測 AS obs3
    WHERE a
    AND obs2.鳥名 = obs3.鳥名
)

これはサブクエリと言われるそうです。
そして、WHERE NOT EXISTSとは「()の条件を満たすデータが存在しない」場合に真となります。

よって、以下の流れで理解ができます。

1. 「観測」テーブル(obs3として参照)の中に、
2. aの組み合わせと同じものが、
3. 存在しない(NOT EXISTS)場合に、その行を選択する。

Claude3.5

そして、今回の問題を振り返ると
「一度でも訪れた野鳥については、観測されなかったときの観測数を 0 とするデータを明示的に挿入する」でした。
挿入するなんかINSERTまんまでしたね。
そして一度でも訪れていたら元の観測表に記載があるはずです。
でも、それは別の通番で訪れている可能性もあります。
「1番ではハトを見れなかったけど2番で見れたならそれは0匹として追加してくれ」と問題文を言い換えられますね。

つまり、今回のaの条件は「元のテーブルにない通番と鳥名のデータの組み合わせ」を見つけ出すことを目的としています。

今回は元の表をobs.3として取得しているのでobs.3の通番に存在しないobs.1の通番の行を追加したら良いと判断できそうです。

よって、答えは「ウ」になります。

いかがでしたでしょうか?
正直、生成AIだけで勉強できる未来は見えました。
確かにAIの回答は完全無欠ではないですが、今回の記事も8割は生成AIからの回答を基に勉強できたと思います。

プロンプトやAIの回答を今回そのまま載せてはいませんが、今後そのような内容も上げていこうと思います。※今プロンプトだけで作成したTENSAIボット君を作成中です。(笑)
※私はプロンプトについては相当厳しい目で見ていますのできっと有益な情報が提供できると思っています。プロンプト50選などで紹介される内容というよりも、生成AIの本質を捉えたプロンプトを作るにはどうすればよいかというのを追求した有料商材級の記事になると勝手に妄想を膨らませています。

本日はここまでです!
質問なども含め、何かありましたら是非コメント頂ければと思います。
本日もご高覧ありがとうございました。

この記事が気に入ったらサポートをしてみませんか?