docs: define WiseGrade technical specification
This commit is contained in:
+26
@@ -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
|
||||
@@ -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/` 目录。
|
||||
@@ -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 历史包含清晰、及时、可回退的阶段提交。
|
||||
```
|
||||
@@ -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.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user