GPTsで無限に模擬問題を生成して資格対策

本稿は[面倒なことはChatGPTにやらせよう Advent Calendar 2024](https://adventar.org/calendars/10145)のDay 13の記事です。

また、本稿の内容は [AIミーティング 2024/12/11](https://osaka-driven-dev.connpass.com/event/337290/)でLTとして発表しています。

# 1. 概要
少し遡りますが、2024年8月末に**E資格2024#2**を受験し、合格しました。
この試験対策にあたり、**OpenAIのカスタムGPTsで模擬問題を生成してそれをひたすら解く**という方法を採っていましたので、作成した内容や、実際やってみての雑感を記載します。

# 2. E資格について
直接、今回の内容とは関係ないのですが、ご存知ない方のために少し説明しておきます。

https://www.jdla.org/certificate/engineer/

E資格は、 **一般社団法人 日本ディープラーニング協会(JDLA)** が実施している、ディープラーニング全般に対する知見を問う資格です。

JDLAが実施しているものとしては「G検定」が有名ですが、G検定がディープラーニングの基礎知識を問うものであるのに対して、E資格は実際に実装に携わるエンジニア向けの資格であることが特徴です。

単なる座学知識だけでなく実際に実装する力もあることを保証する観点から、**JDLAが認定する対策講座を修了することが受験にあたっての条件**になっています。

ただし、**テスト問題自体はCBTでの多肢選択式**で、コーディング実技や記述問題などはありません。

## 3. 受験、GPTs作成に至る流れ
オンラインで受けられるE資格対策の講座を申し込んだのは6月上旬だったのですが、6月7月は他の資格の受験があり後回しになっていたため、**8月末の受験に対して実質的には試験対策を始めたのは7月下旬**から。かなりギリギリの状態でした。

ここで以前どこかで目にした話として、**先に教材を入念に確認してから試験に臨むよりも、ひたすら模擬問題を解き続けたほうが効率がよく定着もする**というものを思い出しました。

ただ、
- 2024#2のE資格はちょうど**Transformerの台頭を念頭にシラバスが大きく改訂されたタイミング**であり、**市販の問題集は対応できているものが見当たらなかった**こと
- **元々厚い問題集(紙でも電子書籍でも)で試験対策するのが苦手**だったこと

が、私の場合のネックでした。

### ChatGPT、GPTsとの接点
2022年のChatGPT登場以降、ちょこちょこお試し程度で触ってはいたものの、がっつりと使い方を把握するまでには至らないまま2024年を迎えていました。

個人としてはいろいろと使えるようになりたいと思っていたこともあり、今年5月頃に、[面倒なことはChatGPTにやらせよう](https://www.amazon.co.jp/%E9%9D%A2%E5%80%92%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AFChatGPT%E3%81%AB%E3%82%84%E3%82%89%E3%81%9B%E3%82%88%E3%81%86-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E3%82%AB%E3%83%AC%E3%83%BC%E3%81%A1%E3%82%83%E3%82%93/dp/4065342902)の書籍を見て、提示されていたサンプルを試すなどしていました。

この書籍の中ではCSVの分析や音声の解析など、いろいろなユースケースのサンプルが例示されており、**その後のちょっと使いでも「こうしたらできるんじゃない？」の幅を広げることができてよかった**です。

今回書いている内容もその一つで、PDFからの情報読み取りや分析の作成というところから、問題も同じように作れないかと着想を得て、ChatGPTを使って問題生成しての資格対策をすることに決めました。

**GPTsの作成にはPlus($20/月)の契約が必要**ですが、他のことにも使うと思えば参考書を買うよりかは安いかとも考え、契約することにしました。

# 4. させたい内容
E資格のシラバスは[公式ページ](https://www.jdla.org/certificate/engineer/#engineer_No03)でPDFとして公開されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619482/c0083ea0-cf2a-b65c-09d7-d95b85e6a36a.png)

この中では以下のように**表形式で出題範囲のキーワードが書かれ、今回から出題範囲外となった内容は灰色背景**にされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619482/a2188617-48bb-959b-a762-abcf993376bd.png)

今回、ここにあるキーワードを使う形で、かつ実際の出題形式に合うように問題を作って解くべく、全体としては以下の内容をさせようとしています。
```mermaid
flowchart TB
    A[シラバスのPDFを<br/>読み込ませる] --> B[適当なキーワードから<br/>所定の形式の問題を<br/>生成させる]
    B --> C[回答する]
    C --> D[正解不正解と解説をもらう]
    D --> B

```

# 5. 簡単な試行
ひとまず、**シラバスのPDFをそのまま送って、以下のようにプロンプトを投げる**だけでも、問題は作ってくれます。
ユーザー入力1
> e-syllabus_2024.pdfに記載されているキーワードを使って、4択の問題を出してください。ユーザーが答えを返してきたら、それに対する正解・不正解を説明し、問題について解説してください。

回答1
> では、シラバスに基づいたキーワードを使用して以下のような4択問題を作成します。
> 
> **問題**  
> 以下のうち、確率・統計分野において「期待値」の定義に最も関連するものはどれですか？
> 
> 1. 二項分布  
> 2. 平均二乗誤差  
> 3. 確率変数  
> 4. KLダイバージェンス  
> 
> 答えを選んでください！

ユーザー入力2
> 3

回答2
> **正解です！**
> 
> **解説**  
> 期待値とは、確率変数に関する統計的指標の一つで、確率分布に基づいた「平均」の概念を示します。期待値は、確率変数の各値にその値が発生する確率を乗じたものを総和した結果として計算されます。そのため、選択肢3の「確率変数」が最も関連性が高いです。
> 
> **その他の選択肢についての説明**  
> 1. **二項分布**  
> 　二項分布は離散確率分布の一つで、特定の試行回数における成功回数を表しますが、期待値自体の定義ではありません。
> 
> 2. **平均二乗誤差**  
> 　これは回帰分析やモデル評価に使用される指標であり、期待値の定義とは異なります。
> 
> 4. **KLダイバージェンス**  
> 　これは情報理論の指標で、2つの確率分布間の差を測定するものであり、期待値とは直接の関係がありません。
> 
> 次の問題が必要であれば教えてください！

ここで出てきたのはちょっと変な問題ではありますが、このやり方でいけそうだな、という印象は持ちました。
# 6. 改善
しかし、**「灰色の背景は範囲外なので除いて」などと指示しても、範囲外だと認識してもらえませんでした。**
今回、範囲外の内容に時間を割けないことから確実に除きたかったので、**PDFの内容から範囲外の内容を除いてMarkdown化**することにしました。
ここもChatGPTにやってもらいましたが、やはり範囲外をうまく除けなかったので、そこは手作業で行いました。
(とはいえ、PDFからすべて手作業で抽出するよりは格段に省力化できました)
<details><summary>変換を試した際のプロンプト。しかしうまく除いてくれなかった</summary>

私
> このPDFの表の中で、出題範囲外のものを除いた細項目とキーワードを抽出してください

GPTの回答
> PDFの表の中で、出題範囲外（グレー網掛け）のものを除いた細項目とキーワードを以下に抽出します。
> 
> ### 数学的基礎
> - **線形代数**
>   - 行列演習: 行列・テンソルの積、勾配、行列のランク、テンソル、アダマール積
>   - 固有値分解・特異値分解: 固有値、固有ベクトル、対角化、特異値、特異ベクトル
> 
> - **確率・統計**
>   - 一般的な確率分布: 確率変数、同時確率、条件付き確率、周辺確率、確率質量関数、確率密度関数、期待値、分散、共分散、ベルヌーイ分布、二項分布、カテゴリカル分布、ガウス分布、t分布、混合ガウス分布、中心極限定理
>   - 確率モデルにおけるパラメータ推定: ベイズ則、ナイーブベイズ、平均二乗誤差、対数尤度、ダイバージェンス、最尤推定、MAP推定、ベイズ推定
> 
> ＜＜＜以下省略＞＞＞

</details>

これで、ひとまずMarkdownをリソースにして進めていましたが、以下を改善したいと思いました。
1. 回答後の解説時、**絶対にすべての選択肢で正解・不正解の説明をしてほしい**
    - **何も指示しないと、解説をつけたりつけなかったりする**
    - ハルシネーション対策や純粋に勉強のために、すべての選択肢についての解説が欲しい
1. **どのキーワードを使って出題したか**明示させたい
    - **問題を見ただけではどこから出題したか分かりにくい**ため
1. **ハルシネーションをなくしたい**
    - 特に、**出てきた選択肢に正解がなかったり、正解が2つあったり**すると**解く意欲が下がる**ため
1. **出題範囲や出題形式を指定**できるようにしたい
    - 単純にキーワード数の比率によるところもあり、**何もしないと結構出題範囲が偏る**ため

これらを解決するため、GPTs化しつつシステムプロンプトを作り込むことにしました。

# 5. システムプロンプトでの工夫
GPTsでのシステムプロンプト全体は、[LT資料](https://speakerdeck.com/hsg_alf/gptsdemo-ni-wen-ti-sheng-cheng-sitezi-ge-dui-ce-sitemiru?slide=21)から確認いただけますが、上記改善に関わる部分を紹介しておきます。
## 利用の流れに関する記載
利用の流れについての指示の中で、**出題範囲や出題形式指定に対応するよう指示**しました。
<details><summary>冒頭部分での命令記載</summary>

> - ユーザーの要求が問題の作成である場合は、出題範囲.mdの内容に基づいて問題を出題してください。
> - 問題に対してユーザーが回答している場合は、回答に対する正誤と内容の解説を行ってください。
> - 出題範囲や問題形式が何かについて質問している場合は、それについて回答してください。サポートしている問題形式は以下のとおりです。
>     - 説明の穴埋め問題
>     - 説明の正解を選ぶ問題
>     - 説明の誤りを選ぶ問題
>     - 数式問題
>     - プログラム穴埋め問題

</details>

<details><summary>各ステップで実施すべき内容に関する指示</summary>

> ## 0. (オプション)利用者による出題範囲・形式の指定
> 出題範囲.mdの中の見出しの何れかが指定された場合は、その見出しの配下にある内容から出題してください。
>  
> また、問題の形式が指定された場合は、その形式の問題を3で作成してください。
>  
> 指定がない場合は、出題範囲.mdの全体の中から無作為に出題してください。
>  
> ## 1. 問題を作成するキーワードの選択
> - 0で見出しが指定された場合はその見出しの配下から「キーワード」にある単語の一つをランダムに選択します。
> - 0で形式が指定された場合は、その形式に適した「キーワード」にある単語の一つをランダムに選択します。
> - 指定がない場合は、出題範囲.mdの全体の中から、「キーワード」にある単語の一つをランダムに選択します。

</details>

## 解説時記載の形式指定
以下のように**フォーマットを指定する**ことで、全選択肢に対する解説と、使用したキーワードの内容を確実に記載してもらえるようにしました。
<details><summary>回答の正誤判定と解説</summary>

> ユーザーが問題に回答したら、扱われたキーワードと問題の内容に関して解説してください。
>  
> ```
> ## 正解
> あなたの回答: {answer} … 正解 / 不正解
> ## 関連するキーワード
> {keyword}
> ## 解説
> [キーワードに関する解説をする]
> ### 各選択肢の正誤
> [各選択肢の正誤を説明する]
> ```
</details>

## 問題形式の例示
以下のように、**それぞれの形式での参考問題を記載**することで、出題内容を保証しました。
**選択肢を生成するときに、正解1つ・誤り3つを作る**ことを明示的に指示しました。
<details><summary>説明の正解を選ぶ問題での指示内容</summary>

> キーワードに関連した説明文で誤りを含むものを3つ、正しいものを1つ生成し、正しいものがどれかを選択させます。
> #### 例
> ResNetの残差接続（Residual Connection）に関する以下の説明の中で、正しいものを一つ選べ。
> A) ResNetの残差接続は、各層の出力を常にゼロに固定し、学習プロセスを単純化する手法である。
> B) ResNetの残差接続は、主にパラメータ数を大幅に削減することを目的として導入された手法である。
> C) ResNetの残差接続は、前の層の出力（入力特徴量）を後段の層の出力に足し合わせることで勾配の流れを改善し、より深いネットワークでも効果的な学習を可能にする。
> D) ResNetの残差接続は、出力層付近にのみ適用され、深い層内部では利用されない手法である。

