dramaling-vocab-learning/note/智能複習/智能複習系統-演算法規格書.md

233 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 智能複習系統 - 演算法規格書 (ASD)
**目標讀者**: 演算法工程師、數據科學家
**版本**: 1.0
**日期**: 2025-09-25
---
## 🧮 **算法概述**
### **核心問題**
現有 `2^成功次數` 算法增長過快,需要設計更科學的間隔重複算法。
### **設計目標**
- 間隔增長平緩,避免過早達到最大間隔
- 結合用戶表現動態調整
- 處理逾期復習的記憶衰減
---
## 📐 **數學模型**
### **主算法公式**
```
新間隔 = (當前間隔 × 增長係數 × 表現係數) × 逾期懲罰係數
下次復習日期 = 復習行為當日 + 新間隔
```
### **⏰ 時間基準定義 (關鍵)**
```python
# 關鍵時間定義
scheduled_date = flashcard.next_review_date # 預定復習日期
actual_review_date = datetime.now().date() # 復習行為當日
overdue_days = (actual_review_date - scheduled_date).days
# 下次復習計算基準:以復習行為當日為準
next_review_date = actual_review_date + timedelta(days=new_interval)
```
**設計原則**:
-**以復習行為當日為基準** - 用戶在哪天復習,就從那天開始計算下次復習
-**避免累積逾期** - 不會因為一次逾期導致後續復習都逾期
-**用戶友好** - 符合用戶直覺,任何時候復習都是"重新開始"
**具體範例**:
```
詞卡應該 2025-09-20 復習,用戶 2025-09-25 才復習 (逾期5天)
- 逾期天數 = 5天 (中度逾期)
- 原間隔 = 14天答對信心等級4
- 新間隔 = 14 × 1.4 × 1.1 × 0.75 = 16天
- 下次復習 = 2025-09-25 + 16天 = 2025-10-11 ✅
- 而非 = 2025-09-20 + 16天 = 2025-10-06 ❌
```
### **1. 增長係數函數**
```python
def get_growth_factor(current_interval):
if current_interval <= 7:
return 1.8 # 短期:快速增長
elif current_interval <= 30:
return 1.4 # 中期:中等增長
elif current_interval <= 90:
return 1.2 # 長期:緩慢增長
else:
return 1.1 # 超長期:極緩增長
```
**設計理念**: 分段函數避免指數爆炸,早期快速建立記憶,後期維持長期記憶。
### **2. 表現係數函數**
```python
def get_performance_factor(is_correct, confidence_level=None, question_type="flipcard"):
if question_type == "flipcard":
# 信心等級映射 (1-5 → 0.5-1.4)
confidence_mapping = {1: 0.5, 2: 0.7, 3: 0.9, 4: 1.1, 5: 1.4}
return confidence_mapping.get(confidence_level, 0.9)
else:
# 客觀題
return 1.1 if is_correct else 0.6
```
**設計理念**: 翻卡題依據主觀信心,客觀題依據正確性,反映不同題型的認知特點。
### **3. 逾期懲罰函數**
```python
def calculate_overdue_penalty(overdue_days):
if overdue_days <= 0:
return 1.0 # 準時,無懲罰
elif overdue_days <= 3:
return 0.9 # 輕度逾期
elif overdue_days <= 7:
return 0.75 # 中度逾期
elif overdue_days <= 30:
return 0.5 # 重度逾期
else:
return 0.3 # 極度逾期
```
**設計理念**: 階梯式懲罰,鼓勵按時復習,但不過度懲罰偶爾延遲。
### **4. 記憶衰減模型**
```python
def calculate_memory_decay(original_mastery, overdue_days):
# 基於 Ebbinghaus 遺忘曲線的指數衰減
decay_rate = 0.05 # 每天5%衰減率
max_decay_days = 30 # 最多考慮30天衰減
effective_days = min(overdue_days, max_decay_days)
decay_factor = (1 - decay_rate) ** effective_days
return max(0, int(original_mastery * decay_factor))
```
**設計理念**: 符合認知科學的遺忘曲線,逾期越久記憶衰減越多。
### **5. 熟悉程度計算**
```python
def calculate_mastery_level(times_correct, total_reviews, current_interval):
# 多因子加權計算
success_rate = times_correct / total_reviews if total_reviews > 0 else 0
base_score = min(times_correct * 8, 60) # 60% 權重
interval_bonus = min(current_interval / 365 * 25, 25) # 25% 權重
accuracy_bonus = success_rate * 15 # 15% 權重
return min(100, round(base_score + interval_bonus + accuracy_bonus))
```
**設計理念**: 綜合考慮學習次數、記憶持久性、學習準確性三個維度。
---
## 📊 **算法特性分析**
### **收斂性分析**
- **間隔上限**: 365天確保不會無限增長
- **收斂速度**: 約15-20次復習達到長期記憶階段
- **穩定性**: 表現波動不會導致劇烈間隔變化
### **參數敏感性**
| 參數 | 影響程度 | 調優建議 |
|------|---------|----------|
| 增長係數 | 高 | 謹慎調整,影響整體學習節奏 |
| 逾期懲罰 | 中 | 可根據用戶行為數據調優 |
| 衰減率 | 中 | 建議基於記憶實驗數據設定 |
| 權重分配 | 低 | 相對穩定,微調即可 |
### **邊界條件處理**
```python
# 關鍵邊界條件
def validate_inputs(interval, times_correct, total_reviews):
assert 0 <= interval <= 365, "間隔必須在 0-365 範圍內"
assert times_correct >= 0, "成功次數不能為負"
assert total_reviews >= times_correct, "總次數不能少於成功次數"
assert total_reviews >= 0, "總次數不能為負"
```
---
## 🔬 **算法驗證**
### **理論驗證**
-**單調性**: 連續答對時間隔遞增
-**有界性**: 間隔不會超過365天
-**連續性**: 參數小幅變化不會導致間隔劇變
-**收斂性**: 學習軌跡收斂到穩定狀態
### **數值穩定性**
- 浮點運算精度: 使用 `Math.Round()` 處理
- 溢出保護: 所有中間結果都有上下界
- 零除防護: `total_reviews = 0` 時返回預設值
### **性能複雜度**
- **時間複雜度**: O(1) - 常數時間計算
- **空間複雜度**: O(1) - 無額外存儲需求
- **預期性能**: < 1ms 計算時間
---
## 🎛️ **參數調優指南**
### **A/B 測試建議**
```json
{
"test_groups": {
"conservative": {
"growth_factors": [1.6, 1.3, 1.1, 1.05],
"description": "保守增長,更多復習機會"
},
"aggressive": {
"growth_factors": [2.0, 1.5, 1.3, 1.15],
"description": "積極增長,減少復習負擔"
},
"current": {
"growth_factors": [1.8, 1.4, 1.2, 1.1],
"description": "當前推薦參數"
}
}
}
```
### **監控指標**
- **學習軌跡分布**: 檢查間隔分布是否合理
- **用戶滿意度**: 復習頻率是否符合預期
- **記憶效果**: 長期記憶率是否提升
---
## 🔮 **未來優化方向**
### **個人化參數**
```python
# 未來可考慮的個人化係數
personal_factor = calculate_personal_learning_ability(user_id)
new_interval *= personal_factor
```
### **遺忘曲線整合**
```python
# 更精確的記憶強度模型
memory_strength = math.exp(-time_since_review / forgetting_constant)
review_urgency = 1 - memory_strength
```
### **多維度考量**
- 詞彙難度係數
- 學習時間分布
- 情境相關性
---
**算法設計者**: Claude AI
**審核狀態**: 待算法團隊 Review