SmartRecall 中的 SM-2 演算法詳解
SM-2 間隔重複演算法的完整實現:初始間隔、ease factor 更新、lapse 規則,以及 SmartRecall 的實操調整,附完整算例。
4月 29, 2026
SmartRecall 中的 SM-2 演算法詳解
SM-2 是 Piotr Wozniak 在 1987 年的 SuperMemo 論文 裡發表的間隔重複演算法,也是 Anki 和 Mnemosyne 背後的演算法。本頁面把 SmartRecall 的實現講透 —— 每一個常數、每一個狀態轉移,附完整算例。
一句話原理
每複習一次,給本次回憶打分:
- Again(0) —— 失敗,沒回憶起來
- Hard(3) —— 想起來了,但很費勁
- Good(4) —— 正常想起來
- Easy(5) —— 一秒回憶
SM-2 用這個評分更新兩個數:
- 間隔(
I) —— 距離下一次複習的天數 - 難度係數(
EF,Ease Factor) —— 控制間隔增長速度的乘數
評分越高 → EF 越大 → 間隔增長越快;評分越低 → EF 越小 → 間隔越緊。失敗會把間隔重置,但 EF 只是被略微下調。
SmartRecall 使用的精確規則
新卡片初始值:
I = 0 (首次複習時設定)
EF = 2.5
reps = 0 (連續成功複習次數)
每次複習,質量分 q (0–5):
if q < 3: // 失敗 lapse
reps = 0
I = 1 // 間隔回到 1 天
// EF 下面繼續更新
else: // 成功
if reps == 0: I = 1
elif reps == 1: I = 6
else: I = round(I_prev * EF)
reps = reps + 1
EF = max(1.3, EF + (0.1 - (5 - q) * (0.08 + (5 - q) * 0.02)))EF 公式在每個評分點折成易記的數:
| 評分 | q | EF 變化 |
|---|---|---|
| Again | 0 | −0.80 |
| Hard | 3 | −0.14 |
| Good | 4 | 0.00 |
| Easy | 5 | +0.10 |
EF 下限被夾在 1.3 —— 不論失敗多少次,間隔都不會比這更慢地增長。
完整算例
一張新卡:"什麼是間隔效應?"
| 第幾次複習 | 評分 | q | 複習後 reps | 複習後 EF | 複習後 I | 下次複習 |
|---|---|---|---|---|---|---|
| 1 | Good | 4 | 1 | 2.50 | 1 天 | 明天 |
| 2 | Good | 4 | 2 | 2.50 | 6 天 | +6 天 |
| 3 | Easy | 5 | 3 | 2.60 | 16 天 | +16 天 |
| 4 | Hard | 3 | 4 | 2.46 | 39 天 | +39 天 |
| 5 | Again | 0 | 0 | 1.66 | 1 天 | 明天(lapse) |
| 6 | Good | 4 | 1 | 1.66 | 1 天 | +1 天 |
| 7 | Good | 4 | 2 | 1.66 | 6 天 | +6 天 |
需要注意的幾點:
- 前兩次的間隔(1 天 → 6 天)是寫死的,不走乘法。SM-2 之所以這麼設計,是為了避免新卡因為高
EF一下子飛到 30 天後才複習。 - 第 4 次後的間隔是
round(16 * EF) = round(16 * 2.46) = 39。 - 第 5 次是 lapse ——
reps歸零,I歸 1,但EF只下調 0.80(沒回到 2.5)。卡片是"受傷",不是"清零"。 - lapse 之後,排程不會重複 1 → 6 的遞增;第 6 次成功之後
reps升到 1,第 7 次直接走 6 天間隔。
SmartRecall 在 SM-2 之上做的三個調整
SM-2 是底線,不是天花板。我們做了三處務實改動:
- Hard 三連軟 lapse。 如果你連續三次給同一張卡評 Hard,下一次的間隔會被夾在
I_prev,不再繼續乘EF。純 SM-2 會繼續放大間隔,讓你跟它越打越遠。 - Leech(釘子卡)識別。 一張卡一共 lapse 8 次後,會被打上 leech 標籤並出現在你的 Dashboard 上,提示你重寫這張卡。一張爛卡是工作流問題,不是演算法問題。
- 生成時間種子化的初始擴散。 AI 一次生成 200 張卡時,我們不會全部放在第一天覆習 —— 用卡片 ID 的確定性雜湊把首次
I = 1的複習鋪到接下來 5 天裡,讓你的每日複習量保持平穩。
其餘部分 —— EF 公式、1/6 天階梯、1.3 下限、lapse 語義 —— 都和 1987 年的論文完全一致。
為什麼暫時不用 FSRS?
FSRS 是一個更新的排程器,會從使用者的複習歷史裡學習個性化遺忘曲線。在累計 ~1000 次複習之後,它的表現可測量地優於 SM-2。我們正在把 FSRS 作為可選排程器開發中 —— 進展看 更新日誌。
延伸閱讀
- Wozniak, P. (1990). Optimization of learning. 原始 SM-2 規範。
- Cepeda, N. J., et al. (2006). Distributed practice in verbal recall tasks: A review and quantitative synthesis. Psychological Bulletin. 跨 317 項實驗的間隔效應元分析。
- Karpicke, J. D., & Roediger, H. L. (2008). The critical importance of retrieval for learning. Science. SM-2 隱式依賴的"測試效應"奠基論文。
