生成AIを使って資格勉強を充実させたい！

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974422/be53de85-403b-3e1c-b9a2-55c15096f4e8.png)

# はじめに
こんにちは、貫見です。

突然ですが、みなさんは資格取得に向けて模擬試験や過去問を解いた経験はありますか？
おそらく「ない」と応える人はわずかだと思います。

問題の傾向や出題形式を確認したり、自身の理解度を確認したりと何かとお世話になる模擬試験ですが、こう思ったことはありませんか？
- 解きながら
    - 都度解説が欲しいなぁ… 解けなかったところはすぐ明確にしたい
    - 英語の問題しかなくて、機械翻訳だと直感的に分かりづらい
- 解き終わった後に
    - もう少し数をこなさないと不安だけど公式で提供されている問題は少ない⋯

私は思います。というか、現在進行系で思ってます。

<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974422/015d31b7-3fef-6db1-69b1-241585edc999.png">

<font color="DarkGray">(DALL-E3を使用して生成)</font>

<br>こんなときに、
 - なるべく自然な言語で、
 - 1問1答形式で都度 解説してくれて、
 - 私が満足するまで問題を生成してくれる

そんな素敵なアプリがあればなぁ〜。

 
というわけで、今回は**生成AIを活用した模擬試験アプリ**をなるべく手軽に作って、
(主に自分自身の)資格取得を手伝ってもらおうと思います。

:::note warn
<font color="Peru">
なお、本ブログに登場する試験問題や解説文などはAIによって生成されており、必ずしも全ての情報が正確であるとは限りません。最終的な判断や理解の確認は、公式ドキュメントを参照してください。
</font>
:::

# 欲しいものを整理する
**模擬試験を生成するWebアプリ**
- ユーザーの入力（資格名・試験名）をもとに対応した問題を生成する
- ユーザーの回答をAIが採点し、解説文を生成する

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974422/be087a7d-cae2-c725-d850-bcb2b53b592b.png)

おー。絵にするとイメージ湧きますね。

# 要件に落とし込む
わざわざ書き直すほどでもないかもしれませんがこんな感じです。
- ① ユーザーの入力（資格名・試験名）をもとに対応した問題文を生成する
    - 資格情報収集機能：資格名・試験名をもとに資格情報をWeb上から収集する
    - 問題文生成機能：資格情報に基づいた4択問題文を生成する
- ② ユーザーの回答をAIが採点し、解説文を生成する
    - 採点機能：4択問題文に対するユーザーの回答を評価し、正誤判定する
    - 解説文生成機能：各選択肢ごとに正誤判定の根拠を生成する
<br>

これは私の意見ですが、こういった資格勉強では
「とりあえず問題を解いてみて、なぜ正解した(間違えた)のか？」を解説やドキュメントをみて理解を深めていく方法が最も効率的だと考えています。
というわけで、模擬試験アプリを語るうえで「解説文生成」は欠かせないし、こだわりたいポイントです。

# レシピ
では、このアプリをどうやって作っていくかをザックリ紹介していきます。
## 材料
 - DockerインストールされたPC or サーバー
 - Dify (0.8.3) ※ 基本最新ver.でOKです
     - https://github.com/langgenius/dify
 - FireCrawl
     - https://github.com/mendableai/firecrawl
 - お好みのLLM
     - 今回はAzureOpenAI `Gpt-4o` を使用
 - プロンプトの知識（少々）

## 作り方

#### 1. Difyセットアップ

[公式ドキュメント](https://docs.dify.ai/ja-jp/getting-started/install-self-hosted/docker-compose
) を参考に、`git clone`して`docker compose up -d`します。
今回 私はDockerを使用しローカルPC上にホストしましたが、クラウド版もありますのでそちらでもOKです。
<font color="DarkGray">※ クラウド版を無料で使う場合は、セルフホストと比べて機能に制限があります。
</font>

#### 2. FireCrawlセットアップ
[Firecrawl](https://www.firecrawl.dev/) にサインアップして API キーを取得します。
クラウド版に抵抗がある方はセルフホストする方法もあります。

#### 3. DifyにLLMを接続する
1.でセットアップしたDifyにアクセスし、
`設定 > モデルプロバイダー`からお好みのLLMモデルをDifyに接続できます。

どのモデルを使用するかは後述するワークフロー作成時に選べますし、
複数のモデルに並行してリクエスト投げるみたいな使い方もできますので、
「ClaudeとGemini どっちにするか選べないよ〜🥺」という方は複数接続しておきましょう。

<font color="DarkGray">例：Azure OpenAIの接続：</font>
<img width="350" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974422/479450c1-d14d-8567-7fee-ada1d3aa7dc4.png">

#### 4. Difyアプリを作成する

今回はDifyに用意されている `Interview Preparation (IF/ELSE and Parallel Run)` テンプレートを参考に作成していきます。

できあがったものがこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974422/d7c15235-cbdf-cbee-1164-9680403385a5.png)

# いざ、実食
こまめに動作確認していたので概ね期待通りに動くことはわかっていますが、


はじめに、模擬試験アプリアクセスして取得したい資格名を入力します。
(今回は"google associate cloud engineer"と入れました)
![スクリーンショット 2024-10-03 17.04.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974422/aa6a9eed-4452-800b-9548-03f6331c8ba7.png)
↓　入力した資格名をもとに資格条件を検索・収集して⋯
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974422/dcb161c7-aa8b-66a6-bb38-257e4fbe91b7.png)
↓　いい感じにまとめてくれて⋯
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974422/299dbcbb-5486-dc61-546f-778b818ea17a.png)
↓　それっぽい問題を生成して⋯
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974422/626cc7a1-a22c-d0f6-75e0-1481e30e10ab.png)
↓　無事に(？)解答の採点と、解説文を生成してくれました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974422/e67c00b0-51a5-30e7-e2f7-363876be8154.png)


# 改善点
- 複数回試すと似たような問題が生成されてしまう
    - 生成済みの問題をキャッシュしておく
- 生成された解説文が正しいかを確認するのが大変
    - 各選択肢の内容をもとに公式ドキュメントをクロールしつつ、その内容をLLMで要約するようにすれば、ある程度の正しさを担保しつつ、公式ドキュメントのリンクを貼ることができそう
- 試験情報をWebから取得できない資格の場合、問題が生成されない
    - そもそもクローリング不可だったり、Web上に試験範囲が明記されていなかったり... etc


# まとめ
LLMを活用した模擬試験アプリを作ってみた結果、
Difyを活用することで、比較的簡単に作成することができた。
ただし、本格的に資格勉強に活用するにはもう少し工夫が必要だった。

# おわりに
今回は資格試験というテーマで1日もかからずアプリ構築ができ、トライアルを通じて具体的な課題や改善策を洗い出すことができました。
Dify自体も多機能且つ簡単にLLMアプリの開発・改善が可能なので、「もしかすると普段 業務でやっているこれもできるんじゃないか？」というアイディアを、とりあえず試してみるのにピッタリだと思いました。

---
弊社X では、Qiita投稿に関する情報や各種セミナー情報をお届けしております。
情報収集や学びの場を求める皆さん！ぜひフォローしていただき、最新情報を手に入れてください:grinning:

https://x.com/kccs_digital