auto_score/docs/自动评分系统需求说明书.md

48 KiB
Raw Permalink Blame History

自动评分系统需求说明书

项 内容
项目名称 自动评分系统(AES, Auto Essay/Experiment Scoring)
文档类型 产品需求说明书 / 软件需求规格说明(PRD + SRS)
当前版本 V1.0
状态 待导师确认
编写日期 2026-09-18
适用范围 当前仓库 AUTO_SCORE 的下一阶段实现
主要读者 导师、开发者

修订记录

版本 日期 说明
V1.0 2026-09-18 依据导师需求讨论会(docs/需求说明.mp4)、语音转写、速记文档与现有 Demo 代码整理首版完整需求

目录

  1. 文档说明
  2. 问题陈述与产品概述
  3. 现状 Demo 与目标差距
  4. 用户角色与核心流程
  5. 信息架构与界面需求
  6. 用户故事
  7. 功能需求
  8. 数据需求
  9. 非功能需求
  10. 验收标准
  11. 分期计划
  12. 待确认问题
  13. 附录

1. 文档说明

1.1 目的

本文档把导师讨论会上已经拍板的产品形态、交互规则、数据约束和实现边界写成一份可开发、可验收的需求说明,作为后续改 Demo、拆任务和联调的依据。

1.2 范围

本系统面向高校实验课 / 大作业场景:教师布置一份作业对应一道题,学生提交实验报告(及可选压缩包附件),系统用大模型按评分标准异步批阅,教师再审核或改分。学生最终看到的成绩以教师结果优先。

范围内包括:

  • 学生端:课程列表、作业列表、作业详情、提交与重传申请、成绩展示
  • 教师端:作业库、出题与评分标准生成、发布、已发布作业管理、批阅、打回、加时、导出
  • 独立批阅进程:从数据库拉取待批记录,读取磁盘上的实验报告文本,调用大模型写回分项成绩
  • 文件校验、上传次数控制、导出包生命周期

范围外见 2.4 非目标。

1.3 需求来源优先级

发生冲突时按以下顺序取舍:

  1. 导师在讨论会中的明确决定(转写中标记为 [1])
  2. 速记文档 docs/自动评分系统/自动评分系统.md
  3. 现有 Demo 已实现且本次未要求删除的能力(课程、班级、账号、登录等底座)
  4. 开发侧合理推断(必须写入「待确认问题」,不得当成已拍板需求)

转写约定:[0] 为学生(缠缍),[1] 为导师,[2]/[3]/[4] 为附和、口误或环境音,不作为需求依据。

1.4 参考资料

资料 位置 / 说明
需求讨论录像 docs/需求说明.mp4
语音转写 docs/通用语音识别_需求说明.mp4 (1).txt
会议速记 docs/自动评分系统/自动评分系统.md
现有库结构 aes.sql
后端 Demo AES/(Spring + Hibernate,端口 8082)
前端 Demo AES-front/(Vue 3 + Vite)
现有评分脚本 original.py(按维度调用大模型)
交互参照 教学平台作业发布/批阅页、OJ 作业列表与评测机、知网查重的「一次上传、再传需申请」
文档写法参照 ISO/IEC/IEEE 29148 需求条目可验证原则;项目内 .cursor/skills/write-spec、prd-template、meeting-to-spec

1.5 术语与缩写

术语 含义
作业 / 题目 本系统一份作业只含一道题,不再拆「第 1 题、第 2 题」
作业库 已出题但尚未发布到班级的题目集合
已发布作业 已指定班级/学生、截止时间后对学生可见的作业
实验报告 学生提交的可读文档(docx / doc / pdf,或仅含这些文件的 zip)
附件 与实验报告分开的一个压缩包,放代码等材料
评分标准 发给大模型的结构化评分依据,含维度、分档与注意事项
维度 评分标准中的一个评分项,如「团队协作」。单份作业最多 10 个
AI 成绩 批阅机根据评分标准算出的分项分与评语,不可被教师覆盖
教师成绩 教师审核通过或修改后另存的分项分与评语
打回 教师驳回本次提交,学生需重新申请/重新提交后才能再进入批阅
补交 过了正式截止时间后,在补交截止时间前仍允许提交
加时 教师给指定未交学生延长可提交时间
申请重传 学生已成功提交后,不能直接再传,需教师同意后才能替换文件
批阅机 独立于 Web 服务的后台进程,类似 OJ 评测机
P0 / P1 / P2 必须有 / 应尽快有 / 本阶段不做但设计上不要堵死

2. 问题陈述与产品概述

2.1 问题陈述

实验课大作业以实验报告为主,一份作业往往只有一道综合题,却需要按多个维度给分。教师手工拆维度、写分档、逐份批改成本很高;若让学生反复上传,每次调用大模型都会产生费用,且超长报告、超大附件会把批阅质量打下去。

当前 Demo 已经能登录、建课、出题、提交、调用大模型出总分,但学生入口不像课程列表、作业状态不够细、评分标准仍靠手工建维度表、AI 分与教师分未按「分项另存」设计、缺少申请重传、补交截止展示、独立批阅机和可靠的附件导出。不补齐这些,系统无法按导师的实际上课方式使用。

2.2 产品定位

本系统不是通用考试平台,也不是多题试卷系统。它是:

  • 一门课程下的大作业收发与 AI 辅助批阅工具
  • 一份作业 = 一道题 + 一份评分标准 + 实验报告(及可选压缩包)
  • 批阅分两步:大模型先评,教师再确认或改分
  • 成绩展示以教师结果优先;AI 结果始终保留,便于对照

