[M-QUIZ-01] 接入 Quiz 题型维度学习分析 #340

Closed
opened 2026-06-23 20:28:17 +08:00 by wangdl · 1 comment
Owner

类型 / 标签

backend analytics learning-analysis quiz p1

依赖

M-QUIZ-01-04(题型 type 枚举必须先冻结)

目标

使用现有 QuizAttempt + QuizAnswer + QuizQuestion.type 数据计算真实题型维度表现。

输出指标

至少填充:

accuracyByQuestionType.choice
accuracyByQuestionType.fill
accuracyByQuestionType.judge

每个题型至少包含或评估:

answeredCount
correctCount
accuracy

规则

  • 只统计已完成 Attempt
  • 统计窗口与 Learning Analysis Snapshot 一致
  • 按当前用户隔离
  • 无该题型数据时标记缺失或样本为 0
  • 不把缺失数据判断为表现差
  • 不信任客户端传入的 type 或 isCorrect
  • 使用数据库真实 Question 和 Answer 数据

非目标

本 Issue 不采集:

  • 单题停留时长
  • 修改答案次数
  • 信心程度
  • 错误原因
  • 查看解析行为

这些另行作为 P2 数据增强处理。

影响范围

模块 说明
Snapshot Builder 新增 Quiz 题型维度聚合
LearningAnalysisSnapshot 填充 accuracyByQuestionType
查询 API 不再返回硬编码空对象

验收标准

  • 不再返回硬编码空对象
  • accuracyByQuestionType.choice 正确统计
  • accuracyByQuestionType.fill 正确统计
  • accuracyByQuestionType.judge 正确统计
  • 跨用户数据不混入
  • 时间窗口与 Learning Analysis Snapshot 一致
  • 无数据语义正确(标记缺失而非判 0 分)
  • Snapshot 中包含真实聚合结果
  • Learning Analysis 回归通过

建议执行顺序

#5 — 依赖 Issue 04。题型枚举冻结后才能按 type 聚合统计。

## 类型 / 标签 `backend` `analytics` `learning-analysis` `quiz` `p1` ## 依赖 M-QUIZ-01-04(题型 type 枚举必须先冻结) ## 目标 使用现有 `QuizAttempt + QuizAnswer + QuizQuestion.type` 数据计算真实题型维度表现。 ## 输出指标 至少填充: ```text accuracyByQuestionType.choice accuracyByQuestionType.fill accuracyByQuestionType.judge ``` 每个题型至少包含或评估: ```text answeredCount correctCount accuracy ``` ## 规则 - 只统计已完成 Attempt - 统计窗口与 Learning Analysis Snapshot 一致 - 按当前用户隔离 - 无该题型数据时标记缺失或样本为 0 - **不把缺失数据判断为表现差** - **不信任客户端传入的 type 或 isCorrect** - 使用数据库真实 Question 和 Answer 数据 ## 非目标 本 Issue 不采集: - 单题停留时长 - 修改答案次数 - 信心程度 - 错误原因 - 查看解析行为 这些另行作为 P2 数据增强处理。 ## 影响范围 | 模块 | 说明 | |------|------| | Snapshot Builder | 新增 Quiz 题型维度聚合 | | LearningAnalysisSnapshot | 填充 `accuracyByQuestionType` | | 查询 API | 不再返回硬编码空对象 | ## 验收标准 - [ ] 不再返回硬编码空对象 - [ ] `accuracyByQuestionType.choice` 正确统计 - [ ] `accuracyByQuestionType.fill` 正确统计 - [ ] `accuracyByQuestionType.judge` 正确统计 - [ ] 跨用户数据不混入 - [ ] 时间窗口与 Learning Analysis Snapshot 一致 - [ ] 无数据语义正确(标记缺失而非判 0 分) - [ ] Snapshot 中包含真实聚合结果 - [ ] Learning Analysis 回归通过 ## 建议执行顺序 #5 — 依赖 Issue 04。题型枚举冻结后才能按 type 聚合统计。
wangdl added this to the M-QUIZ-01 Quiz 答题闭环与跨端契约收口 milestone 2026-06-23 20:28:17 +08:00
wangdl added the
priority:p1
type:feature
area:quiz
area:analytics
backend
labels 2026-06-23 20:28:17 +08:00
Author
Owner