</details>

## インターネット検索の必須化(ハルシネーション対策)
元々、作問時、解説時それぞれでのハルシネーション抑止のため、インターネット検索をするよう各所で指示していました。

ただ、**結局あまりうまくいかなった**ため、公開しているものでは削除しています。

-----------
これら一連の改善で、使いやすい状態にすることができました。

数式問題(Cでも間違いではないのですが…)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619482/c5a21404-affc-201e-2770-3aa678a1ae96.png)
プログラム問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619482/f8812580-e858-a6ba-be6e-f52755fedd4f.png)

# 6. 使ってみての雑感 - よかった点
## 学習効率
兎にも角にもこれが一番大きなところと感じました。
私自身は、前述したようにある程度厚くて大きい参考書を開いて真面目に勉強…というのが、特に社会人になってからはなかなかできない質でしたが、GPTsを使うことで、スキマ時間でもすぐにスマホから資格対策ができたので、非常にはかどりました。
問題形式や範囲も指定できるようになったので、時々シラバスを眺めて（この辺りのキーワードあんまり覚えてないな…）というものを指定して解いたりもでき、助かりました。

## ハルシネーション対策でいろいろと調べるので結果的に理解が深まる
これは逆説的ではありますが、ハルシネーションがあるので、正解だった場合も含めて、一つ一つの問題文、解説文の内容については徹底的に調べざるを得なくなりました。