参照对象:

  • 作业列表、独立评测进程 → OJ
  • 一次上传、再传需申请 → 知网查重
  • 发布对象、已交/未交/待批、批阅页、导出 → 现有教学平台作业模块

2.3 产品功能总览

学生:登录 → 课程列表 → 某门课的作业列表 → 作业详情(描述 / 上传 / 成绩)
教师:登录 → 课程列表 → 作业库(出题)或 已发布作业
      出题:标题 + 描述 + 评分标准(可自动生成)
      发布:班级/个人 + 截止 + 是否补交
      批阅:看 AI 分项结果 → 审核通过 或 修改后保存
批阅机:轮询待批记录 → 读 upload 中的报告文本 → 调大模型 → 写回 AI 分项成绩

2.4 目标与非目标

目标(本阶段做成后应成立)

  • G1. 学生能按「课程 → 作业列表 → 作业详情」完成查看、提交、看分,并在列表上区分五种作业状态。
  • G2. 教师能用「简单要求 + 题目描述」生成可入库的评分标准,手工修改后发布到班级。
  • G3. 每份提交保留 AI 分项成绩与教师分项成绩两套字段;学生看到的是「教师优先」。
  • G4. 实验报告和附件在上传时就被格式、大小、字数、可读性拦住,避免再出现几百页、几百兆的无效提交。
  • G5. 学生不能无限次触发批阅;已成功提交后需「申请重传 + 教师同意」。
  • G6. 批阅不阻塞提交接口,由独立进程异步完成,学生需等待一段时间再查看结果。

非目标(明确不做)

不做 原因(来自会议)
一份作业多道题、按人/按题两种批阅模式 本课一份作业就是一道题
教师批量打分 导师明确「现在先不做」
未交名单里的「设为已交」「查看」 没交就没有可看内容
作业统计页 导师认为无所谓、不需要
发布时站内通知 导师当前没有通知需求
把图片发给大模型 现在只发文字
提交后立刻出分 明确对标知网:提交后等一段时间
学生随意多次上传替换 每次批阅都花钱
评分维度超过 10 个 宽表字段有上限,超过则拒绝保存
以大模型返回的总分为准 分项加总才作为总分,防止加减不一致被学生质疑
管理员审核重传(本阶段) 先由任课教师同意;人多了以后再说

3. 现状 Demo 与目标差距

现有工程是可用的教学 Demo,不是最终产品。底座(登录、课程、班级、学生、助教、作业库/发布骨架)可复用;下列差距是本需求的改造重点。

模块 现有 Demo 目标
学生首页 「点击进入作业 / 加入班级 / 帮助」,作业列表不按课程分层 先课程列表,点进一门课才是作业列表
学生作业列表 作业名、描述、开始/结束时间、单一状态、分页 表格展示截止时间、状态(五种)、分数;一门课作业数量通常 ≤ 20,可不分页
作业状态 未领取 / 已领取 / 待批阅 / 已批阅,另有查重标红 未交 / 待批阅 / 分数(AI) / 分数(教师) / 打回
作业详情 左:描述+上传;右:教师评语;上传在页面下方 描述置顶;右侧放附件区;分数在附件下方;教师端详情不再重复题目描述
提交文件 单文件,txt/doc/docx/pdf,限制 1 个 实验报告 + 可选 1 个 zip;系统规定格式;校验可读、字数、大小;是否必交由教师勾选
再次上传 上传即覆盖,无次数控制 默认可交 1 次;再传需申请,教师同意后才能替换
补交 postproblem.allow 仅 0/1,无补交截止时间,学生端不展示 允许补交时必须有补交截止;列表和详情都要显示
评分标准 scoringstandard(维度+权重)+ scoringrubric(分档),教师逐条建 教师写简要要求,大模型生成带分档的标准;教师可改;入库前校验结构
AI 成绩存储 autoscore 一个总分 + autocomment 拼接评语 总分 = 各维度分数之和;每维分数+评语分字段保存,最多 10 维
教师批阅 详情仍显示题目;教师分会写 score/comment,但不是分项复制工作流 左 AI 右教师;「修改」复制到右侧;「审核通过」不改分;两套字段互不覆盖
批阅触发 Web 接口 /autoscore 同步调 Python 独立批阅机轮询数据库,类似 OJ 评测机
导出附件 前端按钮已注释 分「导出实验报告」「导出附件」;按 学号-姓名 打包;超大则分卷;下载后或 1 天后删除
仓库 .gitignore 几乎为空,存在二进制和本地库风险 二进制不进 Git;库结构/文档放 docs/

现有 Demo 中本阶段默认保留的能力:教师/学生/助教登录与账号、课程与班级、作业库与发布骨架、文件落在 upload/ 而不是数据库、查重相关字段(会议未要求删除,也未作为本轮重点,见待确认问题 Q5)。


4. 用户角色与核心流程

4.1 用户特征

角色 说明
学生 查看自己所选课程的作业,上传报告,查看状态与成绩
教师 出题、生成/修改评分标准、发布、批阅、打回、加时、导出。当前导师同时是教师和管理员
助教 Demo 已有班级助教。本轮会议未重定义,暂沿用现有权限,不新增需求
管理员 账号与系统维护。重传审批本阶段不交给管理员

4.2 学生主流程

进入系统
  → 课程列表
  → 某课程的作业列表(看到截止时间、状态、分数)
  → 作业详情
       描述(置顶)
       右侧:实验报告 / 附件 上传与下载
       附件下方:当前成绩与评语(教师优先,否则 AI)
  → 首次提交成功后进入「待批阅」
  → 批阅机完成后变为「分数(AI)」
  → 教师审核/改分后变为「分数(教师)」
  → 若被打回:状态为「打回」,需申请重传并获批后才能再交

