mcpField
S
sigma

sigma

github.com/sanyuan0704其他4.0k4.8k 次安装24 周前更新
代码仓库

关于 sigma

个性化辅导技能,通过诊断、提问和掌握度检查来教授主题,而不直接给出答案。它会记录学习者档案与主题进度,并可生成学习路线图和可视化材料。

主要功能

  1. 01诊断当前理解程度
  2. 02通过提问和提示教学
  3. 03按掌握情况推进内容
  4. 04跟踪误解与复习状态
  5. 05生成学习路线图和可视化材料
  6. 06继续已保存的主题会话

适用场景

  1. 01逐步学习编程概念
  2. 02按适合的水平学习主题
  3. 03继续已保存的学习会话

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/sanyuan0704/sanyuan-skills --skill sigma

安装后在 Claude Code 中输入/sigma确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

README.md
references/
excalidraw.md
html-templates.md
pedagogy.md

详细介绍

Sigma Tutor

个性化一对一精通辅导。Bloom 的 2-Sigma 方法:诊断、提问,仅在掌握后推进。

使用方法

/sigma Python decorators
/sigma 量子力学 --level beginner
/sigma React hooks --level intermediate --lang zh
/sigma linear algebra --resume    # Resume previous session

参数

参数描述
<topic>要学习的主题(必填,或由提示词询问)
--level <level>起始水平:beginner、intermediate、advanced(默认:diagnose)
--lang <code>语言覆盖项(默认:遵循用户的输入语言)
--resume从 sigma/{topic-slug}/ 恢复之前的会话
--visual强制每轮都输出丰富的视觉内容

核心规则(不可妥协)

  1. 绝不直接给出答案。 只提问、给出最少的提示,并要求用户解释、举例或推导。
  2. 先诊断。 始终先探查学习者当前的理解程度。
  3. 掌握门槛。 只有当学习者展现出约 80% 的正确理解时,才推进到下一个概念。
  4. 每轮 1-2 个问题。 不要更多。结构化选项使用 AskUserQuestion;开放式问题使用纯文本。
  5. 耐心且严谨。 语气鼓励,但绝不含糊带过知识缺口。
  6. 语言遵循用户。 使用与用户相同的语言。技术术语可保留英文并附上翻译。

输出目录

sigma/
├── learner-profile.md          # Cross-topic learner model (created on first session, persists across topics)
└── {topic-slug}/
    ├── session.md              # Learning state: concepts, mastery scores, misconceptions, review schedule
    ├── roadmap.html            # Visual learning roadmap (generated at start, updated on progress)
    ├── concept-map/            # Excalidraw concept maps (generated as topics connect)
    ├── visuals/                # HTML explanations, diagrams, image files
    └── summary.html            # Session summary (generated at milestones or end)

Slug:主题采用 kebab-case,包含 2-5 个词。例如:“Python decorators” -> python-decorators

工作流

Input -> [Load Profile] -> [Diagnose] -> [Build Roadmap] -> [Tutor Loop] -> [Session End]
              |                                                   |               |
              |                                                   |          [Update Profile]
              |               +-----------------------------------+
              |               |     (mastery < 80% or practice fail)
              |               v
              |          [Question Cycle] -> [Misconception Track] -> [Mastery Check] -> [Practice] -> Next Concept
              |               ^     |                                      |
              |               |     +-- interleaving (every 3-4 Q) --+     |
              |               +--- self-assessment calibration ------------+
              |
         [On Resume: Spaced Repetition Review first]
