学生考试学情逐题诊断(一生一份)
这个技能产出什么
输入一次考试的全套材料,输出每名学生一份 Word 诊断单:A4、实名(学号+姓名)、老师逐一打印发给学生。有几名学生就出几份,一一对应,不多不少。
它不是讲答案的工具——学生手里已经有答案解析了。它要回答三个问题:
- 这张卷子上,我具体丢了哪些点?为什么丢?
- 这些点属于哪些知识点?我到底会不会?
- 我在全体考生里处在什么位置?和他们的差距在哪?下一步往哪使劲?
判断标准:学生读完能说出"我下次要在 X 上做 Y",而不是"我这次考了 105 分"。
它不做什么(边界)
| 不做 | 为什么 |
|---|---|
| 讲答案、复述解析、抄答案 | 学生手里已有答案页,复述是浪费版面 |
| 试卷批注/标注、教师版解析 | 那是另一类产物,混进来会让诊断单变成第二份答案 |
| 班级统计报告(均分、及格率、分数段) | 那是教师看的另一份东西;这里只用群体数据给每题定档 |
| 武断改分 | 红笔分与细则不符时只标注、给建议,最终由老师定 |
学科适配
流程全科通用,判分规则一律以本次传入的答案与评分细则为准。本技能不内置任何学科专属标准——没有预设的作文评分表、没有预设的默写规则、没有预设的数学步骤分规则。
教师另给了避坑指南、表述替换口径、导学案、试卷解析,就优先采用他的分类与口径;没给就用通用规则推导,并标注"推定"。
跨学科唯一固定的是"判分单元":客观选项、采分点、固定文本、步骤、档位。看清这道题按哪种单元给分,再决定怎么逐句核。
一、开工:七步确认,确认后才动手
铁律:先确认资料,再要答题卡,最后逐人分析。 一上来就要答题卡,是最常见的违规。
> 开工先做 30 秒体检(不解析内容):① 路径是否存在、可读(外接盘/网络盘最容易掉);② 必备 2 表能否打开;③ 输出目录能否写。任一不通过就立刻停,请老师把材料复制到 材料/ 再继续——不要先花十几分钟解析,最后才发现盘读不到。
- 先问"沿用上次还是新数据"——包括评分标准版本。口径有任何变化就按新数据重收。
- 按分级要资料:非表格必备(试卷原题、参考答案、评分细则、作文标准、各主观题标准)→ 表格必备 2 张(学科试题分析全体版+本班版、学科小题分)→ 可选背景(平均分/综合指标、一分一段)→ 可选增强(知识点/关键能力/核心素养)。
- 问评分标准来源 A/B/C/D:A 默认由答案细则推导;B 额外给作文标准;C 额外给各主观题标准;D 都给。用户额外填入优先于参考答案,等分推定必须标"推定"。
- 问输出版本 A/B/C:A 打印省纸黑白版(0.6cm、小五 9pt、固定 12 磅、纯黑白);B 屏幕阅读版(约 14pt、1.65 倍、不设页数上限);C 两版都要。内容一致,只换版式。
- 最后再要答题卡:以"放大后像素级可辨"为准——整页小也能用,先裁再判;放大后仍不可辨才退回。默认学生同班,不识别、不统计班级;一次推荐 ≤20 张,理论上限 50 张,一个班跑完再传下一个班。
- 只解析失分题:答对的题不写解析(学生自己对答案即可);屏幕版末尾附「本卷知识点总表」,打印版不附。
- 出《本次资料确认单》,用户确认后才开工。
> 完整话术、分级清单、去重规则、缺项降级、确认单模板:references/startup.md(每次开工必读)。
答题卡怎么判"能不能用"
唯一标准:放大到像素级后,目标字是否可辨。 不看整页 DPI,也不按短边一刀切——很多手机拍的卷子整页很小,放大后完全能读。
判定顺序:
- 先定位:
--grid 2x2粗切,找到该题在哪一格; - 裁切:把该题作答区裁出来,放大到 1:1 像素(小字用 5~8 倍);
- 判定:单字笔画可辨 → 可用;形近字分不清 → 该处标"未判";
- 放大到像素级仍不可辨 → 退回重拍/重扫,并指出具体哪题、哪个字。
python scripts/crop_region.py --image 卡.jpg --grid 2x2 --scale 2 --out tiles
python scripts/crop_region.py --image 卡.jpg --box "0.28,0.10,0.46,0.30" --scale 6 --out q17.png
整页短边只用来决定"要不要裁",不作为退回依据。低于 1000px 也能跑,只要放大后可辨。
形近字必须交叉验证:红笔分 + 上下文 + 同知识点别处的书写;三条都不支持时标"未判",不用上下文猜字填充。
二、锁口径:全体是主参照
一套诊断单只用一个人群做分母,且必须是全体考生:
- 个人总分/各科的全体名次、百分位、超均率(个人 − 全体均分)——一律用全体版。
- 本校、本班只作环境补充(如"你在本班处于中上"),不参与定档,不与全体混算。
- 只有单班数据时,口径标"本班",措辞一律用"本班",禁止写"全体/全校",阈值加 5pp 缓冲。
用 scripts/group_stats.py 出每题标尺。"多数人做对"要用满分率,不是均分率——6 分题均分 3.6 只是"大家拿了一半多"。
# 首选:直接用"试题分析"表(口径就是该表人群,且能反推每题满分)
python scripts/group_stats.py --analysis 语文_试题分析.xlsx \
--population 全体 --out "_诊断过程/群体标尺.json"
# 没有试题分析:从小题分现算(需先有满分表)
python scripts/derive_max.py --analysis 语文_试题分析.xlsx --out 满分.json
python scripts/group_stats.py --scores 语文_小题分.xlsx --max 满分.json \
--population 本班 --out "_诊断过程/群体标尺.json"
满分不用另外整理:满分 = 平均分 ÷ 得分率,24 题实测全部精确到整数(合计等于卷面总分)。报表里的"最高分"是观测最高分,作文满分 60 时最高分可能只有 53.5,不能拿它当满分。
规则见 references/tiering.md。
二·补、先建试卷档案(一次,全员复用)
读参考答案、评分细则、避坑指南、表述替换口径、原文标注解析,把这套题整理成 _诊断过程/试卷档案.json:每题记 qid / order / type / full / answer / kp / trap / template / accept / limit / zero_flex。
为什么先建:几十个学生用同一套题,题目信息只该整理一次;否则前 30 份一个口径、后 32 份另一个口径,家长一问就露馅。详见 references/exam-profile.md。
三、逐生诊断(核心,一人一次)
固定顺序,避免"先读卡再找数据"的先入为主:
a. 先看数据定档。 该生每题得分 vs 全体标尺,按 references/tiering.md 判五类:应得未得 / 个人薄弱 / 共性难题 / 优势 / 可优化(其余归"一般")。这步只用数字。
b. 选择题不读卡。 客观题对错只看小题分表该科目的"客观题"栏(各题得分),不识别、不推断涂卡位置;0 分即错,满分即对。
c. 再读卡取证。 只对"应得未得 / 个人薄弱 / 优势"逐句读卡;其余题各写一句 brief(≤40 字)。选择题本来就做对的,不再分析——表格里已经列为优势,正文不必重复。
d. 每个重点失分点写全五问(顺序固定):
| # | 问 | 写什么 |
|---|---|---|
| 1 | 学生写了什么 | 照录答题卡原句/错字/错选项,≤30 字,不转述 |
| 2 | 按细则能否给分 | 该点要求 + 判定(答到/漏点/判错)+ 理由;只引关键词,不复述整段答案 |
| 3 | 为什么失分 | 知识型/审题型/规范型/笔误型,必须附卷面证据;证据不足写"无法确认",不贴标签 |
| 4 | 对应哪个知识点、是否掌握 | 具体到可训练的点,不写"阅读能力弱";必须附知识补给(规则/例/易错/背/自检),见 references/knowledge-pack.md |
| 5 | 常见坑有没有踩、以后怎么避 | 该题的 trap(客观题是哪个选项怎么改;主观题是常见丢分方向)+ 可替换建议("你的X可换成Y")+ 下次动作 |
主观题按整体给分判,不要假装逐点累加:先判"答到/缺/方向错",再给应得区间(如 3~4 分档),最后与卷面总分比,写出"相符 / 偏低 / 偏高"。规则见 references/exam-profile.md。
e. 复核卷面分。 不盲从红笔分,三类都要查:①错字没改出来;②没答到点却给高了;③答到点却给低了。主观题按整体给分判档,写"按细则这段作答应落 X~Y 分,卷面 Z 分(偏高/偏低)",保留卷面分、不自行改分。规则见 references/rescore.md。
f. 写优势。 领先的题/模块必须展开:哪道题、比全体高多少、用对了什么方法、怎么保持。只报问题不报优势,学生会把诊断单当处分通知。
g. 写宏观差距。 先讲全卷知识点整体掌握(全体数据),再讲该生与全体的差距集中在哪 2-3 处、差多少分、优先补哪个、补到什么程度算过关。
h. 落盘 JSON。 按 assets/schema.example.json 输出到 _诊断过程/学生/<学号>.json。先结构化再渲染,同一份数据可反复调版式。
判定细则见 references/diagnosis.md,行文见 references/writing.md。
四、渲染 Word
python scripts/build_docx.py \
--student "_诊断过程/学生/2026010101.json" \
--group "_诊断过程/群体标尺.json" \
--out "<目标文件夹>" \
--subject "语文" --exam "2026秋高一素养评价(一)"
输出 <学号><姓名>.docx。开工第 4 步先定版式,用 --layout 切换:
| 版式 | 参数 | 用途 |
|---|---|---|
compact |
0.6cm、小五 9pt、固定 12 磅 | 默认,最省纸 |
print |
0.6cm、小五 9pt、固定 12 磅、表格 10 磅、纯黑白无底纹 | 打印省纸黑白版 |
screen |
2.0cm、14pt、单倍行距、允许彩色/底纹 | 屏幕阅读重点版 |
both |
一次出 print + screen | 两版都要 |
--layout both 会自动生成两份,文件名分别是"..._打印省纸黑白版.docx"和"..._屏幕阅读重点版.docx";两版文字必须逐字一致,只有版式与颜色不同。版式由脚本统一控制,不要手工排版——几十份手工排的文档,字号行距一定不一致。参数见 references/docx-format.md。
内容密度:只出 2 页或 4 页,不要停在 3 页或 3 页多点。
页数:先标准出,量了再选档
- 第一份用默认参数出:
--scale 1.0 --line 12。 - 用
scripts/check_pages.ps1量实际页数(不要信脚本估算)。 - 按实测选档:
| 实测 | 处理 | 参数 |
|---|---|---|
| ≤2 页,第 2 页不满 70% | 放大到 2 页铺满 | --scale 1.08 --line 13 |
| 2 页多一点 | 先压;压不下(表格不能拆)就放大铺 4 页 | --scale 0.92 --line 10.2,不行改 1.34/18 |
| 3 页(含 3 页多) | 放大铺 4 页 | --scale 1.34 --line 18 |
| 4 页多一点 | 压回 4 页 | --scale 1.24 --line 16 |
- 同一批学生尽量用同一档,厚薄一致;个别超长的单独选档,并在进度表里记一列"页数"。
不要为了凑页数删内容。压不下去通常是"某张表不能拆页"造成的块级留白,换档比删句子有效。
五、自检
按 references/qa.md 逐项过:数字可追溯、无编造原句、四因有证据、页数达标、姓名学号与答题卡一致。
页数优先用 scripts/check_pages.ps1 精确统计(Windows 装了 Word 时):
powershell -ExecutionPolicy Bypass -File scripts/check_pages.ps1 -Path "<目标文件夹>"
自检不过就改 JSON 重渲染,不要直接改 Word——手改的那一份会成为唯一例外。
六、试跑 → 认可 → 分批 → 续跑
先出 10 份,请老师按 references/qa.md 的"试跑认可清单"核对。认可后再批量,并冻结当前规则版本——中途改规则,前后口径会分裂。
每次只导出不超过 20 人(推荐 10~20,默认 20,上限 50)
不要一次导出全班。 三个理由:一次生成几十份 Word 容易卡死或漏文件;打印出来一叠太厚,老师和学生都不好分;分批后出错只影响这一批,重做成本低。
# 1) 把名单拆成 10~20 人一批(自动均分,避免最后一批只剩两三人)
python scripts/batch_plan.py --students "_诊断过程/名单.csv" --size 20 \
--out "_诊断过程/批次.csv"
# 2) 每批单独一个子文件夹:<目标文件夹>/第01批/、第02批/ …
# 批内文件名仍是“学号姓名.docx”
每批流程固定四步:
- 只处理本批名单;
- 出完立刻跑一次
check_pages.ps1量页数,抽查 1~2 份; - 本批无问题再进下一批;
- 在
批次.csv的"已导出"列打勾。
一批出问题,只重做这一批,不要动已经验收的批次。
python scripts/run_state.py init --dir "<目标文件夹>/第01批" --students "_诊断过程/名单_第01批.csv"
python scripts/run_state.py next --dir "<目标文件夹>/第01批" --n 15
python scripts/run_state.py done --dir "<目标文件夹>/第01批" --id 2026010101 --file "2026010101张三.docx"
python scripts/run_state.py list --dir "<目标文件夹>/第01批"
中断后用 next 续跑;已存在的 Word 默认跳过。换批只需换目录与名单。
红线
- 数字必须可追溯。分数、名次、群体率、原句全部来自传入材料;算不出的留空注明"缺数据",不估算。
- 不把群体均分当个人能力。群体数据只用来定档和算差距。
- 四因必须有卷面证据。只有"同知识点别处做对 + 卷面明显笔误"两条同时满足才可归笔误型;否则标"待确认"。
- 不贴标签。禁止"粗心""基础差""态度不端正""阅读能力弱",改写成可观察的行为与可训练的点。
- 不复述答案。判定只引关键词,篇幅留给"为什么错、怎么补"。
- 不把难题当个人失败。群体得分率低的题,不追责、不展开批评。
- 无法辨认就不下结论。字迹不清、涂点辨不出,直接写"此处无法辨认"并跳过该点,不猜、不编,也不另设"待确认"清单——把事实写进对应题目里。
- 不擅自改分。红笔分与细则不符时只提复核建议,保留原分。
- 不匿名、不改名。文件名就是学号+姓名,与答题卡一致;不一致以考号为准并记录。
- 卷面分不等于真实得分。 阅卷可能有误判。所有判定一律以试卷原题与标准答案为准,逐题核对;与卷面分不一致的,写进"分数复核",保留卷面分、不改分。
- 先确认资料、再要答题卡、最后才分析。 顺序颠倒就是违规。
- 先问路径,再动手。
参考文件
| 文件 | 什么时候读 |
|---|---|
references/startup.md |
每次开工必读:上次/新数据、资料分级、评分标准 A/B/C/D、确认单 |
references/inputs.md |
表格字段映射与口径识别 |
references/tiering.md |
定档:阈值、优先级、小样本、特殊题型 |
references/trap-derivation.md |
没有避坑材料时,从原文与答案反推八类设错、五步反推主观题坑 |
references/exam-profile.md |
先建试卷档案:每题的知识点/坑/模板/可替换/硬限制;主观题整体给分 |
references/diagnosis.md |
逐题判定、同义替换边界、四因证据、三态标注 |
references/rescore.md |
红笔分复核:什么算差异、怎么表述、什么不改 |
references/knowledge-pack.md |
知识补给:把"知识点"写成能背、能练的五件套 |
references/essay-rubric.md |
作文:基准45+加分+四项扣分+字数封顶,逐项核 |
references/writing.md |
诊断单结构、措辞、篇幅预算 |
references/docx-format.md |
版式参数、命名、覆盖与路径异常 |
references/anomalies.md |
缺卡/缺考/字迹不清/争议/数据对不上 |
references/qa.md |
自检、试跑认可清单、批量协议 |
assets/schema.example.json |
写学生 JSON 时对照字段 |
依赖
Python 3.10+,需要 python-docx、openpyxl。缺依赖时报错并提示安装,不要退回手工拼 Word。
版本:2.3(2026-10-22 发布版)|流程、版式、评分口径均以本文件为准;换学校只换试卷档案与细则,不改流程。
许可:Apache-2.0,全文见 LICENSE,署名见 NOTICE。