示例内容 · 用于展示排版效果,正式上线前替换
用 AI 搭一个会自我复盘的学习系统
遗忘不是失败,而是信号。把「何时复习」交给算法,把「为什么没记住」交给 AI,学习才真正变成一个闭环。
大多数学习工具只解决了一半问题:它们能提醒你什么时候复习,却从不追问为什么你又忘了。这篇笔记记录我怎样把两件事接在一起,做成一个会自我复盘的学习系统。
遗忘不是失败,而是信号。它告诉你:这条知识还没有接到你已有的网络上。
一、遗忘有曲线,复习有时机
艾宾浩斯的遗忘曲线可以近似写成一个指数衰减:记忆保持率 随时间 下降,下降速度由记忆强度 决定。
每一次成功的复习,都会让 变大,曲线因此变得更平缓。间隔重复算法做的事情,就是在 跌到某个阈值(比如 )之前,把这张卡片重新推到你面前。
难度系数怎么更新
经典的 SM-2 算法用一个难度系数 来调整下一次间隔。你每次给出 到 的自评分 ,系数这样更新:
而第 次复习的间隔是 , 不低于 。
二、让 AI 回答「为什么忘了」
算法只知道你忘了,不知道原因。所以每当一张卡片连续两次答错,我会把它和最近的错误记录一起交给 AI,让它判断属于哪一类:
| 遗忘类型 | 典型表现 | 系统的处理 |
|---|---|---|
| 概念没懂 | 换个问法就答不出 | 生成一段新的解释,拆成两张更小的卡片 |
| 缺少连接 | 单独能记住,放进场景就想不起 | 补一张「和已知知识对比」的卡片 |
| 表述太长 | 答案对了一半 | 压缩答案,只留一个关键词 |
| 纯粹遗忘 | 看到答案立刻想起 | 什么都不改,交给间隔算法 |

三、把它接进日常
核心的调度逻辑其实很短:
// 每天早上:取出今天到期、且保持率低于阈值的卡片
export function dueToday(cards: Card[], now = Date.now(), threshold = 0.9) {
return cards
.map((c) => ({ card: c, r: Math.exp(-(now - c.lastReview) / c.strength) }))
.filter(({ r }) => r < threshold)
.sort((a, b) => a.r - b.r) // 最快被遗忘的排在最前
.map(({ card }) => card);
}
每天固定做三件事:
- 早上清空今天到期的卡片
- 把连续答错的卡片送去诊断
- 每周日看一次「遗忘类型」的分布,调整自己的学习方式
四、几个反直觉的结论
- 卡片越小越好。 一张卡片只问一件事,诊断才准确。
- 答错比答对更有价值。 系统的改进几乎全部来自答错的那一刻。
- 不要追求零遗忘。 保持率设在 左右,复习量和记忆效果的平衡最好1。
学习系统真正的价值,不是让你记住更多,而是让你更早知道自己哪里没懂。
Footnotes
-
这个数字来自我自己几个月的记录,只是一个经验值,并不是严格的研究结论。 ↩