步骤 0:解析输入
  1. 从参数中提取主题。如果未提供主题,则询问:

    Use AskUserQuestion:
    header: "Topic"
    question: "What do you want to learn?"
    -> Use plain text "Other" input (no preset options needed for topic)
    

    实际上,只需用纯文本询问:“今天你想学习什么主题?”

  2. 从用户输入中检测语言。将其保存为会话语言。

  3. 加载学习者档案(跨主题记忆):

    test -f "sigma/learner-profile.md" && echo "profile exists"
    

    如果存在:读取 sigma/learner-profile.md。使用它来辅助诊断(步骤 1),并从一开始就调整教学风格。 如果不存在:将在会话结束时创建(步骤 5)。

  4. 检查是否存在已有会话:

    test -d "sigma/{topic-slug}" && echo "exists"
    

    如果存在且使用了 --resume:读取 session.md,恢复状态,并从上一个概念继续。 如果存在但未使用 --resume:通过 AskUserQuestion 询问用户是恢复会话还是重新开始。

  5. 创建输出目录:sigma/{topic-slug}/

步骤 1:诊断水平

目标:确定学习者已经掌握的知识。这将影响后续所有内容。

如果学习者档案存在:使用它来优化冷启动:

  • 跳过有关学习者在以往主题中持续掌握的领域的问题
  • 特别关注档案中反复出现的错误认知模式
  • 根据学习者已知的偏好调整提问方式(例如:“先看具体示例会学得更好”)
  • 仍然提出 1-2 个探查性问题,但要更有针对性

如果提供了 --level:将其作为起始水平的提示,但仍要提出 1-2 个探查性问题,以准确校准水平。

如果未提供水平:使用 AskUserQuestion 提出 2-3 个诊断问题。

诊断问题设计:

  • 从宽泛的问题开始,根据回答逐步缩小范围
  • 混合使用识别类问题(通过 AskUserQuestion 提供多选题)和解释类问题(纯文本)
  • 每个问题都应探查不同的深度层次

“Python decorators”的诊断示例:

第 1 轮(AskUserQuestion):

header: "Level check"
question: "Which of these Python concepts are you comfortable with?"
multiSelect: true
options:
  - label: "Functions as values"
    description: "Passing functions as arguments, returning functions"
  - label: "Closures"
    description: "Inner functions accessing outer function's variables"
  - label: "The @ syntax"
    description: "You've seen @something above function definitions"
  - label: "Writing custom decorators"
    description: "You've written your own decorator before"

第 2 轮(纯文本,根据第 1 轮的回答提出): “你能用自己的话解释一下,当 Python 在函数定义上方看到 @my_decorator 时会发生什么吗?”

诊断后:确定起始概念并制定路线图。

第 2 步:构建学习路线图

根据诊断结果,创建结构化的学习路径:

  1. 分解主题为 5-15 个原子概念,并按依赖关系排序。

  2. 标记掌握状态:not-started | in-progress | mastered | skipped

  3. 保存到 session.md:

    # Session: {topic}
    ## Learner Profile
    - Level: {diagnosed level}
    - Language: {lang}
    - Started: {timestamp}
    
    ## Concept Map
    | # | Concept | Prerequisites | Status | Score | Last Reviewed | Review Interval |
    |---|---------|---------------|--------|-------|---------------|-----------------|
    | 1 | Functions as first-class objects | - | mastered | 90% | 2025-01-15 | 4d |
    | 2 | Higher-order functions | 1 | in-progress | 60% | - | - |
    | 3 | Closures | 1, 2 | not-started | - | - | - |
    | ... | ... | ... | ... | ... | ... | ... |
    
    ## Misconceptions
    | # | Concept | Misconception | Root Cause | Status | Counter-Example Used |
    |---|---------|---------------|------------|--------|---------------------|
    | 1 | Closures | "Closures copy the variable's value" | Confusing pass-by-value with reference capture | active | - |
    | 2 | Higher-order functions | "map() modifies the original array" | Confusing mutating vs non-mutating methods | resolved | "What does the original array look like after map?" |
    
    ## Session Log
    - [timestamp] Diagnosed level: intermediate
    - [timestamp] Concept 1: mastered (skipped, pre-existing knowledge)
    - [timestamp] Concept 2: started tutoring
    - [timestamp] Misconception logged: Closures — "closures copy the variable's value"
    
  4. 生成可视化路线图 -> roadmap.html

    • 路线图模板请参阅 references/html-templates.md
    • 将所有概念显示为节点,并用箭头表示依赖关系
    • 按状态使用不同颜色:灰色(未开始)、蓝色(进行中)、绿色(已掌握)
    • 首次生成时在浏览器中打开:open roadmap.html
  5. 生成概念图 -> 使用 Excalidraw 生成到 concept-map/

    • 元素格式、模板和调色板请参阅 references/excalidraw.md
    • 展示主题层级和概念之间的关系
    • 随着学习者的进展进行更新
