前言

正在為了取得某些業務相關的廠商認證而努力學習的人,是否也有過這樣的經驗?

「太冷門了,或是資訊少得可憐……就算有題庫也少得要命……」
「題目老是重複……我想要更多變化」
「是新設的認證,模擬試題還很少……」
「太簡單了……我想要更接近正式考試難度的題目」

我在報考多張 AWS 認證的過程中,也曾遇到這個問題。尤其是 AIP-C01(Generative AI Developer Professional)是 2025 年的 Beta 考試、2026 年正式上線(GA)的認證,市面上幾乎沒有題庫。

在蒐集 AIP 準備資料時,我也找到了幾個和我有相同煩惱的考生,自己動手製作題庫的案例。
確實,既然都要考以生成式 AI 為主題的考試,那乾脆自己做一個不就好了——我當時就是這麼想的。

再加上如果是自己做,還能在使用過程中持續補上自己想要的功能,應該就能打造出一個適合自己學習的環境──於是我就開始做了這個系統。

這次特別加入了我自己最需要的以下內容:

  • 只針對自己要考的認證做最佳化
  • 能針對弱項領域加強練習
  • 讓生成式 AI 依據自己的學習紀錄出題

最後完成的系統構成如下:

  • 針對全部 12 種 AWS 認證,共 3,000 題以上隨機出題
  • 自動分析弱點領域,集中加強學習
  • 使用 Amazon Bedrock(Claude)按需生成題目
  • 全部採無伺服器架構,月費幾乎 $0

本文將介紹這個系統的架構,以及實作時的設計重點。

由於本系統使用了公司內部資源,且基於所參考的市售/公開題庫的著作權考量,本文僅介紹架構與實作模式。若您要實作,建議基於自己的資料進行建置。

市售與官方的範例題目都已存入題庫作為參考題,但在 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

主要功能

  1. 隨機出題:依照遊玩次數進行加權抽樣
  2. 領域配分控制:依照考試的出題比例出題
  3. 正確率追蹤:分析各領域的弱點
  4. AI 出題:由 Bedrock 針對弱點領域生成題目
  5. 回饋機制:題目品質評分與低分題目的自動封存

首頁・考試選擇

出題畫面


架構

架構圖

所有基礎架構都由 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

實作重點

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 上生成題目需要時間(每題約 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

重點:

  • 即使 1 題失敗,也不會影響其他題目(重試以題目為單位)
  • 透過 Prompt Caching,固定規則部分(約 800 token)的成本降低了 85%
  • 若將 MessageGroupId 依領域區分,也可達到最多 4 個並行以提升速度

使用者可以在看到「生成中……」畫面時,繼續解既有題目。

生成中的畫面

3. DynamoDB 的存取模式設計

DynamoDB 最重要的是先從存取模式開始設計。這個系統設計了以下 GSI:

題目表
  PK: 認證 ID
  SK: 題目 ID
  GSI1: 領域(依領域查詢)
  GSI2: 回饋分數(取得高評價題目)
  GSI3: 來源類別(區分生成題 / 參考題)

作答紀錄表
  PK: 使用者 ID
  SK: 作答時間(時間序列查詢)

因為有回饋分數用的 GSI,所以在 AI 生成題目時,能有效取得品質較高的參考題 Top 3。這對穩定生成品質有很大幫助。

4. Bedrock × Knowledge Base 生成高品質題目

這裡所說的題目「品質」,具體指的是符合以下條件:

  • 題幹與選項中沒有事實錯誤(不依賴不存在的服務名稱或已停用功能)
  • 正解與解析之間邏輯一致
  • 內容基於 AWS 的最新規格(不會出現過時資訊)
  • 維持與實際考試相近的難度與題型

題目生成提示詞結合了三個要素:

1. 考試指南 PDF(透過 Bedrock Knowledge Base)
      ↓ 以語意搜尋取得相關段落
2. 3 題高評價既有題目(參考樣本)
      ↓ 確保題型與難度的一致性
3. 弱點領域資訊(弱點分析結果)
      ↓ 針對弱項加強出題(指示權重 +50%)

難度也依照等級做了細緻調整:

DIFFICULTY_PROMPT = {
    "Foundational": "以基本概念為主的四選一題,目標正答率 70-80%。",
    "Associate": "多項服務串接的情境題,考驗取捨與判斷。",
    "Professional": "大型設計、多區域/多帳號,目標正答率 40-65%。",
    "Specialty": "深入協定知識與邊緣案例,要求專業且刁鑽。"
}

5. 弱點分析演算法

弱點分析 API 會回傳以下內容:

  1. 各領域正確率(依低到高排序,越弱的排越前面)
  2. 最近 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 字、正解設定不一致等問題,並自動封存
  2. Claude Haiku 的領域自動分類:針對缺少領域標記的題目,依考試指南的領域定義進行批次分類
  3. 回饋功能:使用者可評價「好題目」或「不適合」。低評價題目會自動封存
  4. 高評價題目的循環利用:將高評價題目作為「範例」帶入下一次生成提示詞,形成品質提升的正向循環

透過 規則式品質檢查 + 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 考試。當然正式考試中沒有出現相同或相似到一模一樣的題目,但因為反覆練習了考試範圍內的知識,所以學到的內容在正式考試中派上了用場。特別有感的地方如下:

  • 克服弱點領域:透過弱點分析找出的「RAG 設計模式」、「Agent 架構」等內容,集中生成並練習後,正式考試遇到同領域情境題時,也能有信心作答
  • 熟悉題型:大量練習 4~5 選 1 的情境題,提升了正式考試時的閱讀速度與排除法準確度
  • 做出系統本身就是學習:Bedrock 的提示詞設計與 Knowledge Base 建置,本身就等於在演練考試範圍的內容,也就是生成式 AI 的架構設計

結果是順利通過,也讓我體會到「利用考試範圍內的服務來準備考試」這種做法,比想像中更有效。

回顧

稍微查一下就能發現,已經有不少人想到同樣的事情,並用生成式 AI 自己做題庫系統。當面對新設認證或資訊稀少的認證時,想到「沒有就自己做」其實是很自然的。

但我不想只停留在跟著做,而是想再往前一步。既然都要考生成式 AI 相關的認證,那如果自己做一個能使用考試範圍服務來自動生成題目的環境,這本身就能成為考試準備,也能留作日後持續使用。基於這個想法,我開始建置這套系統。

此外,透過加入分析自己的弱點,並讓生成式 AI 持續針對這些弱點出題的機制,整個學習環境也會隨著做題逐漸朝個人化發展。

實作後的心得

  • DynamoDB 的存取模式設計值得一開始就花時間做。之後才新增 GSI 幾乎等同於修改設計,越早定案越輕鬆。
  • 非同步生成的 UX 設計比想像中重要很多。如果讓使用者在生成時只能乾等,壓力會很大;能一邊等一邊繼續做既有題目的設計是正確的。
  • 生成題目的品質依賴參考樣本的品質。透過回饋篩選高評價題目,再把這些題目帶入下一次生成提示詞,對於穩定品質非常有效。

未來想做的事

  • 記錄、統計每題的作答時間(對應正式考試的節奏安排)
  • 自動評估生成題目的品質(由其他模型進行審查)
  • 支援其他廠商認證(Azure、GCP)
  • 顯示分數變化圖表與距離目標日期的進度

如果你也在為 AWS 新設認證感到困擾,不妨試著自己使用服務做出一套系統看看。


參考


原文出處:https://qiita.com/y_wakai/items/e4ba31be43d518b9fdbc


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝18   💬3   ❤️5
742
🥈
我愛JS
📝2   💬5   ❤️3
142
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登