docs: define WiseGrade technical specification

This commit is contained in:
2026-09-25 00:44:32 +08:00
commit f7a9091c86
13 changed files with 1168 additions and 0 deletions
+26
View File
@@ -0,0 +1,26 @@
.env
.env.*
!.env.example
__pycache__/
*.py[cod]
.pytest_cache/
.mypy_cache/
.ruff_cache/
.venv/
venv/
node_modules/
dist/
build/
coverage/
.coverage
data/processed/
data/exports/
data/runtime/
models/
*.log
*.sqlite3
*.db
.idea/
.vscode/
Thumbs.db
.DS_Store
+22
View File
@@ -0,0 +1,22 @@
# WiseGrade(智评)
WiseGrade 是面向《自动化专业综合实践》课程的教师端自动评分系统。
当前项目处于技术方案固化和系统开发准备阶段。完整技术规格见:
- [技术方案与开发规格](docs/WISEGRADE_TECHNICAL_SPEC.md)
- [Codex Goal 模式开发提示词](docs/CODEX_GOAL_PROMPT.md)
## 当前约束
- 仅供教师使用
- 通过宿主机挂载目录读取学生材料
- 支持 PDF、DOCX、PPTX 和 PPT 导出的 PDF
- 使用本地 BGE-M3 嵌入模型
- 使用 `deepseek-flash` 进行文本和图像理解
- 支持课程、评分规则和评分批次版本化
- 支持 Excel 成绩表和逐生 PDF 反馈导出
## 资料
课程原始资料位于 `docs/` 目录。
+190
View File
@@ -0,0 +1,190 @@
# WiseGrade(智评)Codex Goal 模式开发提示词
将以下内容复制给 Codex,并使用 goal 模式执行。
```text
你是本项目的主开发代理。请在当前工作目录完成 WiseGrade(智评)整套系统的搭建、开发、测试和部署文档。
## 最高优先级要求
1. 先完整阅读 `docs/WISEGRADE_TECHNICAL_SPEC.md`,它是本项目的技术规格和业务约束。
2. 当前项目英文名为 WiseGrade,中文名为智评。
3. 当前只实现“自动化专业综合实践”,但课程、课程版本、课程目标、毕业要求指标点、评分规则、选题方向和 Prompt 必须可配置、可版本化,未来可以扩展其他课程。
4. 系统只供教师使用,采用单机单管理员模式,不实现学生账号。
5. 学生材料通过宿主机目录挂载进入容器。不要把原始学生文件设计成浏览器上传流程。前端只选择挂载目录 `/data/inbox` 下的相对目录,后端扫描和读取实际文件。
6. 学生目录格式为 `学号_姓名_选题题目`。系统需要自动解析并支持教师在导入确认时修正。
7. 支持 PDF、DOCX、PPTX 和 PPT 导出的 PDF。不支持旧版 DOC 输入。
8. 评分材料为阶段报告1、阶段报告2、阶段报告3、最终报告、汇报 PPT/PPT PDF。
9. 课程成绩结构是:阶段报告1 10% + 阶段报告2 10% + 阶段报告3 10% + 期末成绩 70%。期末成绩包含任务完成度20分、报告规范性20分、汇报答辩40分、结果分析20分;其中本系统只按照 PPT 内容评价“汇报答辩”,不评价现场口头答辩。
10. 统一使用一个外部模型 `deepseek-flash`,该模型负责文本理解、图像理解、PPT分析、事实抽取、评分和评语生成。不要设计成文本模型和视觉模型两个必需模型。
11. 使用本地嵌入模型,默认 `BAAI/bge-m3`,支持配置轻量替代模型。模型以独立离线模型目录或模型包提供,不能要求系统启动时在线下载。
12. 每次评分创建独立评分批次。批次之间不覆盖、不设置唯一正式批次。每个批次都可查看、复核和导出。
13. 教师必须可以逐项修改分数和评语。模型原始分数、教师修改结果、证据和修改记录必须同时保留。
14. 最终必须支持导出 Excel 成绩表和每个学生一份 PDF 反馈报告。
15. 开发和测试过程中必须及时 Git commit。提交信息使用清晰的 Conventional Commits 风格。
## 推荐技术栈
- 前端:React + TypeScript + Vite + Ant Design
- 后端:FastAPI + SQLAlchemy + Pydantic
- 数据库:PostgreSQL + pgvector
- 后台任务:Redis + RQ
- 解析:PyMuPDF、python-docx、python-pptx、LibreOffice headless
- OCR:PaddleOCR 作为扫描 PDF 回退
- 嵌入:BAAI/bge-m3
- 大模型:OpenAI 兼容方式调用 deepseek-flash
- 导出:openpyxl/pandas,HTML/CSS + WeasyPrint 或 Playwright
- 部署:Docker Compose,兼容 Linux 和 Windows Docker Desktop
## 工作方式
### 第一步:检查和初始化
- 检查当前目录、现有文件和 `docs/` 资料。
- 阅读 `docs/WISEGRADE_TECHNICAL_SPEC.md`。
- 如果没有 Git,执行 `git init`。
- 创建合理的 `.gitignore`,不得忽略课程资料和源代码,但必须忽略 `.env`、模型目录、运行数据、缓存、构建产物和真实学生材料。
- 创建 `README.md`,说明项目名称、启动方式、配置方法和开发状态。
- 先提交:`chore: initialize WiseGrade project`。
### 第二步:设计并实现后端基础
- 创建 FastAPI 项目结构。
- 创建配置模块、日志模块、异常处理、健康检查和数据库连接。
- 使用 Alembic 或等价迁移工具。
- 创建课程、课程版本、评分规则、指标点、项目、提交材料、评分批次、评分结果、证据、教师复核、导出任务和审计日志模型。
- 保证所有评分结果关联课程版本、规则版本、模型配置快照和嵌入模型版本。
- 编写单元测试。
- 测试通过后提交:`feat: add backend foundation and database models`。
### 第三步:初始化课程资料和可编辑规则
- 从 `docs/` 现有材料建立“自动化专业综合实践”的初始课程版本。
- 课程目标和毕业要求指标点至少包括 2.3、2.4、4.1、4.2、4.3、4.4、11.1、11.2。
- 建立阶段报告1、2、3的初始评分规则,以及期末评分规则。
- 评分规则必须有分值、评分等级、证据要求和关联课程目标字段。
- 规则应可在 API 和前端中编辑、复制、发布新版本。
- 不要把规则写死在 Prompt 或评分代码中。
- 测试通过后提交:`feat: add course versioning and editable rubrics`。
### 第四步:实现挂载目录扫描和导入确认
- Docker 将宿主机目录挂载为 `/data/inbox:ro`。
- 后端只允许访问 `/data/inbox`,必须防止路径越界。
- 前端显示后端扫描出的目录树,教师选择某个大文件夹。
- 后端扫描其中的学生子文件夹,解析 `学号_姓名_选题题目`。
- 识别阶段报告1、2、3、最终报告和汇报PPT/PPT PDF。
- 结合文件名、扩展名、首页文本、章节标题进行识别。
- 对不确定、缺失、重复、无法解析的材料标记状态,交给教师确认。
- 保存相对路径、文件大小、修改时间、SHA-256和解析状态。
- 原始材料不复制到浏览器或应用上传临时目录。
- 测试通过后提交:`feat: add mounted directory scanning and import confirmation`。
### 第五步:实现文档解析和页面资产
- PDF 使用 PyMuPDF 按页解析,保留页码、文本、图片和表格信息。
- DOCX 使用 python-docx 解析标题、段落、表格和图片。
- PPTX 使用 python-pptx 提取文字、表格和备注,并使用 LibreOffice 渲染幻灯片。
- PPT PDF允许作为汇报材料,但需要教师确认材料类型。
- 扫描 PDF 使用 OCR 回退。
- 生成可追溯的结构化文档对象和页面图像。
- 解析失败不得静默忽略,必须进入错误状态并显示原因。
- 测试通过后提交:`feat: add document parsing and page rendering`。
### 第六步:实现知识库和 RAG
- 建立公共课程知识库:课程导学、课程目标、毕业要求、评分表、阶段模板、选题方向要求和优秀报告。
- 为每个学生项目建立独立命名空间,禁止跨学生检索。
- 使用结构感知切分,保留文档类型、阶段、页码、章节、课程版本和项目编号元数据。
- 使用本地 BGE-M3 生成嵌入,向量保存到 pgvector。
- 同时使用 PostgreSQL 全文检索、向量检索和元数据过滤。
- 首次启动不得强制在线下载模型;支持挂载 `./models` 或指定本地模型目录。
- 测试通过后提交:`feat: add knowledge ingestion and hybrid retrieval`。
### 第七步:实现 DeepSeek 适配器和评分编排
- 使用 OpenAI 兼容客户端接入 DeepSeek。
- 模型默认名为 `deepseek-flash`,Base URL、API Key、超时、并发数和重试次数可配置。
- API Key 后端保存,前端不得直接调用 DeepSeek,日志不得输出密钥。
- 通过结构化 JSON Schema/Pydantic 校验模型输出。
- 实现项目事实抽取、规则检查、指标级评分、PPT 页面分析和跨文档一致性检查。
- 每个评分项输出分数、理由、原文证据、页码或幻灯片编号、缺失证据、建议和置信度。
- 每个评分项只发送相关 RAG 证据和必要页面图片,不重复发送完整报告。
- 模型不能对没有证据的内容自行假设。
- 实现批次级后台任务、进度、失败重试和部分完成状态。
- 测试通过后提交:`feat: add deepseek-flash scoring pipeline`。
### 第八步:实现教师复核和导出
- 实现学生项目列表、评分批次列表、逐项评分详情和证据查看。
- 教师可以修改每个评分项的分数和评语。
- 保留模型原始值和教师修改记录。
- 缺失材料和无法评分状态必须明显显示。
- 导出 Excel:学生信息、各阶段分数、期末分项、期末成绩和总评。
- 导出单学生 PDF 反馈:各项分数、证据、页码、缺失内容、建议、教师修改结果、规则版本和模型信息。
- 每个评分批次都可以单独导出。
- 测试通过后提交:`feat: add teacher review and score exports`。
### 第九步:完善前端
实现至少以下页面:
- 仪表盘
- 课程和课程版本
- 评分规则编辑
- 知识库资料
- 挂载目录选择和扫描
- 导入确认
- 学生项目列表
- 评分批次和进度
- 学生评分详情
- 教师复核
- 导出任务
- 模型设置
页面必须适合教师批量操作,重点显示异常、缺失和待复核项目。
测试通过后提交:`feat: add teacher-facing frontend`。
### 第十步:测试、部署和文档
- 使用 `docs/` 当前示例材料完成端到端测试。
- 为路径安全、文件哈希、规则权重、材料识别、模型 JSON 输出、评分批次、教师复核和导出补充测试。
- 不在测试中提交真实 API Key。
- 提供 Linux 启动说明。
- 提供 Windows Docker Desktop 启动说明。
- 提供离线 BGE-M3 模型包安装说明。
- 提供 `.env.example`,说明 DeepSeek 配置、挂载目录、数据库和模型目录。
- 完成后提交:`test: add end to end coverage` 和 `docs: add deployment and usage guides`。
## 重要实现原则
- 先做可运行的最小闭环,再扩展功能。
- 不要为了“微服务化”增加不必要复杂度,第一版采用模块化单体后端。
- 不要把评分规则、课程目标或 Prompt 写死在代码中。
- 不要把模型权重、API Key、真实学生材料提交到 Git。
- 不要静默忽略解析失败、材料缺失或模型失败。
- 所有自动评分都必须能回溯到证据。
- 所有模型输出都必须经过结构化校验。
- 对需要外部网络的模型调用提供清晰错误信息和重试机制。
- 每完成一个可验证阶段就运行测试并及时提交 Git。
- 除非遇到真正阻塞开发的业务矛盾,否则不要停下来请求用户确认,按规格和合理工程判断继续推进。
## 最终验收标准
完成后必须能够:
1. 在 Linux 上通过 Docker Compose 启动 WiseGrade。
2. 在 Windows Docker Desktop 上按文档启动。
3. 选择挂载目录下的大文件夹并扫描学生子目录。
4. 识别和解析阶段报告、最终报告和 PPT/PPT PDF。
5. 编辑课程目标、毕业要求和评分规则并生成新版本。
6. 使用本地 BGE-M3 完成混合检索。
7. 使用 `deepseek-flash` 完成文本和页面图像评分。
8. 为每个评分项显示证据和页码/幻灯片编号。
9. 创建多个独立评分批次并分别保存。
10. 教师可以修改分数和评语。
11. 每个批次分别导出 Excel 和逐生 PDF。
12. 使用当前 `docs/` 示例材料完成端到端测试。
13. Git 历史包含清晰、及时、可回退的阶段提交。
```
+930
View File
@@ -0,0 +1,930 @@
# WiseGrade(智评)技术方案与开发规格
## 1. 项目概述
### 1.1 基本信息
- 英文名:**WiseGrade**
- 中文名:**智评**
- 当前服务课程:**自动化专业综合实践**
- 使用对象:教师
- 部署形态:个人电脑本地部署
- 当前开发环境:Linux
- 目标运行环境:Linux、Windows(Docker Desktop)
- 主要大模型:`deepseek-flash`
- 主要能力:课程材料管理、学生材料批量导入、RAG 辅助评分、教师复核、成绩和反馈导出
### 1.2 项目目标
构建一个前后端分离的自动评分系统,对自动化专业综合实践课程中的以下材料进行内容评分:
1. 阶段报告 1
2. 阶段报告 2
3. 阶段报告 3
4. 最终报告
5. 汇报 PPT,或 PPT 导出的 PDF
系统输出可复核的逐项评分、原文证据、页码或幻灯片编号、缺失内容、评语和改进建议。
### 1.3 非目标
第一版不实现:
- 学生账号和在线提交
- 现场口头答辩、答辩视频和语音评分
- 学生个人贡献度自动识别
- 代码仓库自动审查
- AI 生成内容检测
- 自动控制实验硬件的远程接入
课程评分表中的“汇报答辩 40 分”保留原名称,但本系统只依据 PPT 内容或 PPT PDF 内容评分,不评价现场口头答辩。
## 2. 已确定的业务规则
### 2.1 教师使用流程
系统只供教师使用,采用单机单管理员模式。教师不需要创建学生账号。
教师流程:
```text
选择课程和学期
-> 选择评分规则版本
-> 选择挂载数据目录中的学生总文件夹
-> 扫描学生子文件夹
-> 自动识别学生信息和五类材料
-> 教师确认导入结果
-> 批量解析和评分
-> 查看模型评分和证据
-> 修改分数和评语
-> 导出 Excel 成绩表和逐生 PDF 反馈
```
### 2.2 学生目录结构
宿主机数据目录示例:
```text
WiseGradeData/
└── 2026春季第1批/
├── 1023009006_李傲琦_基于ROS2系统的自瞄移动机器人/
│ ├── 阶段报告1.pdf
│ ├── 阶段报告2.pdf
│ ├── 阶段报告3.pdf
│ ├── 自动化专业综合实践报告.pdf
│ └── 汇报PPT.pptx
└── 其他学生/
```
学生目录命名格式:
```text
学号_姓名_选题题目
```
文件夹名称只用于初步识别。系统还要从文件首页、标题和正文中抽取姓名、学号、项目题目和选题方向,并在不一致时提醒教师确认。
### 2.3 支持文件
支持:
- PDF
- DOCX
- PPTX
- PPT 导出的 PDF
不支持旧版 `.doc` 作为学生输入。
PPT PDF 必须在导入确认阶段标记为“汇报材料”,以免与最终报告 PDF 混淆。
### 2.4 成绩结构
总评成绩:
```text
总评 = 阶段报告1 × 10%
+ 阶段报告2 × 10%
+ 阶段报告3 × 10%
+ 期末成绩 × 70%
```
期末评分保持课程评分表结构:
| 评分项 | 分值 |
|---|---:|
| 任务完成度 | 20 |
| 报告规范性 | 20 |
| 汇报答辩(系统仅按 PPT 内容评价) | 40 |
| 结果分析 | 20 |
### 2.5 评分批次
每次评分创建独立批次。批次之间不覆盖、不替代,也不设置唯一“正式批次”。每个批次均可查看、复核和导出。
批次必须保存:
- 课程版本
- 评分规则版本
- 课程目标版本
- `deepseek-flash` 模型配置快照
- 嵌入模型名称和版本
- 创建时间和结束时间
- 评分任务状态
## 3. 课程和评分依据
初始资料位于 `docs/`:
- `课程导学-自动化专业综合实践.pdf`
- `自动化专业综合实践三融合选题课程概述.pdf`
- `大作业评分表-自动化专业综合实践.docx`
- `阶段报告1模板.doc`
- `阶段报告2模板.doc`
- `阶段报告3模板.doc`
- `阶段报告1.pdf`
- `阶段报告2.pdf`
- `阶段报告3.pdf`
- `自动化专业综合实践报告.pdf`
### 3.1 课程目标和毕业要求指标点
系统初始知识库必须包含并建立关联:
- 课程目标 1:问题解决与研究能力
- 课程目标 2:知识运用与分析能力
- 课程目标 3:实验设计与操作能力
- 课程目标 4:数据处理与报告撰写能力
- 毕业要求指标点 2.3、2.4
- 毕业要求指标点 4.1、4.2、4.3、4.4
- 毕业要求指标点 11.1、11.2
### 3.2 阶段报告要求
#### 阶段报告 1:复杂自动化工程问题解决方案论证报告
重点内容:
- 文献调研和技术现状
- 复杂工程问题分析
- 主方案和至少一套替代方案
- 方案原理、适用场景和优劣对比
- 数理或工程依据下的可行性论证
- 进度计划、资源配置、成本构成和经济性分析
初始评分框架:
| 评分项 | 分值 |
|---|---:|
| 复杂工程问题和需求分析 | 25 |
| 文献调研和技术现状总结 | 20 |
| 主方案和替代方案设计 | 25 |
| 可行性、风险和合理性论证 | 15 |
| 工程管理、进度和成本分析 | 10 |
| 报告完整性和规范性 | 5 |
| 合计 | 100 |
#### 阶段报告 2:实验系统设计与硬件搭建方案
重点内容:
- 硬件选型清单、参数和依据
- 系统架构图、硬件连接或接口关系
- 分步骤实验计划、测试方法和预期指标
- 安全风险、防护措施和操作规范
初始评分框架:
| 评分项 | 分值 |
|---|---:|
| 系统架构和实现思路 | 20 |
| 硬件选型及选型依据 | 20 |
| 系统框图、连接关系和接口设计 | 20 |
| 实验方案、测试方法和预期指标 | 20 |
| 安全风险和防护措施 | 10 |
| 阶段进展及下一阶段计划 | 10 |
| 合计 | 100 |
#### 阶段报告 3:软件设计与系统调试报告
重点内容:
- 软件逻辑、流程图或状态图
- 核心代码片段和实现说明
- 调试过程、故障现象、原因和解决方法
- 实验数据整理和初步分析
- 系统功能、性能指标和存在问题
初始评分框架:
| 评分项 | 分值 |
|---|---:|
| 软件逻辑和系统实现 | 20 |
| 核心代码和功能说明 | 20 |
| 调试过程、问题分析和解决方法 | 20 |
| 实验数据和初步分析 | 20 |
| 功能和性能指标验证 | 15 |
| 下一阶段计划及报告规范性 | 5 |
| 合计 | 100 |
阶段评分框架必须作为可编辑的初始规则导入,不能写死在业务代码中。
## 4. 总体架构
```text
React 前端
|
FastAPI 后端
|-- 课程、版本和规则管理
|-- 挂载目录扫描和导入
|-- 文档解析和事实抽取
|-- RAG 检索
|-- 评分编排和批次管理
|-- 教师复核
|-- Excel/PDF 导出
|
PostgreSQL + pgvector
Redis + RQ
本地文件存储
本地 BGE-M3 嵌入模型
DeepSeek API(deepseek-flash)
```
采用模块化单体后端,不在第一版拆分成大量微服务。模块边界清晰,后续可以拆分。
### 4.1 推荐技术栈
- 前端:React、TypeScript、Vite、Ant Design
- 后端:Python、FastAPI、SQLAlchemy、Pydantic
- 数据库:PostgreSQL、pgvector
- 后台任务:Redis、RQ
- PDF 解析:PyMuPDF
- DOCX 解析:python-docx
- PPTX 解析:python-pptx
- 页面转换:LibreOffice headless
- OCR:PaddleOCR,扫描 PDF 时作为回退
- 本地嵌入:`BAAI/bge-m3`
- 模型调用:OpenAI 兼容客户端,统一模型名 `deepseek-flash`
- Excel:openpyxl 或 pandas
- PDF 反馈:HTML/CSS + WeasyPrint 或 Playwright
- 部署:Docker Compose
## 5. 宿主机目录挂载方案
原始学生材料不通过浏览器上传。前端只选择后端可见的挂载目录下的大文件夹,后端扫描和读取文件。
### 5.1 Docker 挂载
```yaml
volumes:
- ${WISEGRADE_DATA_DIR}:/data/inbox:ro
- ./data/processed:/data/processed
- ./data/exports:/data/exports
- ./models:/models:ro
```
Linux 示例:
```env
WISEGRADE_DATA_DIR=/home/teacher/WiseGradeData
```
Windows 示例:
```env
WISEGRADE_DATA_DIR=D:/WiseGradeData
```
Windows 使用 Docker Desktop 时,教师需要允许 Docker Desktop 访问对应磁盘。
### 5.2 路径安全
- 后端只允许访问 `/data/inbox`
- 前端只提交挂载目录内的相对路径
- 禁止提交绝对路径
- 后端必须执行路径规范化和越界检查
- 原始输入目录只读挂载
- 解析结果、任务状态和导出文件写入独立目录
### 5.3 文件变更检测
导入时保存:
- 相对路径
- 文件大小
- 修改时间
- SHA-256
- MIME 类型
- 解析状态
若文件哈希未变化,不重复解析和向量化。源文件变化时提示重新导入。
## 6. 文档解析和结构化
### 6.1 统一文档对象
每个文档解析为:
```json
{
"document_type": "stage1",
"source_path": "...",
"pages": [
{
"page_number": 1,
"text": "...",
"tables": [],
"images": [],
"rendered_image_path": "..."
}
]
}
```
必须保留页码、章节名、表格和图片关联。
### 6.2 文件识别
支持通过以下信号识别材料类型:
- 文件名关键词
- 文件扩展名
- 文档标题
- 首页文本
- 章节标题
- PPT 页数和标题
识别结果包括:
```text
确定
不确定
缺失
重复
无法解析
```
不确定的文件进入教师确认界面。
### 6.3 PPT/PDF 视觉处理
- 提取 PPT 原生文字、表格和备注
- 将每一页渲染为图片
- PDF 每页保存页面图像
- 评分相关页面连同文字一起发送给 `deepseek-flash`
- 图片证据必须关联页码或幻灯片编号
## 7. RAG 方案
### 7.1 知识库分层
#### 公共课程知识库
- 课程导学
- 课程目标
- 毕业要求指标点
- 评分表
- 三个阶段模板
- 各选题方向要求
- 优秀报告
- 课程版本资料
#### 学生项目知识库
每个学生独立命名空间:
```text
course_2026/project_1023009006/
stage1/
stage2/
stage3/
final_report/
presentation/
```
禁止评分时检索其他学生的材料。
### 7.2 文本切分
- 按标题和章节进行结构感知切分
- 普通文本块约 400~800 个中文字符
- 重叠约 80~120 个中文字符
- 表格单独保存
- 图片及图片说明单独保存
- 每块必须保留页码、章节、文档类型和评分指标关联
### 7.3 检索
采用混合检索:
```text
PostgreSQL 全文检索
+ pgvector 向量检索
+ 课程版本过滤
+ 学生项目过滤
+ 报告类型过滤
+ 阶段过滤
```
默认每个评分项取 8~12 个候选证据块,去重后送入模型。
### 7.4 嵌入模型
默认:
```text
BAAI/bge-m3
```
低配置电脑可配置:
```text
BAAI/bge-small-zh-v1.5
```
模型通过独立离线包提供,不在应用镜像中强制在线下载。配置中保存模型名称、版本和本地路径。
## 8. DeepSeek 接入
### 8.1 统一模型
只使用一个模型配置:
```yaml
provider: deepseek
base_url: https://api.deepseek.com
model: deepseek-flash
```
同一个模型负责:
- 文本理解
- 图像理解
- 事实抽取
- 评分
- 评语生成
- PPT 分析
- 跨文档一致性检查
### 8.2 密钥管理
教师可以在设置页面配置:
- API Key
- Base URL
- 模型名
- 并发数
- 超时时间
- 重试次数
安全要求:
- 前端不直接调用 DeepSeek
- API Key 只发送给后端
- 数据库保存加密后的密钥
- 日志禁止输出 API Key
- 支持环境变量初始化
### 8.3 发送数据范围
原始文件保存在本地。模型请求只发送当前评分项所需的:
- 文本证据块
- 表格内容
- 必要的页面图片
- 课程评分标准
- 已抽取的项目事实
不把全部报告无条件重复发送给每一个评分项。
## 9. 评分引擎
评分采用多阶段流程:
```text
文件导入
-> 文档解析
-> 项目事实抽取
-> 规则检查
-> 指标级 RAG 检索
-> 指标级评分
-> 跨文档一致性检查
-> 分数汇总
-> 教师复核
```
### 9.1 事实抽取
抽取:
- 学号、姓名、项目名称
- 选题方向
- 功能目标
- 性能指标
- 硬件型号
- 软件技术
- 实验方案
- 实验数据
- 进度计划
- 成本信息
- 结论和改进方向
### 9.2 评分输出
每个评分项必须返回结构化 JSON:
```json
{
"criterion_id": "stage1.solution_design",
"score": 17,
"max_score": 20,
"reason": "...",
"evidence": [
{
"document": "阶段报告1",
"page": 12,
"quote": "..."
}
],
"missing_evidence": ["..."],
"suggestion": "...",
"confidence": 0.84
}
```
模型不得对没有证据的内容自行假设。结构化输出必须经过 Pydantic 校验;失败时自动重试或进入人工处理。
### 9.3 跨文档一致性
至少检查:
- 阶段 1 计划是否在阶段 2、3 中落实
- 各报告中的项目名称、硬件型号和技术路线是否一致
- 实验数据是否前后一致
- 最终报告和 PPT 是否描述同一成果
- 指标是否存在明显夸大或矛盾
## 10. 规则配置和版本管理
规则不能写死在 Prompt 或 Python 代码中。
### 10.1 评分指标结构
```yaml
criterion_id: stage1.solution_feasibility
name: 方案合理性与可行性
max_score: 15
description: 评价方案是否具有工程依据、可实施性和风险分析
linked_outcomes: [2.3, 2.4, 4.1]
required_evidence:
- 主方案
- 替代方案
- 方案比较
- 风险分析
score_levels:
- min: 12
max: 15
description: 论证充分,方案比较清晰,风险分析具体
- min: 6
max: 11
description: 基本完成论证,但证据或分析不充分
- min: 0
max: 5
description: 缺少核心论证
```
### 10.2 版本要求
课程、课程目标、毕业要求、模板、评分规则和 Prompt 都需要版本号。评分批次保存完整版本快照。
教师修改规则后创建新版本,不覆盖历史版本。
## 11. 核心数据表
建议至少包含:
```text
courses
course_versions
course_objectives
graduation_indicators
topic_directions
rubric_versions
rubric_criteria
rubric_score_levels
knowledge_documents
knowledge_chunks
students
projects
submissions
submission_files
scoring_batches
criterion_scores
score_evidences
teacher_revisions
export_tasks
app_settings
audit_logs
```
### 11.1 评分批次
```text
scoring_batches
id
course_version_id
rubric_version_id
model_name
model_config_snapshot
embedding_model_name
embedding_model_version
status
created_at
finished_at
```
### 11.2 评分项结果
```text
criterion_scores
id
batch_id
project_id
criterion_id
model_score
teacher_score
final_score
model_comment
teacher_comment
confidence
status
```
```text
final_score = teacher_score(存在时)或 model_score
```
模型原始结果不得被教师修改覆盖。
## 12. 前端页面
第一版页面建议:
1. 仪表盘
2. 课程管理
3. 课程版本和评分规则管理
4. 课程资料/知识库管理
5. 数据目录扫描与导入确认
6. 学生项目列表
7. 评分批次列表
8. 批量评分进度
9. 学生评分详情
10. 证据和页码查看
11. 教师复核
12. Excel/PDF 导出
13. 模型和系统设置
## 13. 后端 API 初稿
### 课程和规则
```text
GET /api/courses
POST /api/courses
GET /api/courses/{id}/versions
POST /api/courses/{id}/versions
GET /api/rubrics/{version_id}
PUT /api/rubrics/{version_id}
POST /api/rubrics/{version_id}/publish
```
### 文件扫描和项目导入
```text
GET /api/storage/directories
GET /api/storage/directories/{relative_path}/children
POST /api/import/scan
POST /api/import/confirm
GET /api/projects
GET /api/projects/{id}
```
### 评分
```text
POST /api/scoring-batches
GET /api/scoring-batches
GET /api/scoring-batches/{id}/progress
POST /api/scoring-batches/{id}/start
GET /api/scoring-batches/{id}/scores
GET /api/projects/{id}/scores?batch_id={batch_id}
PUT /api/criterion-scores/{id}/review
```
### 导出
```text
POST /api/exports/excel
POST /api/exports/project-pdf
GET /api/exports/{id}
```
## 14. 缺失和异常处理
材料状态:
```text
已提交
缺失
重复
无法解析
内容不完整
待人工确认
```
处理原则:
- 缺失阶段报告:该阶段进入待人工处理,不默认静默给零分
- 缺失 PPT:汇报材料项显示无法评分
- 缺少章节:按照对应评分项判断并扣分
- 文件损坏:进入人工确认列表
- DeepSeek 调用失败:自动有限重试,仍失败则标记评分项失败
- 评分批次允许部分完成,但导出时必须显示未完成项目
## 15. 模型离线分发
`bge-m3` 不依赖启动时在线下载。推荐单独提供模型包:
```text
WiseGrade-release/
├── docker-images.tar
├── models-bge-m3.tar.zst
├── docker-compose.yml
├── .env.example
└── README.md
```
也支持将模型目录放在:
```text
./models/bge-m3/
```
容器只读挂载:
```yaml
volumes:
- ./models:/models:ro
```
在线下载脚本是可选工具,不得成为系统正常启动的前置条件。
## 16. 测试要求
### 16.1 单元测试
- 目录扫描
- 学号/姓名/题目解析
- 文件类型识别
- 路径越界防护
- 文件哈希检测
- 规则权重计算
- 缺失材料处理
- 分数汇总
- 评分 JSON 校验
- 版本绑定
### 16.2 集成测试
- 从示例材料导入到项目生成
- PDF/DOCX/PPTX 解析
- PPT PDF 识别
- 知识库入库和检索
- 模型 API mock 调用
- 评分批次创建、运行和查询
- 教师修改分数
- Excel 导出
- PDF 反馈导出
### 16.3 验收测试
至少使用当前 `docs/` 中的示例材料完成一次完整流程:
```text
扫描目录
-> 导入学生项目
-> 解析五类材料
-> 创建评分批次
-> mock 或真实调用 deepseek-flash
-> 查看逐项证据
-> 修改分数
-> 导出 Excel
-> 导出学生 PDF 反馈
```
不应在测试中提交真实 API Key。使用环境变量或 mock 服务。
## 17. Git 开发要求
开发前初始化 Git:
```bash
git init
```
必须创建合理的 `.gitignore`,至少忽略:
```text
.env
data/processed/
data/exports/
models/
__pycache__/
.pytest_cache/
node_modules/
dist/
*.pyc
```
开发和测试过程中按阶段提交,推荐提交节点:
```text
chore: initialize project structure
feat: add backend foundation
feat: add course and rubric versioning
feat: add mounted directory scanning
feat: add document parsing pipeline
feat: add knowledge base and hybrid retrieval
feat: add deepseek-flash adapter
feat: add scoring batch orchestration
feat: add teacher review workflow
feat: add excel and pdf exports
test: add integration coverage
docs: add deployment and usage guides
```
每个提交应保持可理解、可回退、尽量可运行。禁止把 API Key、真实学生隐私数据和模型权重提交到 Git。
## 18. 开发优先级
### P0:可运行骨架
- Git、README、Docker Compose
- 前端和后端健康检查
- 数据库迁移
- 单管理员设置
### P1:课程和导入
- 课程版本和规则配置
- 挂载目录扫描
- 学生目录识别
- 文件识别和导入确认
### P2:解析和知识库
- PDF/DOCX/PPTX 解析
- 页面渲染
- OCR 回退
- BGE-M3 嵌入
- pgvector 混合检索
### P3:评分
- 事实抽取
- 指标级 RAG 评分
- 跨文档一致性检查
- 批次状态和失败重试
### P4:复核和导出
- 教师修改分数和评语
- Excel 成绩表
- 逐生 PDF 反馈
- 审计日志
### P5:验收和部署
- 示例材料完整验收
- Linux 部署文档
- Windows Docker Desktop 部署文档
- 离线模型包说明
## 19. 完成标准
当以下条件全部满足时,第一版系统完成:
- Linux 上可以通过 Docker Compose 启动
- Windows Docker Desktop 有明确部署步骤
- 教师可以选择挂载目录下的大文件夹
- 系统可以识别每个学生目录
- 支持五类材料和 PPT PDF
- 规则、课程目标和课程版本可编辑
- 可创建独立评分批次
- 使用本地嵌入模型完成检索
- 使用 `deepseek-flash` 完成文本和图像评分
- 每项评分显示证据和页码/幻灯片编号
- 教师可以修改分数和评语
- 每个批次都可以导出 Excel 和逐生 PDF
- 示例材料可以完成端到端测试
- Git 历史包含清晰的阶段提交
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.