これが結果的には、一つ一つの概念や問題にしっかり向き合うことに繋がり、理解の深化、定着に役に立ったと思うところではあります。

# 7. 使ってみての雑感 - いまいちな／改善したい点
## ハルシネーション
よかった点に挙げはしましたが、正直毎回の生成内容をくまなく調べるのは疲れる作業ではあるため、言うまでもなく、そもそも問題や解説に誤りが含まれないことが理想ではあります。

特に、勉強する側がまだ十分に概念の理解が進んでいない時点では、個別で調べながら進めて誤った結論に達してしまうリスクもあるので、注意しなければならないとは思います。

この点について根本的な解決はあまり思いつきませんが、**参考書として使えるPDFなどがあればそれもリソースに含める**ことで改善が期待できるかもしれません。
今回はそれに近い効果を、インターネット検索させることで期待しましたが、そちらはうまくいきませんでした。
## 利用回数制限
GPTsは裏では、GPT-4oのモデルを利用しているため利用回数制限を受けます。
**Plusの場合は40回/3時間**なので、**問題→回答のラリーとしては20回**までですが、**GPTs以外の通常のChatGPT利用とも合算**になるため、もっと少なくなる可能性もあります。

実際、はりきって問題を解いている最中に回数制限にあたり、やむなく勉強を中断する場面も何度かありました。

