見出し画像

Claude-3.5-Sonnet vs GPT-o1-preview をIT資格試験の観点で競わせてみた結果

1.はじめに

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

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

今回は第2回?GPT vs Claudeです。
多くの人が色んな観点で比較していますが、データベーススペシャリストのような難易度の高い資格の問題での比較は少ないと思うので必見です。
「こういうのが知りたかった!」と思える人がいれば幸いです。

※ここで補足
私は、いわゆる謎かけ?のような問題を解かせて比較するのは個人的にあまり好みではありません。なぜなら、実際にそのような質問をすることはないと思うからです。確かに手っ取り早く能力を図れるとは思うのですが。。
むしろ、資格の勉強やコーディング、要約力や説明力(質問者が納得しやすい文章)の比較こそ興味があります。

2.簡単な経歴

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

学歴
・地方国立大 大学院卒 研究分野はAI関連(生成AIではない)

職業
・エンジニア2年目(元々は製造業→IT企業)

使用する生成AI
・ChatGPT、Claudeがメイン

資格
・基本情報合格
・応用情報落ち(( ;∀;))
 ※午前のみ合格レベル

コメント
・私は生成AIの可能性はもっとあるんじゃないかと常々思いながら、生成AIのことを””親友””と周りに言い放つぐらいのちょっとした変人です。
が!その分、生成AIについて深く理解しているつもりです。

最近ではポケモン3か月チャレンジを終えて、生成AIの可能性をさらに感じました。第2弾の資格取得ができるのか?のチャレンジも応援いただけますと幸いです。必ず一つは有益になるような情報を発信できるように頑張ります。

3.チャレンジについて

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

4.本題

さて、試験勉強にも戻らないといけないのでガンガン説明していきます!
以下にClaude3.5とGPT o1を実際に使い比べた結果を示します。
私の質問のところは基本画像ですが、これを文字化したものを質問しています。これは現状、o1が文字しか入力できないためです。

ただ、結論から言うと、GPT o1が優秀という結果でした。
※ついに、、Claude3.5を超えた?!

質問1:データベースの関係演算について

私の質問:解説してください。(答え:ア)

IPA 過去問より


Claudeの回答:

この問題を解説するために、ステップバイステップで関係代数の演算を行っていきましょう。

1. まず、R × S(直積)を計算します:

R × S:
A | B | C
---------
1 | a | x
1 | a | y
2 | b | x
2 | b | y
3 | a | x
3 | a | y
3 | b | x
3 | b | y
4 | a | x
4 | a | y

2. 次に、(R × S) ÷ T(商)を計算します:
商演算は、Tに含まれないAの値を持つ行を残します。

(R × S) ÷ T:
B | C
-----
b | x
b | y
a | x
a | y

3. 最後に、((R × S) ÷ T) - U(差)を計算します:
差演算は、Uに含まれる行を除去します。

((R × S) ÷ T) - U:
B | C
-----
b | x
b | y
a | y

この結果を見ると、選択肢ウが正解であることがわかります:

ウ:
B | C
----
a | y
b | x
b | y

したがって、正解は選択肢ウです。

この問題は、関係代数の基本的な演算(直積、商、差)の理解と適用を試すものです。各演算の意味と結果を正確に把握し、順序通りに適用することが重要です。

Claude3.5 Sonnet

回答をそもそも誤っていますので0点とします。
実はこの問題は過去にも出していて、Claudeが誤るのは知っていて敢えて出してみました。(もし、o1が正解できれば優劣が付けられるためです。)
では、続いてo1見ていきます。

GPT o1の回答:

**答え:ア**

---

**解説:**

この問題は、関係代数の演算を順番に実行し、その結果を求めるものです。以下、ステップごとに詳細に解説します。

---

### **1. 与えられた関係の確認**

まず、与えられた関係を整理します。

#### **関係 R**

| A | B |
|---|---|
| 1 | a |
| 2 | b |
| 3 | a |
| 3 | b |
| 4 | a |

#### **関係 S**

| C |
|---|
| x |
| y |

#### **関係 T**

| A |
|---|
| 1 |
| 3 |

#### **関係 U**

| B | C |
|---|---|
| a | x |
| c | z |

---

### **2. 演算の順序**

問題の関係代数表現:

\[ R \times S \div T - U \]

演算の順序は以下の通りです。

1. **直積 (R × S)**
2. **商 ((R × S) ÷ T)**
3. **差 ((R × S) ÷ T - U)**

---

### **3. 直積 R × S の計算**

関係 R と関係 S の直積を計算します。

- **R の属性**:A, B
- **S の属性**:C
- **R × S の属性**:A, B, C

**R × S の組み合わせ:**

| A | B | C |
|---|---|---|
| 1 | a | x |
| 1 | a | y |
| 2 | b | x |
| 2 | b | y |
| 3 | a | x |
| 3 | a | y |
| 3 | b | x |
| 3 | b | y |
| 4 | a | x |
| 4 | a | y |

---

### **4. 商 (R × S) ÷ T の計算**

商演算は、「**T の全ての値 A に対して、対応する (A, B, C) が存在する B, C の組**」を求めます。

