Imported from shi-tou1234/cmchen-skill (
dsh适配/skills/cmchen-practice/SKILL.md). Install upstream withnpx skills add shi-tou1234/cmchen-skill --skill cmchen-practice. Copyright stays with the author.
练习 Skill v1 — 出题 · 错题 · 期末冲刺
这是什么
一个「练与考」的技能:把材料变成题库,把做题变成数据,把数据变成期末武器。
与 cmchen-learning 的分工一句话:learning 负责「教会你」,本技能负责「练住你」。两者读写
同一份课程状态文件(state/<课程名>.json),错题本全系统只有一份:
- 用户想被逐步教学、听概念讲解 → 用 cmchen-learning。
- 用户要出题、刷题、批改、错题管理、期末冲刺产物 → 用本技能。
- 两件事都要 → 先问用户先做哪个。用户说「复习」但语境是想让人教 → 提醒他去 learning。
三条铁原则
- 题目质量 > 数量:一道好题胜过十道水题。每题必须有唯一确定的答案、明确的考点。
- 绝不自己答自己判:出题后必须等用户作答;判分以用户的作答为准,不许替答再自我确认。
- 一切落账:每次判分立即更新状态文件的
wrong_bank和排期,不许攒到最后补记——账断了, 期末冲刺包就是废纸。
模式总览(开工前先认准)
| 用户表达 | 模式 | 干什么 |
|---|---|---|
| 「把这章 PPT 出一套题」「生成练习题/卷子」 | ① 出题 | 材料 → 四类题型试卷 md → 登记 |
| 「刷题」「做第三章的题」「对答案」 | ② 刷题 | 作答 → 批改 → 错题入本 |
| 「错题本」「针对我的错题出组题」 | ③ 错题专练 | 抽错题 → 变式再练 |
| 「今天该复习什么」「有哪些到期」 | ④ 复习查询 | 扫全部课程列出到期项 |
| 「期末冲刺包」「错题重做卷」「速查卡」 | ⑤ 期末冲刺 | 一键产出重做卷/速查卡 |
拿不准就先问一句,别自作主张。
状态与文件布局
课程状态文件(与 cmchen-learning 共用,只有这一份)
路径:<SKILL_DIR>/../cmchen-learning/state/<课程名>.json(<SKILL_DIR> 为本技能目录,与 cmchen-learning 是同级技能,共享同一 state 目录),没有就新建。
写入纪律:先读全文 → 只增改本技能的字段 → 整体写回。learning 的字段(mission、
knowledge_points、weak_points…)一律不动。
本技能新增/使用的字段(其余字段见 learning 自己的文档):
{
"course": "大学物理",
"question_banks": [
{
"id": "QB-大学物理-01",
"title": "第三章 刚体转动 练习卷",
"source": "ch3.pptx",
"file": "<SKILL_DIR>/courses/大学物理/第三章刚体转动-练习.md",
"created": "2026-08-24"
}
],
"wrong_bank": [
{
"id": "W-20260824-01",
"topic": "转动惯量",
"kp_id": 1,
"question": "质量 m 半径 R 的圆盘对边缘轴的转动惯量?",
"your_answer": "½mR²",
"correct": "½mR² + mR² = ³⁄₂mR²(平行轴定理)",
"error_type": "知识缺口",
"leech_count": 1,
"date": "2026-08-24",
"bank_ref": { "bank_id": "QB-大学物理-01", "q_no": "Q03" },
"next_review": "2026-08-25"
}
]
}
字段规矩:
question_banks[].id:QB-<课程名>-<两位序号>,全库唯一;试卷文件头部也写这个 id,两边靠它对上。- 首次新建课程文件时只写本技能字段(course/question_banks/wrong_bank)——mission、knowledge_points 等 learning 字段留给 learning 自己补,别替它建空壳。
wrong_bank[].id:W-<YYYYMMDD>-<当日序号>。learning 写的老条目可能没有 id/topic——读的时候 用它的kp_id去 knowledge_points 里查标题当 topic,别报错。topic是考点字符串,变式题、重做卷分组都靠它聚合;kp_id有就带上,没有不硬造。error_type六选一(沿用 learning):知识缺口 / 粗心 / 读错题 / 时间不够 / 方法错 / 掉陷阱。next_review是错题自己的复习排期,与 knowledge_points 的排期互不干扰。bank_ref可空(用户手工报进来的错题没有出处)。
产物目录
试卷、重做卷、速查卡都放这里,按课程分文件夹:
<SKILL_DIR>/courses/<课程名>/
├── 第三章刚体转动-练习.md
├── 大学物理-错题重做卷-20261228.md
└── 大学物理-期末速查卡-20261228.md
间隔排期(错题的生死簿)
- 档位序列固定:1 / 3 / 7 / 14 / 30 / 60 / 90 天。入本时
next_review= 明天(即 1 天档)。 - 答对跳一级:新间隔 = 序列中第一个大于当前间隔的值,
next_review= 今天 + 新间隔 (例:1 天档答对 → 3 天档,明天+3 天)。连对两次才允许连跳两级。 - 答错回落:
next_review= 明天(回 1 天档),leech_count+1,错因按最新更新(错因会变)。 - leech 规则与重写 SOP:同一道题(同 topic 同题干)
leech_count ≥ 3时禁止原样重考。在 模式③专练或模式④带做轮到它时执行重写:换题型、拆成小问或换个角度出一道新题——旧题干挪进 条目的rewritten_from字段,question换成新题,标"rewritten": true,leech_count归零 重新计数。重写后的题按新题对待,用户作答正常判分入账。 - 数据体检:读到
next_review早于date的条目,视为数据异常——照常列入到期清单,但在 输出里标注「日期可疑,建议核实」。 - 90 天档过了还对 → 该错题视为已消灭,
next_review置 null,不再出现在到期清单里。
模式① 出题(材料 → 试卷)
输入处理:
| 用户给了什么 | 怎么处理 |
|---|---|
| 文件路径/目录(.pdf/.pptx/.ppt) | 把文件放进一个目录,跑 python "<SKILL_DIR>/scripts/提取.py" extract <目录>,JSON 直接打印在 stdout(进度在 stderr)——直接读 stdout 即可;不要重定向到文件(> 与脚本路径同命令会触发安全钩子拦截) |
| 图片(拍照/截图的笔记板书) | 直接用读图能力看图提取内容 |
| 粘贴的文本/课堂笔记 | 直接用,别重复提取 |
| 只说章节名 | 先问有没有材料;实在没有就联网搜该章大纲组织题目(引用规范同 learning:真实来源+链接,编不出就不给) |
流程:
- 🔴 CHECKPOINT 先提问再动笔:出题前必须向用户问清两件事——①范围(哪一章/哪些材料)②题型与数量。 问的时候给出建议配比供参考(默认:选择 8 / 填空 4 / 计算 3 / 证明 2;文科类没有计算证明 就换成选择/填空/简答,别硬凑题型),等用户回复确认或调整后再生成。只有当用户消息里已经 同时说清了范围和各题型数量时,才可以复述一遍直接开工。绝不在没确认前自作主张出卷。
- 内容按考点切分,每个考点至少覆盖一题;有 mission 和 weak_points 的课,优先覆盖它们。 材料撑不满题量时:先保证每个考点 1 题,剩余题量给重点/易混考点出变式,并在收尾摘要里 说明覆盖集中在哪里——别在单一考点上无提示地刷屏。
- 动笔前先读
references/question-formats.md(命题规范+试卷模板),照着写。 - 卷子写到 courses 目录,头部元信息带 bank_id。
- 登记状态文件:追加 question_banks 条目(先读再写)。
- 收尾一行摘要:「已生成 17 题(选8/填4/计3/证2),覆盖 6 个考点 → 第三章刚体转动-练习.md。 直接开刷说『刷这套』。」
模式② 刷题(作答 → 批改 → 入账)
两种节奏,用户选或按场景定:
- 整卷自测(默认):一次给整卷,用户做完交卷(拍照或打字,处理方式见下方「交卷双通道」)。
- 逐题快练:一题一交一判,适合碎片时间。
交卷双通道(用户做完后大概率是这两种之一,分别接):
| 用户怎么交 | 你怎么处理 |
|---|---|
| 拍照发图 | 用读图能力识别每道题的手写作答与过程,按题号对回试卷逐题判。计算/证明重点看步骤——方法分和结果分分开给。🔴 CHECKPOINT:字迹或拍摄角度看不清的地方,问一句确认,不许猜:判错一道比多问一句代价大。多张图就按图逐张对应题号。 |
| 打字回复 | 解析文字答案:选择题认字母(如「1C 2B 3A」),填空认数值或关键词,计算/证明用户通常只写关键结果或思路。只报了答案没报过程的按结果判;想拿步骤分的提示他补过程再改判。 |
两种通道之后走同一条流水线:成绩单 → 一次性错因收集 → 写 wrong_bank。
批改规矩:
- 选择/填空直接判对错;计算/证明按步骤给分——结果对但关键步骤缺失算半对,并指出缺哪步。 带小问的计算题:每小问独立按步骤分制判分。
- 🔴 CHECKPOINT:整卷批完先给成绩单(格式见
references/question-formats.md的「成绩单模板」):得分率 + 错题表(题号|你的答案|正确答案|错在哪个环节)。用户确认成绩单无异议后,才进入错因收集。 - 然后一次性收集错因:列出六分类编号表,让用户给每道错题报编号;懒得报的你根据出错环节 推测并注明「猜的,不对告诉我」。一次交互收完,别一题一题问。
- 每道错题当场写入 wrong_bank(含 topic、error_type、next_review=明天、bank_ref)。同 topic 同 题干的旧错题已存在则更新 leech_count 与 next_review,不重复插行。
- 全对也别只说「完美」——报正确率,顺带预告最近的到期复习日。
样卷片段(照着写的样子)
---
bank_id: QB-大学物理-01
course: 大学物理
title: 第三章 刚体转动 练习卷
---
一、选择题(每题 5 分,共 40 分)
1. 质量为 m、半径为 R 的圆盘对中心轴的转动惯量是?
A. mR² B. ½mR² C. ⅓mR² D. ⅔mR² (答案见文末)
...
模式③ 错题专练
触发:「错题本」「看看我的错题」「针对 XX 再来一组」。
- 先亮家底:按 topic 分组给概览(考点|累计错误次数|最近错因),让用户挑着练或者说「都练」。
- 抽题优先级:leech 高危(≥2)> 最近错的 > 从未重做过。
- 对抽中的错题出变式题:换数字、换情境、换提问角度,考点不变;leech ≥3 的按 leech 规则重写。
- 一次 3-5 道,做完即批即入账(流程同模式②)。
- 变式全对 → 该错题间隔跳级;再有错 → 回落并更新错因。
模式④ 复习查询
触发:「今天该复习什么」「有哪些到期了」「有什么要复习的」。
- 扫描
state/下所有课程的 json(不是只看一门),今天日期以实际为准。 - 汇总两类到期项:
- 错题到期:wrong_bank 里
next_review ≤ 今天的 → 本技能直接带做。 - 知识点到期:knowledge_points 里
next_review ≤ 今天的 → 那是 cmchen-learning 复习模式 的活,列出来提醒即可,不抢活。 - 附带亮黄灯:leech_count ≥2 的题即使没到期也单独标出。
- 错题到期:wrong_bank 里
- 输出按课程分组的清单(每行:课程|到期错题数|到期知识点数|高危项),问先做哪门。
- 带做方式:到期错题原文给用户(遮住 correct 和历史答案)→ 重做 → 判定 → 更新排期。 全清后总结一句:「今日复习完成 N 题,下次到期 X 月 X 日(M 题)」。
模式⑤ 期末冲刺包
触发:「期末冲刺包」「快考试了整理错题」「出重做卷」「出速查卡」。用户点名的交付物都给, 没点名的不主动塞——只要一样就只给一样。
交付物 A:错题重做卷
- 取该课程 wrong_bank 全部条目(可按章节/topic 过滤)。
- 同 topic 合并:保留最新题干,累计错误次数和历史错因清单。
- 结构照
references/sprint-card.md的重做卷模板:头部统计 → 按考点分组 → 题目+作答留白 → 文末统一解析(答案要点|历史答案|历次错因|一句教训)。 - 生成后主动提议:「做完发我批改——这是你最后的失分点清单。」
交付物 B:期末速查卡
一到两页的 md,四个板块(模板见 references/sprint-card.md):
- 核心重点速览:从 knowledge_points(有就用,mastery 低的标⭐)或材料现场提炼。表格: 考点|公式/定义|一句话人话|易错警示。
- 易错点警示:error_type 分布统计 + 对应考场对策(如「你 40% 的错是粗心 → 留最后 10 分钟检查」)。
- 我的错题档案 Top10:按 leech_count 排序,每条:题目一句话|正确要点|教训一句。
- 考前检查清单:考前一天做什么、开考前十分钟扫哪几个公式。
数据不足时:这门课从没学过(连 state 都没有)→ 问用户要材料,从材料现场提炼重点和通用易错点, 个人档案板块留空并注明原因,别编造「你的错题」。
异常与兜底(失败模式编码)
| 触发条件 | 一线修复 | 仍失败兜底 |
|---|---|---|
| 提取脚本跑不出内容 / 输出过短 | 问用户要可读版本或换文件 | 仍拿不到 → 按用户口头章节名联网搜大纲出题,标注来源 |
| 交卷图片看不清 | 逐题问确认,不许猜 | 用户也说不清 → 该题暂不判,标记待补 |
| 状态文件损坏 / JSON 解析失败 | 备份 .bak 后重建,从现有 question_banks 恢复 |
恢复不了 → 告知用户,重新登记已出卷子 |
| 复习/查到期没有结果 | 明确说"今天没有到期项" | 挑 leech 高危或最近错题出变式热身 |
| 材料撑不满题量 | 先保证每考点 1 题,其余给重点/易混考点 | 仍不足 → 收尾摘要里说明覆盖集中在哪里,不硬凑 |
| 用户没确认就催出卷 | 停下来重申「先确认范围+题量再出」 | 用户坚持 → 复述建议配比后出,标注"未按确认出卷" |
红线黑名单(不要做)
以下动作一律不做,命中即改:
- 绝不自己答自己判——出题后必须等用户作答
- 绝不跳过「先确认范围+题型×数量」直接出卷
- 绝不编造答案/考点/材料内容
- 绝不让 leech ≥3 的题原样重考(必须重写)
- 绝不在照片看不清时猜判——必须问
- 绝不把 state 文件整体覆盖——先读全文,只增改本技能字段
- 绝不给没有出处的材料编引用/链接
- 绝不一次问一长串错因(一次性收齐,别连环追问)
自检清单(每次会话结束前自查)
- 出的每道题都有唯一确定答案和明确考点?选择题选项等长、没泄露答案?
- 批改等用户作答了吗?没自己替答?
- 错题都入了 wrong_bank?error_type 和 next_review 都填了?
- 状态文件是先读全文→局部增改→整体写回?learning 的字段没动?
- leech ≥3 的题没有原样重考?
- 试卷/卡片都写在
<SKILL_DIR>/courses/<课程名>/下并登记进状态了? - 全程中文?一次交互收完所有错因,没连环追问?
参考
- 命题规范与试卷模板:
references/question-formats.md - 速查卡与重做卷模板:
references/sprint-card.md - 排期与错题机制设计继承自 cmchen-learning v5(错因六分类源自 human-skill-tree,leech 规则源自 Anki 卡片质量规范)