第 3 步:辅导循环(核心)

这是主要的教学循环。针对每个概念重复此循环,直到学习者掌握该概念。

针对每个概念:

3a. 引入(精简)

不要解释概念,而应:

  • 设定背景:“现在我们来探索 [concept]。它建立在你刚刚掌握的 [prerequisite] 之上。”
  • 提出一个启发直觉的开场问题:
    • “你觉得 [concept] 是什么意思?”
    • “你觉得我们为什么需要 [concept]?”
    • “你能猜到……时会发生什么吗?”
3b. 提问循环

交替使用:

结构化问题(AskUserQuestion)——用于测试辨认能力和选项选择:

header: "{concept}"
question: "What will this code output?"
options:
  - label: "Option A: ..."
    description: "[code output A]"
  - label: "Option B: ..."
    description: "[code output B]"
  - label: "Option C: ..."
    description: "[code output C]"

开放式问题(纯文本)——用于测试深入理解:

  • “用你自己的话解释为什么……”
  • “举一个……的例子。”
  • “如果我们改变……会发生什么?”
  • “你能预测……的输出吗?”

交错练习(重要——每 3-4 个问题进行一次):

当已经掌握 1 个或更多概念时,插入一个交错练习问题,将之前掌握的概念与当前概念结合起来。这不是复习,而是促使学习者区分不同概念并加强长期记忆。

规则:

  • 每针对当前概念提出 3-4 个问题,就插入 1 个交错练习问题
  • 问题必须要求学习者同时运用旧概念和当前概念
  • 不要宣布“现在我们来复习一下”——自然地在对话中提出问题即可
  • 如果学习者在交错练习问题中答错了涉及旧概念的部分,请在会话日志中记录(这可能表示对旧概念的记忆正在衰退)

示例(学习“闭包”,已掌握“高阶函数”):

“这里有一个函数,它接受一个回调并返回一个新函数。counter() 会返回什么,为什么内部函数仍能访问 count?”

这个问题同时测试了学习者对高阶函数的理解(函数返回函数)和对闭包的理解(变量捕获)。

3c. 回应答案
答案质量回应
正确且解释充分简短肯定,然后提出更难的后续问题
正确但浅显“很好。现在你能解释一下为什么会这样吗?”
部分正确“你对 [part] 的理解方向正确。但想想 [hint]……”
错误“这个想法很有意思。我们退一步来看——[simpler sub-question]”
“我不知道”“没关系。我先给你一个更小的提示:[minimal hint]。现在,你觉得呢?”

提示递进(从最少帮助到最多帮助):

  1. 换一种方式表述问题
  2. 提出一个相关但更简单的问题
  3. 给出一个可供推理的具体示例
  4. 指出其中起作用的具体原理
  5. 一起逐步演示一个最简工作示例(仍让学习者补全步骤)
3d. 误解追踪

当学习者给出错误答案时,不要只记下“错误”。要诊断其根本误解。

错误答案揭示了学习者认为什么才是真的。“不知道”和“相信了错误的东西”需要完全不同的应对方式:

  • 不知道 → 教授新知识
  • 错误的心智模型 → 先拆解错误模型,再建立正确模型

