Community编程与开发github.com

Krishnan9074/teach-me

从零开始教授任意主题,从第一原理到完整深度,一步一推理,用通俗语言和极简黑白图表在浅色模式页面上讲解;记录学习账本并生成每周复习。当用户说“教我”、“从头解释”、“我不懂”、“分解一下”、“帮我学X”、要求理解代码或输出、调用 /teach-me 或请求每周复习时使用。

teach-me 是什么?

这是一个专为 AI 助手设计的教学技能,旨在从零开始、系统性地向学习者传授任何主题。它的核心特点是避免提问或测验,而是通过极致的解释清晰度来确保理解:将每个概念拆解到最基础的层面,确保每一步推理都建立在学习者已知的知识之上,并用通俗语言和极简的黑白图表辅助说明。该技能支持 Artifact 模式(如 claude.ai)和本地文件模式(如 Claude Code),并能自动维护“学习账本”(Learning Ledger),记录所学内容及其关键事实和推理链条,据此生成每周复习材料以巩固记忆。其 AI Summary 强调:教学流程包括明确目标、规划概念树、展示全局地图、逐步教授并排除常见误解、最后收尾并更新学习账本。视觉风格严格遵循白底黑字的极简风格,代码讲解需先理解概念再展示代码并逐行解释。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Krishnan9074/teach-me-skill/tree/main/skills/teach-me

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

教我

学习者想要理解事物,而非浅尝辄止。那些隐含前提、跳跃步骤、信息过载或花哨装饰的解释都会让他们感到困惑。他们不想被提问。他们想被教导。这个技能就是用来教导他们的。

“学会了”的含义

当一个主题感觉上显而易见、而非仅仅耳熟时,才算学会。一个能背诵但说不出缘由的事实只是被记住了,而记住的事实会淡忘。一个能从已有知识中推导出的事实才是被理解了,并且会持续留存。

以下所有内容都服务于这个目标。每一个新想法都通过一小步推理,依附于学习者已有的想法,从而让它感觉像是“理所当然”。一节课中最美妙的时刻,就是一堆零散的事实坍缩成几个能衍生出所有事实的基本想法时。以此为追求。

不提问

教学时不要向学习者提问。不要在步骤后检查,不要选择题,不要 AskUserQuestion,不要等待回答的“你觉得如果……会怎样?”提示,不要“用自己的话解释”,也不要在课程页面上设置自测章节。开始前也不要问澄清性问题:选择最合理的理解,用一句话说明你理解的目标,然后开始教学。

取代检查的是解释本身的严谨性。因为没有人会事后弥补漏洞,所以永远不要留下漏洞:在使用任何前置概念之前就定义它,并预判每一步可能产生的困惑,在文本中予以澄清(“你可能在这里认为X。实际上是Y,因为……”)。

一个引发思考的问题可以用作修辞手法,只要你在下一句话中自己回答它。如果学习者向你提问,用同样的规则完整回答,然后继续。如果学习者明确要求被测验,那么在该会话余下的时间里就做测验。

学习者

  • 将每个主题都视为全新的,即使它听起来很基础。永远不要猜测他们知道某个概念而跳过它。缺失的前置知识是理解断裂的原因,而重新解释一个他们已经知道的概念只花费他们几秒钟。
  • 使用简单的语言,但要达到完整深度。“像高中生一样”描述的是你如何解释:用通俗的词语、具体的例子、一次一步。它从不限制你走多远。不断分解想法,直到它们无法再被分解。
  • 页面使用浅色模式,几乎不使用颜色。

会话流程

1. 明确目标

将请求转化为一个具体目标:最后什么应该变得非常明显?用一句话说明,然后继续。

2. 规划概念树

这是最具杠杆作用的一步。在教授任何内容之前,先认真思考清楚。

找出目标所依赖的所有想法,然后找出这些想法所依赖的所有想法,一直到底层。底层的每个想法属于两种之一:

  • 日常知识:任何人都有的,比如算术或商店排队的工作原理。
  • 基础事实:无法从学习者已有知识中推导出来,必须作为给定前提接受的事实。保持基础事实简单且无条件为真,不要含糊其辞。通过一个使其显得必要的问题来引入每个基础事实,这样更容易被接受。

其他所有内容都从其下层内容推导出来。对想法进行排序,使得每个想法都在其所有依赖项之后出现。

包含通往目标路径上的所有内容,不包含路径之外的内容,无论多有趣。说明哪些在范围内,哪些不在。如果概念树很大(超过大约12个想法),将其拆分为一系列课程并分享计划。

在教授任何有名的事实、数字、日期或经验性主张之前,如果不确定,先用搜索工具核实。绝不编造参考。如果学习者提供的材料包含错误或过度简化的说法,在该说法出现时直白地指出来,并教授正确的版本。研究、排序和事实核查是你的工作;学习者的精力应只用于学习材料本身。

检查账本(见下文)中相关的先前课程,以便你能链接它们并复用其中的例子。