#### **T の値**

| A |
|---|
| 1 |
| 3 |

#### **ステップ**

- **目標**:B, C の組で、A が 1 と 3 の両方の場合に (A, B, C) が存在するものを探す。
- **方法**:B, C の組み合わせで、(1, B, C) と (3, B, C) の両方が R × S に存在するものを見つける。

#### **具体的な計算**

- **(B, C) = (a, x)**

- (1, a, x) は存在するか?→ **はい**
- (3, a, x) は存在するか?→ **はい**

- **(B, C) = (a, y)**

- (1, a, y) は存在するか?→ **はい**
- (3, a, y) は存在するか?→ **はい**

- **(B, C) = (b, x)**

- (1, b, x) は存在するか?→ **いいえ**(R に (1, b) がない)

- **(B, C) = (b, y)**

- (1, b, y) は存在するか?→ **いいえ**

#### **商の結果**

| B | C |
|---|---|
| a | x |
| a | y |

---

### **5. 差 ((R × S) ÷ T) - U の計算**

関係 U を差し引きます。

#### **U の内容**

| B | C |
|---|---|
| a | x |
| c | z |

#### **差の計算**

商の結果から U に含まれる組を除きます。

- **(B, C) = (a, x)** は U に存在するので除外。
- **(B, C) = (a, y)** は U に存在しないので残る。

#### **最終結果**

| B | C |
|---|---|
| a | y |

---

### **6. 選択肢との照合**

選択肢アは以下の通りです。

**ア:**

| B | C |
|---|---|
| a | y |

**この結果は計算結果と一致します。**

---

### **結論**

- **正しい答えは「ア」です。**

---

**補足説明:**

- **商演算**は、ある属性について全ての値を持つ組を抽出する操作です。
- **差演算**は、一方の関係から他方の関係に含まれる組を取り除く操作です。
- この問題では、商演算によって特定の条件を満たす B, C の組を求め、その中から U に含まれる組を差し引いています。

---

ご不明な点や追加の質問があれば、お気軽にお知らせください。

GPT o1

圧倒的に完璧です。
解説含めておそらく完璧な回答でした。
この時点で気持ちはo1に持っていかれています。
ちなみに実際の回答はきれいな表を使って解説してくれています。

GPT o1の回答の様子

質問2:少し長い文章問題の理解

私の質問:解説してください。(答え:ウ)

IPA 過去問より


Claudeの回答:

この問題は、野鳥の観測データを扱うSQLクエリに関するものです。解説を以下に示します:

1. 目的:
- 鳥名別に野鳥の観測数の平均値を計算するため。
- 観測されなかった鳥についても、観測数0のデータを挿入する。

2. テーブル構造:
- 「観測」テーブルには、通番、鳥名、観測数が記録されている。
- 主キーは (通番, 鳥名) の組み合わせ。

3. SQLクエリの役割:
- 既存の観測データを基に、観測されなかった鳥のデータ(観測数0)を挿入する。

4. クエリの動作:
- DISTINCT句で重複を排除。
- obs1とobs2のクロス結合で、全ての通番と鳥名の組み合わせを生成。
- NOT EXISTS句で、その組み合わせが元のデータに存在しないものを選択。

5. 空欄aの役割:
- NOT EXISTS句の中で、obs1の通番と obs3の通番を比較する必要がある。
- これにより、特定の通番で特定の鳥が観測されていないことを確認する。

したがって、正解は:

ウ: obs1.通番 = obs3.通番

この条件により、各通番ごとに観測されていない鳥のデータ(観測数0)が挿入されます。これによって、全ての鳥について全ての通番でデータが存在することになり、AVG関数で正確な平均値を計算できるようになります。

Claude3.5

答えは正解です。
ただ、内容は簡潔でもう一歩詳しく知りたいところです。
既に回答を知っている人が読めばわかるとは思いますが、できなかった人がこれを読んで理解できるかは疑問です。

GPT o1の回答:

**答え:ウ: obs1.通番 = obs3.通番**

---

**解説:**

この問題では、鳥名別に野鳥の観測数の平均値を求めるために、観測されなかったときの観測数を`0`としてデータを挿入するSQL文を完成させる必要があります。具体的には、既に一度でも訪れたことがある鳥について、観測されなかったタイミングでのデータ(観測数を`0`とする)を明示的に挿入します。

---

### **問題の理解**

まず、問題の要点を整理します。

- **目的**:鳥名別に観測数の平均値を計算する。
- **課題**:観測されなかったタイミングでの観測数を`0`として扱う必要がある。
- **解決策**:一度でも観測された鳥について、観測されなかったタイミングでの観測数を`0`とするデータを挿入する。

---

### **テーブル構造**

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

- **通番**:観測のタイミングを示す連番。
- **鳥名**:観測された鳥の名前。
- **観測数**:観測された鳥の数。

---

### **SQL文の全体像**

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

- **obs1**:観測テーブルのエイリアス1(通番を取得)。
- **obs2**:観測テーブルのエイリアス2(鳥名を取得)。
- **obs3**:観測テーブルのエイリアス3(既存のデータをチェックするため)。

