正在為了取得某些業務相關的廠商認證而努力學習的人,是否也有過這樣的經驗?
「太冷門了,或是資訊少得可憐……就算有題庫也少得要命……」
「題目老是重複……我想要更多變化」
「是新設的認證,模擬試題還很少……」
「太簡單了……我想要更接近正式考試難度的題目」
我在報考多張 AWS 認證的過程中,也曾遇到這個問題。尤其是 AIP-C01(Generative AI Developer Professional)是 2025 年的 Beta 考試、2026 年正式上線(GA)的認證,市面上幾乎沒有題庫。
在蒐集 AIP 準備資料時,我也找到了幾個和我有相同煩惱的考生,自己動手製作題庫的案例。
確實,既然都要考以生成式 AI 為主題的考試,那乾脆自己做一個不就好了——我當時就是這麼想的。
再加上如果是自己做,還能在使用過程中持續補上自己想要的功能,應該就能打造出一個適合自己學習的環境──於是我就開始做了這個系統。
這次特別加入了我自己最需要的以下內容:
最後完成的系統構成如下:
本文將介紹這個系統的架構,以及實作時的設計重點。
由於本系統使用了公司內部資源,且基於所參考的市售/公開題庫的著作權考量,本文僅介紹架構與實作模式。若您要實作,建議基於自己的資料進行建置。
市售與官方的範例題目都已存入題庫作為參考題,但在 AI 題目生成時,僅作為出題的語氣與形式參考。在生成提示詞中,我明確要求「參考題只能用來參考文風、表達與解說寫法,主題與服務名稱必須換成其他內容」,並且另外透過 LLM as a Judge 檢查與既有題目的相似度,將相似題排除。
若您要自行製作,請務必確認所使用題庫的使用條款(禁止爬蟲、禁止轉載、禁止再利用等)。
最後這些努力也發揮了效果,順利通過了考試。
| 資格 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 |



所有基礎架構都由 AWS CDK(Python) 管理。
| 層級 | 技術 |
|---|---|
| 前端 | React 18 + TypeScript + Vite |
| 驗證 | Amazon Cognito |
| API | API Gateway + Lambda(Python 3.12) |
| 資料庫 | 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 |
如果只是單純隨機選題,常出現的題目和幾乎不出現的題目會失衡。因此我設定了與遊玩次數成反比的權重。
| 遊玩次數 | 權重(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
}
在 Bedrock 上生成題目需要時間(每題約 30 秒到 1 分鐘,高階認證的長篇情境題可能更久)。
初期實作是一次批次生成指定數量的題目,但如果中途超時,可能會導致全部題目都失敗。
因此我改成了透過 SQS FIFO 佇列,一題一題生成的設計。
POST /questions/generate → 202 Accepted(立即回應)
↓
generate-request Lambda
(1 題 = 1 則訊息送入 SQS)
↓
SQS FIFO Queue + DLQ
(batch_size=1、並行 5、失敗 3 次後進 DLQ)
↓
generate-worker Lambda(逐題生成)
(Prompt Caching:將固定規則放在 system)
↓
將題目存入 DynamoDB
重點:
使用者可以在看到「生成中……」畫面時,繼續解既有題目。

DynamoDB 最重要的是先從存取模式開始設計。這個系統設計了以下 GSI:
題目表
PK: 認證 ID
SK: 題目 ID
GSI1: 領域(依領域查詢)
GSI2: 回饋分數(取得高評價題目)
GSI3: 來源類別(區分生成題 / 參考題)
作答紀錄表
PK: 使用者 ID
SK: 作答時間(時間序列查詢)
因為有回饋分數用的 GSI,所以在 AI 生成題目時,能有效取得品質較高的參考題 Top 3。這對穩定生成品質有很大幫助。
這裡所說的題目「品質」,具體指的是符合以下條件:
題目生成提示詞結合了三個要素:
1. 考試指南 PDF(透過 Bedrock Knowledge Base)
↓ 以語意搜尋取得相關段落
2. 3 題高評價既有題目(參考樣本)
↓ 確保題型與難度的一致性
3. 弱點領域資訊(弱點分析結果)
↓ 針對弱項加強出題(指示權重 +50%)
難度也依照等級做了細緻調整:
DIFFICULTY_PROMPT = {
"Foundational": "以基本概念為主的四選一題,目標正答率 70-80%。",
"Associate": "多項服務串接的情境題,考驗取捨與判斷。",
"Professional": "大型設計、多區域/多帳號,目標正答率 40-65%。",
"Specialty": "深入協定知識與邊緣案例,要求專業且刁鑽。"
}
弱點分析 API 會回傳以下內容:
取得的弱點領域會直接傳給出題請求,並作為 Claude 提示詞中的指令:「請針對這個領域加強出題」。
因此不只是單純「做題」,而是形成了持續補強弱點的學習循環。

AI 生成題目有可能出現「看起來合理但其實不正確」的內容,或是與既有生成題高度相似的題目。這個系統透過以下機制確保品質。
在生成提示詞(system 訊息)中明確寫入以下內容,防止複製參考題:
- 參考題僅能作為文風、表達與解說寫法的參考,
主題與服務名稱必須換成其他內容
在生成後的批次處理中,我使用 Claude Haiku 4.5 判斷與既有題目的相似度:
# merge_duplicates.py 中的正解判定提示詞(節錄)
prompt = f"""請判斷以下 AWS 認證考題的正確答案。
## 題目
{q_text}
## 選項
{choices}
## 候選 A 的正答: {answer_a}
## 候選 B 的正答: {answer_b}
哪一個正答是正確的?請只輸出「A」「B」「UNCERTAIN」其中一個字元。"""
透過 規則式品質檢查 + 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,假設每題輸入約 2,000 token(考試指南相關段落+參考題)+輸出約 600 token。
我在使用這個系統約 2 週、解了 200 題以上後參加 AIP-C01 考試。當然正式考試中沒有出現相同或相似到一模一樣的題目,但因為反覆練習了考試範圍內的知識,所以學到的內容在正式考試中派上了用場。特別有感的地方如下:
結果是順利通過,也讓我體會到「利用考試範圍內的服務來準備考試」這種做法,比想像中更有效。
稍微查一下就能發現,已經有不少人想到同樣的事情,並用生成式 AI 自己做題庫系統。當面對新設認證或資訊稀少的認證時,想到「沒有就自己做」其實是很自然的。
但我不想只停留在跟著做,而是想再往前一步。既然都要考生成式 AI 相關的認證,那如果自己做一個能使用考試範圍服務來自動生成題目的環境,這本身就能成為考試準備,也能留作日後持續使用。基於這個想法,我開始建置這套系統。
此外,透過加入分析自己的弱點,並讓生成式 AI 持續針對這些弱點出題的機制,整個學習環境也會隨著做題逐漸朝個人化發展。
如果你也在為 AWS 新設認證感到困擾,不妨試著自己使用服務做出一套系統看看。