4.3 教师主流程

课程列表 → 进入课程
  ├─ 作业库:新建 / 编辑题目(标题、描述、评分标准)
  │     评分标准可自动生成 → 教师修改 → 校验格式 → 入库
  └─ 已发布作业:发布(班级/个人、截止、补交)
        → 作业汇总(已交 / 待批 / 未交)
        → 已交名单:批阅 / 打回 / 导出成绩 / 导出文件
        → 未交名单:加时 / 批量加时 / 导出未交名单
        → 重传申请:同意后学生可再传一次

4.4 批阅机流程

循环:
  取出状态=待批阅 且尚未写入 AI 成绩的提交
  从 upload/ 读取实验报告,抽出文字(忽略图片)
  与该题评分标准一并送入大模型
  解析各维度 score / comment
  校验维度数量 ≤ 10
  总分 = Σ 维度分数(不用模型返回的 total)
  写入 AI 字段,学生端显示「分数(AI)」

学生提交接口只负责收文件和建待批记录,不在请求内同步完成大模型调用。


5. 信息架构与界面需求

5.1 学生端页面

UI-001 课程列表

登录后首先看到课程列表,交互对齐导师展示的课程卡片/列表,而不是现在的「点击进入作业」首页文案。点击一门课程进入该课作业列表。课程卡片上不需要再堆 Demo 首页那大段说明。

UI-002 作业列表

做成类似 OJ 的表格。建议列:

列 内容
作业名称 标题
截止时间 正式结束时间
补交 不允许补交 / 补交截止时间(若允许)
状态 / 分数 见 5.3 状态机
操作 进入详情

一门课大作业通常不超过约 20 个,可以不分页,一页显示完。若后续作业很多,再加分页,但不是本阶段必须。

不要在列表里放很长的作业描述正文。列表信息要足够让学生判断:有没有交、截止何时、现在几分、是 AI 还是教师。

UI-003 作业详情(学生)

页面结构(导师指定):

  1. 顶部:作业标题、截止/补交信息、当前状态
  2. 上部主体:作业描述(学生端必须保留描述,因为要知道做什么)
  3. 右侧:附件区(实验报告 + 压缩包),可下载已传文件
  4. 附件下方:分数与评语

不需要「第 1 题、第 2 题」题号区。右侧不再放与附件无关的模块。

上传控件规则见 FR-S 系列。分数展示规则见 FR-S-007。

5.2 教师端页面

UI-010 课程列表

教师端进入后也是课程列表,风格可与学生端一致。点进一门课后,分为:

  • 作业库
  • 已发布作业

UI-011 新建 / 编辑作业(作业库)

字段:

  1. 作业标题
  2. 作业描述(富文本)
  3. 评分标准(富文本或结构化编辑区,支持自动生成)
  4. 提交约束(见 FR-T-010)

评分标准区旁边可放「?」帮助,只展示参考示例给教师看;真正发给模型的阶层结构放在系统提示词里,不必全部摊在编辑器上。

保存失败时,若结构不合格,直接告诉教师应按什么格式写,而不是静默入库。

UI-012 发布作业

  • 发布对象:班级多选;也可发到个人;支持全选/取消全选、按姓名搜索
  • 结束时间(正式截止)
  • 是否允许补交;允许则必须填补交截止时间
  • 本阶段不做站内通知,也不做「允许重做几次」(改由申请重传机制控制)

UI-013 已发布作业列表

表格至少显示:

  • 作业名称、正式截止时间
  • 是否允许补交、补交截止时间(允许时必显示,否则教师自己也记不清)
  • 已交人数、待批人数、未交人数
  • 班级筛选、状态筛选(未开始 / 进行中 / 已结束)、标题搜索

UI-014 提交名单(已交 / 未交)

已交表列建议:学号、姓名、班级、提交时间、提交 IP、状态、批阅人(AI 或教师姓名)、成绩、操作(批阅、打回)。支持按成绩等列排序。顶部汇总:全部人数、已交、未交。

支持按班级筛选。可多选后:

  • 批量打回
  • 导出成绩
  • 导出实验报告
  • 导出附件

不做批量打分,不做按人/按题切换。

未交表:加时、批量加时、导出未交名单。不提供「设为已交」,不提供「查看」。

UI-015 批阅详情

进入后不要再展示题目描述。教师此页只做一件事:看 AI 结果,决定确认还是改。

左:AI 批阅结果(只读)          右:教师打分与评语
  总分(分项之和)                  总分(分项之和)
  维度1 分数 / 评语                 维度1 分数 / 评语
  维度2 分数 / 评语                 维度2 ...
  ...
按钮:审核通过 | 修改 | 保存 | 打回
  • 审核通过:不改分,把当前 AI 结果确认为教师侧成绩(另存,不覆盖 AI 字段),学生状态改为「分数(教师)」
  • 修改:把左侧分数和评语复制到右侧,教师改完点保存
  • 保存:只写教师字段
  • 教师未操作时,学生看到 AI;教师操作后,学生只看到教师结果

5.3 作业状态机

对学生可见的五种状态(导师最终用「未交」而不是「未完成」):

状态 含义 列表展示
未交 在可交期内(含加时/补交)尚未成功提交 文案「未交」
待批阅 已成功提交,批阅机尚未写出 AI 成绩 文案「待批阅」
分数(AI) AI 已出分,教师尚未审核/改分 如 95(AI)
分数(教师) 教师已审核通过或已保存改分 如 98(教师)
打回 教师打回本次提交 文案「打回」

「未交」和「打回」必须分开,不能合成一个「未完成」。

