考古題練習工具
AI幫幫忙

AI幫幫忙:我如何用AI快速生成考古題練習工具

備考工具製作心得・題庫與工具分離・可在手機、平板、桌機使用

把「刷考古題、整理錯題」變成一套可重複使用、可以分享的小工具,而且整個過程幾乎都是在和 AI 對話中完成的。


起點:分數起伏讓我不安

我最近在準備 IPAS 初級資訊安全工程師能力鑑定。備考方式很樸素:在網路上把歷年考古題一份一份刷過去。

刷到後來,有件事讓我不太踏實:每次模擬的分數落在 60 多到 80 多分,起伏很大。及格線是 70 分,等於我隨時可能掉到線下。我意識到,真正該花時間的不是再多刷幾份新題,而是把錯過的題目收起來反覆練,因為錯題才是弱點的所在。

先想清楚:我要的是「記得我」的題庫

一開始我的直覺是把錯題丟給 AI,請它出題、講解、陪我複習。試了一下就發現幾個摩擦:

這些問題的共同點是:我需要的不是更聰明的聊天,而是一份會被保存、可以累積的資料。 於是我換了個思路:把它做成一個工具,而且從設計之初就把「題庫(資料)」和「工具(程式)」分開。這樣 AI 只需要替我產生題庫,不必每次重寫程式;題庫格式一致,工具就能永遠不用動。

做成工具還有兩個額外的好處:可以直接分享給一起備考的人,也能套用到其他任何有考古題的考試。

工具是怎麼長出來的

整個過程不是事先規劃好的,而是「用一陣子,遇到不順,就跟 AI 說一句話改一點」。回頭看,有幾個值得記錄的轉折。

第一版:先做到能刷題。 我請 AI 把一批考古題整理成網頁,每題用表格呈現,題目與選項用藍色,題意、各選項的分析和答案用紅色。答案預設藏起來,點單題才展開,交卷後才一次顯示,並自動標示對錯。這一版的題目直接寫死在 HTML 裡,能用,但每換一份考題就得重做一次,還稱不上工具。

真正的轉折:把題庫拆成 JSON。 我和 AI 花了不少時間把格式談清楚:檔名採「年度-能力-科目.json」(例如 112-info-sm.json);每題包含分類、題目、題意、選項、每個選項的對錯分析和正確答案。HTML 只負責讀取與顯示,放在同一目錄或 ./json/ 的題庫會被讀入下拉選單,並顯示標題與題數。從這一刻起,換考試只要換題庫,工具本身不用動。

讓它記得我:作答紀錄。 我想知道的是「哪幾題總是錯」。所以交卷後,工具會把正確率與錯題寫成獨立的紀錄 JSON;同一個題庫在不同時間的作答會合併成同一份檔案,每題旁邊標示「累計錯 N 次」,還能查看每次成績的變化與平均正確率,或只練習反覆錯的題目。瀏覽器預設不能自己寫檔,所以我讓工具透過 File System Access API 請使用者授權一個資料夾,不支援的瀏覽器則退回下載檔案,並用 localStorage 做備份。

用出來的需求,一個一個補上。 日常使用中冒出的想法,都只是一句話交給 AI:

題庫累積的過程也出現過小插曲:同一年度的兩份管理概論試題,題號有重複、內容卻不同。我的處理方式是合併後重新編號,並在每題保留原題號與來源份數(origNo、set)以便回頭對照,最後 31 題檢查過沒有任何重複。

與 AI 協作的五個心得

1. 先定規格,再生成內容。 JSON 格式、檔名規則、紀錄格式一旦固定,AI 每次生成的題庫就能保持一致,工具也才能穩定讀取。花在規格上的時間,後面全部賺回來。

2. 要求「最小修改」。 每次改功能,我都明講「在現有的 HTML 上加,保留原本的元素和欄位名稱」。這樣舊題庫與舊紀錄才不會因為一次改版而失效。

