Files
WiseGrade/docs/IMPORT_MODEL_FIX_2026-10-14.md
T

6.0 KiB
Raw Blame History

2026-10-14 目录扫描与模型故障修复

原因与修复

  • 直接扫描 test/示例 原来返回 projects: [],因为扫描器只遍历子文件夹。现在支持所选目录直接存放资料,并继续支持下一级学生资料目录;空目录不再生成空项目。
  • 未按“学号_姓名_选题”命名的资料目录原来只返回 detected_identity,确认表仍为空。现在用无冲突的封面信息预填空字段;不同封面信息冲突会提示人工确认,不覆盖目录名中已有的信息。
  • 旧批次 5 的模拟样例有 14 个 ConnectError。本次容器内使用已保存配置访问模型列表接口返回 HTTP 200;相同配置的批次 6 后续完成全部 22 项评分。旧连接故障目前未重现,不能据此断言历史故障具体来自 DNS、代理或服务商。
  • 批次 6 的事实抽取仍报 ValidationError。原调用仅要求严格 JSON,没有传递事实/一致性结果所需的字段类型。现在所有 JSON 调用明确包含对应 Pydantic JSON Schema,不放宽评分、引文或证据来源校验。
  • 网络、超时、HTTP 认证/限流/服务异常提供可操作的提示,仍不输出响应正文、凭据、请求 URL 或原始异常文本。评分页面直接显示每项错误和批次重试入口说明;空扫描显示提示并禁用确认导入。
  • 最后实际浏览器复查还复现了多项目批次链接加载时丢失学生选择的问题:批次列表先返回、项目列表未返回时,页面误以为所选学生不在批次中。评分页现在等两个列表都加载完才判断项目范围;新增延迟项目列表的回归测试,修复前失败,修复后通过。
  • 示例 PPT 有 4 页文字层不足 30 字,触发 OCR;此前缺少离线模型导致整个 PPT 解析失败。依照 PaddleOCR 检测文档和识别文档,在本项目 models/ocr/detection 与 models/ocr/recognition 安装 PP-OCRv5 mobile 推理模型(约 21.75 MB),使用容器已有 PaddleOCR 3.7.0 / PaddlePaddle 3.3.1,未改变系统 Python 或驱动。下载链接和本地 SHA256 记录在运行证据 ocr-setup/manifest.json。真实首页 OCR 返回非空文字。

验证

  • 新的导入和模型错误测试在修复前 8 项失败,修复后连同优化和批次测试共 63 项通过。
  • 网页 Playwright 最终测试 12 项通过,TypeScript/Vite 构建通过。
  • 实际 Docker 网页(无接口模拟)验证直接扫描 test/示例、预填身份、展示 5 份 PDF、显示 14 项历史连接错误以及新项目资料详情,无页面异常。
  • 使用真实扫描结果确认导入“李傲琦 / 1023009006 / 基于ROS2 系统的自瞄移动机器人”,项目 ID 6,初始索引任务 7–11;补齐 OCR 模型后保留失败任务 7,并生成重试任务 12。原 PDF 和历史批次保留。
  • 新镜像部署 API、网页和 worker;worker 在批次 6 原任务结束且无活动任务后更新。重试批次 6 仅补做事实抽取/一致性检查,已有 22 项评分跳过模型调用。
  • 批次 6 真实重试结束为 completed,22/22 个评分项为 scored,事实结果不再含 error。93.55 为明确标注模拟数据的测试样例分数,不是李傲琦或胡旭阳的实际成绩。
  • 最终项目 6 的 5/5 份资料为 ready、解析错误为空,5 个知识库文档均可检索;任务 8、9、10、11、12 全部完成。任务 7 保留首次缺 OCR 模型的历史失败,不影响重试后的资料状态。验收脚本验证了 PPT 首页 OCR 与可见标题一致、原 5 份 PDF 哈希完全一致及批次 6 的完整成功状态。

材料范围提醒

test/示例/汇报PPT.pdf 首页实际显示“课程导学/自动化专业综合实践”。应在评分前确认它是否属于学生汇报稿,而不是课程说明。本次只导入和索引该示例资料包,未创建或启动它的新评分批次。

运行证据保存在工作区 .wisegrade-testing/docker-preview/,包括 import-model-live.json、import-test-sample-2026-10-14.json、浏览器截图和构建/部署日志。实际入库与批次重试的最终状态见该目录 import-model-final-2026-10-14.json。

后续:确认导入的校验与封面来源

按钮被禁用的原因原来隐藏在网页布尔表达式中;扫描只返回合并后的身份,冲突时清空字段,但未提供逐文件来源,忽略文件后也不重新计算。这使用户无法从页面判断如何完成合法导入。

  • d7bd152(2 个文件):扫描返回每份文件的封面身份和原目录身份,警告使用中文字段名;读取失败的文件不沿用上一份身份。
  • b24930b(3 个文件):显示具体阻碍原因和逐文件身份;只根据当前选中文件重算身份和冲突,忽略异项目文件后可重新预填。保留人工修改,提供“使用所选资料的封面信息”入口。材料类别未知、同类多份或没有选中材料时直接提示。
  • 36bf473(2 个文件):API 在写入前统一去除身份字段首尾空白,要求 5–20 位 ASCII 数字学号,拒绝空白姓名/选题、空项目、全部忽略及无效/重复材料类型。忽略的未知类型文件不阻碍合法选择。
  • 后端隔离测试 74 passed,网页测试 17 passed,TypeScript/Vite 构建通过;新增用例在修复前失败。API、网页和空闲 worker 已更新,本轮没有新增数据库迁移。
  • 实际网页无接口模拟验证:输入 1 显示学号规则;忽略异项目 PPT 并采用剩余报告封面信息后,身份冲突清除且确认按钮可用。没有提交真实导入或调用评分模型。空项目 API 请求返回 422。证据见工作区 docker-preview/import-root-live.json 和对应截图。

本轮修复不放宽学号格式要求,也不把不同学生的材料自动改成同一身份。已有项目若先前被人工填写为测试身份,需要核对所选资料并重新确认导入才能更新数据库中的身份。