建议内部流转:

未交 --提交成功--> 待批阅 --批阅机完成--> 分数(AI)
分数(AI) --教师审核通过或保存改分--> 分数(教师)
分数(AI) 或 分数(教师) --打回--> 打回
打回 --教师同意重传且学生再次提交成功--> 待批阅
未交 --教师加时/仍在补交窗--> 仍为未交,但可提交
过了正式截止且不允许补交(或过了补交截止)且未提交 --> 仍显示未交,但不可提交

6. 用户故事

US-001 按课程查看作业

描述: 作为学生,我想先看到自己的课程,再进入某门课的作业表,以便只关心当前这门课的大作业。

验收:

  • 登录后落地页是课程列表,而不是直接铺开全部作业
  • 点入课程后只显示该课作业
  • 作业表能看到截止时间、补交信息、状态/分数

US-002 提交实验报告并立刻知道有没有交上

描述: 作为学生,我想在作业详情里看清要求、上传报告和附件,并确认文件已经保存且可下载。

验收:

  • 描述在页面上部可见
  • 上传区在右侧,已传文件可下载
  • 不满足格式/大小/字数/可读性时提交失败,并给出具体原因
  • 必交项未上传时不能提交成功

US-003 控制重复批阅成本

描述: 作为教师,我希望学生不能每改几个字就重新上传一次,以免反复调用大模型产生费用。

验收:

  • 成功提交后,上传入口变为不可用(或仅显示「申请重传」)
  • 学生提交申请后,教师能在待办/名单中看到
  • 教师同意前,学生不能再次上传
  • 教师同意后,学生可再上传并再次进入待批阅

US-004 等待异步出分

描述: 作为学生,我提交后不必立刻拿到分数,但过一段时间应能看到 AI 分,并知道这是 AI 给的。

验收:

  • 提交成功后状态为「待批阅」,不阻塞在提交按钮上长时间转圈调用模型
  • AI 完成后列表出现 分数(AI)
  • 教师确认后变为 分数(教师),数值以教师为准

US-005 用简要要求生成评分标准

描述: 作为教师,我不想手工写「9–10 分什么样、7–8 分什么样」,只想写题目和几条关键要求,让模型生成可修改的标准。

验收:

  • 教师输入题目描述 + 简要评分要求后可一键生成
  • 生成结果出现在评分标准框中,教师可改
  • 超过 10 个维度时保存被拒绝并提示
  • 格式不符合入库结构时,提示应采用的格式,不写入数据库

US-006 对照 AI 结果做人工审核

描述: 作为教师,我想左右对照 AI 分项结果,一键复制后修改,或直接审核通过,并且不丢掉 AI 原始分。

验收:

  • 批阅页不显示题目正文
  • 左侧只读 AI 分项,右侧教师可编辑
  • 「修改」复制左侧到右侧
  • 「审核通过」不改分数,状态变为教师
  • 数据库中 AI 字段仍在

US-007 处理未交和打回

描述: 作为教师,我想给个别学生加时,或把不合格作业打回,并导出未交名单。

验收:

  • 未交名单可单人加时、批量加时
  • 已交名单可打回、批量打回
  • 可导出未交名单
  • 学生端能区分未交与打回

US-008 按学号姓名导出文件

描述: 作为教师,我想分别导出实验报告和附件,文件按 学号-姓名 命名,并在导出很大时拆包。

验收:

  • 两个独立导出入口
  • zip 内条目名为 学号-姓名 + 原扩展名(或内层仍为 zip)
  • 超过约定体积则拆成多份
  • 完成后提示「请在某时之前下载」;下载完成或到期后删除临时包

7. 功能需求

优先级:P0 本阶段必须交付;P1 明显提升体验,时间允许应做;P2 明确留到以后。

7.1 学生端

FR-S-001 课程列表入口

  • Description: The system shall 在学生登录后展示其已加入的课程列表,点击课程后进入该课程作业列表。
  • Priority: P0
  • Source: 会议

FR-S-002 作业列表字段

  • Description: The system shall 在作业列表中展示作业名称、截止时间、补交信息、状态/分数。不得只显示作业名而把截止与是否已交藏进详情。
  • Priority: P0

FR-S-003 五种状态展示

  • Description: The system shall 按 5.3 展示状态。AI 分与教师分不得混成一个「已完成」。
  • Priority: P0

FR-S-004 作业详情布局

  • Description: The system shall 将作业描述置于详情页上部,将实验报告与附件上传/下载放在右侧,将分数与评语放在附件区域下方。学生端必须显示作业描述。
  • Priority: P0

FR-S-005 首次提交

  • Description: The system shall 在「未过正式截止」或「允许补交且未过补交截止」或「该生仍在加时窗口」时,允许尚未成功提交的学生上传。
  • Priority: P0

FR-S-006 申请重传

  • Description: The system shall 在学生已经成功提交之后,禁止直接再次上传。页面提供「申请重传」。教师同意后,该生获得一次新的上传资格。
  • Priority: P0
  • Note: 会议先定「教师同意即可」。不要做成随时覆盖保存。

FR-S-007 成绩与评语优先级

  • Description: The system shall 在教师成绩存在时向学生展示教师的总分、分项分和评语;否则展示 AI 的对应内容。不得把两套结果混成一段无法区分来源的文本。
  • Priority: P0

FR-S-008 已传文件下载

  • Description: The system shall 允许学生下载自己已成功保存的实验报告和附件。桌面端点击即可下载;需同时保证移动端也能完成下载(会议提到有同学反馈手机上看不到/不能下)。
  • Priority: P0

