
我把一本三百多页的书从头翻到尾划线划得密密麻麻合上书却连核心论点都复述不全。这个“读完就忘”的问题我断断续续折腾了好几年试过思维导图、笔记软件、卡片法最后真正让我停下脚步的是最近在 AI 工作流里逐渐流行起来的开源 skill 机制。所谓 skill并不只是普通意义上的提示词模板它是一套可以放进目录、能被 AI 根据场景自动调用的标准化技能包一个 SKILL.md 说明文件配合若干脚本和模板把“如何处理一类任务”完整固化下来。我基于开源社区的做法给自己手写了一套学习专用的 skill用来对抗遗忘这套方法到现在已经稳定跑了一个多月这篇文章就把完整思路和踩坑过程都写出来。如果你是学生、程序员或者日常工作需要大量阅读输入的知识型工作者下面这些内容应该能直接抄作业。我会讲清楚 skill 为什么能解决读书记不住的问题也会给出能在 Claude Code、Codex、OpenCode 这类工具里直接运行的最小实现你不需要先成为 AI 专家只要会写 Markdown就能在半小时内搭出自己的学习流程。1. 读完就忘的根源流畅性错觉与失效的提取路径1.1 记忆科学里三个反直觉的结论先说一个最扎心的结论划线、抄笔记、反复重读这些我们最习惯的学习动作记忆效率其实非常低。认知科学里面有个术语叫“流畅性错觉”指的是当我们阅读时文字信息顺着上下文自然流过来大脑会产生一种“我懂了、我记住了”的顺畅感但这种顺畅感恰恰会骗过自己。顺畅感来自“识别”而考试、写作、讨论时需要的却是“回忆”。识别和回忆是两套完全不同的提取路径识别时可以依赖外部线索回忆时大脑得自己搭建线索难度高了一个量级。第二个结论是遗忘这件事并不是平均发生的。德国心理学家艾宾浩斯那条遗忘曲线告诉我们刚学完一个小时后记忆保留率就能跌到一半以下一天之后能留下来的往往只有三成左右。但这里有个隐藏机会每一次在即将遗忘的边缘成功回忆一次后续遗忘速度就会明显变慢。换句话说遗忘不是敌人它本身是记忆形成的信号灯问题在于我们从来不主动去触发那个“回忆”动作。第三个结论来自所谓的“检索练习”。大量实证研究表明同样是花十分钟学习把十分钟全部用来反复阅读的效果远不如先读四分钟然后把剩下六分钟用来“合上书回想刚才讲了什么、尝试回答几个问题”的效果。回忆得越吃力记忆留存越好。这听上去很反直觉因为主动回忆时人会非常不舒服大脑会本能地想回去翻书。但正是这个不舒服的动作在真实地加固神经通路。1.2 为什么学习流程里缺一个“自动出题员”把我前面说的三个结论翻译成实际动作就是不要追求读得顺要追求回想得起来不要在读完一遍后立刻觉得自己会了要在一天、一周、一个月后反复把自己按回去回忆不要只顾着输入要强迫自己输出。但这三个动作执行起来太难了。难在哪儿第一我们不知道出什么题自己给自己出题很容易出成“这个定义是啥”的浅层题刷起来没意思第二我们不知道什么时候该复习今天读的内容究竟该明天复习还是下周复习人工算间隔很麻烦第三阻力太大每天打开笔记软件面对一堆摘录根本不知道该从哪一句开始回忆。开源 skill 补上的正是这个缺环。它可以把“从阅读材料里生成测验题”变成一次稳定调用的标准动作把“到期提醒、抽取卡片、记录反馈”变成一套由脚本驱动的自动化流程。你不需要在每次学习时重复输入长指令AI 通过读取 SKILL.md 就能自动执行整套流程你只负责做出题、回答问题、给反馈这三个真正对记忆有效的人工动作。2. 开源学习类 Skill 现状可直接抄作业的三个方向2.1 三类最实用的学习技能长什么样在 GitHub 上翻了一圈之后我发现学习场景里真正成熟的开源 skill 基本可以分成三类。你要是想从现成项目起步优先找这三种别一上来就想搞个大而全的“学习助手”。第一类是“知识提炼型”。这类 skill 的典型用法是你把一本书的目录、章节摘要或者你划线的片段丢给它它按照固定结构输出核心概念、关键论据、反常识结论、可执行的行动项。它跟普通对话最大的区别是输出格式极度稳定每次都会生成一份同样结构的 Markdown 文档方便你直接存档或者导入笔记软件。很多知识管理类的开源项目里都能翻到类似的技能定义。第二类是“主动回忆出题型”。输入一段材料它输出一组问题通常还会区分记忆层次。比较好的实现会按照布鲁姆分类法把题目分成“回忆事实”“解释概念”“应用场景”“对比辨析”几个层级而不是全部堆一水的填空题。这类 skill 我目前看到的质量参差不齐因为出题质量很依赖底下的模型能力但 skill 本身可以把提问框架固定下来降低模型“自由发挥”带来的随机性。第三类是“间隔复习调度型”。它会维护一张复习计划表记录每张卡片的学习日期、到期日期和上次回答正确与否然后根据简单间隔算法算下一次复习时间。这类技能经常跟 Anki 配合也有些独立实现直接输出一个 Markdown 文件作为复习清单。2.2 去哪里检索搜索词与仓库筛选标准找学习类 skill 的渠道主要有三个。一个是 GitHub 上直接搜awesome-claude-skills这个仓库里面有大量社区收集的技能清单另一个是搜active recall skill、flashcards skill、spaced repetition skill这类关键词还有一个方式是在 OpenCode、Codex 的官方文档或示例仓库里翻它们的 skills 目录本身就带了不少范例。选型时我建议按下面这套标准筛可以省掉很多后面调试的时间筛选维度关注点我个人的经验依赖模型写的是 Claude 专用还是兼容多个模型优先选纯提示词定义、不绑死厂商能力的外部依赖是否依赖云端 API、数据库、特定浏览器纯本地能跑的维护成本最低输出格式是否输出结构化 Markdown / JSON / CSV能为后续导入 Obsidian、Anki 留好接口脚本复杂度是纯提示词还是有 Python / Shell 脚本有脚本的动力更足但要有能力调试许可证MIT / Apache / CC 等商用前务必看一眼实测下来我发现一个规律越是想做成“全能学习助手”的 skill越难直接落地反而是只做一件小事的技能比如“把摘录转成测试题”“从阅读笔记里生成复习卡”安装即用效果远比全能型稳定。3. 从零手写一个“间隔复习”Skill 的完整拆解3.1 目录结构与最容易被忽略的细节如果现成的几个项目满足不了需求自己写也完全不复杂。我建议从“主动回忆出题 间隔复习”这个组合开始这也是我这套学习流程里最核心的一块。先搭目录结构skills/ recall-trainer/ SKILL.md scripts/ create_cards.py review_today.py templates/ review_card.md question_set.md samples/ example_input.md example_output.md目录本身并不神秘真正容易被忽略的是两件事。第一SKILL.md文件必须放在技能目录的根部很多工具就是靠这个文件名识别技能包的第二目录名最好全小写并用连字符连接避免特殊字符因为不少脚本会把目录名当成 skill 的 id 来引用起得乱七八糟后面调用时会很痛苦。3.2 SKILL.md 的 frontmatter 与正文写法SKILL.md 本质上是一个带 YAML 头部的 Markdown 文件。头部信息通常在三个字段里起决定性作用你可以用下面这个最小例子起步--- name: recall-trainer description: 当需要把阅读材料转化为主动回忆测试题或需要安排间隔复习计划时使用。输入可以是书籍摘录、论文片段或课程笔记输出为一组分层问题与复习计划表。 license: MIT ---name是技能的唯一标识description是最重要的字段。很多基于 LLM 的工具在判断“当前这轮对话要不要调用某个 skill”时靠的就是把你这句话和 description 做语义匹配。所以 description 一定要写清楚“什么时候用”“输入是什么”“输出是什么”千万不要写成“这是一个帮助用户学习的好工具”这种没信息量的话。正文部分我一般按五段结构来组织# recall-trainer ## 1. 任务目标 将输入材料转化为促进主动回忆的测试题并为每道题分配一个合理的复习日期。 ## 2. 执行步骤 1. 把输入材料拆分为若干知识单元每个单元不超过 500 字。 2. 对每个单元生成 3 道题分别覆盖事实回忆、概念解释、场景应用三个层级。 3. 将题目写入 templates/question_set.md 并输出。 4. 调用 scripts/create_cards.py 将题目追加进复习表 cards.json。 ## 3. 输出格式 - 题目编号格式R-日期-序号 - 每题必须包含问题、参考答案、知识来源、下次复习日期 - 复习日期计算规则第一次学习设置为 1 天后之后按 2,4,8,16 天翻倍 ## 4. 示例 见 samples/example_output.md ## 5. 注意事项 - 不要生成评价性的问题例如“你觉得这段话写得怎么样” - 不要生成与输入材料无关的拓展题 - 参考答案必须基于输入材料禁止编造这个结构看起来平淡但它能把“AI 自由发挥的空间”压缩到一个合理范围输出的内容稳定到可以直接进复习循环。3.3 用脚本保证调度确定性LLM 擅长出题但不擅长做日期计算更不擅长稳定地维护一张会变化的表。所以我让 skill 中的脚本负责两件确定性的事情写入卡片和抽取到期卡片。下面是一个最小化的create_cards.py只依赖标准库import json import sys from datetime import datetime, timedelta from pathlib import Path def main(): cards_path Path(__file__).parent.parent / cards.json if not cards_path.exists(): cards_path.write_text([], encodingutf-8) cards json.loads(cards_path.read_text(encodingutf-8)) question sys.stdin.readline().strip() answer sys.stdin.readline().strip() source sys.stdin.readline().strip() today datetime.now().date().isoformat() next_review (datetime.now() timedelta(days1)).date().isoformat() card { id: fR-{today}-{len(cards) 1}, question: question, answer: answer, source: source, created: today, next_review: next_review, success_count: 0, } cards.append(card) cards_path.write_text(json.dumps(cards, ensure_asciiFalse, indent2), encodingutf-8) print(f已写入卡片编号{card[id]}) if __name__ __main__: main()对应的review_today.py读取卡片筛选next_review小于等于今天的条目随机打乱后输出。这套脚本唯一的职责就是把“今天该复习哪些题”这件事做到精确不掺入任何智能判断。这样设计的好处是即使换一个模型只要 SKILL.md 还指向这个脚本整套复习调度依然可靠。3.4 调试时要盯住三个信号我第一次写完这个 skill 后实际跑起来根本不工作问了周围一圈朋友发现大家踩的坑惊人地一致。第一AI 经常把脚本路径搞错它会以为脚本在根目录结果执行时会报No such file or directory解决办法是在 SKILL.md 里明确写出从技能根目录到脚本的绝对相对路径并在注意事项里补一句“必须使用脚本真实路径调用”。第二模型生成的 JSON 偶尔不合法尤其当题目答案里出现引号时外层脚本直接报错我的办法是脚本里增加一个异常捕获解析失败时就跳过当前卡片并把原文打印出来。第三模型会无视复习间隔算法自己发挥比如“我觉得三天比较合适”就给你改成三天解决办法是在步骤里写得非常死直接写“禁止修改复习日期规则日期必须由脚本计算”。4. 把 Skill 接进日常阅读流程的三种姿势4.1 姿势一读完每一章立刻生成检索卡片现在我的阅读流程已经被这套 skill 完全改掉了。每读完一个章节我不再急着画线而是把这一章里我认为最重要的两三个片段复制下来发给 AI 说“用 recall-trainer 处理这段摘录”。skill 会自动生成一组题目并写入复习表全程大概三十秒。这个改动看起来很小但效果变化很大因为它把“总结提炼”这个动作从阅读后挪到了阅读中。过去我是整本书读完了再想这本书讲了什么那时候细节已经丢了一半现在每一章都在记忆还新鲜的时候强制生成问题等于在每个新知识进入大脑时立刻加了一道提取练习的锁。为了提高这套流程的使用率我还做了个小改造给自己建了一个固定的“阅读收件箱”文本文件把平时划线的句子随手丢进去每天晚上批量让 skill 处理。这样阅读时不用频繁切换对话窗口积累到晚上统一加工心理负担反而更小。4.2 姿势二每天十分钟的主动回忆对话流间隔复习最大的难点不是生成卡片而是“到期了但你没去复习”。针对这个痛点我固定每天早上花十分钟打开对话窗口输入“开始今天的复习”。skill 会调用review_today.py把今天到期的题目一条一条列出来。我不直接看答案先自己回忆然后在对话里给出回答。AI 根据参考答案判断对错在卡片的success_count上做增减。连续答对的卡片复习间隔会拉长连续答错的卡片则会提前回归。这个方法本质上就是简化版的 SM-2 算法但足够好用不需要接数据库不需要连网全部逻辑都藏在 JSON 文件里。有一个心理层面特别值得注意的体会一旦你知道明天 AI 会拿着同样的题目来问你今天阅读时你会下意识地更注意那些容易被提问的细节。这种“马上要被考”的预期本身就是一种很强的注意力过滤器它比任何“我要认真学习”的自我叮嘱都管用。4.3 姿势三用 skill 做主题式对比阅读除了单本书的学习我还给这套流程加了一个延伸玩法对比阅读。读了三篇关于同一技术方向的文章之后我会把三篇文章的结论段落一次性丢给 skill让它的输出模板切换成“对比矩阵模式”。这种用法不需要单独写第二个 skill在 SKILL.md 里增加一个可选的模式参数就行比如在描述里写成“当用户要求对比时输出维度包括各文章核心主张、支撑证据强度、适用条件、分歧点、可整合结论”。AI 会生成一张结构化的对比表把它保存下来后以后写综述或者做技术选型时的检索效率能高出一大截。这个场景的核心价值在于它把“反复阅读单一资料”变成了“在多个观点之间强制建立连接”。读第二篇时你会不自觉地想“上一篇是怎么说的”这种连接动作本可以促进深层记忆但在日常阅读中很少被人主动执行skill 相当于把这个动作例行化了。5. Skill 不是提示词套壳它和 Prompt、Agent 的真实分工5.1 普通提示词是“一次性有效”Skill 是可复用资产我一直觉得把 skill 简单理解成“高级提示词模板”是一种低估。两者表面上看确实长得像但思考框架完全不同。普通提示词是你每次使用时在对话框里现场输入的指令它存在于一次对话中用完即弃格式、措辞、流程都靠临场发挥而 skill 是放在文件系统里的一个结构化单元有名字、有版本、有许可证、有配套脚本它可以被任何支持该约定的客户端反复加载。真正的分水岭在于脚本。提示词只能驱动模型思考没法可靠地操作文件、计算日期、调用外部程序skill 里的脚本则补上了这一层确定性。前面说的复习日期调度就是一个典型例子普通对话流里你可以要求 AI 帮你算时间但它的输出不可稳定复现把调度逻辑丢给 Python 脚本之后不管谁来调用、调用多少次结果都是一致的。如果你发现自己某条提示词在两周内被反复复制粘贴超过三次这就是把它升级成 skill 的信号。升级不需要重写所有内容只需要给提示词套上 frontmatter、写清触发描述、放好配套脚本就能让它从一个私人的临时文本变成团队可共享、社区可分发的能力单元。5.2 Agent 负责动态决策Skill 负责标准动作很多人在检索时会看到“agent skill”这个组合词然后开始混淆 skill 和 agent 的关系。我的理解是agent 是动态决策者skill 是静态执行器。Agent 根据你的目标判断“这一步该做什么、需不需要调用工具、调用哪个技能”而 skill 本身不知道全局计划它只负责把“某一类任务”的标准动作执行到位。举个学习场景里的例子。如果你的目标是一个月内啃完一本专业书并产出读书报告这个目标本身适合交给 agent 来编排第一天读第几章、哪天该出题、哪天该写总结这些决策是动态的。但“把第二章摘录转成八道主动回忆题”这个动作适合打开recall-trainer这个 skill 来做而“今天该复习哪些卡片”适合直接跑脚本连 skill 都不需要走完整个流程。所以更合理的架构是agent 作为调度层根据用户状态动态选用多个 skill每个 skill 内部再组合提示词、脚本和模板把自己负责的那块闭环跑完。把 skill 的角色定错了要么会做出一个什么都想干、什么都干不动的伪 agent要么会把 agent 的决策逻辑写死在 skill 里导致流程僵化。5.3 解决一个小的选择困惑在实际落地时你可以套用下面这个判断方法如果任务输出格式固定、流程不变、需要反复执行就写成 skill如果任务需要多步推理、需要根据中间结果调整下一步行动就先交给 agent让 agent 在合适时机去调用 skill。学习场景里出题、复习、生成摘要、对比阅读都是典型的高频标准动作非常适合 skill 化而“帮我制定接下来一周的学习计划”这种需要综合判断的任务更适合保留在 agent 对话中完成。6. 实测一个月后效果评估与坑位清单6.1 我踩过的四个坑先说坑后说收获因为坑才是这套流程真正值钱的部分。第一个坑是 description 写得太泛。我第一次写的是“用于帮助用户学习生成问题并安排复习”结果在实际使用中AI 会在任何跟学习沾边的场景都尝试调用它包括“帮我查一下某个概念在书里的定义”这种简单的查询任务。后来我把 description 改成“当输入包含阅读摘录、书籍片段、论文笔记且需要生成分层测试题和复习计划时使用”误触发率立刻降了下来。第二个坑是脚本执行环境的路径问题。我的复习表文件一开始放在 skill 根目录脚本用相对路径读写结果在有的工具里相对路径的基准目录不是技能目录而是项目根目录。后来统一改成基于Path(__file__).parent.parent定位这个坑才彻底消失。第三个坑是出题质量不稳定。同一个 skill 在状态好的时候能生成很有深度的问题状态差的时候就变成“这段文字的主要观点是什么”这种泛泛而谈。解决办法是在 samples 目录里放了一个高质量示例并在 SKILL.md 里加一句“严格参考示例输出的风格和难度”相当于给模型一个 few-shot 锚点。第四个坑跟情绪有关生成的卡片越来越多我会产生一种“我积累了好多知识”的错觉。但事实是卡片里只有不到六成被我真正复习过剩下的躺在复习表里成了数字资产对记忆没有任何帮助。后来我强行规定每天只看今日到期卡片坚决不动未到期部分才从囤积心态里走回来。6.2 怎么判断 skill 真的提高了学习效率一个月后我做了个简单评估不看主观感受只看三个指标。第一个指标是两周后的回忆保持率我把十张两周前生成的卡片拿出来不带答案重新做了一遍正确率从之前几乎为零提升到了七成左右第二个指标是复习表的活跃度也就是真正到期且完成复习的卡片比例稳定在一个可维持的区间第三个指标是时间成本我每天花在复习上的时间不超过十五分钟但整体阅读留存显著高于只做划线笔记的阶段。我用的评估方式非常朴素没有做严谨的对照实验但已经足够回答“这套工具值不值得继续用”的问题。需要提醒的是不要用“今天学了好多东西”的感觉来衡量效果感觉是最容易骗人的指标唯一可信的是隔一段时间后重测的回忆率。6.3 持续优化的一个技巧最后分享一个让我这套流程越用越顺的小技巧给 skill 加一个轻量的feedback_log.md。每次使用完成后我都花十秒钟记录这次输出里“满意的地方”和“不满意的地方”比如“题目第三题太简单了”“对比阅读的输出缺少适用条件这一列”。每隔一段时间把这些反馈批量整理回填到 SKILL.md 的注意事项里。这是一种很简单的自我迭代闭环但效果异常好。模型不会自己记住你上次的偏好但你写在 skill 文件里的注意事项会成为每次调用的常驻约束。几轮迭代下来我的 recall-trainer 出题质量已经明显稳定它不再是一个通用模板而是一个为我自己的阅读习惯、知识领域和记忆节奏定制过的私有技能。如果你也想在开源 skill 这条路上试试别急着去设计一个覆盖所有学习场景的大方案。从小处入手挑一个你反复经历的学习痛点比如“读完就忘”先写一个只做一件事的 skill跑通之后再慢慢加功能。这套流程真正的价值不在于技术本身而在于它把那些你明明知道有效、却总是因为麻烦而不去做的学习动作变成了一个低成本、高确定性的日常习惯。