3. AI 的答案一定要自己核對。 這是整件事最重要的一條。題庫裡的答案是 AI 依知識判斷出來的,不是官方標準答案。遇到附圖(例如創用 CC 授權標示、Kerberos 流程圖、字串分析題),AI 看不到圖,只能從選項推測,這類題目我會要求它在備註欄標上「暫定」;憑記憶回答、沒有查證的,也要標明。涉及法規的題目,我則要求它先搜尋條文再回答,例如資安事件通報的審核時限(第一、二級 8 小時、第三、四級 2 小時),就是查過才寫進題庫的。看到這些標記的題目,我再自己去核對一次。

4. 對話不是永久的。 有好幾次,AI 沙盒裡先前生成的檔案消失了,只能重新生成或重新上傳。這讓我學到兩件事:檔案要存在自己手上;還要寫一份「生成規則-重啟對話」文件,把命名規則、JSON 格式、HTML 規格和常用提示詞都寫進去。之後開新對話,貼上這份文件再附上最新的 HTML,就能無縫接續。

5. AI 也有看不到的地方。 AI 可以做語法檢查、跑邏輯測試,但沒辦法替我在真實的瀏覽器裡操作畫面。排版、按鈕行為這類東西,還是得自己打開實測,再把問題回報給它修正。

目前的成果與限制

目前累積了九個題庫:七個是 IPAS 初級資訊安全工程師的管理概論與技術概論(涵蓋多個年度,約 105 題),另外兩個是我後來順手放進去的 AI 應用規劃師練習題(中級科目一 150 題、初級學科一 200 題),合計約 455 題,每一題都有題意說明和逐個選項的分析。同一個工具能直接吃下不同考試的題庫,這也驗證了「資料與工具分開」的好處。工具本身只有一個 HTML 檔,加上放在 json/ 資料夾的題庫,不需要安裝任何套件,也沒有後端。

當然也有明確的限制:

本地部署:不需要架伺服器

這個工具不需要任何 HTTP 服務,下載後用瀏覽器直接打開就能用。差別只在「題庫怎麼載入」和「成績怎麼存」。

先擺好資料夾

建議另外建一個專用資料夾,把工具和題庫放在一起:

我的題庫/
├─ info-test.html
├─ make-index.py        (選用)
└─ json/
   ├─ 112-info-sm.json
   └─ index.json

兩種開法

開法 做法 題庫載入 成績存檔 適合
A. 直接雙擊(免伺服器) 雙擊 info-test.html,按「選擇資料夾」並授權;或按「選擇 JSON 檔」一次選取題庫檔 每次開啟都要手動選一次 授權資料夾時直接寫回 json/(Chrome、Edge);用「選擇 JSON 檔」則下載紀錄檔,需自行放回資料夾 想最快上手、不碰命令列
B. 本機伺服器 在資料夾執行 python -m http.server,瀏覽器開 http://localhost:8000/info-test.html 自動掃描 ./ 與 ./json/,不用手動選 授權資料夾後可直接寫回;否則下載 每天都在用,想省掉重複選資料夾

開法 A 的細節

  1. 雙擊開啟後,畫面上方會顯示「尚未讀到 JSON」,這是正常的:瀏覽器在 file:// 下不允許網頁自己讀取資料夾。
  2. 用 Chrome 或 Edge 的話,按「選擇資料夾」,選整個 我的題庫 資料夾並允許讀寫。工具會讀入裡面(包含 json/ 子資料夾)的題庫與紀錄,之後的成績與備註都會直接寫回去。
  3. 用其他瀏覽器,按「選擇 JSON 檔」,在檔案對話框裡全選題庫檔。成績會以下載方式儲存,請把下載的 .records.json 放回 json/ 覆蓋舊檔,下次載入時才會接上先前的紀錄。
  4. 如果授權資料夾失敗(例如瀏覽器拒絕你選的系統資料夾),改選專用的子資料夾,或退而使用「選擇 JSON 檔」。

幾個要留意的地方

想自己做一套?照這樣做