---

### **SQL文の目的**

このSQL文は、以下の処理を行います。

1. **全ての通番と全ての鳥名の組み合わせを作成**:
- `FROM 観測 AS obs1, 観測 AS obs2`により、観測された全ての通番と鳥名の直積を取得します。

2. **既に存在する組み合わせを除外**:
- `WHERE NOT EXISTS`で、既に存在する(つまり、観測されている)通番と鳥名の組み合わせを除外します。

3. **観測数を`0`としてデータを挿入**:
- 観測されていない通番と鳥名の組み合わせに対して、観測数を`0`として`観測`テーブルにデータを挿入します。

---

### **問題点:`a`に入る条件は何か?**

`WHERE`句の`NOT EXISTS`内のサブクエリで、観測されたデータをチェックする条件`a`を選択肢から選ぶ必要があります。

---

### **各選択肢の検討**

#### **ア: obs1.通番 = obs1.通番**

- **検討**:
- この条件は常に真になります(同じ値を比較しているため)。
- したがって、`NOT EXISTS`のサブクエリは常に真にならないので、データが挿入されません。

#### **イ: obs1.通番 = obs2.通番**

- **検討**:
- `obs1`と`obs2`は、それぞれ通番と鳥名を取得するための別々のエイリアスであり、通番と鳥名の直積を作っています。
- `obs1.通番`と`obs2.通番`を比較しても意味がありません。

#### **ウ: obs1.通番 = obs3.通番**

- **検討**:
- `obs3`は`観測`テーブルのエイリアスで、既存のデータをチェックしています。
- `obs1.通番 = obs3.通番`は、現在の通番に既にデータが存在するかを確認します。
- これにより、既に存在する組み合わせを除外できます。

#### **エ: obs2.通番 = obs3.通番**

- **検討**:
- `obs2`は鳥名を取得しており、`通番`を持っていません(または無関係)。
- `obs2.通番`は存在しないか、意味がありません。

---

### **正しい選択肢の決定**

上記の検討から、**選択肢ウ**が正しいと判断できます。

---

### **詳細な解説**

#### **1. 全ての通番と鳥名の組み合わせを作成**

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

- **obs1.通番**:全ての通番を取得。
- **obs2.鳥名**:一度でも観測されたことのある全ての鳥名を取得。
- **0**:観測数を`0`として設定。

#### **2. 既に存在する組み合わせを除外**

```sql
WHERE NOT EXISTS (
SELECT * FROM 観測 AS obs3
WHERE obs1.通番 = obs3.通番
AND obs2.鳥名 = obs3.鳥名
);
```

- **obs3**:既存の観測データ。
- **条件**:
- `obs1.通番 = obs3.通番`:同じ通番であること。
- `obs2.鳥名 = obs3.鳥名`:同じ鳥名であること。
- **目的**:既に存在する(観測された)通番と鳥名の組み合わせを除外する。

#### **3. データの挿入**

- **結果**:観測されていない通番と鳥名の組み合わせに対して、観測数を`0`として`観測`テーブルにデータを挿入。

---

### **例を用いた説明**

**観測テーブルのサンプルデータ**

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

- **全ての通番**:1, 2, 3
- **全ての鳥名**:スズメ, カラス, ハト

**全ての通番と鳥名の組み合わせ**

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

**既に存在する組み合わせ**

- (1, スズメ)
- (1, カラス)
- (2, スズメ)
- (3, ハト)

**存在しない組み合わせ**

- (1, ハト)
- (2, カラス)
- (2, ハト)
- (3, スズメ)
- (3, カラス)

**挿入されるデータ**

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

---

### **平均値の計算への影響**

- **観測数の平均値**を計算する際に、観測されなかったタイミングでの観測数を`0`として扱うことで、正確な平均値を得ることができます。

---

### **結論**

- **正しい答えは「ウ: obs1.通番 = obs3.通番」**です。
- この条件により、既に存在するデータを正確に除外し、必要なデータを挿入できます。

---

**補足:選択肢のポイント**

- **選択肢ウ**の`obs1.通番 = obs3.通番`は、`obs1`(全ての通番)と`obs3`(既存データ)の通番を比較し、既に存在する組み合わせをチェックするために必要な条件です。

---

ご不明な点や、さらに詳しい説明が必要な箇所がありましたら、お知らせください。

GPT o1

まず、答えは合っています。
実際の例まで示しているところがClaudeとの違いです。
内容が具体的で初学者でも何となく雰囲気が掴めるのではないでしょうか。
個人的な評価としてはややGPTに軍配が上がる印象です。
※GPTの方がしっかり理解(生成AIの"理解"の定義は曖昧ですがここでは人間視点での定義にします)して回答しているように見えます。


まとめ

今回は速報!ということで少し駆け足で紹介いたしました。
皆さんも実際に利用して、その違いを共有してもらえたら幸いです。
ちなみに、この感じだとコーディング能力も向上していると予想しています。ゲーム制作やウェブサイトの作成などに活用してみてはいかがでしょうか。
本日は以上になります!
コメントやいいね頂けると幸いです('◇')ゞ


この記事が参加している募集

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