Files
2026-06-06 05:21:10 +00:00

213 lines
9.1 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: quiz-mastery
description: 出题、测验、复习、掌握度追踪工具。**用户说"复习"、"巩固"、"回顾"任一关键词时优先触发本 skill**。当用户的请求与"题目/复习"相关时触发:把学习资料/PDF/材料转成题目练习("给这个 PDF 出几道题")、导入题目文件做练习("我有一份题目文件,帮我做")、复习已学内容("复习一下昨天的"、"巩固一下"、"回顾下昨天"、"用艾宾浩斯帮我安排")、遗忘曲线追踪、掌握度评分。**🔴 强制规则**:每次出题/导入题目成功后,**首轮展示题目前必须问一句**"要不要生成网页练习页?",用户说要 → 调用 quiz-html skill。**不处理**:长期学习项目的进度管理、计划制定(→ study-buddy
---
# 测验大师 (Quiz Mastery)
## 两大核心能力
### 能力一:从学习资料出题
1. 用户提供学习资料(.md / .txt / .docx / .pdf / .ppt / .pptx
2. 调用 `generate_from_material.py` 获取知识点提取 prompt
3. 将 prompt 发给 LLM得到知识点 JSON
4. 调用 `service.save_knowledge_points()` 保存知识点
5. 调用 `run_quiz.py` 生成出题 prompt
6. 将 prompt 发给 LLM得到题目 JSON
7. **⭐ 询问用户是否生成网页练习页**(见下方"网页练习联动"章节)
- 用户说要 → 调用 `quiz-html` skill 生成 HTML 并打开
- 用户说不用 → 走原流程
8. 逐题展示给用户,收集答案
9. 调用 `submit_answers.py` 提交评分
### 能力二:从题目文件练习
1. 用户提供题目文件(.md / .txt / .docx / .pdf / .ppt / .pptx
2. 调用 `import_quiz.py` 获取题目解析 prompt
3. 将 prompt 发给 LLM得到标准化题目 JSON
4. 调用 `service.import_questions()` 导入题目并创建 session
5. **⭐ 询问用户是否生成网页练习页**(见下方"网页练习联动"章节)
- 用户说要 → 调用 `quiz-html` skill 生成 HTML 并打开
- 用户说不用 → 走原流程
6. 逐题展示给用户,收集答案
7. 调用 `submit_answers.py` 提交评分
## 何时使用(触发条件)
1. **用户主动要求**"出几道题"、"测试一下"、"来个小测"、"练习题"、"考考我"
2. **用户说"复习"、"巩固"、"回顾"**:直接触发
3. **基于已有题目文件练习**:用户上传题目文件后触发
> ⚠️ **不处理 study-buddy 的"即时练习"**——那条链路由 study-buddy 走外部 `exam_take`,不调本 skill。
## 没历史数据时的兜底
当用户说"复习"但 `data/user_progress/` 是空的(新用户/没答过题):
- **不要硬启动复习流程**——没数据可复习
- 主动告诉用户:"还没有可复习的历史数据,要不要先用一份学习资料出题练一下?"
- 引导用户走"能力一:从学习资料出题"
## 难度系统
| 级别 | 含义 | 说明 |
|------|------|------|
| L1 | 识记 | 基础记忆和理解,考察概念辨认和基本事实 |
| L2 | 理解 | 深层理解,考察概念区分、原理解释和简单应用 |
| L3 | 应用 | 综合运用,考察实际场景应用、分析和问题解决 |
- **首次出题**:强制从 L1 开始
- **答对当前难度**:升一级(最高 L3
- **答错当前难度**:降一级(最低 L1
## 题型分配规则
| 级别 | 选择题 | 判断题 | 填空题 | 简答题 |
|------|--------|--------|--------|--------|
| L1 | 70% | 30% | - | - |
| L2 | 50% | 20% | 30% | - |
| L3 | 40% | 20% | 20% | 20% |
## 出题数量
- **默认每次出 3 道题**(一次对话展示 3 题,用户一次性回答后统一评分)
- 每轮最多 **15 题**(用户可要求调整数量)
- 简答题尽量少出,不自动评分(标记为 `needs_review`,由外部 LLM/人工评判)
## 薄弱知识点追踪
- **标记为薄弱**:累计错误次数 ≥ 3
- **不解除**:薄弱知识点只增不减,作为历史档案保留
- 内部数据保存在 `data/user_progress/`(错误次数、艾宾浩斯阶段等)
- **同步到 USER.md 第 3 节"薄弱知识点"**(由本 skill 直接写入,来源=`quiz-mastery`
| 知识点 | 错误次数 | 来源 | 备注 |
- 已有该知识点 → 更新错误次数
- 未在表中 → 新增一行
## 遗忘曲线复习机制
基于艾宾浩斯遗忘曲线,按 **1天 → 2天 → 4天 → 7天 → 15天** 间隔安排复习:
- 答对review_stage +1推进到下一个间隔
- 答错review_stage 重置为 0从头开始
- 复习推荐包含:即将遗忘的知识点 + 最近 3 天薄弱知识点
## 脚本调用方式
### 1. 从学习资料提取知识点
```bash
python3 scripts/generate_from_material.py <file_path> <document_id>
```
输出知识点提取 promptJSON将 prompts.system_prompt 和 prompts.user_prompt 发给 LLM。
### 2. 从题目文件导入题目
```bash
python3 scripts/import_quiz.py <file_path> <document_id> <user_id>
```
输出题目解析 promptJSON将 prompts.system_prompt 和 prompts.user_prompt 发给 LLM。
### 3. 生成测验
```bash
python3 scripts/run_quiz.py <user_id> <document_id>
```
根据已保存的知识点和用户当前掌握度自动决定难度,输出出题 promptJSON
### 4. 提交答案
```bash
python3 scripts/submit_answers.py <user_id> <document_id> <session_id> '<answers_json>'
```
参数说明:
- `answers_json`JSON 格式的答案字典,如 `{"q_001": "A", "q_002": "True"}`
返回评分结果score、total、accuracy、逐题 results。
## 出题流程(面向 study-buddy 的调用说明)
1. 确定知识点来源(学习资料 or 已有题目文件)
2. 执行对应的提取/导入流程
3. 调用 `run_quiz.py` 生成出题 prompt
4. **每次展示 3 道题给用户**(一次性展示,编号清晰,不要逐题出),用户一次性回答后再统一评分
5. 收集用户回答(用户可以一次性回复 3 道题的答案)
6. 调用 `submit_answers.py` 提交评分
7. 将评分结果返回给 study-buddy由其写入 memory 文件
⚠️ **本 skill 仅写入 USER.md 第 3 节"薄弱知识点"**(来源=`quiz-mastery`);不写其他分区,也不写 `memory/`。其他持久化由 study-buddy 统一负责。
## 数据目录结构
```
skills/quiz-mastery/data/
├── knowledge_points/ ← 知识点定义(按 document_id
├── sessions/ ← 测验会话记录
└── user_progress/ ← 用户掌握度数据(含薄弱标记、遗忘曲线)
```
## ⭐ 网页练习联动(与 quiz-html 协作)
每次拿到题目 JSON 之后("能力一"步骤 7、"能力二"步骤 5都要**主动问用户一句**
> "题目准备好啦~ 要不要我把它们生成一个网页练习页?你可以在浏览器里慢慢做,错题会自动记下来,还能切换主题、模拟考试 🎯"
### 用户回应判定
| 用户说 | 判定 | 行动 |
|---|---|---|
| "要 / 好 / 嗯 / 来一个 / 生成 / 网页 / 浏览器" | ✅ 要 | 调用 `quiz-html` |
| "不用 / 不要 / 算了 / 直接做 / 这里做" | ❌ 不要 | 走原对话流程 |
| 没回应 / 不明确 | 默认 ❌ 不要 | 直接走原流程,不强推 |
### 调用 quiz-html 的具体步骤
```python
import json, subprocess, tempfile
from pathlib import Path
# 1. 把已经拿到的题目 JSON 写到临时文件
tmp_dir = Path(tempfile.mkdtemp(prefix="quiz_"))
qjson = tmp_dir / "questions.json"
qjson.write_text(json.dumps(questions, ensure_ascii=False), encoding="utf-8")
# 2. 决定输出路径(推荐放 ~/Desktop
output = Path.home() / "Desktop" / f"quiz_{title_slug}.html"
# 3. 调脚本
result = subprocess.run([
"python3",
str(Path.home() / "Desktop/studybuddy_4.0/skills/quiz-html/scripts/build_quiz_html.py"),
str(qjson),
"--title", page_title, # 如 "📚 物理 · 电学练习"
"--output", str(output),
"--open", # 生成后自动用浏览器打开
], capture_output=True, text=True)
info = json.loads(result.stdout) # {"success": true, "output_path": "...", ...}
```
### 题目字段补全建议
调用前,最好给每道题补上以下字段(如果出题时没生成):
- `category`**一级分类,短词**(建议 2-6 字),用于网页顶部分类筛选 chip。
- ✅ 推荐:`物理` / `数学` / `法律` / `历史` / `编程` / `通用`
- ❌ 避免:`通用类 / 1.中华人民共和国证券法1998年12月29日…` 这种长串、含日期/编号/斜杠的写法
- 如果非要分两级,用 `/` 分隔且二级也要短:`物理 / 电学`
- `knowledge_point`:知识点名(侧边栏分组用,可与 quiz-mastery 的 KP title 一致,不要带层级前缀)
- `memory_tip`记忆口诀可选K12 学生很需要)
这样网页的分类筛选、侧栏分组、记忆卡片才能发挥作用。
### 边界
| 任务 | 用谁 |
|---|---|
| 出题、提取题目 | 本 skill (quiz-mastery) |
| 评分、掌握度追踪 | 本 skill (quiz-mastery) |
| **题目 → 网页练习页** | **quiz-html** |
调完 quiz-html 之后,**仍然要走 quiz-mastery 的评分流程**——网页里的答题状态是给用户自查用的,正式的 mastery 数据要靠 `submit_answers.py` 写入。两者并行不冲突。