FR-S-009 提交后等待

  • Description: The system shall 在提交成功后将状态置为「待批阅」,不保证实时出分。可提示「批阅需要一段时间,请稍后查看」。
  • Priority: P0

7.2 教师出题与评分标准

FR-T-001 作业库与已发布分离

  • Description: The system shall 将「未发布题目」放在作业库,「已发布实例」放在已发布列表。新建作业默认进入作业库,不自动对学生可见。
  • Priority: P0

FR-T-002 出题必填内容

  • Description: The system shall 保存作业时同时持久化:标题、题目描述、发给大模型的评分标准、提交约束。缺评分标准不得发布。
  • Priority: P0

FR-T-003 评分标准自动生成

  • Description: The system shall 支持教师点击生成评分标准。发送给大模型的信息固定为三部分:

    1. 教师写的题目描述
    2. 教师写的简要评分要求(例如「团队合作 10 分,需有 git 提交记录且覆盖三个时间点」)
    3. 系统内置的参考阶层结构 / 输出格式(放在 system prompt,不要求教师手写 JSON)
  • Priority: P0

  • Note: 会议现场把整篇参考文档塞进提示词后,模型会误当成要重写参考文。提示词必须标明「以下是格式参考,不是题目本身」。

FR-T-004 教师可编辑生成结果

  • Description: The system shall 允许教师在入库前和入库后修改评分标准正文(例如补上「个人完成且未用 agent 模拟成员最多 2 分」这类模型没写的规则)。
  • Priority: P0

FR-T-005 结构校验与维度上限

  • Description: The system shall 在保存评分标准时解析出维度列表。维度数必须为 1–10;超过 10 个则拒绝保存并提示不允许超过 10 个维度。解析失败则提示应采用的撰写格式(除「注意事项」是否展示给教师外,格式主体都应说明清楚)。
  • Priority: P0

FR-T-006 生成结果必须可入库

  • Description: The system shall 保证最终写入数据库的是结构化字段(维度名、满分、分档说明等),而不是只能给人看、不能给批阅机用的自由文本。教师看到的编辑稿可以是 Markdown,但保存前必须能解析。
  • Priority: P0

FR-T-010 提交约束(出题时配置)

教师可为每份作业配置:

配置项 规则 谁决定
实验报告是否必交 勾选则不交报告不能提交 教师
附件是否必交 勾选则不交 zip 不能提交 教师
报告最少字数 按「字」展示给师生;后台按字符统计 教师
报告最多字数 同上,用于拦住把完整 AI 对话+代码贴成几百页的报告 教师
报告大小上限 会议示例 5MB 教师可配,系统给默认值
附件大小上限 会议示例 10MB 教师可配,系统给默认值

以下由系统规定,不开放给教师选:

  • 实验报告允许:docx、doc、pdf;或 zip,但 zip 内只能包含这三种文档
  • 附件允许:一个 zip
  • 图片不送给大模型,字数统计也不把图片算进去

FR-T-011 上传校验失败要说人话

  • Description: The system shall 在校验失败时拒绝保存,并返回可理解原因,例如:找不到 docx/doc/pdf、文档打不开、zip 内含不允许的文件、超过大小、少于最少字数、超过最多字数。
  • Priority: P0
  • Note: 导师会提供已有的文档/zip 读取脚本;也可用现有能力重写,但行为要一致。

7.3 发布、补交、加时

FR-P-001 发布对象

  • Description: The system shall 支持按班级发布,并支持发给班级中的指定学生;提供全选、取消全选、按姓名搜索。
  • Priority: P0

FR-P-002 补交窗口

  • Description: The system shall 在允许补交时要求设置补交截止时间。过了补交截止后,未获加时的学生不能再交。
  • Priority: P0

FR-P-003 补交信息展示

  • Description: The system shall 在教师已发布列表、学生作业列表、学生作业详情中展示是否允许补交及补交截止时间。仅写在「修改设置」里但列表不可见,视为不满足。
  • Priority: P0

FR-P-004 加时

  • Description: The system shall 允许教师对未交学生单人加时和批量加时。加时只延长该生可提交窗口,不改变整份作业对其他学生的截止时间。
  • Priority: P0

7.4 教师批阅

FR-R-001 批阅页信息

  • Description: The system shall 在批阅详情展示学生学号、姓名、班级、可下载的实验报告与附件、AI 分项结果、教师分项编辑区。不展示题目描述正文。
  • Priority: P0

FR-R-002 AI 与教师字段隔离

  • Description: The system shall 将 AI 的总分、各维分数、各维评语与教师的对应字段分开存储。教师保存不得覆盖 AI 字段。
  • Priority: P0

FR-R-003 审核通过与修改

  • Description: The system shall 提供「审核通过」:把 AI 结果复制为教师结果(若教师侧尚空)并切换学生可见状态为教师,分数数值不变。提供「修改」:把 AI 结果填入教师编辑区供改。提供「保存」:只提交教师编辑区。
  • Priority: P0

FR-R-004 打回

  • Description: The system shall 支持单人打回与已交名单上的批量打回。打回后学生状态为「打回」,在获得重传许可前不能再交。
  • Priority: P0

FR-R-005 名单能力

  • Description: The system shall 在已交名单支持排序、班级筛选、导出成绩、分别导出实验报告和附件。不做批量打分。
  • Priority: P0

FR-R-006 未交名单

  • Description: The system shall 支持导出未交名单,以及加时。不提供设为已交、不提供查看空提交。
  • Priority: P0

FR-R-007 重传审批

  • Description: The system shall 让教师看到学生的重传申请并同意或拒绝。同意后该生可再上传一次。
  • Priority: P0

7.5 批阅机与大模型

