etRetrievability是 FSRS 算法中计算记忆提取概率的核心方法。让我详细解释方法定义go// 获取卡片在指定时间的记忆提取概率可提取性 func (f *FSRS) GetRetrievability(card Card, now time.Time) float64 { // 计算自上次复习以来的时间间隔 elapsed : now.Sub(card.LastReview).Hours() / 24.0 // 转换为天数 // 使用指数遗忘曲线计算 return math.Pow(1 elapsed / (9 * card.Stability), -1) }核心公式FSRS 使用的遗忘曲线公式textR(t) (1 t / (9 * S))^(-1)其中R(t) 在时间 t 时的记忆提取概率0~1t 距离上次复习的时间天数S 卡片的稳定性Stability单位天实际意义返回值范围含义0.990% 概率能回忆起来理想状态0.770% 概率能回忆起来建议复习0.550% 概率能回忆起来记忆模糊 0.3可能已经遗忘急需复习使用示例go// 场景1判断卡片是否该复习了 card : Card{ Stability: 30.0, // 稳定性30天 LastReview: time.Now().AddDate(0, 0, -20), // 20天前复习 } retrievability : fsrs.GetRetrievability(card, time.Now()) // 计算R (1 20/(9*30))^(-1) (1 0.074)^(-1) ≈ 0.93 // 结果93% 概率能记住暂时不需要复习 // 场景2判断阈值通常设为0.7-0.9 if retrievability 0.7 { // 记忆率低于70%应该安排复习 fmt.Println(需要复习了) }与其他方法的关系go// 完整工作流示例 card : Card{Stability: 30, LastReview: time.Now().AddDate(0, 0, -25)} // 1. 获取当前记忆状态 retrievability : fsrs.GetRetrievability(card, time.Now()) // R ≈ 0.85 // 2. 查看卡片信息类似 Repeat record : fsrs.Repeat(card, time.Now()) // 3. 如果用户复习并评级 if retrievability 0.8 { // 评级为 Good next : fsrs.Next(card, time.Now(), RatingGood) // 新的稳定性会基于当前稳定性和评级更新 // S_new S * (1 factor * (grade - 3)) }实际应用场景1.复习提醒go// 每天早上检查哪些卡片需要复习 func getDueCards(cards []Card) []Card { var due []Card for _, card : range cards { if fsrs.GetRetrievability(card, time.Now()) 0.7 { due append(due, card) } } return due }2.学习进度监控go// 统计整体记忆水平 func getAverageRetrievability(cards []Card) float64 { total : 0.0 for _, card : range cards { total fsrs.GetRetrievability(card, time.Now()) } return total / float64(len(cards)) }3.动态调整复习计划go// 根据记忆率调整复习量 if avgRetrievability 0.75 { // 增加复习频率 reviewCount 5 }关键参数说明Stability稳定性越高遗忘越慢间隔时间上次复习到现在的时间Retrievability随时间衰减的指数函数总结GetRetrievability是 FSRS 的核心评价指标量化还记得多少决定何时复习阈值通常 0.7~0.9是Next()方法更新稳定性的依据用于动态调整学习计划这个方法的计算结果直接影响整个复习系统的决策逻辑