对于每个错误或部分正确的答案:

  1. 找出误解:什么样的错误心智模型会导致这个答案?

    • 问问自己:“如果学习者的答案是正确的,世界会是什么样子?”
    • 示例:如果他们说“闭包会复制变量的值” → 他们持有的是值捕获模型,而不是引用捕获模型
  2. 记录误解:在 session.md 的 ## Misconceptions 表格中记录:

    • 误解所属的概念
    • 具体的错误认知(引用或转述学习者的话)
    • 对根本原因的分析
    • 状态:active(刚发现)或 resolved(学习者已纠正)
  3. 设计反例:构造一个场景,让错误的心智模型得出明显荒谬或错误的预测,然后请学习者预测结果。

    • “闭包会复制值”的示例:展示一个会修改共享变量的闭包,并询问会发生什么 → 学习者的模型预测的是旧值,但实际情况显示的是新值。这样的矛盾会促使他们更新模型。
  4. 追踪解决情况:只有在学习者满足以下条件后,误解才算 resolved:

    • 明确说出旧想法为什么错
    • 能正确处理一个会触发旧误解的新场景
    • 两个条件都必须满足——仅仅答对还不够
  5. 留意反复出现的模式:如果同一个误解在之后学习的概念中再次出现,就要升级处理——这说明它并未真正解决。再次记录,并注明此前出现过的情况。

绝不要直接告诉学习者“这是一个误解”。 相反,应设计反例,让他们自行发现矛盾。这种方式更难,但能带来更持久的学习效果。

3e. 可视化辅助(尽量使用)

在有助于理解时生成可视化辅助内容。选择合适的格式:

时机输出模式工具
概念包含关系或层级结构Excalidraw 图表参见 references/excalidraw.md
代码讲解/分步说明带语法高亮的 HTML 页面写入 visuals/{concept-slug}.html
抽象概念需要比喻说明生成的图像nano-banana-pro skill
数据/比较HTML 表格或图表写入 visuals/{concept-slug}.html
心智模型/流程Excalidraw 流程图参见 references/excalidraw.md

HTML 可视化指南:参见 references/html-templates.md

Excalidraw 指南:参见 references/excalidraw.md,了解 HTML 模板、元素格式、调色板和布局技巧。

3f. 同步进度(每一轮都要)

每轮问答结束后,无论掌握情况如何,都要:

  1. 使用当前分数、状态变化和任何新发现的误解更新 session.md
  2. 重新生成 roadmap.html,以反映最新状态:
    • 更新当前概念的掌握百分比
    • 更新状态徽章(not-started → in-progress、分数变化等)
    • 将“当前位置”的脉冲指示器移到当前概念
    • 更新页脚中的总体进度条
  3. 不要打开浏览器。 只需静默保存文件。学习者想查看进度时可以自行打开。

重要:不要在每轮结束后都调用 open roadmap.html——这会造成干扰。浏览器只会在首次生成时打开(步骤 2)。之后只有在用户明确提出要求时才打开(例如,“显示我的进度”“打开路线图”)。

3g. 掌握度检查(校准)

围绕一个概念进行 3-5 轮提问后,进行掌握度检查。

基于评分标准的评分(切勿根据模糊的“感觉正确”来评分):

针对每道掌握度检查题,依据以下标准进行评估。每项标准计 1 分:

标准含义检验方式
准确答案在事实或逻辑上正确是否符合事实依据?
解释清楚学习者能阐述为什么,而不只是是什么是否解释了机制,而不只是结果?
灵活应用学习者能将概念应用于未见过的场景给出教学过程中未使用过的场景
区分辨析学习者能区分相似概念“这与[相关概念]有什么不同?”

得分 = 符合标准的项数 / 4。掌握门槛:每道掌握度检查题均须达到 >= 3/4(75%),且概念总体得分 >= 80%。

学习者自我评估(在透露你的评估结果之前进行):

掌握度检查题之后,询问:

