はじめに
何かしらの業務に携わるベンダー資格を取得するために勉強している方、こんな経験をしたことはないですか?
「マイナーすぎる or 情報がなさすぎる…問題集があっても少ない…」
「同じ問題ばっかり…もっとバリエーションが欲しい」
「新設資格で模擬試験がまだ少ない…」
「簡単すぎる…本番の試験レベルのものが欲しい」
私はAWSの資格を複数受験していく中でこの問題に直面しました。特にAIP-C01(Generative AI Developer Professional)は2025年にベータ試験、2026年にGAした資格で、市場に問題集がほとんどない。
AIPの対策のために情報収集していると、同じ悩みを持った受験者が自分で問題集を作っている事例がいくつか見つかりました。
確かに、せっかく生成AIを題材にした試験を受けるならば自分で作ればいいじゃないか、そう思いました。
加えて自分で作れば、自分で使っているうちに欲しい機能を付け加えることもできる、そんな学習環境を作れるはずだ──と思い立って作ったのがこのシステムです。
特に今回は自分でほしい以下の内容を取り入れました:
- 自分が受ける資格だけに絞って最適化できる
- 苦手なドメインを重点的に攻めるよう調整できる
- 生成AIが自分の学習履歴を見て問題を作ってくれる
最終的には以下のような構成になりました:
- 全12のAWS資格・計3,000問以上をランダム出題
- 弱点ドメインを自動分析して重点的に学習
- Amazon Bedrock(Claude)でオンデマンド問題生成
- 全てサーバーレス・月額ほぼ$0
本記事ではこのシステムのアーキテクチャと、実装で工夫したポイントを紹介します。
本システムは社内リソースを使用していたり、参考にした市販・公開問題集の著作権の観点から、アーキテクチャや実装パターンの紹介のみとなります。本内容を基に、自身のデータを使用して構築していただけると幸いです。
市販・公式のサンプル問題は参考問題として問題DBに格納していますが、AI問題生成時における出題のニュアンスや形式の参考としてのみ使用しています。生成プロンプトでは「参考問題は文体・表現・解説の書き方の参考のみに使い、トピックやサービスは必ず別のものにすること」と明示的に指示しており、さらにLLM as a Judgeで既存問題との類似性をチェックし、類似問題を排除する仕組みを設けています。
自作される際は、利用する問題集の利用規約(スクレイピング禁止、転載禁止、再利用禁止等)を必ず確認してください。
これらが功を奏したのか無事合格できました。
システム概要
対応資格(全12種)
| 資格ID | 資格名 |
|---|---|
| AIP-C01 | Generative AI Developer Professional |
| AIF-C01 | AI Practitioner |
| MLA-C01 | Machine Learning Engineer Associate |
| SCS-C03 | Security Specialty |
| DOP-C02 | DevOps Engineer Professional |
| DVA-C02 | Developer Associate |
| SAP-C02 | Solutions Architect Professional |
| DEA-C01 | Data Engineer Associate |
| SOA-C03 | CloudOps Engineer Associate |
| SAA-C03 | Solutions Architect Associate |
| CLF-C02 | Cloud Practitioner |
| ANS-C01 | Advanced Networking Specialty |
主な機能
- ランダム出題:プレイ回数に応じた重み付きサンプリング
- ドメイン配分制御:試験の出題比率に合わせた出題
- 正解率トラッキング:ドメイン別の弱点分析
- AI問題生成:弱点ドメインに特化した問題をBedrockが生成
- フィードバック:問題の品質評価・低評価問題の自動アーカイブ
アーキテクチャ
インフラは全て AWS CDK(Python) で管理しています。
技術スタック
| レイヤー | 技術 |
|---|---|
| フロントエンド | React 18 + TypeScript + Vite |
| 認証 | Amazon Cognito |
| API | API Gateway + Lambda(Python 3.12) |
| DB | DynamoDB(PAY_PER_REQUEST) |
| メッセージング | SQS FIFO(問題生成の非同期処理) |
| AI生成 | Amazon Bedrock(Claude Sonnet 4.6 + Prompt Caching) |
| 知識ベース | Bedrock Knowledge Base(試験ガイドPDF) |
| IaC | AWS CDK(Python) |
| ホスティング | S3 + CloudFront |
工夫したポイント
1. 重み付きサンプリングで「同じ問題ばかり」を防ぐ
問題を単純にランダム選択すると、よく出る問題と全然出ない問題が偏ります。そこでプレイ回数に反比例する重みを設定しました。
| プレイ回数 | 重み(weight) |
|---|---|
| 未プレイ | 10 |
| 1回 | 3 |
| 2回 | 1 |
| 3回以上 | 0.2 |
さらにフロントエンド側で試験の公式ドメイン配分に合わせた選択アルゴリズムを実装しています:
function selectByDomainWeight(questions: Question[], examId: string, count: number): Question[] {
const selected: Question[] = []
const weights = DOMAIN_WEIGHTS[examId]
const totalWeight = Object.values(weights).reduce((a, b) => a + b, 0)
for (const [domain, weight] of Object.entries(weights)) {
const pool = questions.filter(q => q.domain === domain)
const domainCount = Math.round(count * weight / totalWeight)
selected.push(...sampleRandom(pool, domainCount))
}
return selected
}
2. SQS + Prompt Cachingで信頼性の高い問題生成
Bedrockでの問題生成は時間がかかります(1問あたり30秒〜1分程度、上級資格の長文シナリオ問題ではさらにかかる場合あり)。
初期実装では指定数の問題を一括生成していましたが、途中でタイムアウトすると全問失敗する可能性がありました。
そこでSQS FIFOキューを挟んで1問ずつ生成する設計に変更しました。
POST /questions/generate → 202 Accepted(即返却)
↓
generate-request Lambda
(1問=1メッセージとしてSQSに投入)
↓
SQS FIFO Queue + DLQ
(batch_size=1, 並行5, 3回失敗でDLQ行き)
↓
generate-worker Lambda(1問ずつ生成)
(Prompt Caching: 固定ルールをsystemに配置)
↓
DynamoDBに問題を保存
ポイント:
- 1問失敗しても他に影響しない(リトライは問題単位)
- Prompt Cachingで固定ルール部分(~800トークン)のコストを85%削減
- MessageGroupIdをドメイン別にすると最大4並行で高速化も可能
ユーザーは「生成中...」の画面を見ながら既存問題を解き続けられます。
3. DynamoDBのアクセスパターン設計
DynamoDBはアクセスパターン先行設計が重要です。このシステムでは以下のGSIを設計しました:
問題テーブル
PK: 資格ID
SK: 問題ID
GSI1: ドメイン(ドメイン別検索)
GSI2: フィードバックスコア(高評価問題の取得)
GSI3: ソース区分(生成問題/参考問題の区別)
回答履歴テーブル
PK: ユーザーID
SK: 回答日時(時系列検索)
フィードバックスコア用GSIのおかげで、AI問題生成時に高品質な参考問題Top3を効率よく取得できます。これが生成品質の安定化に貢献しています。
4. Bedrock × Knowledge Baseで品質の高い問題を生成
ここでいう問題の「品質」とは、具体的に以下を満たすことを指します:
- 問題文・選択肢に事実誤認がない(存在しないサービス名や廃止された機能を前提としていない)
- 正答と解説が論理的に整合している
- AWSの最新仕様に基づいている(古い情報で出題されていない)
- 実際の試験と同等の難易度・形式を維持している
問題生成のプロンプトには3つの要素を組み合わせています:
1. 試験ガイドPDF(Bedrock Knowledge Base経由)
↓ セマンティック検索で関連箇所を取得
2. 高評価の既存問題3問(参考サンプル)
↓ 問題形式・難易度の一貫性を確保
3. 弱点ドメイン情報(弱点分析の結果)
↓ 苦手分野を重点出題(+50%の重みで指示)
難易度はレベル別に細かくプロンプトを調整:
DIFFICULTY_PROMPT = {
"Foundational": "基本概念を問う4択問題。正答率70-80%を目標。",
"Associate": "複数サービスの連携シナリオ。トレードオフの判断を問う。",
"Professional": "大規模設計・複数リージョン/アカウント。正答率40-65%を目標。",
"Specialty": "深いプロトコル知識・エッジケース。専門的かつ難解に。"
}
5. 弱点分析アルゴリズム
弱点分析APIは以下を返します:
- ドメイン別の正解率(昇順ソートで弱い順に表示)
- 直近20件の誤答問題(解説付き)
取得した弱点ドメインは問題生成リクエストにそのまま渡され、Claudeへのプロンプトに「このドメインを重点的に出題せよ」という指示として組み込まれます。
これにより、単に「問題を解く」だけでなく弱点を潰す学習サイクルが回ります。
6. 生成問題のファクトチェックと類似性排除
AI生成問題では「もっともらしいが事実と異なる」問題や、既存の生成問題と酷似した問題が生成されるリスクがあります。本システムでは以下の仕組みで品質を担保しています。
プロンプトでの類似防止指示
生成プロンプト(systemメッセージ)に以下を明記し、参考問題のコピーを防いでいます:
- 参考問題は文体・表現・解説の書き方の参考のみに使い、
トピックやサービスは必ず別のものにすること
LLM as a Judge による類似問題検出
生成後のバッチ処理で、Claude Haiku 4.5 を使い既存問題との類似性を判定しています:
- 問題文の先頭200文字の類似度(SequenceMatcher)が80%以上のペアを自動検出
- 正答が一致する場合はsource(生成/取込)とフィードバックスコアで優先度判定し、低い方を削除
- 正答が食い違う場合はClaudeに正答を判定させ(LLM as a Judge)、正しい方を残す
# merge_duplicates.py での正答判定プロンプト(抜粋)
prompt = f"""以下のAWS資格試験の問題について、正答を判定してください。
## 問題文
{q_text}
## 選択肢
{choices}
## 候補A の正答: {answer_a}
## 候補B の正答: {answer_b}
どちらの正答が正しいですか?「A」「B」「UNCERTAIN」のいずれか1文字で答えてください。"""
その他の品質チェック
- 構造品質チェック(ルールベース日次バッチ):選択肢の文字数偏り(最長/最短 2倍以上)、解説150文字未満、正答設定不整合を自動検出→アーカイブ
- Claude Haiku によるドメイン自動分類:ドメイン欠損問題に対して試験ガイドのドメイン定義に基づきバッチ分類
- フィードバック機能:ユーザーが「良問」「不適切」を評価。低評価問題は自動でアーカイブ
- 高評価問題の循環利用:次回生成プロンプトに高評価問題を「お手本」として渡し、品質の正のループを形成
ルールベース品質検査 + LLM as a Judge + ユーザーフィードバックの多層チェックで、使い込むほどに問題プールの品質が向上する設計にしています。
コスト
| サービス | 月額 |
|---|---|
| Cognito | $0(MAU 5万まで無料) |
| DynamoDB | $0(PAY_PER_REQUEST、低トラフィック) |
| Lambda | $0(無料枠内) |
| API Gateway | $0(無料枠内) |
| SQS FIFO | $0(無料枠内) |
| S3 + CloudFront | ~$0.01 |
| Bedrock(問題生成時のみ) | ~$0.5 / 10問※ |
| 合計 | ほぼ$0(生成時のみ課金) |
完全サーバーレスなので常時稼働コストがほぼゼロ。問題を生成したときだけBedrockの費用がかかります。
※ Claude Sonnet 4.6 使用、1問あたり入力約2,000トークン(試験ガイド参照箇所+参考問題)+出力約600トークン想定。
まとめ
実際の試験で活かせたか
このシステムで約2週間・200問以上を解いてからAIP-C01を受験しました。当然ながら本番で同じ問題あるいは類似問題が出ることはありませんでしたが、試験範囲の知識を繰り返し問われることで定着した内容が本番で活きました。特に効果を感じたのは以下の点です:
- 弱点ドメインの克服:弱点分析で浮き彫りになった「RAGの設計パターン」「エージェント構成」周りを重点生成して解いたことで、本番で同分野のシナリオ問題が出た際にも自信を持って回答できた
- 問題形式への慣れ:4〜5択のシナリオベース問題を大量に解いた経験が、本番の読解速度と消去法の精度向上につながった
- 作る過程自体が学習:Bedrockのプロンプト設計やKnowledge Baseの構築は、試験範囲そのもの(生成AIのアーキテクチャ設計)の実践演習になった
結果として無事合格でき、「試験範囲のサービスを使って試験対策する」というアプローチは想像以上に有効でした。
振り返り
少し調べただけでも、同じことを考えて生成AIで問題集システムを自作している人がすぐに見つかりました。新設資格や情報の少ない資格に挑むとき、「ないなら作る」という発想に至るのは自然な流れだと思います。
ただ、乗っかるだけではなく一歩踏み込みたいと思いました。せっかく生成AIを題材にした試験を受けるなら、自分で試験範囲のサービスを使って問題を生成してくれる環境を作ればそれ自体が試験対策になるし、今後にも活用できる。そう考えて構築してみました。
さらに、自分の弱点を分析して、そこに特化した問題を生成AIが作り続けてくれる仕組みも入れることで、解いていくほど自分に最適化されていく学習環境になりました。
作ってみて気づいたこと
- DynamoDBのアクセスパターン設計は最初に時間をかける価値がある。後からGSIを追加するのは設計変更と同義で、早期に固めるほど楽になる。
- 非同期生成のUX設計は想像以上に重要だった。生成中に「待つしかない」状態にするとストレスが高く、既存問題を解き続けられる設計にして正解だった。
- 生成問題の品質は参考サンプルの質に依存する。高評価問題をフィードバックで選別し、それを次の生成プロンプトに渡すループが品質の安定化に効いた。
今後やりたいこと
- 1問あたりの回答時間の計測・記録・集計(本番試験のペース配分対策)
- 生成問題の自動品質評価(別モデルによるレビュー)
- 他ベンダー資格(Azure、GCP)への対応
- スコアの推移グラフ・目標日までの進捗表示
同じようにAWSの新設資格で悩んでいる方がいれば、自分でサービスを使ってシステムを作ってみるという手段、ぜひ試してみてください。