FR-J-001 独立进程

  • Description: The system shall 将自动批阅做成独立运行的程序/服务,从数据库逐条取待批记录,而不是在学生提交的 HTTP 请求里同步打完分。行为对齐 OJ 评测机。
  • Priority: P0

FR-J-002 输入

  • Description: The system shall 只把实验报告抽取的文字,以及该题评分标准,发给大模型。压缩包附件默认不作为批阅输入(除非后续另开需求)。图片忽略。
  • Priority: P0

FR-J-003 输出与总分

  • Description: The system shall 解析每个维度的 score 与 comment。总分必须等于各维度分数之和,即使模型另外返回了 total 也不得采用。
  • Priority: P0
  • Rationale: 分项偶然不准,学生最多质疑某一维;若分项相加不等于总分,会被认为系统不可用。

FR-J-004 结构化落库

  • Description: The system shall 将总体评语、各维分数、各维评语写入固定字段(宽表,最多 10 维),而不是只拼一句 autocomment。
  • Priority: P0

FR-J-005 失败可重试

  • Description: The system shall 在模型失败、解析失败、文件读失败时保留待批阅或标记失败原因,不得写成一个无法解释的 0 分成功结果。失败记录应能再次进入队列。
  • Priority: P1

FR-J-006 提示词职责分离

  • Description: The system shall 将系统提示(格式、阶层结构、禁止编造维度)与用户提示(题目+教师要求+报告正文)分开,避免模型把参考格式当成新题目。
  • Priority: P0

7.6 导出与临时文件

FR-E-001 导出实验报告 / 导出附件

  • Description: The system shall 提供两个导出动作。每个学生在包内的文件夹或文件主名为 学号-姓名。若学生交的是 docx,则包内为该文档;若交的是 zip,则包内仍是 zip。
  • Priority: P0

FR-E-002 分卷

  • Description: The system shall 在导出包过大时拆成多份。单份上限由实现选定,会议建议 500MB 或 1GB,需在实现时写进配置并在界面提示。
  • Priority: P0

FR-E-003 临时包生命周期

  • Description: The system shall 在导出完成后提示「请及时下载,将保留到 YYYY-MM-DD HH:mm」。文件被成功下载后删除该临时包;若一直不下载,则在保留期结束后由定时任务删除。建议默认保留 1 天。
  • Priority: P0
  • Note: 不要做成教学平台那种长期可重复下载的导出历史,以免占磁盘。

FR-E-004 导出成绩 / 未交名单

  • Description: The system shall 支持导出已交成绩表和未交名单。格式可用 xlsx。
  • Priority: P0

7.7 仓库与文档约定

FR-D-001 不把无用二进制推进 Git

  • Description: The repository shall 排除构建产物、node_modules、学生作业、超大媒体、本地密钥。导师要求上传前删掉不必要的二进制以节省空间。
  • Priority: P0

FR-D-002 数据库脚本放文档目录

  • Description: The repository shall 将库结构/示例数据作为文档放在 docs/(或导师指定的 dock/docs 目录),而不是把运行中的数据库文件直接塞进仓库根。
  • Priority: P0
  • Source: 会议结尾「数据库也上传,放到 docs 目录当文档」

8. 数据需求

8.1 设计原则

  1. 文件本体放磁盘 upload/(或等价目录),数据库只存路径、校验信息和批阅结果。
  2. 评分结果用宽表分项字段,不用「一行一个字段名」的 EAV 表。导师认可宽表查询更快;维度上限 10 是为此服务的。
  3. AI 与教师两套结果并存。

8.2 现有表(可复用底座)

aes.sql 中已有:adminusers、users、course、class、studentclass、assistantclass、problem、postproblem、scoringstandard、scoringrubric、submitreport。

submitreport 现有字段包括:attachment、autoscore、autocomment、score、comment、submissionStatus、addTime、查重相关字段等。这套结构不够表达:双文件、分项成绩、补交截止、重传申请、打回与未交的区分。

8.3 需要演进的逻辑数据

下列为逻辑模型,不强制一次迁移完成,但 P0 功能必须能存下这些信息。

作业(题目,作业库)

字段 说明
id, courseId, teacherId 归属
title, description 标题与富文本描述
rubricText 教师可见的评分标准文稿
rubricParsed 解析后的维度数组(JSON 可接受)
reportRequired, attachmentRequired 是否必交
reportMinChars, reportMaxChars 字数(对外称「字」)
reportMaxBytes, attachmentMaxBytes 大小

发布实例

字段 说明
problemId, classId / 指定学生 对象
endTime 正式截止
allowMakeup 是否允许补交
makeupEndTime 补交截止,允许补交时必填

评分标准维度(解析结果,≤10)

字段 说明
name 维度名
maxScore 该维满分
bands 分档说明(9–10 / 7–8 / …)

提交

字段 说明
reportPath, attachmentPath 两个文件路径
status 未交/待批阅/AI/教师/打回
submitTime, submitIp 提交元数据
extraDeadline 该生加时截止
reuploadGranted 是否已获重传许可

AI 成绩(不覆盖)

字段 说明
aiTotal Σ aiDimNScore
aiOverallComment 总体评语
aiDim1Score, aiDim1Comment … aiDim10Score, aiDim10Comment 空维留空

教师成绩(另存)

字段 说明
teacherTotal Σ teacherDimNScore
teacherOverallComment 总体评语
teacherDim1Score, teacherDim1Comment … 与 AI 对称
teacherId, reviewedAt 审核人与时间

重传申请

字段 说明
studentId, problemId, reason, status 待审/同意/拒绝
decidedBy, decidedAt 教师处理

导出任务

