paper_132736388400529_根因分析.md 3.2 KB

paper_132736388400529 题目不足根因分析

一、现象

  • 请求:知识点组卷,20 题,kp_code_list 含 7 个知识点
  • 实际:仅产出 7 题

二、日志链路复盘

1. ExamTypeStrategy 阶段

QuestionExpansionService: Step1 - 获取直接关联知识点题目
  added_count: 20, total_count: 20(expansion 未用 exclude,拿到 20 个 ID)

知识点组卷题池评估: pool_count_after_expand: 20, total_questions: 20
  → basePoolCount >= totalQuestions,mistake_question_ids = [](不传扩展结果)

从 paper_questions 获取学生已做题目: exclude_count: 219

2. getQuestionsFromBank 阶段

应用知识点筛选: kp_codes 含 7 个(含 typo S06-002_003)
应用学段筛选: grade=11 → stage_grade=3(高中)
应用排除筛选: exclude_count=219

getQuestionsFromBank: 查询完成
  raw_count: 7, total_needed: 0, database_query_count: 7

3. selectQuestionsByMastery 阶段

题目数量不足,将使用所有可用题目 (available: 7, requested: 20)
题型分配: choice 7, fill 0, answer 0(全部为选择题,填空/解答无题)
题型缺口补充: deficit=13, 最终仍为 7(无更多题目可补)

三、根因归纳

根因 1:poolLimit=0 导致智能补充不触发(主因)

现象 原因
total_needed: 0 调用 getQuestionsFromBank 时传入的第 5 参为 poolLimit=0
智能补充未执行 条件 totalNeeded > 0 && count < totalNeeded && grade !== null,因 totalNeeded=0 不成立

代码位置LearningAnalyticsService.php 约 1456 行

$additionalQuestions = $this->getQuestionsFromBank(
    ...
    $poolLimit,  // ← 传入 0,导致 totalNeeded=0
    ...
);

智能补充条件(约 1801 行):

if ($totalNeeded > 0 && count($selectedQuestions) < $totalNeeded && $grade !== null) {
    // 智能补充逻辑
}

totalNeeded=0 时,永远不进入智能补充。

根因 2:指定知识点下可用题目仅 7 道

  • 指定 7 个 kp 下,审核通过的题目约 60 道(grade=3)
  • 排除学生已做 219 题后,剩余 7 道(约 53 道与 exclude 重合)
  • 即该学生在这些知识点上已做过大部分题,题池接近耗尽

根因 3:参数 typo 导致 1 个知识点无题

  • 输入为 S06-002_003(连字符),应为 S06_002_003(下划线)
  • 该 typo 导致该知识点匹配 0 题(对本次 7 题结果影响有限,因其他知识点仍有题)

四、修复建议

建议 1:修正 totalNeeded 传参(已修复)

已修改:调用 getQuestionsFromBank 时传入 $needCount = $totalQuestions - count($priorityQuestions),使 totalNeeded > 0,从而在题目不足时触发智能补充。

建议 2:知识点组卷传入 grade(必须)

  • 当前 textbook_id=null,但 grade=11 已传入
  • 智能补充只需 grade 即可从同年级其他知识点补题
  • 需确认 params 中 grade 正确传到 getQuestionsFromBank(日志显示已传入)

建议 3:前端参数校验(可选)

  • 对 kp_code 格式做基础校验,避免 S06-002_003 类 typo
  • 或在后端对 S06-002_003 自动规范为 S06_002_003