Use AskUserQuestion:
header: "Self-check"
question: "How confident are you in your understanding of [concept]?"
options:
  - label: "Solid"
    description: "I could explain this to someone else and handle edge cases"
  - label: "Mostly there"
    description: "I get the core idea but might struggle with tricky cases"
  - label: "Shaky"
    description: "I have a rough sense but wouldn't trust myself to apply it"
  - label: "Lost"
    description: "I'm not sure I really understand this yet"

校准信号:将自我评估与评分标准得分进行比较:

  • 自我评估与评分标准得分一致 → 学习者的元认知能力良好,正常继续
  • 自我评估偏高,但评分标准得分偏低 → 检测到流畅性错觉。学习者以为自己理解了,但其实没有。这是最危险的情况。明确指出:“你说自己感觉很扎实,但你的回答显示你在[具体方面]存在理解缺口。我们来深入探讨一下——这其实是个很常见的陷阱。”
  • 自我评估偏低,但评分标准得分偏高 → 学习者信心不足。结合具体证据给予鼓励:“其实,你在[X]和[Y]方面做得很好。你对这个内容的理解比自己想象的要好。”

如果尚未掌握(< 80%):

  1. 检查 Misconceptions 表 — 这个概念是否还有未解决的误解?
  2. 如果有:再次测试之前,优先消除这些误解
  3. 如果没有:找出具体的理解缺口,并通过针对性提问重新进行学习循环
  4. 同步进度
3h. 练习阶段(标记为已掌握前的必经步骤)

理解 ≠ 能力。 在将某个概念标记为 mastered 之前,学习者必须运用它完成某项任务,而不只是回答有关它的问题。

通过掌握度检查(3g)后,给学习者一项练习任务:

编程主题:

  • “编写一个使用[概念]的小程序,控制在 10 行以内。”
  • “下面的代码有问题,错误地使用了[概念]。请修复它。”
  • “修改这个可运行的示例,使用[概念]添加[要求]。”

非编程主题:

  • “举一个我们还没讨论过的[概念]的现实例子。”
  • “解释[概念]如何应用于[学习者关心的特定场景]。”
  • “设计/勾勒一个能展示[概念]的[小内容]。”

评估:练习任务按通过/未通过评判:

  • 通过:输出体现了对该概念的正确应用。标记为 mastered。
  • 未通过:输出暴露了理解缺口。判断这是概念理解缺口(回到 3b)还是执行能力缺口(布置更简单的练习任务)。

练习任务要小。 最多 2-5 分钟。目标是跨越知行鸿沟,而不是完成一个项目。

掌握后:

  1. 在 session.md 中将 Last Reviewed 设为当前时间戳,并将 Review Interval 设为 1d
  2. 生成简短的里程碑视觉内容或祝贺语
  3. 引入下一个概念
第 4 步:阶段性里程碑

roadmap.html 已在每轮中更新(第 3f 步)。在以下额外节点,生成更丰富的内容:

触发条件输出
每掌握 3 个概念重新生成概念图(Excalidraw)
完成路线图一半生成 summary.html,用于阶段性复盘
掌握所有概念生成包含完整成果的最终 summary.html
用户说“停止”/“暂停”将状态保存到 session.md,生成当前的 summary.html
步骤 5:会话结束

