Taiwan Exam 让 AI 出一份原创的学测仿真考,最后交付题本和详解两份 PDF。它的内核分工只有一句话:模型负责出题,程序只负责排版、检查和套版,而且程序永远不替题目品质背书。
为什么要这样分工
LLM 很会写题目,但它也很会「说自己写得很好」。如果让同一个模型出题、自评、再宣布完成,品质问题就会被一句「已检查」盖过去。所以这套工具的设计原则是:
- 能用机器判断的(格式、版面、字体、页面留白、答案分布、图片分辨率),交给脚本判断;
- 需要判断力的(题目好不好、难度对不对),要留下可检查的证据,而且不能由脚本自动标成通过。
主要的流程脚本在说明里写得很直接:它「从不出题,也从不核准审查」。
流程
- 读取知识、预检。 只读这一科需要的数据,每段不超过 12,000 字;检查 PyMuPDF 版本、30 份原始模板的哈希值、答对率校准快照、字体,以及图片能不能下载。
- 命题蓝图。 先排出整份考卷:题号、配分、四个难度带、答案分布、需要几张图、总作答时间。难度用大考中心 111–115 年的官方答对率校准,例如数学是「中偏难+难 ≥ 70 分、难 ≥ 30 分、手算 80–92 分钟」。
- 分批命题。 每次只写 2~4 题并存盘。格式不对会直接拒收:LaTeX、
$符号、不成对的标签、哈希对不上的图、分辨率太低的图片。 - 盲审解题。 产生一份不含答案的题目包,从印出来的题目重新解一次,再估计答对率、归入难度带。
- 内容锁定。 题目与答案写进锁定档之后,才能开始正式组版;要改题就得重新锁定并写下理由。
- 套用原始模板。 题目本体是透明的一页,用 PyMuPDF 叠印到大考中心的原始模板上,只有年份、页码和封面标题是动态字段。页眉页脚的像素在叠印前后必须完全相同,否则直接中止。
- 逐页检查,然后交付。 每一页和每一题的截屏都要写下观察、标记通过或不通过;最终检查通过才输出两份 PDF。
检查长什么样子
- PDF 检查器有 9 种硬性失败:不是 A4 或被旋转、缺字或替代字符、文本超出页面、作答栏碰撞、作答栏格式错误、数学题印出来源备注、数学题印出制作说明、栏宽过窄、国写字体用错。
- 页面留白:一般内页最多 32% 空白(英文 42%),最后一页 60%。组版计划、检查器和最终检查用的是同一条规则,不会前后不一。
- 最终检查:每题 4 道关(答案、难度、原创性、图片),整份 5 道关(题型结构、难度平衡、来源依据、模板组成、答案分离),再加上各科自己的检查。
- 预算:组版计划最多 3 次、正式组版最多 2 次,避免模型无限重试、把时间耗光。
让它能在一般人的 AI 里跑
老师和学生多半不会用终端机,所以同一套规则有三种交付方式:可以直接上传到 Claude 或 ChatGPT 的 Skill ZIP(Claude 的上传上限是 200 个文件,所以要打包成资源包)、给 Gemini 和项目用的知识档,以及给 Codex、Claude Code 的本机版。完整考卷常常要两三轮对话才做完,所以每一步都会存盘,用户回一句「继续」就能接着做。
诚实的限制
- 机器检查不等于好题目。 所有自动检查都只能挡掉「明显错」的东西;题目是否有教学价值,仍然需要人看。
- 模型差异很大。 目前 4 种模型 × 7 科、共 28 份的实测只完成 14 份,其余仍在测。
- 整个项目有 112 支脚本、679 项测试,但测试验证的是工具本身,不是模型出的每一题。
原代码与安装方式:github.com/niansia/taiwan-exam。也可以看 80 秒的前导片。