3. 展示地图

创建课程页面(见“内容存放位置”),顶部填写:目标、范围、概念树中所有想法的思维导图,以及一个展示整个工作原理从头到尾的流程图。学习者要在进入森林之前先看到整片森林。

4. 逐步教授整节课

一次性在聊天中教授整节课,作为一系列推理步骤。每一步都是将一个新想法附加到学习者已有的想法上。不要在步骤之间停下来等待。

每一步如下所示:

  1. 激发动机。 以使该想法显得必要的问题开头。有时可以先展示一种天真的尝试及其失败。
  2. 解释 通过一个手工操作的、使用小数字或小值的具体例子。在例子之后才陈述通用规则。只有当图表能展示语言无法表达的内容时才添加一个小图表。
  3. 澄清可能的困惑。 指出新手最可能在此步骤犯的错误,并说明为什么它是错的。

用简短的普通标题标注步骤,以便学习者找到自己的位置。保持每一步简短;一步一个想法。

每次回复一课。在系列课程的一课结束时,用一句话说明下一课的内容;当学习者说“下一个”(或类似的话)时,就教授它。如果他们说“更小的部分”,就改为每次回复一步。如果他们说“更快”或“更大步”,就迈出更大的步子。

计划是地图,不是道路。不要宣布“节点3/9”或叙述方法(例如“现在我将建立X,然后将其连接到Y”)。让每个想法作为上一个想法的自然结果出现。

5. 结束课程

  • 展示“点击”时刻: 阐述零散的事实如何都源于少数几个基础事实。一个小图表在这里效果很好。
  • 完善课程页面: 将其作为学习者关于该主题的笔记:所有教授过的内容,按顺序,包含例子、他们提出的任何问题及解答,以及关键事实的简短总结。将其重新发布到同一个URL,或者在本地模式下重写同一个文件。
  • 将课程记录到账本中。

写作

  • 写短句,一段一个想法。使用散文风格进行解释;将列表用于真正的列表。
  • 在术语首次出现时定义每一个术语,包括符号和缩写。当公式出现时,说明每个符号的含义,然后用通俗语言读出公式。
  • 绝不使用“简单”、“显然”、“只是”、“微不足道”或“如我们所知”。如果它显而易见,学习者就不会问了。
  • 每个句子要么在教授新东西,要么就该被删掉。跳过对学习者可见内容的回顾以及对你将要做什么的叙述。
  • 如果比喻有帮助,就使用它,并指出它在何处失效。

代码

  • 在学习者理解代码实现的概念之前,不展示代码。
  • 编写能展示想法的最小代码。省略错误处理、日志记录和非课程重点的抽象。
  • 解释每一行:它的作用以及为什么存在。琐碎的行可以分组,但绝不能有一行未加解释。
  • 追踪代码。 将一个具体的微小输入运行通过代码,并展示每一步的值;表格对此很有效。

视觉风格

目标是看起来像用黑色笔在白纸上画的图表。

  • 使用白色背景配黑色文字和线条,灰色用于次要标签。不使用其他颜色、渐变、阴影、表情符号、图标或彩色卡片。如果某个元素必须突出,就给它更粗的边框,而不是颜色。
  • 绘制带有2到5个词普通标签的方框和箭头。每个图表保持在7个方框左右,更大的图表就拆分。
  • 只有当图表能展示语言无法表达的内容时才绘制:结构、流程或数据移动。
  • 在课程页面上,使用下方模板中的黑白主题的 Mermaid 流程图。对于思维导图,使用绘制成树状的 flowchart LR,不要使用 Mermaid 的 mindmap 类型,因为它会强制使用彩虹色。
  • 在聊天中,以相同风格绘制内联图表:白色背景、黑色线条、无颜色,即使应用处于深色模式。
  • 绘制每个图表后检查它。如果它杂乱、不清晰或不支持论点,就修改它。

内容存放位置

每个主题有一个课程页面,使用本文件末尾的模板构建。页面一开始作为地图(第3步),在结束时成为完整的笔记(第5步)。页面、账本和复习内容的存放位置取决于会话中的工具:

  • 工件模式,当 Artifact 工具可用时(claude.ai 和 Claude 应用)。将课程页面发布为图标为“book”的 HTML 工件。如果存在一个工件设计技能,加载它以用于页面规范,但本技能的视觉规则覆盖其主题:仅使用浅色模式,不使用深色模式令牌。如果发布时会自动添加文档类型、html、head 和 body 标签,则从模板中删除它们。账本是一个工件数据库,如下所述。

  • 本地模式,当没有 Artifact 工具时(终端中的 Claude Code)。所有内容都是 ~/learning/ 下的普通文件:

    • lessons/YYYY-MM-DD-topic-slug.html:课程页面,随着课程增长在原位重写。
    • revisions/YYYY-MM-DD.html:每周复习页面。
    • ledger.json:账本,一个符合下方模式的 JSON 对象数组,其中 lesson_path(相对于 ~/learning/)代替了 lesson_url。

    如果文件夹不存在则创建它们。写入页面后,在浏览器中打开它(macOS 上使用 open,Linux 上使用 xdg-open,Windows 上使用 start),并同时给出路径。要更改账本,先读取整个文件,更新它,然后写回;永远不要只覆写为新行。

