Files
WiseGrade/docs/WISEGRADE_TECHNICAL_SPEC.md
T

932 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# WiseGrade(智评)技术方案与开发规格
> 2026-09-26 增量实现:默认“对话”页面、应用内固定工具 Agent、持久会话、待确认操作、自动索引任务和批次固定项目清单。具体状态机、API 与恢复流程见 [对话页面与业务 Agent](CHAT_AGENT.md)。旧版正文的阶段计划按原始系统设计编写,新增业务边界以该增量文档及当前代码为准。
## 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 历史包含清晰的阶段提交