対策としては、以下が考えられます。
1. **Assistants APIをSandbox経由で使う**
    - 利用した分のみの課金になるので使用量次第ではPlus契約より安くなるかもしれない
    - スマホでもブラウザ経由のアクセスになるため使用感は下がる
2. **GeminiのGems, ClaudeのProjectの利用**
    - いずれもChatGPTよりは利用回数制限がゆるい
    - いずれも数式描画の対応がないか、ChatGPTより不十分
3. **Pro($200/月)契約する**
    - 言うまでもなく高価だが、完全に無制限に使えるようにはなる
    - 他のPro機能も使える

特にGeminiは無料で利用できますので、数式が絡まない領域であればGeminiを使うのが最適かもしれません。

# 7. まとめ
**キーワードを書いたPDFだけで、本来知識がないと作れないような問題が作れる**というのは個人的には、初めて試したときは衝撃でした。

ハルシネーションも未だあるとはいえ低減してきてはいますので、GPT側で知識を持っていることが期待できる分野ではこうした使い方が十分できるな、というところです。

また今回書きませんでしたが、選択式ではなく記述式の問題でも使えるかもしれません。

資格やそれ以外の場面の学習において、本稿の内容をご参考いただるようであれば幸いです。

# 8. LT時の資料
作成したGPTsに関する情報(リンク、システムプロンプト全体などの情報)は以下LT資料に掲載しています。

https://speakerdeck.com/hsg_alf/gptsdemo-ni-wen-ti-sheng-cheng-sitezi-ge-dui-ce-sitemiru