# 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 历史包含清晰的阶段提交