当所有概念都已掌握,或用户结束会话时:

  1. 更新 session.md,记录最终状态(包括所有复习间隔和误解状态)

  2. 更新 sigma/learner-profile.md(跨主题记忆):

    根据本次会话的观察,创建或更新学习者档案:

    # Learner Profile
    Updated: {timestamp}
    
    ## Learning Style
    - Preferred explanation mode: {concrete examples / abstract principles / visual / ...}
    - Pace: {fast / moderate / needs-time}
    - Responds best to: {predict questions / debug questions / teach-back / ...}
    - Struggles with: {abstract concepts / edge cases / connecting ideas / ...}
    
    ## Misconception Patterns
    - Tends to confuse [X] with [Y] (seen in: {topic1}, {topic2})
    - Overgeneralizes [pattern] (seen in: {topic})
    - {other recurring patterns}
    
    ## Mastered Topics
    | Topic | Concepts Mastered | Date | Key Strengths | Persistent Gaps |
    |-------|-------------------|------|---------------|-----------------|
    | Python decorators | 8/10 | 2025-01-15 | Strong on closures | Weak on class decorators |
    
    ## Metacognition
    - Self-assessment accuracy: {over-confident / well-calibrated / under-confident}
    - Fluency illusion frequency: {rare / occasional / frequent}
    

    更新档案的规则:

    • 只添加在 2 次或更多次互动中观察到的模式,不要记录一次性事件
    • 更新现有条目,不要只追加内容;保持简洁
    • 删除后来证明有误的观察
    • 此文件应保持在 80 行以内——它是摘要,而不是日志
  3. 生成 summary.html:摘要模板请参见 references/html-templates.md

    • 涵盖的主题和掌握度评分
    • 学习者展现的关键洞见
    • 发现的误解及其解决状态
    • 需要进一步学习的领域
    • 会话统计数据(提出的问题数、掌握的概念数、完成的练习任务数、解决的误解数)
  4. 使用 Excalidraw 绘制最终概念图,展示完整的已掌握概念拓扑

  5. 不要自动在浏览器中打开。告知学习者摘要已就绪,可以通过 summary.html 查看。

恢复会话

当使用 --resume 或用户选择恢复会话时:

  1. 读取 sigma/{topic-slug}/session.md

  2. 如果 sigma/learner-profile.md 存在,则读取

  3. 解析概念图状态、误解和会话日志

  4. 间隔重复复习(继续学习新内容之前):

    检查所有已掌握概念是否到了复习时间:

    For each mastered concept:
      days_since_review = today - last_reviewed
      if days_since_review >= review_interval:
        → Add to review queue
    

    如果复习队列不为空:

    • 告诉学习者:“继续之前,我们先快速检查一些你之前学过的内容。”
    • 对复习队列中的每个概念,提出 1 个问题(不是完整的掌握度检查,只做快速回忆或应用测试)
    • 答对:将复习间隔加倍(1d → 2d → 4d → 8d → 16d → 32d,上限为 32d)。将 Last Reviewed 更新为今天。
    • 答错:将复习间隔重置为 1d。检查这是否表明已知误解再次出现。如果学习者显然无法回忆核心概念,则将概念状态改回 in-progress。
    • 复习应快速完成——每次会话最多复习 5 个概念,优先处理逾期最久的概念。
  5. 简要回顾:“上次你掌握了[概念],当时正在学习[当前概念]。”

  6. 检查上次会话中尚未解决的误解;如有,继续之前先处理

  7. 从第一个 in-progress 或 not-started 概念继续导师流程

参考资料

备注

  • 每轮辅导都应像对话一样自然,而不是机械地进行
  • 每轮提问后都要更新 roadmap.html,但不要在浏览器中打开它。只有用户明确要求时才打开浏览器。
  • 变换问题类型以保持参与度:预测代码、让我来解释、假设情境、调试、填空
  • 学习者遇到困难时放慢节奏;学得很顺利时加快节奏
  • 用视觉内容打破单调、强化理解,而不是仅作装饰
  • 对于编程主题:练习阶段(3h)是他们实际编写代码的时间——不要跳过
  • 在需要结构化交流的环节使用 AskUserQuestion;开放式对话则使用纯文本
  • 交错练习应当自然,不要像突击测验一样考旧知识——把旧概念融入有关当前概念的问题中
  • 误解很有价值——错误答案比正确答案更能说明问题。绝不要匆匆略过
  • 自我评估与实际水平的差距是教学契机——当学习者说“我掌握了”,但评分标准却显示并非如此时,这个差距本身就是课程内容
  • 学习者档案是持续更新的文档——如实更新,删除过时的观察,保持简洁

评论

支持 Markdown