皆さんこんにちは、横浜で清掃業をしているヤスです。
前回は【Dify上級】問い合わせを貼るだけでFAQ・対応マニュアル・改善提案書を全自動生成!
のアプリを作りましたね。今回はこちらです。
1. 教材を読んで問題を作る作業、全部AIに任せましょう
「この教材から問題集を作りたいけど、一から考えるのが大変…」「試験対策の問題を用意したいけど時間がない」「塾・企業研修・自己学習で使える問題集が欲しい」先生・研修担当者・自己学習者なら誰もが感じる悩みです。
今回紹介する「教材PDF→問題集+解説+難易度別演習プラン自動生成くん」は、教材PDFをアップするだけで以下を全自動生成します。
- 教材の重要概念・キーワードの抽出(重要度:高・中・低の3段階)
- 一問一答問題集(難易度別・正答・ポイント付き)
- 穴埋め問題集(4択選択肢・解説付き)
- 記述問題集(模範解答・採点基準ルーブリック付き)
- 入門・標準・上級の3段階演習プラン(日別スケジュール・チェックリスト付き)
実際にPython基礎入門テキストのPDFでテストしたところ、変数・関数・制御構文・例外処理などPDF固有の内容に基づいた問題集が数分で完成しました。先生・研修担当者・塾講師・自己学習者全員に刺さるアプリです。
2. 実際の出力サンプル
📚 問題集+演習プラン 自動生成 教科:プログラミング・IT 学習目標:基礎固め 📖 STEP1 教材分析 推定タイトル:Python基礎入門テキスト 章構成:第1章Pythonとは / 第2章変数とデータ型 第3章制御構文 / 第4章関数 / 第5章例外処理 重要度【高】:変数・for文・while文・def・try/except ✅ STEP2 一問一答(標準20問・易8・普8・難4) Q1【易】用語定義型 変数とは何ですか? 答え:プログラム内でデータを保存するための記号的な名前 ポイント:変数はデータを一時的に保持するために使われます 📝 STEP3 穴埋め(標準20問) 問1【易】空欄数:1 変数は___を保存するための記号である。 a)データ b)関数 c)クラス d)メモリ 正答:a)データ / 解説:変数はデータを格納する… ✍️ STEP4 記述(10問・採点基準付き) 問1【説明型】難易度:易 関数の役割について再利用性の観点から説明しなさい(200字) 模範解答:関数は特定の処理をまとめたもので… 採点基準:3点=再利用性・具体例を含む / 2点=基本説明のみ 🗓️ STEP5 演習プラン(3段階) 入門:7日間・30分/日・易問題中心 標準:7日間・45分/日・一問一答+穴埋め並行 上級:7日間・60分/日・記述問題重点
💡 テキスト抽出ブロックを使うことでPDFの内容を正確にLLMに渡せます。スキャン画像のみのPDFは読み取れません。
3. このアプリが特に刺さる人
| こんな人に刺さる | 解決できる悩み |
| 学校の先生・塾講師 | 教材から問題集を作る時間が数時間→数分になる |
| 企業研修の担当者 | 研修テキストから確認テストを自動生成できる |
| 資格試験の受験者 | テキストをアップするだけで過去問形式の問題が生成される |
| 自己学習者 | 読んだ本・教材の理解度を問題形式で確認できる |
| EdTech系のサービス開発者 | コンテンツから問題集を自動生成するサービスの核心部分として使える |
4. 全体のブロック構成
| # | ブロック名 | 種類 | 役割 |
| 1 | ユーザー入力 | 開始 | PDF・教科・レベル・問題数・目標を入力 |
| 2 | テキスト抽出 | テキスト抽出 | PDFからテキストを変換して出力 |
| 3 | 重要概念抽出 | LLM① | 教材の重要概念を重要度別に抽出・整理 |
| 4 | 一問一答生成 | LLM② | 難易度別・問題タイプ別の一問一答を生成 |
| 5 | 穴埋め問題生成 | LLM③ | 4択選択肢・解説付きの穴埋め問題を生成 |
| 6 | 記述問題生成 | LLM④ | 模範解答・採点基準付きの記述問題を生成 |
| 7 | 演習プラン生成 | LLM⑤ | 3段階の難易度別演習プランを生成 |
| 8 | 最終整形 | テンプレート変換 | 全ドキュメントを1つにまとめる |
| 9 | 出力 | 終了 | 最終結果を出力 |
5. 今回の核心:テキスト抽出ブロックの使い方
このアプリで最も重要なのが「テキスト抽出ブロック」です。DifyのLLMはPDFをそのまま読み取れないため、テキスト抽出ブロックを経由させる必要があります。
| 方法 | 確実性 | 設定の簡単さ |
| テキスト抽出ブロック経由(推奨) | ✅ 確実 | ✅ 簡単 |
| LLMのコンテキスト機能 | ⚠️ 不安定 | ⚠️ 設定が複雑 |
| ビジョン機能でPDFを読む | ✅ 確実 | ⚠️ 10ページ以内限定 |
| テキストを直接貼り付け | ✅ 確実 | ✅ 簡単(PDFなし可) |
テキスト抽出ブロックの設定は1つだけです。
テキスト抽出ブロックの設定: 入力変数:{{開始.teaching_material}} 出力変数:text(固定・変更不可) LLM①のプロンプトでの参照: 教材の内容:{{テキスト抽出.text}}
⚠️ テキスト抽出ブロックの出力変数名は「text」固定です。変更しないでください。またスキャン画像のみのPDF(文字データなし)は読み取れません。
💡 LLM①のプロンプトで変数を設定する際は「{{」と入力してサジェストからテキスト抽出の「text」を選択することで正しく紐づきます。
6. 事前準備|必要なものはこれだけ
- Difyのアカウント(無料プランOK)
- OpenAIのAPIキー(GPT-4oが使えるプラン)
- テスト用の教材PDF(テキストデータを含むもの)
- 所要時間:40〜60分
7. 【作り方】ステップごとに丁寧に解説
STEP 1|新しいワークフローアプリを作成する
- Difyにログインして「アプリを作成」をクリック
- 種類は「ワークフロー」を選ぶ
- アプリ名に「教材PDF→問題集+解説+難易度別演習プラン自動生成くん」と入力
- 「作成する」をクリック
STEP 2|開始ブロックを設定する(変数5つ)
| 変数名 | 表示名 | 種類 | 必須 |
| teaching_material | 教材PDF | ファイル | ✅ 必須 |
| subject | 教科・科目 | セレクトボックス | ✅ 必須 |
| level | 学習レベル | セレクトボックス | ✅ 必須 |
| question_count | 生成する問題数 | セレクトボックス | ✅ 必須 |
| learner_goal | 学習目標 | セレクトボックス | ✅ 必須 |
【subject】選択肢:数学・算数/英語・英文法/国語・現代文/理科・化学・物理/社会・歴史・地理/プログラミング・IT/ビジネス・経営/その他
【level】選択肢:小学生・中学生/高校生/大学生・社会人/資格・検定試験
【question_count】選択肢:少なめ(各種10問)/標準(各種20問)/多め(各種30問)
【learner_goal】選択肢:基礎固め・理解確認/試験・テスト対策/資格取得・検定合格/実務応用・スキルアップ
STEP 3|テキスト抽出ブロックを設定する
- 開始ブロックの右の「+」をクリックして「ドキュメント抽出」または「テキスト抽出」を選ぶ
- 入力変数に「{{開始.teaching_material}}」を設定する
- 出力変数は「text」(固定・変更不可)のまま
💡 設定する項目はこれだけです。とてもシンプルです。
STEP 4|LLM①(重要概念抽出)を設定する
temperature:0.1(抽出・分析は正確性重視)・最大トークン:2000に設定してください。
プロンプト設計の最重要ポイントは「教材にない概念を補完させない」ことです。Must Notに以下を必ず追記してください。
## Must Not – 教材に存在しない情報・概念を追加しない – {{テキスト抽出.text}}に記載されていない 用語・概念を絶対に出題しない – 「プログラミング・IT」などのカテゴリの 一般知識で補完・追加することを禁止する – 教材に書かれている内容のみを使うこと
またPre-ProcessingのStep1の前に以下を追加することで精度が上がります。
Step0 教材内容の確認(最初に必ず実行) {{テキスト抽出.text}}に含まれる内容のみを 分析対象とする 教材に存在しない概念は出力しない 教材のテキストが空の場合はFallbackを実行する
STEP 5〜8|LLM②〜⑤を設定する
| ブロック | 役割 | temperature | 最大トークン |
| LLM② | 一問一答生成 | 0.4 | 2000 |
| LLM③ | 穴埋め問題生成 | 0.4 | 2000 |
| LLM④ | 記述問題生成 | 0.5 | 2000 |
| LLM⑤ | 演習プラン生成 | 0.5 | 1500 |
各LLMの変数紐づけ
| ブロック | 参照する変数 |
| LLM① | 開始.subject / 開始.level / 開始.learner_goal / テキスト抽出.text |
| LLM② | 開始.subject / 開始.level / 開始.question_count / 開始.learner_goal / LLM①.text |
| LLM③ | 開始.subject / 開始.level / 開始.question_count / 開始.learner_goal / LLM①.text / LLM②.text |
| LLM④ | 開始.subject / 開始.level / 開始.question_count / 開始.learner_goal / LLM①.text / LLM②.text / LLM③.text |
| LLM⑤ | 開始.subject / 開始.level / 開始.learner_goal / LLM①〜④.text |
STEP 9|テンプレート変換+終了ブロックを設定する
| 変数名(左) | 参照先(右) | 内容 |
| arg1 | LLM①.text | 重要概念分析 |
| arg2 | LLM②.text | 一問一答問題集 |
| arg3 | LLM③.text | 穴埋め問題集 |
| arg4 | LLM④.text | 記述問題集 |
| arg5 | LLM⑤.text | 難易度別演習プラン |
| arg6 | 開始.subject | 教科・科目 |
| arg7 | 開始.level | 学習レベル |
| arg8 | 開始.learner_goal | 学習目標 |

8. よくあるトラブルと解決方法
① PDFの内容が反映されず一般的な知識で出力される
LLM①のMust Notに「教材にない概念を追加しない」を明示的に追記してください。また変数の参照が正しく設定されているかDifyのサジェスト機能で確認してください。
② テキスト抽出ブロックで何も出力されない
PDFがスキャン画像のみの場合は読み取れません。WordからエクスポートしたPDFやブラウザで印刷したPDFを使用してください。テキスト抽出ブロックを単体で実行して「最後の実行」タブで出力内容を確認してください。
③ LLMへの変数参照が正しく設定されない
プロンプト内に手打ちで変数名を書くのではなく「{{」と入力してDifyのサジェスト機能から選択してください。サジェストから選択することで正しいブロック名・変数名が自動入力されます。
9. 3種類の問題形式の学習効果
| 問題形式 | 確認できること | 特徴 |
| 一問一答 | 基礎用語・定義の記憶 | 難易度別・問題タイプ別・正答+ポイント付き |
| 穴埋め | 文脈の中での概念理解 | 4択・解説付き・一問一答と角度を変えて出題 |
| 記述 | 深い理解・応用・論述力 | 模範解答・3点満点採点基準(ルーブリック)付き |
記述問題の採点基準(ルーブリック)は「3点=必須要素+補足あり・2点=必須要素のみ・1点=方向性は正しい・0点=的外れ」の4段階で出力されます。教師・研修担当者がそのまま採点に使えます。
10. よくある質問(FAQ)
Q1. どんなPDFでも使えますか?
テキストデータが含まれているPDFなら使えます。WordからエクスポートしたPDF・ブラウザで印刷したPDF・電子書籍のサンプルPDFなどが対応しています。スキャンして画像化されたPDFは読み取れません。
Q2. 問題の精度を上げるコツはありますか?
LLM①のMust Notに「教材にない内容を補完しない」を明示することが最も効果的です。またPDFの文字数が少ない場合はテキスト長文変数に変えて直接貼り付ける方法が確実です。
Q3. 記述問題の採点基準はそのまま使えますか?
基本的にそのまま使えるレベルで出力されます。ただし教科・教材によっては採点基準が甘すぎたり厳しすぎる場合があります。最終確認は必ず行ってください。
Q4. 複数のPDFをまとめて処理できますか?
ファイル変数を複数対応にして繰り返しブロック(Iterator)を追加することで複数PDFの一括処理が可能です。ただし1PDFずつ処理する方が品質が安定します。
11. まとめ
- 教材PDFをアップするだけで一問一答・穴埋め・記述の3種類+採点基準+演習プランを全自動生成
- テキスト抽出ブロック→LLM①〜⑤の8ブロック構成でPDFの内容を正確に問題化
- LLM①のMust Notで「教材外の補完を禁止」することが品質の鍵
- 記述問題に3点満点のルーブリックが付くので採点作業も自動化
- 入門・標準・上級の3段階演習プランで学習者のレベルに合わせた活用が可能
教材を読んで問題を作る作業が、PDFをアップするだけで数分で完成します。先生・研修担当者・受験生・自己学習者のどなたにも刺さるアプリです。
問題を作るのってとても時間がかかって難しいと思いますので
苦労されてる方にはぜひ試してみて欲しいです。
次におすすめの記事
49歳・AI初心者の絶望が希望に変わった瞬間。Dify執筆エージェントで『書けない』を卒業!
xもやってるので良かったら見に来てください


コメント