作者基于 Claude Code 构建 skill,将「解释概念」改造为结构化学习流程(含先修判断、节奏控制、实例推导、即时测验),解决 AI 单次回复学习效果差的问题。
我每天都在用 Claude Code。它帮我写测试、改重构、解释那些我懒得去看的东西。但当我真的想学点新东西时——async/await 的机制、flexbox 到底怎么工作、正态分布背后的数学——我总是离开 agent,去看 YouTube、博客文章,或者看到第四页就放弃的教科书。
明明 agent 就在手边。它能搜索网页、能给我解释。为什么我还要去别的地方学习?
说实话,"给我讲讲 X"是个很差的 prompt。它只给你一团文字。你读完了,觉得懂了,一周后就忘得精光。这不是模型的问题,是结构的问题。学习需要前置知识、节奏控制、完整例题,还需要一种方式验证知识是否真的进去了。单纯一个对话回复,这些一样都给不了。
所以我做了一个能提供这些的 skill。这篇文章讲的是我做了什么、skill 格式相比 Web 应用有什么优势,以及我踩过哪些坑。
你告诉 agent "我想学 X"。Skill 接管一切。它用 agent 自己的搜索工具研究资料——真实搜索,不是编造的——然后切分出大纲,用有向图标注前置知识,每节课程控制在七个新概念以内,课程内容沿用 Gagné 的九步教学法(引入、讲解、完整示例、渐进练习、独立练习、回顾)。输出的成果是你磁盘上一整个 Markdown 文件夹。
Skill 的入口是 SKILL.md,它把意图路由到五个子 skill:
agent-mentor/
├── SKILL.md # 意图路由器
└── skills/
├── generate-course-from-topic/ # "我想学 X"
├── review-course/ # "考考我"
├── maintain-course/ # "更新我的课程"
├── export-course/ # "导出 PDF / Anki"
└── publish-course/ # "发布到网上"
frontmatter 是 agent 首先读取的部分:
name: agent-mentor-skill
description: "Use for EVERY learning request, even unnamed — "I want to learn X", "teach me X", learn X. Never answer inline; build a structured self-paced course.
Also: review/quiz, maintain, export, publish online."
这个 description 就是路由的钥匙。当用户说"我想学正则",agent 会用 description 做模式匹配,加载对应子 skill 的完整工作流。其他的 skill 不会加载。这就是渐进式披露:100 个 token 做决策,只有相关时才加载完整指令。
写一门课程是一次性的努力。确保别人真的学会了,才是更难的问题,也是工程量最大的地方。
大多数复习工具会把同一张卡片反复给你,直到你背下来。这测的是记忆,不是理解。复习 skill 每次会话都从课程材料生成新题目,本地评分,根据表现重新安排复习时间。题目生成走的是托管模型,但评分逻辑是公开可审计的,模型只看得见题目,看不见你的整门课程。
复习队列是一个存在磁盘上的 JSON 文件,不是数据库。运行 npm run review:queue 得到当天的批次:
{
"items": [
{ "course": "css-flexbox-zh", "kind": "term", "id": "display: flex" },
{ "course": "css-flexbox-zh", "kind": "term", "id": "justify-content" },
{ "course": "css-flexbox-zh", "kind": "term", "id": "align-items" },
{ "course": "css-flexbox-zh", "kind": "term", "id": "flex item" }
]
}
这就是复习 skill 读取的内容。没有服务器,没有账号。你的学习状态可以跟代码一起做版本控制。
调度算法用的是 FSRS(就是 srs-benchmark 项目背后的算法)。每个条目都有一个稳定度分数,正确复习会让它增长。答错会降低稳定度,让题目更早出现。
课程内置交互块,在阅读站点里可以直接渲染。以下是 git 基础课程里的真实示例:
{
"id": "learn-git-basics-02-staging-check",
"label": "认出暂存区的职责",
"prompt": "哪条命令把文件从工作目录移进暂存区,让它可以被提交?",
"answer": "git add",
"accept": ["git add .", "git add --all", "git add -A"]
}
那个块在阅读站点里渲染成一个真实的输入框。你输入答案,本地判定,结果会反馈到复习队列里。一共有五种块类型:agentmentor-check(自由文本判定)、agentmentor-order(排序步骤)、agentmentor-predict(预测输出)、agentmentor-trace(追踪变量状态)、agentmentor-code(伪 IDE 练习)。它们都是 Markdown,所以版本控制友好、可以离线使用。
我反复权衡过。Web 应用更容易分发。大家不用装任何东西就能试用。SEO 可用。也可以放一个免费试用在前面。
但 Web 应用意味着你的课程存在别人的服务器上。学习发生在一个跟其他四十个标签页竞争注意力的浏览器标签里。而且 agent——你用来写代码的那个工具——并不是在做教学这件事。
Skill 运行在你已有的 agent 内部。你的 Claude Code、Codex 或 opencode 读取 SKILL.md,按工作流执行,在你当前所在的地方产出课程文件。当你学完一节想练习,你留在同一个 agent 里。当你想发布一门课程让其他人不用安装任何东西就能阅读,那是一条单独的发布命令,推送到一个托管 URL。本地学习和公开分享是两件不同的事,有意为之。
整套东西都在你自己的磁盘上。无需账号、无云、无人在读你的学习记录。如果你自己带 API key 来用托管功能(原地作答、课程期间的网页研究、课程播客),这些调用直连你的供应商。你直接向他们付费。
我花了太多时间试图让课程生成在所有 agent 上同时工作。Skill 格式现在是一个开放标准(Claude Code、Codex、Gemini CLI、Cursor 等都读同样的 SKILL.md 结构),但宿主 agent 的搜索和浏览能力差异很大。Codex 有扎实的内置网页检索。Claude Code 配合搜索 skill 也挺好用。有些 setup 需要你手动粘贴来源链接。我应该先选一个 agent,在上面做到完美,再去扩展。
我还低估了复习循环的工作量,远超课程生成。课程生成是用户第一眼看到的东西,所以我早期大部分时间都花在那上面。但你读一遍就忘的课程不叫课程。复习循环、题目生成、调度、本地评分——那才是真正产生记忆留存的地方,而且花费的时间大概是生成管道的三倍。
最后一个错误是定价沟通。我定价 29.90 美元一次付费,因为对于一个跑在你自己机器上的东西,我不想收订阅费。但我花了好几周跟人解释"一次付费"就是一次,不是"一次加积分"。托管服务(云端发布、AI 功能如果你不自带 key)走积分制,积分永不过期。这个区别花了我比开发本身更长的时间才解释清楚。
九门示例课程现在可以在 agentmentor.dev 无需购买直接阅读:git 基础、CSS flexbox、HTTP 基础、JavaScript async/await、正则、音乐理论、个人理财、终端基础,还有一门关于让 agent 替你干活的方法论课。英文版和中文版是同一门课程的镜像,不是两门独立的课程。
如果你想在安装之前看看生成出来的课程长什么样,可以看 flexbox 这门:agentmentor.dev/css-flexbox。如果你决定要剩下的部分,安装大约需要两分钟。