开发完成评论

完成内容

aggregateByQuestionType 新增

  • QuizAnswer(已完成 Attempt)+ QuizQuestion.type 聚合题型维度正确率
  • 数据源:服务端写入的 isCorrect(不可信客户端)+ 数据库真实 type
  • accuracyByQuestionType 从硬编码空对象 {} → 真实填充

输出格式

accuracyByQuestionType: {
  choice: { answeredCount: 3, correctCount: 2, accuracy: 0.67 },
  fill:   { answeredCount: 2, correctCount: 1, accuracy: 0.5 },
  judge:  { answeredCount: 1, correctCount: 1, accuracy: 1.0 },
}

规则实现

规则 实现
只统计已完成 Attempt attempt.finishedAt: { not: null }
时间窗口一致 attempt.startedAt: { gte: scoreStart } (30d)
按用户隔离 attempt.userId
无数据标记缺失 不返回该 key(而非 accuracy: 0
不信任客户端 type/isCorrect 使用 question.type + 服务端 quizAnswer.isCorrect

修改文件

  • src/modules/ai-job/learning-analysis-snapshot-builder.ts — 新增 aggregateByQuestionType,更新类型
  • src/modules/ai-job/learning-analysis-snapshot-builder.spec.ts — +3 tests

测试情况

  • learning-analysis-snapshot-builder.spec.ts:11 tests
    • accuracyByQuestionType 填充真实数据(choice 3/2, fill 2/1, judge 1/1)
    • 无数据题型不返回 key(标记缺失)
    • 跨用户隔离验证(Prisma 查询条件断言)
  • 全量回归:10 suites / 189 tests / 0 failed

是否建议进入 Review

## 开发完成评论 ### 完成内容 #### aggregateByQuestionType 新增 - 从 `QuizAnswer`(已完成 Attempt)+ `QuizQuestion.type` 聚合题型维度正确率 - 数据源:服务端写入的 `isCorrect`(不可信客户端)+ 数据库真实 `type` - `accuracyByQuestionType` 从硬编码空对象 `{}` → 真实填充 #### 输出格式 ```typescript accuracyByQuestionType: { choice: { answeredCount: 3, correctCount: 2, accuracy: 0.67 }, fill: { answeredCount: 2, correctCount: 1, accuracy: 0.5 }, judge: { answeredCount: 1, correctCount: 1, accuracy: 1.0 }, } ``` #### 规则实现 | 规则 | 实现 | |------|------| | 只统计已完成 Attempt | `attempt.finishedAt: { not: null }` | | 时间窗口一致 | `attempt.startedAt: { gte: scoreStart }` (30d) | | 按用户隔离 | `attempt.userId` | | 无数据标记缺失 | 不返回该 key(而非 `accuracy: 0`) | | 不信任客户端 type/isCorrect | 使用 `question.type` + 服务端 `quizAnswer.isCorrect` | ### 修改文件 - `src/modules/ai-job/learning-analysis-snapshot-builder.ts` — 新增 `aggregateByQuestionType`,更新类型 - `src/modules/ai-job/learning-analysis-snapshot-builder.spec.ts` — +3 tests ### 测试情况 - `learning-analysis-snapshot-builder.spec.ts`:11 tests ✅ - accuracyByQuestionType 填充真实数据(choice 3/2, fill 2/1, judge 1/1) - 无数据题型不返回 key(标记缺失) - 跨用户隔离验证(Prisma 查询条件断言) - 全量回归:**10 suites / 189 tests / 0 failed** ✅ ### 是否建议进入 Review - **是**
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wangdl/api-server#340
No description provided.