字段 说明
type 报告 / 附件 / 成绩 / 未交名单
filePath, expireAt, downloadedAt 临时包与生命周期

8.4 总分计算规则

aiTotal      = sum(aiDim i Score)      i = 1..n, n ≤ 10
teacherTotal = sum(teacherDim i Score)  (教师保存时同样重算,不采用手工填的矛盾总分)
学生可见总分  = teacherTotal 存在 ? teacherTotal : aiTotal

8.5 文件存储

  • 路径建议:upload/{courseId}/{problemId}/{studentNo}/report.* 与 attachment.zip
  • 不把 docx 二进制写入 MySQL
  • 批阅机只读报告文件的文字层

9. 非功能需求

NFR-001 费用可控

每次成功进入批阅队列都应是教师可预期的。默认每生每题 1 次批阅;重传必须经教师同意。这是产品约束,不是优化项。

NFR-002 长报告处理

字数上限的目的,是避免把完整 AI 对话和代码全部贴进报告导致切块后分数异常偏低。统计口径对外叫「字」,实现可用字符数;不要把「字符」这个词直接给师生看。

NFR-003 导出体积

班级附件可能达数 GB。导出必须可分卷,临时包必须可过期删除。单份上限(500MB 或 1GB)做成配置。

NFR-004 批阅时延

允许分钟到更长的排队,不要求提交接口秒级返回分数。需要让状态「待批阅」可被学生理解。

NFR-005 安全

  • 密钥、模型 API Key 不得写入仓库(现有 original.py 含明文 key,实现时应改为环境变量,旧 key 视为已泄露需轮换)
  • 学生只能访问自己的提交;教师只能访问自己课程/班级
  • 上传文件按白名单解析,拒绝 zip 炸弹和可执行文件(P1,但 zip 内扩展名白名单是 P0)

NFR-006 可用性

校验失败必须返回中文原因。模型失败不得静默成 0 分。

NFR-007 兼容现有 Demo 技术栈

默认继续:前端 Vue 3(AES-front,开发端口现为 3100),后端 Java Spring(AES,8082),MySQL(库名 aes),文件本地磁盘。批阅机可用 Python 独立进程,不必塞进 Tomcat 请求线程。

NFR-008 规模假设

本阶段按单教师、若干班级、每课大约不超过 20 个大作业、每班约数百人设计。列表可以不分页。不按多租户 SaaS 设计。


10. 验收标准

下列条款全部满足,才视为本阶段需求落地。

10.1 学生端

  • 入口为课程列表,作业列表含截止时间、补交信息、五种状态之一
  • 详情页:描述在上,附件在右,分数在附件下,已传文件可下载
  • 必交项、格式、大小、字数、可读性均在上传阶段拦截
  • 成功提交后不能直接再传;申请 → 教师同意 → 才能再传
  • 教师未审显示 AI 分;教师已审显示教师分

10.2 教师端

  • 作业库新建:标题、描述、可生成并修改的评分标准、提交约束
  • 维度 > 10 或格式非法时不能保存,并提示正确格式
  • 发布可选班级/个人,可设补交截止,列表能看到补交信息与已交/待批/未交人数
  • 批阅页左右分栏,审核通过 / 修改 / 保存行为符合 FR-R-003,AI 字段仍在
  • 可打回、加时、导出成绩、分别导出报告与附件、导出未交名单
  • 不做批量打分、不显示题目正文于批阅页、没有作业统计页要求

10.3 批阅机

  • 独立运行,提交后先「待批阅」
  • 只发送报告文字 + 评分标准
  • 总分等于分项之和
  • 分项写入固定字段,最多 10 维

10.4 导出

  • 包内命名 学号-姓名
  • 过大则分卷
  • 有过期时间提示;下载后或到期后删除

11. 分期计划

里程碑 A(P0 骨架,先能按新信息架构上课)

  1. 学生课程列表 + 作业列表五种状态 + 详情布局
  2. 双文件上传校验(格式/大小/必交;字数可先做简单版)
  3. 作业库 / 已发布分离,发布含补交截止
  4. 提交后写待批阅,不再在 Web 请求里同步打分

里程碑 B(P0 批阅闭环)

  1. 评分标准生成 + 格式校验 + 最多 10 维入库
  2. 独立批阅机 + 分项字段 + 总分重算
  3. 教师批阅页(复制/审核通过/另存)
  4. 申请重传 + 打回 + 加时

里程碑 C(P0 收尾)

  1. 导出报告 / 附件分卷 + 临时文件定时删除
  2. 导出成绩、未交名单
  3. 仓库清理与 docs/ 数据库文档
  4. 字数统计与 zip 内文件可读性的完整校验

里程碑 D(P1 / P2)

  • 批阅失败自动重试与教师可见失败原因
  • 助教权限按班级细化
  • 管理员审批重传
  • 查重是否保留或与新状态机整合
  • 更多导出命名格式
  • 通知、统计图表、批量打分

建议实现顺序与导师关注点一致:先改学生详情和列表状态,再改出题/评分标准,再做批阅机与导出。导出是已交名单里最重的一块,不要堵在最小闭环之前。


12. 待确认问题

下列问题会议未最终钉死,实现前需向导师确认。未确认前采用「建议默认」。

