開卷有益 Open-Book-Is-Good:考古題自學系統復刻手冊
把官方開放試題資料長成一套「考古題自學系統」的判斷式復刻手冊。給載入此 skill 的 AI agent 執行:偵察資料源 → 下載轉檔 → 判斷式解析 → 題庫 → 答案配對全驗(必跑)→ 裁圖 → 詳解(含查證紀律)→ 詳解紅隊(必跑,問使用者全跑或抽查)→ build 單檔/網站。已在國考跑通, 方法正延伸嘗試臺灣升學(學測 GSAT/會考 CAP)等其他公開試題。
兩道不可略過的必跑門(與「品質門檻」表一致):
- 答案配對全驗 —— 解析出的每題答案,逐題對官方標準答案核對,全跑、不抽樣。 這道擋的是解析時的整體錯位(例如某題答案套到下一題),結構檢查(答案落在 A–D 範圍)擋不到。
- 詳解紅隊 —— AI 生成選擇題與申論題解析後,一定要反駁式紅隊查核;執行前 詢問使用者要「全跑」(逐題查)還是「抽查」(統計停止規則),不得跳過。
何時用這個 skill
- 手上有官方公布、可自由重製的試題(依著作權法 §9,見 §9),想把它變成可練習的題庫。
- 要復刻或擴充「開卷有益」這類考古題自學系統:新增一個科目、一個年度,或一整套新考試 (換國家、換考別)。
- 需要把 PDF 試題轉成結構化題庫、裁出圖式題的圖、生成 clean-room 詳解、打包成離線單檔 或網站。
不適用:受著作權保護的商業題本(出版商編排、詳解);非公開、需授權的試題。
核心哲學:judgment 式,不是死腳本
這套流程的靈魂是一句話:先查真實資料再選策略,並內建品質門檻。
- judgment 式、不是死腳本:每一卷的版面、題型、答案鍵格式都不同。解析器要先「偵測 這卷的實況」(有沒有題組?幾選一?有沒有多選/非選?答案鍵長怎樣?圖多不多?), 再選對應策略 —— 而不是硬套一支萬用腳本。學測較複雜(5 選項、多選、非選、混合題並存, 每科結構差很多),會考較單純(全 4 選一單選)。所以幾乎每科一個 parser。
- 內建品質門檻:judgment 不是隨意,而是把維護者的判斷固化成每次都遵守、不漂移 的門檻(見 §4)。寧可漏、不可錯:規則分情況(圖片題 vs 文字題、題組 vs 獨立題), 不一刀切。
- 先查實際資料再下判斷:抓到官方答案後用
len(answer)推題型,比從題幹文字猜可靠; 用官方答案表當權威題號清單,過濾掉附錄被誤判的孤立數字。判斷依據是真實資料,不是規格 或假設。
7 phase 流程概覽
偵察 → 下載轉檔 → 判斷式解析 → 題庫 →【答案配對全驗・必跑】→ 裁圖 → 詳解
→【詳解紅隊・必跑(全跑或抽查,問使用者)】→ build
每個 phase 都有對應的 references/ 深入文件,agent 執行時載入對應檔。
Phase 1:偵察資料源 → references/data-sources.md
找到官方試題與標準答案的實際所在。兩個已驗證的資料源模式:
- 伺服器渲染(學測走大考中心 ceec.edu.tw):列表頁是靜態 HTML,
curl -A Mozilla直接抓得到,用 python 正則從 HTML 直取file_pool/*.pdf連結。curl + python 優於 WebFetch(WebFetch 會摘要、可能漏改連結)。 - JS 渲染(會考走心測中心 cap.rcpet.edu.tw):主頁前端渲染,curl 抓不到連結。
突破點是
examination.html用 iframe 載入靜態頁exam/{年}/{年}exam.html,該頁才 列出指向 Google Drive 的 file id。整理成cap_drive_ids.json,由fetch_cap.py下載(已處理 Drive 大檔的病毒掃描確認頁、_is_pdf()合法性檢查、冪等跳過)。
碰到新資料源時,第一步永遠是偵察它的渲染方式,再決定 curl 直取或走 iframe/API。
⚠️ 政府/考試開放資料的檔名、編碼、版面年年漂移,是髒資料。 抓檔分類絕不要 exact-match—— ceec 113 數A 的試題檔名少了一個「學」字(
數a而非數學a),exact-match 直接漏抓整科整年、還 exit 0 不報錯。比對前一律unicodedata.normalize('NFKC', s)、用別名集合寬鬆比對、零筆即sys.exit(1)別覆蓋好資料。完整原則+ceec 教學案例+攝取前自檢清單見references/dirty-data-robustness.md, Phase 1~3 都適用。
Phase 2:下載轉檔 → references/parsing.md §1
PDF 先用 markitdown 轉 markdown:
markitdown data/raw/{年}_{科}_試題.pdf -o data/raw/{年}_{科}_試題.md
markitdown 有版面理解,散文(題幹、題組引文 passage)閱讀序乾淨,這是 raw pymupdf 做不到
的。但 markitdown 不是萬靈丹:多欄並排選項、複雜統計表、特殊版面(會考英語)會翻車,
這時改用 pymupdf 座標序(get_text("dict") 依 (page, y, x) 排序)。判斷哪邊可靠正是
judgment 的一部分。答案 PDF 不轉 md,走 pymupdf find_tables() 直接解析表格。
Phase 3:判斷式解析 → references/parsing.md
先偵測「這卷長怎樣」(§2 的偵測表),再選策略。落實到程式的具體手法:
- 題型由答案推斷:
len(answer) > 1→ 多選;單字母 → 單選;空且無選項 → 非選。 - 答案表是權威題號清單:用它過濾誤判的孤立數字。
- 題組跨度合理性檢查:標頭抓到
(a, b)要求a <= b、跨度不過大。 - 選項殘缺 → fallback:答案是某字母但只解析到 < 4 選項 → 版面被打碎,改 pymupdf 座標 重抓該題。
- 選項圈號組合本身塌縮,不是解析器的錯:部分年度官方 PDF 的字型 ToUnicode 對映本身壞掉,
自製 parser/第三方 API/
pdftotext三條管線會複製同一種毀損,交叉比對抓不出來;偵測判準、 排序題豁免、vision 復原的硬門見references/dirty-data-robustness.md「官方 PDF 文字層本身 會壞」一節。 - 題組作答政策分類(承上題判斷,給平臺拆題用):這是「題目分類」要在解析時一次標好的關鍵一項。讀每個子題 stem 判斷它能否「單獨出現」:引用同組兄弟題者(
承上題/依前題/根據第 N 小題/同上題條件/利用前小題的結果)→ 標standalone=false(平臺須整組一起出,≥2 題同時作答);其餘 →standalone=true(可單獨出,但自帶共用 passage/圖)。關鍵分辨:「上述/如圖」指的是共用材料(passage/圖 → 仍可單獨)還是前一子題的內容/答案(→ 不可單獨)。判斷式、解析時定(落欄見 Phase 4)。
每科一個 parser(parse_gsat.py/parse_eng.py/parse_soc.py/parse_cap_*.py),
共用同一份 schema 與 qid-keyed 冪等 merge(重跑某科只覆蓋該科)。逐字忠實:絕不改寫、
摘要、翻譯;跳過卷首測驗說明;題組 group_id/passage 綁定、絕不拆散。
Phase 4:題庫 bank.json → references/data-sources.md §5
純文字題庫,每題一物件。核心欄位:qid(全域唯一鍵)、exam、year、subject、no、
group_id、passage、stem、options、answer(可多選)、type、needs_figure、
figure(只存檔名)。圖只存檔名、永不存影像,讓題庫可 lint、可 diff、git 可 delta。
- 題組欄位(共用材料+作答政策):
group_id綁同組(解析時建、絕不拆散)。新增standalone(bool,預設 true)=該子題能否單獨出現;承上題類標false→ 平臺在模擬題/單題/錯題/弱點等模式必須整組一起出、不拆;true者可單獨抽出。共用圖與 passage 必須寫進該組「每一個」子題(每子題都帶自己的figure/passage,即使共用同一張),否則一個standalone子題被單獨抽出時會缺圖、缺材料而變廢題。分類在 Phase 3 判斷、此處落欄;圖的 group propagation 見 Phase 5。這兩欄落地後,前端引擎怎麼在不同作答表面顯示題組情境(原文完整引入、只引題幹、鏈式堆疊、各表面分工),見references/frontend-engine-rules.md§1。 - 轉寫題幹要留定位錨點:
stem預設逐字忠實;但數學等題若把題幹轉成 LaTeX 或清洗後顯示,轉寫過的 stem 已對不上原卷 PDF 文字層,裁圖(Phase 5)靠 stem 比對定位就會失敗或抓錯區塊。凡會改寫 stem,就另存一條 PDF 忠實的定位錨點(建議欄locate_anchor:題號+第一個數學符號前的純散文前綴、要求頁內唯一),定位走它、永不顯示。為何不能用 ASCII 化整段救:PDF 的數學符號文字層本身常是 PUA 造字/壞ToUnicode/根本沒編碼,匹配不到不存在的字。詳見exam-pdf-asset-extractor「Locating the Question」。
必跑門 A:答案配對全驗(每題逐一,不抽樣)
這是不可略過的步驟,每次都要跑、而且是全跑。
題庫成形後、進詳解前,把每一題的 answer 逐題對官方標準答案核對,列出所有對不上的題(mismatch),修到 0 mismatch 才往下走。(只管選擇題;申論/計算題無官方標準答案,不適用此門,改靠 Phase 7 的申論紅隊角度。)
- 為什麼非跑不可:答案來自官方標準答案 PDF 不代表「對到正確題號」。PDF 解析常見整體錯位(某題答案套到下一題),這種錯結構檢查擋不到(答案還是落在 A–D 範圍、看起來正常),只有逐題比對抓得出來。
- 全跑、不抽樣:答案配對是「對或錯」的硬事實,抽樣只能給信心區間、給不出「哪幾題錯」。所以這道門逐題全驗,與下面詳解紅隊的「可抽查」不同。
- 方法:獨立重新解析官方標準答案來源(PDF
find_tables/ 答案表),與bank.json的answer逐題 diff;用官方答案表當權威題號清單對齊。輸出只印計數與 mismatch 清單(qid、bank 答案、官方答案)。 - 國考護理師即用此門全驗 600 題、0 mismatch;舊建的考試若未跑過,補跑這道門。
Phase 5:裁圖 → references/figures.md
圖式題缺圖等於廢題,所以裁切原卷版面區塊 render 成 PNG,忠實重現、不簡化重排。
- 不靠
page.get_images():地圖/統計圖多為矢量繪製,抓不到內嵌點陣,或會漏掉向量層。 改用 pymupdf 整塊 render(raster + vector 一起點陣化,zoom 2.2)。 - 定位題目:學測用 stem/題組標記的文字前綴(長前綴優先 + 要求唯一);會考用題號行 (左邊界穩定)。題組圖放 passage 區、獨立題圖放題幹後。
- 題組共用圖 → 寫進全組子題:一張題組共用圖只裁一次(放在實際出現的子題位置),但
figure欄要 propagate 到該group_id的每一個子題。偵測器只給「圖 → 所在題號」這一筆,group 補齊是 wire 進 bank 這步用group_id做(偵測器不知道分組)。不補的話,可單獨出的子題(Phase 4standalone=true)在模擬/單題/錯題/弱點被單獨抽出時就缺圖。 - 圖→題對應隨考試家族變,別套同一管線:數學圖在題幹下方(對最近上方題號);非數學圖常是題號上方的共用材料或相鄰單題共用無 group → 用「caption-anchored(讀圖的
圖Ncaption 對應引用該標籤的題)」優先,無標籤(如會考多為指示詞)退「position(圖在頁頂→給下方首題)」。needs_figure非數學雙向都會錯:漏抓(寬圖被濾、頁頂圖丟)要回收、假旗標(純文字題/\dfrac公式題)要降旗。每個(考試家族×科)先抽 1-3 卷判 needs_figure 是否整批盲標、有無圖N標籤、圖在題上或題下,再選方法。完整見exam-pdf-asset-extractor「Mapping figures to questions」+「What varies per exam family」。 - 轉寫過的題幹定位會失敗(數學最慘):LaTeX/清洗過的 stem 對不上 PDF 文字層,會出現「stem 無法定位」或抓到純文字假圖(band 偏矮 = 抓錯區塊的警訊,與裁切到圖同一類,commit 前一起複查)。定位錨點改用題號+符號前的純散文前綴(或 Phase 4 的
locate_anchor),別比對整段 LaTeX stem;圖不一定在題幹與選項之間(數學常在 stem 上方或題組共用區),真圖改用 image/drawing-rect 錨點。 - 裁數學圖前先看站上的渲染能力:若部署端已用 KaTeX/MathJax 渲染 LaTeX,許多數學
needs_figure=true是舊離線單檔版「把公式截成圖」的遺留——重審後降旗、交給渲染器畫,只有真幾何圖(多面體、座標圖、電路/結構圖)才裁。對每個數學needs_figure硬裁只會產生純文字假圖。 - 假圖訊號(答題說明/劃記 boilerplate):升學試卷 Q1 前常有獨立的「選填題答案卡劃記說明」頁(網格+劃記範例),對任何墨偵測都像圖、是強假陽性(每份學測數學 p0 都有);國考考選部試題 PDF 則乾淨(直接從第 1 題起、答案卡另份)。第一道防線=跳過無題號頁+圖必對應某題,即可濾掉。詳見
exam-pdf-asset-extractor「Known False-Figure Signals」+「Erase-Text Figure Detection」。 - band 邊界:上界留 padding 不過頁眉;下界取下一題起點當硬上限;圖底保護
(
band_image_bottom)確保不切半張圖。寬度一律整頁寬單欄(不依文字 x0 切欄,否則 「文字左圖右」的並排圖會被切掉)。 - 保真不壓縮:不用 pngquant、不降 DPI(地圖失真影響判讀);只做無損最佳化(如 oxipng)。
腳本:extract_figures.py(學測 S/G 命名)、extract_figures_cap.py(會考 C 命名),
皆有 --dry-run 先驗 band。
Phase 6:詳解(含查證紀律) → references/explanations-redteam.md
clean-room 自行生成詳解,絕不抄出版商。 輸入只有「題幹 + 選項 + 官方標準答案鍵」,
不把出版商詳解寫法餵進 prompt。每則詳解兩個欄位 {t, c}:t 是詳解本文,c 是把握度
(high/med/low),讓使用者一眼看出這是「AI 整理」而非權威定論。正本
explanations.json 的 meta.note 固定寫明須查證。詳解以 qid 為鍵、冪等 merge
(merge_stage3.py 是唯一寫入者)。
詳解涵蓋 AI 生成的選擇題詳解與申論題解析。凡是 AI 生成的解析(含申論/短答/中譯英參考要點), 一律走下面 Phase 7 的必跑紅隊;官方分級樣卷不是 AI 生成物,不在此列。
t不是想寫多長就寫多長:三段固定結構(正解/逐一選項辨析/本題考點,段間空行)、 同因選項的合併解析規則、字數上限(概念型 600 字、計算題不受限),見references/explanations-redteam.md§1.4/§1.5。量產詳解的模型要趨近強模型下筆的水準, 靠金樣 few-shot、結構 lint 零 token 硬門、檢索錨定、分級路由、審計回饋圈五個機制, 見 §2.1。
Phase 7:詳解紅隊(必跑)+ build → references/explanations-redteam.md §3、references/build-deploy.md
- 必跑、不可跳過:AI 生成選擇題與申論題解析後,一定要紅隊查核才能進 build。
- 執行前先問使用者:要 全跑(逐題查)還是 抽查(統計停止規則)?由使用者拍板,agent 不自作主張跳過或默認。
- 全跑 —— 每則解析逐題反駁式查核(題量小、求穩、或答案爭議多時)。
- 抽查 —— 抽樣真錯達
k ≥ 4/40(Wilson CI 下界 ≥ 4%)才升級該科到更強模型重做;否則續用現模型。動態停,邊抽邊看。
- 反駁式紅隊(選擇題):用最強模型主動找碴(正解寫反?措辭誤導?事實過時?把握度標太高?),不是覆述。
- 申論/無官方答案題:錨點不同(沒有官方答案可對),改用
references/explanations-redteam.md§3.4 的六角度(計算重算/準則法條/題意覆蓋/時效/捏造引用/把握度),計算題務必獨立重算。 - 節制門:只修確認的錯,不為改而改;改完重 lint、重驗。
- build:
build_app.py純標準庫、確定性。一場考試一份自足單檔(不出合併版),外加 repo 根index.html索引。圖在此步才 base64 內嵌進window.__FIGS__。前端 ES5、el()/textContent(杜絕 XSS)、檔 < 800 行。網站版(PWA)走 Service Worker cache-first + 圖隨選快取;改 shell 必把CACHE版號 +1。每次改 build/前端後跑 preview smoke (0 console error 才算過)。
build 出來的引擎本身還有一層互動邏輯要顧:單題練習下一題怎麼挑(弱項 Laplace 加權+ 指紋冷卻+定期回鍋複習)、「標記」與「儲存」兩個相似按鈕怎麼分工(作答內記號+回顧介面 折角 vs 收進獨立頁的專練集合),見
references/frontend-engine-rules.md§2、§3。
完整端到端範例見 examples/walkthrough.md(學測社會 111,最難啃的一科)。
品質門檻(每次都遵守、不漂移)
| 門檻 | 規則 |
|---|---|
| 答案配對全驗(必跑) | 每題 answer 逐題對官方標準答案核對、全跑不抽樣,修到 0 mismatch 才往下;擋解析整體錯位(結構檢查擋不到)。 |
| 詳解紅隊(必跑) | AI 生成選擇題與申論題解析後一定要反駁式紅隊;執行前問使用者全跑或抽查。抽查時真錯達 k≥4、n≈40(Wilson CI 下界 ≥ 4%)才升級該科到更強模型;否則續用。 |
| 全形 lint | 中文段落不可混半形標點;CI 一道門(lint.py + lint.yml)。修正用 CJK 前綴規則(CJK 字後緊接的半形子句標點才轉),寧可漏轉、不可誤轉(保住比值 3:1、數字後標點)。 |
| 詳解須查證 | 每則標把握度 c + meta.note 寫明「AI 整理,非官方標準答案,須查證」。 |
| 節制門 | 只修確認的錯(判定寫反、事實錯、把握度明顯標錯),不為純措辭改;改完重 lint、重驗,最小變動面。 |
| 逐字忠實 | 解析絕不改寫/摘要/翻譯;題組絕不拆散;自驗把「忠實」變可檢查條件。 |
模型路由
依成本守則分三檔,把錢花在真正需要推理的地方,並避免「便宜生成 → 昂貴查核」的成本倒置:
| 工作 | 模型 |
|---|---|
| 解析生成(選擇+申論;文字/事實/計算皆是) | Opus 或 Codex 大模型(部分或全部,看使用者) |
| 紅隊查核 | Opus 或 Codex(往上查,見原則 1) |
| 機械化(答案配對核對、下載/轉檔/檔案搬移、結構/全形 lint) | Sonnet/Haiku |
兩條原則:
- 紅隊往上查(reviewer ≥ generator):查核者須 ≥ 被查者,否則漏抓真錯又亂標假錯。Sonnet 不當內容紅隊,只做機械化與結構 lint。
- 避免成本倒置:便宜模型生成、被強模型大量重寫=付兩次。解析直接上強模型一次到位、紅隊只需輕度確認,整體更省。
實測校準(會計師,2026-06):Sonnet 計算 ~67% 錯、文字 ~20% 錯;Codex 計算 ~8% 錯。
查核固定用最強模型。詳解紅隊本身必跑、不可省;但全跑或抽查由使用者決定——抽查時靠統計 停止規則決定要不要升級,不逐題重判。升學分支實測(國文/英文/社會):Sonnet 生成 + Opus 抽驗, 真錯率遠低於升級門檻,故各科續用 Sonnet。(答案配對全驗例外:那道門一律全跑、不抽樣。)
§9 著作權與 clean-room
法律依據:著作權法 §9.1.5
依法令舉行之各類考試試題及其備用試題,不得為著作權之標的。
因此官方試題與標準答案可自由重製,不需授權、不付費。標準答案作為權威答案鍵使用。
clean-room 紀律(受保護的不能碰)
§9 解放的是「試題」本身,不解放出版商加值的部分:
- ❌ 不抄出版商的編排(分類、難度標註、章節對應、選文導讀)。
- ❌ 不抄出版商的詳解;出版商答案/詳解寫法不餵進任何生成 prompt。
- ✅ 詳解由我們自行生成(只看官方試題與官方答案),全標「AI 整理,需查證」並附把握度, 經 lint + 必跑紅隊(全跑或抽查)。
- ✅ 作文採官方分級樣卷(最高分→低分),不 AI 代寫完整作文;英文短答/中譯英近乎有標準 答案,可由 AI 整理參考答案並標明須查證。
授權:方法與程式碼(scripts、引擎)採 MIT;題目資料依 §9 屬公共所有;作文範本屬官方機關
依其授權提供。理由(見產物 docs/DECISIONS.md):norms over laws,與其用 copyleft 強制衍生
開源,不如把 fork/改作/商用的自由給滿,讓「開放比封閉更好用」自己長出規範。
三層文件(別混為一談)
復刻時要寫三份對象不同的文件,剛起步的開源專案最常漏掉第三層:
| 文件 | 對象 | 內容 |
|---|---|---|
SKILL.md(+ references/) | AI agent | 復刻手冊本體,給 agent 載入執行(即本檔)。 |
skill repo 的 README.md | 逛 GitHub 的人 | 門面:這 skill 是什麼、怎麼裝、怎麼用、授權。 |
產物/專案 README.md | 大眾/貢獻者 | 理念 + 如何貢獻 —— 對社群參與最重要,但最常被漏掉。 |
base64 安全鐵則(最高優先)
把任何 base64 字串塞進對話/終端/工具輸出,會觸發 Anthropic AUP 內容過濾器、kill 掉 session —— 這是專案鐵則,整套圖架構就是為了讓 base64 全程不進那些通道。
資料流三段、職責清楚(只描述架構,永不貼任何 base64 內容):
原卷 PDF ──extract_figures──► data/figures/{檔名}.png (獨立二進位 PNG)
│
bank.json 只寫 figure="{檔名}.png" │ (純文字、可 lint、可 git delta)
▼
build_app.py 建置時:PNG ──► base64 ──► 內嵌進 window.__FIGS__(輸出 HTML 內)
鐵則細項(agent/貢獻者務必遵守):
- 絕不把任何 base64 字串放進對話、終端輸出、工具參數、Read 結果。
- 裁圖/批次腳本只 print 計數與大小(張數/位元組/檔名/座標/缺檔清單);要看圖就
用 Read 開 PNG 檔,不
cat、不head、不把 bytes 餵進 prompt。 bank.json/staging JSON 只存檔名;base64 只活在build_app.py的figures_block()內部與最終 HTML。js_safe_json()把資料裡的</轉成<\/,避免內容裡萬一出現</script>提早關閉標籤。
範圍是對象決策,不是技術決策
收哪些年度/課綱/考別,由維護者依服務對象拍板(升學分支:只收新課綱 111–115)。換對象 (收舊課綱、另一國家的考試)時自行調整收錄範圍,其餘流程(偵察→下載→解析→題庫→裁圖→ 詳解→build)不變。學測與會考同平臺、考試選擇器切換、預設不跨考混題;國考各考試對使用者 各自獨立呈現。
但國考端有「共用槓桿」:不同考試常共用基礎科目(如臨床/諮商心理師共用變態心理學、
心理衡鑑等)。開一套新考試前先做「科目重疊矩陣」,共用科目建一次、用 exams 陣列標
歸屬、題庫層去重(同一份官方卷才併),省工又保證兩考試一致 —— 見
references/shared-question-banks.md。
混卷模擬考跨年跨卷抽題時還有另一層去重:組卷前的內容指紋去重(題幹+排序選項), 與「題幹相同、選項全異」的跨年孿生題絕不可 stem-only 誤刪,同場互斥改靠獨立的 題幹指紋+萬用題幹豁免——同樣見
references/shared-question-banks.md。
references 索引
| 檔 | 主題 |
|---|---|
references/data-sources.md | 資料源偵察、下載、著作權 §9、clean-room、bank.json schema |
references/parsing.md | judgment 式解析、markitdown vs pymupdf、每科 parser、冪等 merge、自驗 |
references/figures.md | 裁圖(整塊 render)、定位、band 邊界、base64 安全架構、保真 |
references/explanations-redteam.md | clean-room 詳解、三段固定結構+合併解析規則、品質拉齊五機制、模型路由、反駁式紅隊、Wilson 停止規則、節制門、lint、作文政策 |
references/build-deploy.md | build 單檔/網站、PWA/Service Worker、體積永續、產物層收斂決策 |
references/dirty-data-robustness.md | 政府/考試開放資料的命名/編碼/版面髒點:NFKC 正規化、寬鬆匹配、零筆即報、不吞錯、原子寫入、官方 PDF 文字層 ToUnicode 塌縮的偵測與 vision 復原硬門;含 ceec「數a 少學字」教學案例+攝取前自檢清單 |
references/shared-question-banks.md | 跨考試共用題庫(國考用):科目重疊矩陣、共用科目建一次、exams 陣列多考試標記、同一份官方卷才併的去重紀律、混卷模擬考內容指紋去重、跨年孿生題不可 stem-only 去重 |
references/frontend-engine-rules.md | 前端作答引擎:題組/承上題情境引入規則(各作答表面分工)、出題演算法(弱項加權、指紋冷卻、回鍋複習)、標記與儲存的職責分工 |
examples/walkthrough.md | 端到端範例:學測社會 111(最難啃的一科) |
examples/sample-output/ | 真實產出切片:學測社會 111 題組(passage+小題+圖+詳解 JSON),看管線跑完長什麼樣 |
scripts/ | 各 phase 的參考實作(model 腳本:scrape/parse/裁圖/merge/build);judgment 式、需依自身資料調整,見 scripts/README.md |