這套做法不綁定特定的 AI。關鍵在於 「生成規則-重啟對話.md」 這份文件:它把我和 AI 磨合出來的規格全部寫成文字,任何 AI 讀過之後,都能產出格式一致的題庫與工具。

你需要準備

步驟

  1. 開新對話,先把規則交給 AI。 上傳 生成規則-重啟對話.md 和 info-test.html,或把規則檔的內容直接貼上。可以先用這段話當開場:
我要做一套考古題練習工具。附上的「生成規則」是我的規格,info-test.html 是現成的作答工具。
請先讀完並用三句話複述:題庫 JSON 的格式、檔名規則、你生成題庫時要遵守的原則。
之後我會貼考古題,請依規則生成題庫 JSON。

先讓 AI 複述規格,是在確認它真的讀懂了;複述有誤就當場糾正,比事後修檔案省力。

  1. 貼上考古題,請它生成題庫。 一次貼一份試卷,並註明年度、科目:
以下是「○○年 ○○考試:○○科目」的題目。請依生成規則逐題分析題意、每個選項的對錯與具體原因,
生成題庫 JSON,檔名為 年度-能力-科目.json。
附圖看不到的題目請在 note 標「暫定」,法規題請先查條文,憑記憶的請標明未查證。
  1. 存檔。 如果你的 AI 能直接輸出檔案,下載後放進 json/。如果不能,請它把 JSON 放在程式碼區塊裡,你自己複製後存成 UTF-8 的 .json。
  2. 產生索引(選用)。 在資料夾裡執行 python make-index.py,或打開工具後按「更新 index.json」。也可以請 AI 依規則檔第 3.1 節輸出,但 AI 容易漏列舊題庫,所以我建議用腳本或按鈕。如果你只用開法 A 的「選擇資料夾」,這一步可以先略過。
  3. 開始作答。 依「本地部署」一節選擇開法 A 或開法 B。
  4. 回頭檢查題庫。 AI 偶爾會寫出不合格式的 JSON。下面這支小腳本(存成 check-bank.py)可以快速檢查:格式對不對、題號有沒有重複、答案是否真的在選項裡。
import json, pathlib, sys
ok = True
for p in sorted(pathlib.Path(sys.argv[1] if len(sys.argv) > 1 else 'json').glob('*.json')):
    if p.name == 'index.json' or p.name.endswith('.records.json'):
        continue
    d = json.loads(p.read_text(encoding='utf-8'))
    errs = []
    if d.get('type') != 'bank': errs.append('type 不是 bank')
    if d.get('id') != p.stem: errs.append('id 與檔名不符')
    for k in ('year', 'ability', 'subject', 'title'):
        if not d.get(k): errs.append('缺少 ' + k)
    nos = [q.get('no') for q in d.get('questions', [])]
    if len(nos) != len(set(nos)): errs.append('題號 no 重複')
    for q in d.get('questions', []):
        keys = [o.get('key') for o in q.get('options', [])]
        if q.get('answer') not in keys: errs.append('第 %s 題 answer 不在選項中' % q.get('no'))
        for f in ('category', 'question', 'intent'):
            if not q.get(f): errs.append('第 %s 題缺少 %s' % (q.get('no'), f))
    print(p.name, '→', '通過' if not errs else errs)
    ok = ok and not errs
sys.exit(0 if ok else 1)

換成別的考試,要注意什麼

常見狀況

還能延伸的方向

下載

下載位置:<請填入你的下載連結,例如 GitHub 或雲端硬碟>

內容包含:

下載後怎麼開始,請見上方「本地部署」一節;要新增題庫,請見「想自己做一套?」。

分享前的提醒


結語

這次最大的收穫不是工具本身,而是一種做法:把「重複要做的事」拆成「資料」和「工具」,讓 AI 負責產生資料、修改工具,而我只負責把需求說清楚、把結果核對過。 AI 讓我省下的是機械性的整理與改寫,而判斷題目對不對、弱點在哪裡,這部分仍然是自己的功課。

如果你也在準備同一個考試,或有其他考古題要刷,歡迎拿去用,也歡迎把改進的想法告訴我。