ID 问题 谁来定 建议默认 是否阻塞编码
Q1 单份导出包上限取 500MB 还是 1GB 导师 / 实现 配置项,默认 512MB 否,先做配置
Q2 报告默认大小 5MB、附件 10MB 是否写死为默认值 导师 作为新建作业默认值,教师可改 否
Q3 「字数」按中文词还是 Unicode 字符 导师已倾向对外称字、对内字符 按字符数,界面写「字」 否
Q4 审核通过时,若教师侧已有旧修改,是覆盖还是禁止 未讨论 已有教师稿时「审核通过」只改状态、不覆盖教师稿 否
Q5 现有查重(plagiarismStatus 标红)本轮是否保留 未讨论 暂时保留字段,不在新列表里做主状态 否
Q6 压缩包附件是否永远不送进大模型 会议按「只发报告文字」 不送 否
Q7 重传申请是否要填写原因 未讨论 可选原因,教师列表能看到 否
Q8 教师同意重传后,旧 AI 成绩是清空还是归档 未讨论 归档保留历史,当前成绩回到待批阅 建议先定
Q9 批阅机与 Web 是否必须分两个可执行文件 会议说「也可以做成独立软件」 独立 Python/Java 进程 + 同一数据库 否
Q10 学生课程列表 UI 是否必须像素级模仿导师截图 会议是「可以做成这个样子」 信息结构一致即可,不追视觉稿 否
Q11 助教能否批阅、打回、同意重传 未重谈 沿用 Demo:助教可进作业管理,但重传审批先只开放教师 否
Q12 评分标准编辑器用纯 Markdown 还是继续富文本 会议是富文本框 描述用富文本;标准用 Markdown 便于解析 建议先定

13. 附录

13.1 会议中的关键原话(意译整理,便于追溯)

  • 一份作业就是一道题,不要「一、一」那种题号。
  • 学生详情:描述拉到最上面;右边改放附件;分数放在附件下面。
  • 学生不能随意上传,参照知网:传一次后要再传,向老师申请。
  • 作业列表至少要有截止时间、是否已传、分数;状态拆成未交、待批阅、分数(AI)、分数(教师)、打回。
  • 教师出题主要就两块:题目描述、发给大模型的评分标准。
  • 评分标准让模型按分档拆开;教师可改;保存必须符合格式。
  • 维度最多 10 个;用宽表存每维分数和评语。
  • 总分用各维度相加,不用模型给的 total。
  • 实验报告限制最少/最多字数和大小;附件一个 zip 也限制大小;是否必交打勾。
  • 格式由系统规定:docx / doc / pdf / zip,打不开就上传失败。
  • 发布要能选班级和个人,能设补交截止,列表上要能看到补交时间。
  • 批阅页不要再看题目;左 AI 右教师;改了另存,不覆盖 AI。
  • 不要批量打分;要批量打回、导出成绩、分别导出报告和附件。
  • 未交可以加时、批量加时、导出未交名单。
  • 导出按 学号-姓名,太大就拆包;下载完或保留一天后删。
  • 批阅做成独立软件,从数据库一条一条取,学生提交后要等一段时间。
  • Git 不要传无用二进制;数据库脚本放到 docs 当文档。

13.2 评分标准阶层结构(批阅机需要能解析)

生成结果应能抽出类似结构(示例,字段名可在实现时固定):

总体:满分 100
维度:
  - 名称:团队协作
    满分:10
    分档:
      9-10:...
      7-8:...
      0-2:...
  - 名称:...
注意事项:...   (可对教师隐藏或保留,但解析规则要稳定)

批阅机输出应对齐为:

total = dim1.score + dim2.score + ...
overall_comment
dim1.score, dim1.comment
dim2.score, dim2.comment
...

这与导师现有本地批阅程序导出的 Excel(总分、总体评语、各维分数、各维评语)一致。

13.3 与现有代码的主要改造点(给开发用)

位置 现状 需求方向
AES-front/src/views/user/index.vue 宣传式首页 改为或跳转到课程列表
AES-front/src/views/user/exam-list/index.vue 全局作业表 + 分页 按课程过滤;状态列改为五种
AES-front/src/views/user/report-submit/* 左描述+上传,右评语 描述置顶,右附件,下分数;申请重传
AES-front/src/views/admin/problem/problem-edit.vue 维度表 + 权重 简要要求 + 生成 + 可编辑文稿
AES-front/src/views/admin/problem/problem-post.vue 有允许补交,无补交截止 补交截止;个人发布
AES-front/src/views/admin/problem/problem-review.vue 仍显示题目;教师一个总分 左右分项;审核通过/修改
AES-front/src/views/admin/problem/problem-student.vue 导出附件被注释 分报告/附件导出
AES/.../ProblemController.java /autoscore 请求内同步评分 改为入队;独立进程消费
AES/.../ProblemServiceImpl.java getAutoScore 按旧维度循环调 Python,评语拼接 一次(或按维)调用后写宽表;总分重算
submitreport / postproblem / scoringstandard 字段不足 按第 8 章扩展
original.py 含明文 API Key 独立批阅机 + 环境变量

13.4 文档技能与整理方法

为持续维护本需求,已在仓库安装:

Skill 路径 用途
write-spec .cursor/skills/write-spec/SKILL.md 按 PRD 结构写目标、非目标、用户故事、P0/P1/P2
prd-template .cursor/skills/prd-template/SKILL.md 编号需求、shall 句式、IEEE 29148 式章节
meeting-to-spec .cursor/skills/meeting-to-spec/SKILL.md 从导师会议转写/速记抽取需求,区分 as-is 与 to-be

本次成稿时:以转写中导师决定为主,用速记补状态列表和数据字段,用 aes.sql 与前后端页面做差距表;会议明确「先不做」的能力一律写入非目标,未拍板的写入第 12 章。

13.5 原文索引

  • 转写全文:docs/通用语音识别_需求说明.mp4 (1).txt
  • 速记:docs/自动评分系统/自动评分系统.md
  • 库结构现状:aes.sql