上一份学案 20% -> 本次 65%,变化值却显示 80%。当前65%,变化80% 这种反直觉结果。% 容易被理解成“相对增长率”,语义也不清晰。POST /api/exam-analysis/reportapp/Http/Controllers/Api/ExamAnalysisApiController.php:24ExamAnalysisService::generateReport(...)app/Services/ExamAnalysisService.php:49ExamAnalysisService::processReportGeneration(...) 主要步骤:
getAnalysisDataExamPdfExportService::generateAnalysisReportPdfstudent_reports 或 OCR 记录app/Services/ExamAnalysisService.php:117ExamPdfExportService::generateAnalysisReportPdfapp/Services/ExamPdfExportService.php:201buildAnalysisData($paperId, $studentId)papers / students)exam_analysis_results.analysis_data)analysis_data.knowledge_point_analysis,否则走 MasteryCalculator 概览)knowledge_point_mastery_snapshots 用于补充 previous_masterypaper_questions + 题库详情)关键代码:
app/Services/ExamPdfExportService.php:735-923resources/views/exam-analysis/pdf-report.blade.php报告中“层级掌握度分析”显示的是父节点:
65%↑80%用户直觉:如果上次是 20%,那这次 65%,变化应约 +45(百分点),而不是 +80。
MasteryCalculator::getStudentMasteryOverviewWithHierarchy(全量子节点聚合)
app/Services/MasteryCalculator.php:555app/Services/ExamPdfExportService.php:815-834也就是说:
mastery_level(parent) = 全兄弟子节点平均mastery_change(parent) = 本次命中子节点平均变化这两个分母不同,数值天然不可直接对比,导致“当前值不大、变化却很大”的感知错误。
模板展示逻辑:
changeText = number_format(abs($delta) * 100, 1) . '%'resources/views/exam-analysis/pdf-report.blade.php:111-113, 151-153这里把 delta(0~1) 直接乘100并显示 %,但未说明是“百分点变化”。
用户容易理解成“相对增幅%”,语义冲突。
previous_mastery 缺失时被当成 0:
app/Services/ExamPdfExportService.php:791, 905这会把本应“无对比基线”的记录显示成“大幅提升”。
当前父节点掌握度 - 上次父节点掌握度收益:杜绝 65% +80% 类错觉。
基线明确化(P0)
在报告中写明:
对比基线:上一份已完成学案(时间:xxxx-xx-xx xx:xx)首次分析,无历史对比。禁止 silently fallback 到 0。
无基线不显示变化(P1)
previous_mastery 缺失时显示 --,并附 无可比历史数据。
报告数据版本化(P1)
在 exam_analysis_results 记录 metric_version、baseline_snapshot_id。
避免后续算法改动后旧报告口径不可追溯。
↑ 80.0%↑ 45.0 个百分点(绝对变化)若要展示相对增幅,另加一行:较上次提升 225%。
在卡片中显示“三元组”
上次 20.0% → 本次 65.0%(+45.0pp)
直接消除认知歧义。
父节点卡片增加口径说明(P1)
标注:父节点掌握度=全部子知识点加权/平均
与“本次命中知识点变化”分开展示。
异常提示(P1)
当 |delta_pp| > 60 且题量很少时,标记 样本偏小,变化波动较大。
parent_delta = parent_current - parent_previous不再用 relevantChildren 的平均变化替代。
子节点变化值稳健化(P1)
增加最小样本约束(如 attempts>=N)才展示变化。
否则显示“趋势待观察”。
变化值双口径并存(P2)
delta_pp(百分点)
delta_ratio(相对变化率)
前端默认展示 delta_pp,tooltip 展示 delta_ratio。
generateReport 目前同步执行耗时任务,峰值时可能拖慢接口。代码:app/Services/ExamAnalysisService.php:49
fallback 分支基线不稳定
当没有 knowledge_point_analysis 时,取“最新快照(不按 paper_id)”作为对比基线。
代码:app/Services/ExamPdfExportService.php:894-899
风险:跨学案串基线。
previous 缺失默认0
可能制造虚高变化。
代码:app/Services/ExamPdfExportService.php:791, 905
父节点层级计算规则与展示说明不一致
代码注释写“所有兄弟节点历史数据”,实现却是 relevantChildren。
代码:app/Services/ExamPdfExportService.php:818-833
“是对比上一份学案吗?”
当前实现并不稳定地等价于“上一份学案”:
所以你看到 20% -> 65%,却↑80% 是代码层面的口径混用问题,不是你的理解问题。