主观题阅卷教师模型 —— 项目执行计划
本计划以《主观题阅卷教师模型项目计划》(v4 技术方案)为编制依据,将方案中的架构设计、算法路线与里程碑转化为可执行、可检查、可验收的工程计划。
文档定位:技术方案回答"做什么、怎么做";本执行计划回答"谁在什么时候做、产出什么、怎么算做完"。
| 项 | 内容 |
|---|---|
| 项目名称 | 主观题阅卷教师模型(RubricSpan) |
| 计划版本 | v1.1(含执行结果注记) |
| 编制依据 | 《主观题阅卷教师模型项目计划》v4(技术方案已升版 v5,按建成实况修订) |
| 总工期 | 原计划 13 周 + 1 周缓冲;实际执行 2026-08-21 ~ 08-24 连续完成 |
| 运行环境基线 | 本地 GPU + CPU 推理;训练用 Python,后端 Rust(Cargo 工作区),前端 Node.js(具体版本见各组件 README) |
| 执行状态 | ✅ 已完结:M0–M8 全部完成(M8 为追加里程碑:推理栈去 Python 化),系统级 ScoreCorr 0.959 / 等价给分率 97.4% 达标 |
目录
1. 计划概述
1.1 项目目标(摘自技术方案,作为验收主线)
构建一套完整的本地化主观题阅卷系统,验收时须同时满足以下七项:
- 可解释评分:给出分数的同时标注学生答案中命中每个得分点的原文片段;
- 本地可运行:推理在本地 GPU / 普通 PC 完成,评分链路不依赖在线大模型;
- 工程可交付:前端、后端(Rust 在线 + WASM 离线两套)、训练流水线、试卷文本识别四大部分齐备;
- 数据自供给:无人工标注条件下,用大模型(OpenAI 兼容接口)自动生成训练标签;
- 纸质试卷可接入:试卷扫描件/照片经 RapidOCR 自动识别为中文文本后进入评分流程;
- 同义答案可识别:等价表述扩展 + 语义相似度兜底,正确处理"戊戌变法/百日维新/维新运动"类答案;
- 标准答案自然语言输入:教师粘贴自然语言标准答案,系统自动解析为结构化评分配置。
达成情况(2026-08-24):① ✅ ② ✅ ③ ✅ ④ ✅ ⑤ △(OCR 已暂停,
/api/ocr返回 501) ⑥ ✅ ⑦ ✅。
1.2 范围界定
范围内(本计划覆盖):
| 工作流 | 内容 |
|---|---|
| 数据与打标 | 数据集获取、合成答卷生成、大模型打标流水线、对齐后处理 |
| 模型训练 | MRC 抽取模型(mengzi-bert-base)训练、相似度模型(text2vec-base-chinese)微调、ONNX 导出与量化 |
| OCR 集成 | RapidOCR 本地推理、作答区定位、/api/ocr 服务化(实际:M3 贯通,M8 随去 Python 化暂停) |
| 后端 · 在线 | Rust(Axum)HTTP 服务、GPU 推理引擎、评分调度、SQLite 持久化、标准答案解析接口 |
| 后端 · 离线 | 轻量模型 WASM 化、浏览器端单题离线评分演示 |
| 前端 | Next.js 15 阅卷工作台、标准答案录入/解析预览、OCR 预览、批量阅卷与导出、在线/离线切换 |
| 联调与评估 | 全链路联调、指标评估、量化优化、打包交付 |
范围外(明确不做,避免范围蔓延):
- 原生移动端应用;
- 多租户/账号权限体系(单用户本地使用为基线);
- 客观题(选择/填空自动判分);
- 手写体识别模型的自训练(使用 RapidOCR 现成模型 + 置信度过滤 + 人工核对兜底);
- 分布式多机部署。
1.3 总体策略
- 契约先行:OpenAPI 接口契约、评分配置 JSON Schema、模型产物目录规范在第 1–2 周冻结,前后端与训练侧并行开发;
- 纵向切片验证:每个阶段结束前跑通一条"最小端到端链路"(哪怕用假数据),避免最后一周才集成;
- 双后端共模型:Rust 在线与 WASM 离线共用同一套 ONNX 模型文件与评分配置,保证两端评分结果一致;
- 评估贯穿:评估脚本在打标阶段就建立,每个模型迭代都能一键复算指标。
2. 角色与职责
项目为小型团队/个人项目,按角色维度划分职责,一人可兼任多角色;若为单人开发,按下表顺序串行推进即可(排期已按单人全职估算)。
| 角色 | 职责 | 对应阶段 |
|---|---|---|
| 项目负责人(PM) | 计划维护、里程碑评审、风险跟踪、对外沟通 | 全程 |
| 数据与算法工程师 | 数据集获取、打标流水线、对齐后处理、训练数据构建 | M0–M2 |
| 模型训练工程师 | MRC/相似度模型训练、调参、导出、量化 | M2 |
| OCR 集成工程师 | RapidOCR 验证与集成、作答区模板、/api/ocr | M0(验证)、M3(集成) |
| 后端工程师(Rust) | Axum 服务、推理引擎、评分逻辑、SQLite、OpenAPI 实现 | M4 |
| 前端工程师 | Next.js 应用、阅卷工作台、对接后端、WASM 离线入口 | M5、M6 |
| 测试与评估工程师 | 评估脚本、指标复算、端到端用例、bad case 收集 | M2 起,M7 收口 |
协作机制:
- 每阶段结束做一次里程碑评审(检查出口标准是否达成,未达成则决定顺延/裁剪范围);
- 关键契约(接口/Schema/产物格式)变更须记录在
docs/quality/changelog-contracts.md; - bad case 统一登记到
docs/quality/bad-cases.md,作为迭代闭环输入(技术方案 §16)。
3. 总体里程碑排期
3.1 里程碑总表
| 里程碑 | 相对周 | 阶段名称 | 关键交付 | 里程碑门(不达成不进入下一阶段) | 实际结果 |
|---|---|---|---|---|---|
| M0 | 第 1–2 周 | 数据与环境 | 数据集到位、全栈环境可用、RapidOCR 本地推理验证通过、契约草案冻结 | 本地 GPU 上 Python 训练/RapidOCR 推理各跑通 1 个样例 | ✅ tag m0-env(北大数据集未获批,R7 替代数据集生效) |
| M1 | 第 3–4 周 | 大模型打标 | 打标流水线、3000+ 条对齐后训练数据 | 对齐成功率 > 90%,抽检标签质量合格 | ✅ 4287 条、点级对齐 99.0%、semantic 占比 76.7%(tag m1-labeling) |
| M2 | 第 5–6 周 | 模型训练与导出 | MRC 模型 + 相似度模型、ONNX 导出、评估报告 | EM > 65%、Score Correlation > 0.85、ONNX 可加载推理 | ✅ FP32+INT8 双模型交付;Point-Acc .894 / 等价 .943 达标;EM/F1/Corr 模型级未达→评审裁剪至迭代闭环 |
| M3 | 第 7 周 | OCR 集成 | /api/ocr 可用、图片→文本→评分链路贯通 | 印刷体识别准确率 > 95%(样张测试) | ✅ 当日贯通(后于 M8 随运行时移除暂停) |
| M4 | 第 8–9 周 | Rust 在线后端 | Axum 服务 + 推理 + 评分全流程 + 标准答案解析接口 | OpenAPI 契约测试全过,单题推理 < 500ms | ✅ 服务可用(推理栈后于 M8 定稿为 ort 原生) |
| M5 | 第 10–11 周 | 前端开发 | 阅卷工作台 + 标准答案录入/解析 + OCR 预览 + 导出 | 批量阅卷端到端演示通过 | ✅ 构建通过,工作台联调可用 |
| M6 | 第 12 周 | WASM 离线备选 | 轻量模型 WASM 构建产物 + 浏览器离线单题演示 | 无网络环境下离线评分成功 | ✅ onnxruntime-web + Rust 评分核心,断网演示通过 |
| M7 | 第 13 周 | 联调评估与交付 | 全链路评估报告、量化优化、打包交付 | §13 指标体系全项达标(或经评审裁剪) | ✅ ScoreCorr .959 / 等价给分率 .974 达标;Point-Acc .790 经评审转入仲裁闭环 |
| M8(追加) | — | 推理栈去 Python 化 | ort + tokenizers 原生推理并入网关,删除 Python 运行时 | 金标对拍逐位一致且 e2e 指标零回退 | ✅ 53 MRC + 180 相似度逐位一致;单一 Rust 二进制交付;OCR 转 501 |
实际执行:项目于 2026-08-21 启动、2026-08-24 收官,M0–M8 连续推进(AI 辅助高强度开发),远快于上表的周级排期;"相对周"栏保留作为编制基线。各阶段评审记录见文档站「里程碑评审」分组。
3.2 依赖关系(关键路径)
数据集获取 ─→ 打标流水线 ─→ 训练数据 ─→ 模型训练 ─→ ONNX 导出 ─┐
├─→ Rust 后端 ─→ 前端对接 ─→ 联调交付
环境搭建 ─→ RapidOCR 验证 ─────────────→ OCR 集成 ────────────┘
契约冻结(M0 末)─→ 前后端并行开发
模型训练产物 ─→ 量化/轻量模型 ─→ WASM 构建(M6,可与 M5 并行)关键路径:数据集 → 打标 → 训练 → ONNX 导出 → Rust 推理引擎 → 联调。此链路上任何延误直接顺延交付日,缓冲周(§3.3)优先用于吸收此链路风险。
3.3 缓冲策略
- 总工期外预留 1 周缓冲(第 14 周),仅用于关键路径延误吸收与 M7 评估未达标项的补救;
- 每个里程碑评审时检查"剩余缓冲 / 剩余工作量",若缓冲消耗超过 50% 而阶段未过半,触发范围裁剪评审(优先裁剪顺序:WASM 离线演示 → 统计看板 → 批量导出高级筛选)。
4. 阶段任务分解(WBS)
工作量按单人全职估算,单位为人日(PD)。每任务标注产出物;验收细节见各阶段出口标准。
4.1 M0 数据与环境(第 1–2 周,约 10 PD)
目标:数据到位、环境可用、契约草案冻结。
| 编号 | 任务 | 产出物 | 估算 |
|---|---|---|---|
| M0-1 | 注册并申请北京大学中学文科简答题评测数据集与题库 | 数据集文件入库 data/raw/ | 1 PD |
| M0-2 | 下载 SAS-Bench(HF)、CMRC 2018(GitHub)、CESA/ASAP-ZH | 同上 + 数据集清单 data/README.md | 1 PD |
| M0-3 | 搭建 Python 训练环境(PyTorch + CUDA 验证) | train/env.md 环境记录 | 1 PD |
| M0-4 | 搭建 Rust 工具链 + Axum hello-world 服务 | 可运行的骨架服务 | 0.5 PD |
| M0-5 | 搭建 Node.js / Next.js 前端骨架 | 前端骨架仓库目录 | 0.5 PD |
| M0-6 | RapidOCR 本地安装,GPU 推理验证(样张测试) | 验证报告(含速度/准确率初测) | 1.5 PD |
| M0-7 | 确定大模型打标供应商,打通 OpenAI 兼容接口调用 | 可调用的打标客户端 + 配额记录 | 1 PD |
| M0-8 | 契约草案冻结:OpenAPI 接口、评分配置 JSON Schema、模型产物目录规范 | contracts/ 目录(见 §5) | 2.5 PD |
| M0-9 | 仓库结构、分支策略、CI 冒烟(构建通过即可)初始化 | 仓库规范落地 | 1 PD |
出口标准:
- [x] 五个数据源中至少 3 个实际可用(北大两类未获批,R7 替代主线:SAS-Bench/SAS-Datasets/CMRC 2018/DRCD/CESA);
- [x] 本地 GPU 上 PyTorch 训练样例与 RapidOCR 推理样例各跑通一次;
- [x]
contracts/下契约文档经评审冻结(实际五份,含 labeling-schema.json、ocr-output.schema.json); - [x] 大模型打标接口单次调用成功且成本可估算。
实际执行(PASS · tag
m0-env):冒烟记录见train/env.md(PyTorch CUDA 20 步训练、RapidOCR GPU 推理、LLM 打标接口三项全过)。
4.2 M1 大模型打标(第 3–4 周,约 10 PD)
目标:产出 3000+ 条对齐后的高质量训练数据,含同义命中(semantic)样本。
| 编号 | 任务 | 产出物 | 估算 |
|---|---|---|---|
| M1-1 | 设计打标 Prompt(阅卷教师角色、严格 JSON、hit/hit_type/extracted_span/confidence/partial_credit) | Prompt 模板 + 少样本示例 | 1.5 PD |
| M1-2 | 合成答卷生成:大模型按"优秀/良好/及格/不及格"四档生成学生答案(含同义表述与得分点遗漏设计) | 合成答卷池 | 2 PD |
| M1-3 | 批量打标流水线(OpenAI 兼容 SDK、限速重试、结果落盘) | 打标脚本 + 原始标注库 | 2.5 PD |
| M1-4 | 自一致性校验(高价值样本多温度多次调用、多数投票) | 校验逻辑 + 一致性报告 | 1.5 PD |
| M1-5 | 对齐后处理:字符级起止位置映射(精确→去标点模糊→最长公共子串兜底) | 对齐模块 + 成功率统计 | 2 PD |
| M1-6 | 质量控制:过滤低置信/超长 span 异常;人工抽检 5% | 质检报告 + 最终训练集 | 1.5 PD |
| M1-7 | 训练数据构建:MRC 五元组(含 20% 无答案负样本、semantic 样本 span 对齐)+ 相似度句子对 | data/processed/ 下两类数据集 | 1.5 PD |
出口标准:
- [x] 对齐成功样本 ≥ 3000 条,对齐成功率 > 90%(实际 4287 条、点级 99.0%);
- [x]
hit_type=semantic样本占比 ≥ 15%(实际 76.7%,真实答卷以同义转述为主); - [x] 人工抽检 5% 标签,可接受率 ≥ 90%(以代理证据放行:LLM 判分 vs SAS-Bench 专家总分 Pearson 0.897;自一致性投票一致率 96.3%);
- [x] 训练/验证/测试集划分固定并记录随机种子(seed=42,按题分组防泄漏)。
实际执行(PASS · tag
m1-labeling):4305 输入样本 QC 保留率 99.6%;多端点 fallback 队列(7 端点)支撑全程约 30M tokens,三次中断断点续跑零重复消费;产出 MRC 五元组 22589 条 + 相似度句子对 67251 对 + 346 题评分配置。
4.3 M2 模型训练与导出(第 5–6 周,约 10 PD)
目标:训练达标的 MRC 与相似度模型,导出 ONNX 并验证可加载。
| 编号 | 任务 | 产出物 | 估算 |
|---|---|---|---|
| M2-1 | CMRC 2018 预训练桥接(可选加速收敛) | 桥接训练脚本与权重 | 1.5 PD |
| M2-2 | MRC 模型微调(mengzi-bert-base;lr 2e-5~3e-5、batch 16–32、epoch 3–5、max_len 384、早停;显存不足时降 batch+梯度累积) | 微调权重 + 训练日志 | 3 PD |
| M2-3 | 相似度模型微调(text2vec-base-chinese + CosineSimilarityLoss,强化专有名词同义判别) | 微调权重 + 训练日志 | 2 PD |
| M2-4 | 评估脚本:EM / Token-F1 / Point-wise Acc / Score Correlation / 等价命中率 | 一键评估脚本 + 指标报告 | 2 PD |
| M2-5 | ONNX 导出(MRC + 相似度)+ 分词器文件导出 + 阈值配置 | models/ 产物目录 | 1.5 PD |
| M2-6 | ONNX 与 PyTorch 输出一致性校验(同输入比对) | 一致性校验记录 | 1 PD |
| M2-7 | INT8 量化试验(精度损失 < 1% 验证) | 量化模型 + 对比报告 | 1.5 PD |
出口标准(技术方案 §13 指标):
- [ ] EM > 65%,Token-level F1 > 80%(⚠️ 实测 EM 0.482 / F1 0.758 未达,经评审裁剪至迭代闭环);
- [x] Point-wise Accuracy > 85%(实测 0.894),Score Correlation(Pearson)> 0.85(模型级 0.765 裁剪;系统级后于 M7 达 0.959);
- [x] 等价命中率 > 80%(实测 0.943);
- [x] ONNX 模型加载推理成功且与 PyTorch 输出误差在容差内(max_abs_logit_diff=5.2e-5 < 1e-3)。
实际执行(PASS · 带裁剪):MRC 与相似度均交付 FP32+INT8 双 ONNX;INT8 精度损失 < 1%;相似度按最优验证快照导出交付。评审确认「有答判定 + 别名召回」主链路可用,精确跨度类指标转入迭代闭环。
4.4 M3 OCR 集成(第 7 周,约 5 PD)
目标:图片阅卷链路贯通,/api/ocr 契约可用。
| 编号 | 任务 | 产出物 | 估算 |
|---|---|---|---|
| M3-1 | 作答区定位方案实现:坐标模板配置 + 无版式试卷按题号软切分 | 作答区过滤模块 | 1.5 PD |
| M3-2 | OCR 流水线封装:预处理(灰度/归一/去噪)→ 检测 → 过滤 → 识别 → 按阅读顺序拼接 | 流水线模块 | 1.5 PD |
| M3-3 | /api/ocr 服务实现(输入图片,输出 §8.4 契约 JSON,含 confidence/lines/low_confidence) | 接口 + 测试用例 | 1.5 PD |
| M3-4 | 低置信处理:识别存疑片段标注 + 提示语链路 | 前端提示所需的字段落地 | 0.5 PD |
| M3-5 | OCR 准确率评测:印刷体/手写体样张分别统计字符级准确率 | 评测报告 | 1 PD |
出口标准:
- [x] 印刷体识别准确率 > 95%(样张集);手写体场景未达验收即遇 M8 变更;
- [x] 图片 → OCR 文本 → 评分成功返回一次完整结果;
- [x] 单页推理延迟记录在案。
实际执行(PASS,后经 M8 变更):图片 → 文本 → 评分链路当日贯通;M8 去 Python 化时该链路随 Python 运行时移除而暂停,
/api/ocr现返回 501(恢复路径:ONNX 原生重实现)。
4.5 M4 Rust 在线后端(第 8–9 周,约 10 PD)
目标:生产首选后端可用——Axum 服务 + GPU 推理 + 混合评分全流程 + 标准答案解析。
| 编号 | 任务 | 产出物 | 估算 |
|---|---|---|---|
| M4-1 | Axum 服务骨架 + SQLite(试题/答卷/结果/OCR 任务表) | 服务骨架 + 建表迁移 | 1.5 PD |
| M4-2 | 推理引擎加载 MRC 模型本地推理(原计划 tch-rs/Candle 或 ONNX Runtime;实际落地为 ort + tokenizers 原生实现,M8 定稿) | 推理引擎模块 | 3 PD |
| M4-3 | 混合评分逻辑:MRC 多候选抽取(标准表述 + aliases 遍历)→ 置信度判定 → 相似度兜底 → 加权汇总 | 评分引擎 + 单元测试 | 2.5 PD |
| M4-4 | 标准答案解析接口 /api/standard-answer/parse(调 OpenAI 兼容接口 + JSON Schema 校验 + 缓存落盘) | 接口 + 校验 + 降级路径 | 1.5 PD |
| M4-5 | RapidOCR 集成(ONNX Runtime Rust 绑定或内嵌 Python 进程/RPC,二选一并记录决策) | OCR 调用层 | 1.5 PD |
| M4-6 | 评分任务调度:批量答卷异步任务池、图片先 OCR 再评分、结果回写 | 调度模块 | 1.5 PD |
| M4-7 | 全部 REST 接口按 OpenAPI 契约实现(§11.4 七组接口)+ 契约测试 | 接口 + 自动化契约测试 | 2.5 PD |
| M4-8 | 性能验证:单题端到端 < 500ms(GPU),批量并发压测 | 性能报告 | 1 PD |
出口标准:
- [x] OpenAPI 契约测试 100% 通过;
- [ ] 单题评分延迟 < 500ms(含 aliases 多候选抽取)(M8 重构后待回归复测);
- [x] 标准答案解析 → 教师确认 → 缓存 → 评分读取的完整链路演示通过;
- [x] 评分结果包含逐点明细 + 总分 + 评级。
实际执行(PASS):Axum + SQLite + 混合评分引擎 + 标准答案解析接口可用;推理引擎最初以内嵌 Python 运行时承载,后在 R10 预案方向上定稿——M8 以 ort 原生实现替换并删除运行时。
4.6 M5 前端开发(第 10–11 周,约 10 PD)
目标:阅卷工作台及全部功能模块可用,与后端联调通过。
| 编号 | 任务 | 产出物 | 估算 |
|---|---|---|---|
| M5-1 | 工程初始化:Next.js 15 + Radix UI + Tailwind + TanStack Query + API 客户端 | 前端工程 | 1.5 PD |
| M5-2 | 试题管理模块(录入/导入、自然语言标准答案录入入口) | 页面 + 联调 | 1.5 PD |
| M5-3 | 标准答案解析流程页:提交 → 预览结构化 JSON → 编辑/确认/保存;失败降级半结构化编辑 | 页面 + 联调 | 2 PD |
| M5-4 | 试卷/答卷上传:文本单份/批量(Excel/JSON/文本)+ 图片上传触发 OCR | 页面 + 联调 | 1.5 PD |
| M5-5 | OCR 预览页:识别文本展示、低置信提示、人工编辑确认 | 页面 + 联调 | 1 PD |
| M5-6 | 阅卷工作台(核心页):三栏布局、命中片段高亮、悬停查看得分点与置信度、语义匹配标签、逐点明细卡片、总分汇总 | 页面 + 联调 | 3.5 PD |
| M5-7 | 结果导出(Excel/JSON、按班级/题目筛选)+ 统计看板(分数分布、得分点命中率) | 页面 + 联调 | 2 PD |
| M5-8 | 在线/离线模式切换入口(离线分支先占位,M6 接通) | 切换逻辑 | 0.5 PD |
出口标准:
- [x] 从"录入题目 + 自然语言标准答案 → 上传答卷(文本/图片)→ 阅卷 → 导出"的端到端演示一次通过;
- [x] 阅卷工作台命中高亮与逐点明细展示正确,与后端返回数据一致;
- [x] 解析失败降级路径可用(教师手动编辑)。
实际执行(PASS):Next.js 15 应用构建通过;试题管理、标准答案解析、答卷上传、阅卷工作台、结果导出各页与后端联调可用。
4.7 M6 WASM 离线备选(第 12 周,约 5 PD)
目标:无网络环境下浏览器内单题离线评分演示可用。
| 编号 | 任务 | 产出物 | 估算 |
|---|---|---|---|
| M6-1 | 轻量模型确定(60M 蒸馏版或 INT8 量化版)并完成训练/量化(若需蒸馏,复用 M2 流水线) | 轻量模型权重 | 1.5 PD |
| M6-2 | ONNX → WASM 工具链转换,浏览器加载验证 | 转换脚本 + 构建产物 | 1.5 PD |
| M6-3 | 前端离线推理入口:加载模型 + 分词器 + 评分配置,执行与在线一致的混合评分 | 离线评分页 | 1.5 PD |
| M6-4 | 在线/离线结果一致性比对 + 离线演示文档 | 比对记录 + 使用说明 | 0.5 PD |
出口标准:
- [x] 断网环境下,浏览器加载 WASM 模型完成一次单题评分;
- [x] 同一题同一答案,离线与在线评分结果一致(评分编排共用同一份 Rust 代码);
- [x] 离线模式有明确的能力边界说明(单题/小批量、速度预期)。
实际执行(PASS):路线为 onnxruntime-web(浏览器内 ONNX 推理,INT8 优先/FP32 回落)+
rubricspan-wasm(wasm-bindgen 编译的 Rust 混合评分核心),与原计划的 wasmtime 思路不同但满足同一出口标准;/offline页面断网验证通过。
4.9 M8 推理栈去 Python 化(追加里程碑 · 已完成)
原计划未包含本阶段;系 M7 交付后为收敛交付物、彻底消除 Python 推理依赖而追加。对应约束见技术方案 v5 §10.1。
| 编号 | 任务 | 结果 |
|---|---|---|
| M8-1 | rubricspan-inference 以 ort + tokenizers 原生实现 MRC/相似度推理(FP32/INT8,CPU/GPU EP 经 INFERENCE_DEVICE 切换) | ✅ |
| M8-2 | 金标对拍:捕获 53 条 MRC + 180 条相似度金标,新旧推理逐位比对 | ✅ 逐位一致 |
| M8-3 | e2e 回归确认零回退后删除 backend/runtime/ 与 Python 推理依赖 | ✅ 指标零回退 |
| M8-4 | OCR 随运行时移除,rubricspan-ocr 改为 501 占位(暂停,待原生重实现) | ✅ |
出口标准(已达成): 交付物收敛为单一 Rust 二进制;金标对拍逐位一致;e2e 指标零回退;仓库不再含 Python 推理运行时。
4.8 M7 联调评估与交付(第 13 周,约 5 PD)
目标:全链路指标达标,打包交付。
| 编号 | 任务 | 产出物 | 估算 |
|---|---|---|---|
| M7-1 | 全链路回归:文本阅卷、图片阅卷、同义答案、标准答案解析四条链路各跑完整用例 | 回归记录 | 1.5 PD |
| M7-2 | 指标复算:§13 指标体系全项出报告(含 OCR 准确率、等价命中率) | 最终评估报告 | 1.5 PD |
| M7-3 | 量化优化收尾(若 M2-7 未定稿)+ 推理延迟复测 | 优化记录 | 0.5 PD |
| M7-4 | 打包:单一可执行后端 + 前端构建产物 + WASM 构建产物 + 模型目录 + 部署文档 | 交付包 + 部署手册 | 1.5 PD |
| M7-5 | bad case 归档与迭代闭环说明(收集 → 重打标 → 增量微调流程文档化) | 迭代手册 | 0.5 PD |
| M7-6 | 交付评审与验收 | 验收记录 | 0.5 PD |
出口标准:
- [x] §7.2 验收指标全项达标,或经评审书面确认裁剪项(ScoreCorr 0.959 / 等价给分率 97.4% 达标;Point-Acc 79.0% 与模型级 EM/F1 经评审裁剪至迭代闭环);
- [x] 交付包含 §11 清单全部条目;
- [ ] 全新环境按部署手册完成一次干净部署并跑通演示。
实际执行(PASS):36 卷等距抽样覆盖全分数段——系统级 ScoreCorr 0.9592 / 等价给分率 97.39% 达标;Point-Acc 79.04% 受金标口径分歧影响未达,登记 BC-002 并产出 34 条人工仲裁清单;阈值扫描维持默认 0.5;句级相似度兜底方案经实验否决。
5. 接口与数据契约冻结计划
契约先行是本计划并行开发的基础。以下契约须在 M0 结束前冻结,存放于仓库 contracts/ 目录:
| 契约 | 内容 | 冻结时点 | 变更控制 |
|---|---|---|---|
contracts/openapi.yaml | 前后端全部 REST 接口(§11.4 七组:/api/questions、/api/standard-answer/parse、/api/standard-answer、/api/answers、/api/ocr、/api/score、/api/results) | M0 末 | 变更记录 + 前后端双确认 |
contracts/scoring-config.schema.json | 评分配置 JSON Schema(question_id / total_score / points[point_text, weight, aliases] / thresholds) | M0 末 | 训练、后端、前端三方确认 |
contracts/model-artifacts.md | 模型产物目录规范:ONNX 模型、分词器、阈值配置的文件命名与目录布局 | M0 末 | 训练侧与后端双确认 |
contracts/labeling-schema.json | 大模型打标输出 Schema(hit / hit_type / extracted_span / confidence / partial_credit) | M1 启动前 | 数据侧主导 |
contracts/ocr-output.schema.json | OCR 输出契约(answer_text / confidence / lines / low_confidence) | M0 末 | OCR 与后端双确认 |
规则:契约冻结后任何字段变更,须在 docs/quality/changelog-contracts.md 记录原因、影响面与确认人;接口实现以契约测试(自动化)为准,不以口头约定为准。
6. 仓库结构与配置管理
6.1 建议仓库结构(Monorepo)
RubricSpan/
├── data/ # raw(原始数据集)/ synthetic(合成答卷)/ processed(训练数据)
├── contracts/ # 冻结契约(OpenAPI、JSON Schema、产物规范)
├── train/ # Python 训练侧:打标、对齐、训练、评估、导出脚本
├── backend/ # Rust Axum 服务(推理引擎、评分逻辑、OCR 调用、SQLite)
├── frontend/ # Next.js 15 应用
├── wasm/ # WASM 离线构建脚本与产物
├── models/ # 导出模型产物(.gitignore 管理,大文件走本地/附件分发)
└── docs/ # 项目计划、契约变更记录、评估报告、bad case、部署手册6.2 分支与版本策略
main:始终可构建,里程碑评审通过后合并;dev:日常集成分支;功能分支feat/<模块>-<简述>,修复分支fix/<简述>;- 每个里程碑打 tag:
m0-env、m1-labeling、…、m7-release; - 模型产物与大数据文件不入库,用
models/README.md记录获取方式与校验值(哈希); - 提交信息说明"改了什么 + 为什么",契约相关变更引用变更记录编号。
7. 质量保障与验收方案
7.1 测试策略(分层)
| 层级 | 范围 | 时机 |
|---|---|---|
| 单元测试 | 对齐后处理、评分逻辑(多候选抽取/阈值分支/加权汇总)、Schema 校验 | 随开发,合并前必须通过 |
| 契约测试 | 后端接口对 openapi.yaml 的符合性 | M4 起,CI 自动化 |
| 一致性测试 | PyTorch↔ONNX 输出、在线↔离线评分结果 | M2-6、M6-4 两个节点 |
| 端到端测试 | 四条链路(文本阅卷/图片阅卷/同义答案/标准答案解析)固定用例 | M5 起,M7 全量回归 |
| 评估测试 | §13 指标体系一键复算 | M2 起,每次模型迭代必跑 |
7.2 最终验收指标(引自技术方案 §13,含实测)
| 指标 | 目标值 | 验证方式 | 实测(2026-08-24) |
|---|---|---|---|
| Exact Match | > 65% | 固定测试集一键评估 | 模型级 48.2% ⚠️ 裁剪至迭代闭环 |
| Token-level F1 | > 80% | 同上 | 75.8% ⚠️ 同上 |
| Point-wise Accuracy | > 85% | 同上 | 模型级 89.4% ✅;系统级 79.0% ⚠️ 仲裁闭环中 |
| Score Correlation(Pearson) | > 0.85 | 与专家给分对照 | 系统级 0.959 ✅(模型级 0.765 裁剪) |
| Human Agreement(Cohen's Kappa) | > 0.7 | 人工阅卷对照子集 | 未实施(裁剪) |
| 等价命中率 | > 80% | 同义专项测试子集 | 模型级 94.3% ✅ / 系统级 97.4% ✅ |
| 单题推理延迟(GPU) | < 500ms | 压测报告 | M8 重构后待回归复测 |
| OCR 字符级准确率 | 印刷体 > 95% / 手写体 > 85% | 样张集分体统计 | 随 OCR 暂停搁置 |
核心指标 Score Correlation 已以系统级 0.959 达标;未达项均有明确处置路径(bad case 登记 / 34 条仲裁清单 / 迭代闭环),详见 M7 评估报告。
7.3 数据质量门
- 打标对齐成功率 > 90%(M1 出口);
- 抽检标签可接受率 ≥ 90%(M1 出口);
- semantic 样本占比 ≥ 15%(M1 出口)。
7.4 迭代闭环(上线后)
按技术方案 §16:收集 bad case(含 OCR 误识别、同义漏判)→ 大模型重新打标 → 增量微调 → 回归评估 → 发版。docs/quality/bad-cases.md 为唯一登记入口。
8. 风险登记册
| # | 风险 | 概率 | 影响 | 触发信号 | 应对策略 | 预案成本 |
|---|---|---|---|---|---|---|
| R1 | 大模型打标噪声导致小模型学偏 | 中 | 高 | 抽检可接受率 < 90% | 自一致性多温度投票 + 跨模型交叉验证 + 人工抽检 5% | 已计入 M1 |
| R2 | MRC 抽取效果不足(EM < 60%) | 中 | 高 | M2 中期评估 | 扩大合成数据 + 同义替换/回译增强;必要时转相似度主导路线(评审决策点) | 预留缓冲周 |
| R3 | 同义识别不足(等价命中率低) | 中 | 高 | 等价命中率 < 80% | 扩充 aliases(解析生成 + 打标沉淀)+ 下调相似度高阈值试探 + SAS-Bench 同义样本专项评测 | 预留缓冲周 |
| R4 | 标准答案解析输出非法 JSON | 中 | 中 | 解析失败率 > 5% | Schema 校验 + 自一致性重试 + 教师手动编辑降级界面 | 已计入 M4-4/M5-3 |
| R5 | 训练 GPU 显存不足 | 低 | 中 | 训练 OOM | 降 batch(8)+ 梯度累积;切换 60M 蒸馏版 | 已计入 M2 |
| R6 | WASM 路径推理过慢 | 高 | 低 | 单题 > 10s | 明确 WASM 仅用于演示定位;生产走 Rust+GPU | M6 出口标准已限定 |
| R7 | 数据集授权/获取受阻 | 低 | 高 | 北大数据集申请被拒 | 主线改走 SAS-Bench + CMRC(开放获取)+ 合成数据补足 | 已计入 M0 |
| R8 | 手写体 OCR 不准拖累评分 | 高 | 中 | 手写体准确率 < 85% | 置信度过滤 + 教师人工核对入口 + 结果附带 OCR 置信度便于追溯 | 已计入 M3 |
| R9 | 上线后新题型评分漂移 | 中 | 中 | 上线后 bad case 聚集 | 迭代闭环(§7.4) | 运营期 |
| R10 | Rust 推理栈(Candle/tch-rs)踩坑 | 中 | 中 | M4-2 超期 | 回退 ONNX Runtime Rust 绑定 + INT8 CPU/GPU 路径 | 已计入 M4 |
升级机制:任一风险触发且预案执行后仍无法收敛,提交里程碑评审做范围/工期决策,不允许静默顺延。
执行实况:R7 触发(北大数据集未获批,替代数据集主线生效);R10 应对转正(推理栈最终即为 ONNX Runtime Rust 绑定,并在 M8 进一步去 Python 化);其余未触发(R8 随 OCR 暂停悬置)。
9. 关键假设与外部依赖
| # | 假设/依赖 | 影响 | 确认时点 |
|---|---|---|---|
| A1 | 本地 GPU + CUDA 环境可用 | 全局 | M0 |
| A2 | 北大两类数据集科研授权可申请成功 | 训练数据质量 | M0 第 1 周 |
| A3 | OpenAI 兼容大模型接口有足够配额/预算完成 3000+ 条打标与合成答卷生成 | M1 | M0-7 |
| A4 | mengzi-bert-base 与 text2vec-base-chinese 可正常下载 | M2 | M0 |
| A5 | RapidOCR 对目标试卷样张的识别率达到门槛 | M3 | M0-6 初测 |
| A6 | 单人全职投入(若多人并行,M4/M5 可重叠 1–2 周,总工期可压缩至约 10–11 周) | 排期 | 立项确认 |
确认结果(2026-08-24):A1 ✅;A2 ❌ 未获批(走 R7 替代主线);A3 ✅(多端点免费额度 + 约 30M tokens 完成 4305 条打标与合成答卷);A4 ✅;A5 ✅ 印刷体达标(手写体场景随 OCR 暂停悬置);A6 ✅ 单人 + AI 辅助,实际进度远快于估算。
10. 完成定义(DoD)
任务级 DoD:代码/产出完成 + 自测通过 + 产出物归档到约定目录 + 依赖该任务的下游可开工。
里程碑级 DoD:对应 §4 出口标准全部勾选 + 评审记录归档。
项目级 DoD(最终验收):
- §1.2 七项项目目标逐条演示通过;
- §7.2 验收指标全项达标(或有书面裁剪决议);
- §11 交付物清单齐备;
- 全新环境干净部署并跑通端到端演示;
- 部署手册、迭代手册、最终评估报告归档。
11. 交付物总清单
| 类别 | 交付物 | 产出阶段 | 状态 |
|---|---|---|---|
| 数据 | 训练/验证/测试数据集(含划分与种子记录)、打标流水线、质检报告 | M1 | ✅ MRC 五元组 22589 + 相似度对 67251(seed=42) |
| 模型 | MRC ONNX(FP32+INT8)、相似度 ONNX(FP32+INT8)、分词器与阈值配置 | M2 / M6 | ✅(WASM 采用 INT8 路线,60M 蒸馏版未启用) |
| 后端 | Rust 单一可执行服务(Axum + ort 原生推理 + SQLite)、OpenAPI 契约测试 | M4 / M8 | ✅ 单一二进制(M8 定稿) |
| 前端 | Next.js 构建产物(含阅卷工作台、标准答案解析、导出等) | M5 | ✅ |
| 离线 | WASM 构建产物 + 浏览器离线演示入口 + 能力边界说明 | M6 | ✅ /offline 页面 |
| OCR | RapidOCR 集成(作答区模板 + /api/ocr)+ 准确率评测报告 | M3 | ⚠️ M3 贯通,M8 起暂停(501) |
| 文档 | 执行计划、契约变更记录、最终评估报告、部署手册、bad case 归档 | 全程,M7 收口 | ✅ 文档站已发布(GitHub Pages) |
本计划基于技术方案 v4 编制;v1.1 补记执行结果(2026-08-24 收官)。配套技术方案已升版 v5(按建成实况修订),两文档的历史版本见 git 历史。