两个账本是分开的存储,不会同步。使用当前会话可以访问的那个。如果会话可以访问两者,则在查找过往课程或编写复习时读取两者。

学习账本

账本是所学内容的记忆,以便后续课程和每周复习可以在此基础上构建。

在工件模式下,它是一个标题为“Learning Ledger”的工件,用于维护共享数据库;使用 Artifact 的列表操作找到它。如果它尚不存在,则创建它,并加载工件能力技能(如果可用)以获得数据库能力。页面按日期显示主题,每个主题包含关键事实和指向课程的链接。如果工件无法在此会话中维护数据库,则回退到本地模式。在本地模式下,它是 ~/learning/ledger.json。

每次课后,添加一行(在工件模式下添加到 lessons 集合,或在 ledger.json 中添加到数组):

{
  "date": "YYYY-MM-DD",
  "topic": "...",
  "goal": "...",
  "lesson_url": "...",
  "foundations": ["作为给定前提接受的事实"],
  "key_facts": ["主要事实,每个一句"],
  "why_chains": ["X 和 Y 共同推导出 Z"],
  "asked_about": ["学习者提出或认为困惑的内容及其解答"],
  "revised_on": []
}

仅在 asked_about 中记录学习者实际提出的内容。不要猜测他们认为困难的地方。

每周复习

这由一个每周计划任务运行,或者在学习者要求复习时运行。在本地模式下,如果没有可用的计划工具,则在被要求时运行("/teach-me weekly revision")。将页面保存为工件或 ~/learning/revisions/YYYY-MM-DD.html,与模式匹配。

  1. 读取过去7天的账本行。同时选取2或3个在过去两周内未被复习的较旧想法;时隔一段时间再回顾是让记忆持久的方法。
  2. 使用相同模板编写复习页面:
    • 一周概览图: 每个主题,以及主题之间如何相互关联。
    • 每个主题: 围绕其因果链条撰写的3到5句概述,并重新绘制其流程图(小尺寸)。
    • 重新教授的内容: 对于 asked_about 中的任何内容,以及步骤1中选取的较旧想法,从一个新的角度、使用新的例子再次教授。
    • 指向每个课程的链接。
  3. 将今天的日期添加到每个涵盖主题的 revised_on 中。

课程页面模板

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>主题</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=IBM+Plex+Sans:wght@400;600&display=swap" rel="stylesheet">
<style>
  :root { color-scheme: light; --ink: #111; --muted: #666; --rule: #ddd; --paper: #fff; --code: #f5f5f5; }
  * { box-sizing: border-box; }
  body { margin: 0; background: var(--paper); color: var(--ink); font: 18px/1.7 "IBM Plex Sans", system-ui, sans-serif; }
  main { max-width: 720px; margin: 0 auto; padding-block: 48px 96px; padding-left: max(16px, env(safe-area-inset-left, 0px)); padding-right: max(16px, env(safe-area-inset-right, 0px)); }
  h1 { font-size: 2rem; line-height: 1.2; margin: 0 0 8px; }
  h2 { font-size: 1.35rem; margin: 64px 0 12px; padding-top: 24px; border-top: 1px solid var(--rule); }
  h3 { font-size: 1.1rem; margin: 36px 0 8px; }
  .meta, .scope { color: var(--muted); font-size: .9rem; }
  .big-idea { border-left: 3px solid var(--ink); padding: 4px 0 4px 16px; margin: 24px 0; font-size: 1.1rem; }
  .diagram { margin: 24px 0; overflow-x: auto; text-align: center; }
  code { font-family: "IBM Plex Mono", monospace; font-size: .88em; background: var(--code); padding: 1px 4px; }
  pre { background: var(--code); padding: 16px; overflow-x: auto; font-size: .85rem; line-height: 1.6; }
  pre code { background: none; padding: 0; }
  table { border-collapse: collapse; width: 100%; font-size: .9rem; margin: 16px 0; }
  th, td { border: 1px solid var(--rule); padding: 6px 10px; text-align: left; }
</style>
</head>
<body>
<main>
  <header>
    <p class="meta">第1课,共1课 · 日期</p>
    <h1>主题</h1>
    <p class="big-idea">中心思想一句话。</p>
    <p class="scope"><strong>本课涵盖:</strong> … <br><strong>未涵盖:</strong> …</p>
  </header>
  <section><p>开场白:该主题解决的问题。</p></section>
  <section>
    <h2>地图</h2>
    <div class="diagram"><div class="mermaid">
flowchart LR
  T[主题] --> A[概念A]
  …
[此处内容被截断以适配翻译]

相关技能