diff --git a/note/智能複習/智能複習系統-技術規格書.md b/note/智能複習/智能複習系統-技術規格書.md
index b6d486e..f2a8955 100644
--- a/note/智能複習/智能複習系統-技術規格書.md
+++ b/note/智能複習/智能複習系統-技術規格書.md
@@ -56,8 +56,8 @@ public class SpacedRepetitionService
overdueDays
);
- // 4. 更新熟悉程度
- var newMastery = CalculateMasteryLevel(
+ // 4. 更新基礎熟悉程度 (存入資料庫)
+ var newBaseMastery = CalculateMasteryLevel(
request.TimesCorrect + (request.IsCorrect ? 1 : 0),
request.TotalReviews + 1,
newInterval
@@ -67,11 +67,27 @@ public class SpacedRepetitionService
{
NewInterval = newInterval,
NextReviewDate = actualReviewDate.AddDays(newInterval), // 以復習當日為基準
- MasteryLevel = newMastery,
+ BaseMasteryLevel = newBaseMastery, // 基礎熟悉度
+ CurrentMasteryLevel = newBaseMastery, // 剛復習完,兩者相等
IsOverdue = overdueDays > 0,
OverdueDays = Math.Max(0, overdueDays)
};
}
+
+ ///
+ /// 計算當前熟悉度 (實時計算,不存資料庫)
+ ///
+ public int CalculateCurrentMasteryLevel(Flashcard flashcard)
+ {
+ var daysSinceLastReview = (DateTime.Now.Date - flashcard.LastReviewDate.Date).Days;
+
+ // 如果沒有時間經過,返回基礎熟悉度
+ if (daysSinceLastReview <= 0)
+ return flashcard.BaseMasteryLevel;
+
+ // 應用記憶衰減
+ return ApplyMemoryDecay(flashcard.BaseMasteryLevel, daysSinceLastReview);
+ }
}
```
@@ -97,13 +113,37 @@ public class SpacedRepetitionService
"data": {
"newInterval": 15,
"nextReviewDate": "2025-10-10",
- "masteryLevel": 65,
+ "baseMasteryLevel": 65, // 基礎熟悉度 (存資料庫)
+ "currentMasteryLevel": 65, // 當前熟悉度 (實時計算)
"isOverdue": false,
"overdueDays": 0
}
}
```
+### **GET /api/flashcards/{id}**
+
+#### **響應格式**
+```json
+{
+ "success": true,
+ "data": {
+ "id": 123,
+ "word": "apple",
+ "definition": "蘋果",
+ "baseMasteryLevel": 75, // 基礎熟悉度 (資料庫值)
+ "currentMasteryLevel": 68, // 當前熟悉度 (考慮衰減)
+ "lastReviewDate": "2025-09-20",
+ "nextReviewDate": "2025-10-04",
+ "currentInterval": 14,
+ "timesCorrect": 8,
+ "totalReviews": 10,
+ "isOverdue": true,
+ "overdueDays": 1
+ }
+}
+```
+
#### **錯誤響應**
```json
{
@@ -153,8 +193,11 @@ public class ReviewRequestValidator : AbstractValidator
-- 現有 Flashcards 表需要的欄位
ALTER TABLE Flashcards ADD COLUMN
LastReviewDate DATETIME, -- 上次實際復習日期
+ BaseMasteryLevel INT DEFAULT 0, -- 基礎熟悉度 (上次復習時的值)
OverdueCount INT DEFAULT 0, -- 逾期次數統計
ConsecutiveOverdue INT DEFAULT 0; -- 連續逾期次數
+
+-- 注意: CurrentMasteryLevel 不存資料庫,透過 API 實時計算
```
### **索引優化**
@@ -208,8 +251,14 @@ public class ReviewMetrics
[Histogram("review_calculation_duration_ms")]
public static readonly Histogram CalculationDuration;
+ [Histogram("mastery_calculation_duration_ms")]
+ public static readonly Histogram MasteryCalculationDuration;
+
[Gauge("overdue_reviews_current")]
public static readonly Gauge OverdueReviews;
+
+ [Counter("mastery_calculations_total")]
+ public static readonly Counter MasteryCalculations;
}
```
diff --git a/note/智能複習/智能複習系統-演算法規格書.md b/note/智能複習/智能複習系統-演算法規格書.md
index 9885b9e..7924656 100644
--- a/note/智能複習/智能複習系統-演算法規格書.md
+++ b/note/智能複習/智能複習系統-演算法規格書.md
@@ -113,10 +113,15 @@ def calculate_memory_decay(original_mastery, overdue_days):
**設計理念**: 符合認知科學的遺忘曲線,逾期越久記憶衰減越多。
-### **5. 熟悉程度計算**
+### **5. 熟悉程度計算 (雙重概念)**
+
+#### **5.1 基礎熟悉度計算 (存入資料庫)**
```python
-def calculate_mastery_level(times_correct, total_reviews, current_interval):
- # 多因子加權計算
+def calculate_base_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% 權重
@@ -126,7 +131,47 @@ def calculate_mastery_level(times_correct, total_reviews, current_interval):
return min(100, round(base_score + interval_bonus + accuracy_bonus))
```
-**設計理念**: 綜合考慮學習次數、記憶持久性、學習準確性三個維度。
+#### **5.2 當前熟悉度計算 (實時計算)**
+```python
+def calculate_current_mastery_level(base_mastery, last_review_date):
+ """
+ 計算當前熟悉度,考慮記憶衰減的實時值
+ 用於前端顯示,不存入資料庫
+ """
+ days_since_review = (datetime.now().date() - last_review_date).days
+
+ # 如果是當日復習,返回基礎熟悉度
+ if days_since_review <= 0:
+ return base_mastery
+
+ # 套用記憶衰減
+ return calculate_memory_decay(base_mastery, days_since_review)
+```
+
+**設計理念**:
+- **基礎熟悉度**: 學習成果的基準值,反映用戶的學習進度
+- **當前熟悉度**: 考慮時間因素的實時值,反映當下的記憶強度
+
+### **6. 熟悉度計算時機**
+
+#### **6.1 基礎熟悉度更新時機**
+- ✅ **復習完成時**: 計算並更新到資料庫
+- ❌ **查詢時**: 不重新計算,直接讀取資料庫值
+- ❌ **定期批次**: 不需要排程任務更新
+
+#### **6.2 當前熟悉度計算時機**
+- ✅ **API 查詢時**: 每次請求都實時計算
+- ✅ **前端顯示時**: 根據 API 返回的基礎值和參數計算
+- ✅ **列表頁面**: 批次計算多個詞卡的當前熟悉度
+
+#### **6.3 計算流程圖**
+```
+用戶復習 → 更新基礎熟悉度 → 存入資料庫
+ ↓
+用戶查詢 → 讀取基礎熟悉度 → 計算當前熟悉度 → 返回前端
+ ↓
+前端展示 → 顯示當前熟悉度 (會隨時間動態變化)
+```
---
@@ -171,9 +216,12 @@ def validate_inputs(interval, times_correct, total_reviews):
- 零除防護: `total_reviews = 0` 時返回預設值
### **性能複雜度**
-- **時間複雜度**: O(1) - 常數時間計算
+- **基礎熟悉度**: O(1) - 常數時間計算
+- **當前熟悉度**: O(1) - 常數時間計算
- **空間複雜度**: O(1) - 無額外存儲需求
-- **預期性能**: < 1ms 計算時間
+- **預期性能**:
+ - 單次計算: < 1ms
+ - 列表頁批次計算: < 10ms (100個詞卡)
---
diff --git a/note/智能複習/智能複習系統-產品需求規格書.md b/note/智能複習/智能複習系統-產品需求規格書.md
index 91a1e8b..c716f91 100644
--- a/note/智能複習/智能複習系統-產品需求規格書.md
+++ b/note/智能複習/智能複習系統-產品需求規格書.md
@@ -84,11 +84,11 @@
### **MVP (2-3周)**
- 核心間隔算法實現
- 基本逾期處理
-- 熟悉程度顯示
+- 基礎熟悉程度計算和實時熟悉度顯示
### **V1.0 (1-2個月)**
- 完整逾期處理機制
-- 學習統計面板
+- 學習統計面板 (含熟悉度變化趨勢)
- 復習提醒功能
### **V2.0 (3-6個月)**
diff --git a/note/智能複習/智能複習系統需求規格書.md b/note/智能複習/智能複習系統需求規格書.md
deleted file mode 100644
index efce9c0..0000000
--- a/note/智能複習/智能複習系統需求規格書.md
+++ /dev/null
@@ -1,876 +0,0 @@
-# 智能複習系統需求規格書 (SRS)
-
-**版本**: 1.5
-**日期**: 2025-09-25
-**項目**: DramaLing 英語詞彙學習平台
-
----
-
-## 1. 項目概述
-
-### 1.1 業務目標
-提升詞彙學習效率,通過科學的間隔重複算法,幫助學習者在最佳時機復習,達到長期記憶效果。
-
-### 1.2 問題陳述
-**當前問題**:
-- 現有復習算法 (`2^成功次數`) 增長過快,僅需9次成功就達到365天間隔
-- 學習者過早停止復習,導致詞彙遺忘
-- 缺乏個人化調整,所有詞彙使用相同復習頻率
-- 熟悉度計算不準確,無法反映真實學習進度
-
-**影響**:
-- 學習效率低下,重複學習已熟悉詞彙
-- 困難詞彙復習不足,容易遺忘
-- 學習者無法獲得準確的進度反饋
-
-### 1.3 預期效益
-- **學習效率提升 30%**:更精準的復習時機
-- **長期記憶率提升 40%**:科學的間隔設計
-- **用戶滿意度提升**:個人化學習體驗
-- **系統可擴展性**:支援未來複雜學習策略
-
----
-
-## 2. 用戶需求
-
-### 2.1 目標用戶
-- **主要用戶**: 英語學習者(A1-C2各程度)
-- **次要用戶**: 教師、內容創建者
-
-### 2.2 用戶故事 (User Stories)
-
-#### **US-001: 智能復習排程**
-**作為**學習者
-**我希望**系統能根據我的學習表現智能安排復習時間
-**以便**我能在最佳時機復習,提高學習效率
-
-**驗收標準**:
-- [ ] 系統根據答題表現動態調整復習間隔
-- [ ] 表現好的詞彙間隔延長,表現差的間隔縮短
-- [ ] 新詞卡的第一次復習在合理時間內安排
-
-#### **US-002: 個人化學習路徑**
-**作為**不同程度的學習者
-**我希望**復習頻率能根據我的程度和詞彙難度調整
-**以便**得到適合我程度的學習計畫
-
-**驗收標準**:
-- [ ] A1學習者學習C1詞彙時復習頻率較高
-- [ ] C1學習者學習A1詞彙時復習頻率較低
-- [ ] 系統能識別學習者程度並自動調整
-
-#### **US-003: 準確的進度反饋**
-**作為**學習者
-**我希望**能看到準確的詞彙熟悉程度
-**以便**了解自己的真實學習進度
-
-**驗收標準**:
-- [ ] 熟悉程度反映真實記憶強度
-- [ ] 進度顯示平滑增長,避免突然跳躍
-- [ ] 能區分短期記憶和長期記憶
-
-### 2.3 使用場景
-
-#### **場景1: 日常復習**
-1. 學習者打開應用,查看今日復習列表
-2. 系統根據復習算法推薦到期詞彙
-3. 學習者完成復習,提供答題反饋
-4. 系統更新復習間隔和熟悉程度
-5. 學習者查看學習進度報告
-
-#### **場景2: 新詞學習**
-1. 學習者新增詞彙到學習列表
-2. 系統設定初始復習間隔(1天)
-3. 隔天學習者進行第一次復習
-4. 根據表現調整後續復習計劃
-5. 系統追蹤學習軌跡
-
-#### **場景3: 逾期復習處理**
-1. 學習者有詞卡預定在2025-09-20復習,但未及時完成
-2. 學習者在2025-09-25才進行復習(逾期5天)
-3. 系統檢測逾期天數,應用記憶衰減模型調整熟悉程度
-4. 學習者完成復習,系統應用中度逾期懲罰係數(0.75)
-5. 系統計算新間隔 = (原間隔 × 增長係數 × 表現係數) × 0.75
-6. 更新NextReviewDate和調整後的熟悉程度
-7. 記錄逾期統計數據,用於學習分析
-
----
-
-## 3. 功能需求
-
-### 3.1 核心功能模組
-
-#### **F-001: 間隔計算引擎**
-**描述**: 實作新的復習間隔計算算法
-
-**輸入**:
-- 當前間隔天數 (IntervalDays)
-- 答題結果 (isCorrect: boolean)
-- 信心程度 (confidenceLevel: 1-5, 翻卡題必須提供)
-- 預定復習日期 (NextReviewDate)
-- 實際復習日期 (ActualReviewDate)
-
-**處理邏輯**:
-```
-步驟1: 計算逾期天數 = 實際復習日期 - 預定復習日期
-步驟2: 應用記憶衰減調整熟悉程度
-步驟3: 計算逾期懲罰係數
-步驟4: 新間隔 = (當前間隔 × 增長係數 × 表現係數) × 逾期懲罰係數
-
-增長係數:
-- 1-7天: 1.8
-- 8-30天: 1.4
-- 31-90天: 1.2
-- 91天以上: 1.1
-
-表現係數:
-- 翻卡題 (根據信心程度 1-5):
- * 信心程度 1: 0.5
- * 信心程度 2: 0.7
- * 信心程度 3: 0.9
- * 信心程度 4: 1.1
- * 信心程度 5: 1.4
-- 客觀題: 1.1 (答對) / 0.6 (答錯)
-
-逾期懲罰係數:
-- 準時 (0天): 1.0 (無懲罰)
-- 輕度逾期 (1-3天): 0.9 (10%懲罰)
-- 中度逾期 (4-7天): 0.75 (25%懲罰)
-- 重度逾期 (8-30天): 0.5 (50%懲罰)
-- 極度逾期 (>30天): 0.3 (70%懲罰)
-```
-
-**輸入驗證規則**:
-```csharp
-// 必須驗證的邊界條件
-if (intervalDays < 0 || intervalDays > 365)
- throw new ArgumentOutOfRangeException("間隔天數必須在 0-365 範圍內");
-
-if (confidenceLevel.HasValue && (confidenceLevel < 1 || confidenceLevel > 5))
- throw new ArgumentOutOfRangeException("信心程度必須在 1-5 範圍內");
-```
-
-**輸出**:
-- 新間隔天數 (1-365天)
-- 下次復習日期
-- 更新後的熟悉程度
-
-#### **F-002: 熟悉程度計算**
-**描述**: 重新設計熟悉程度計算邏輯
-
-**統一計算公式**:
-```csharp
-// 多因子熟悉程度計算公式(含邊界條件處理)
-public static int CalculateMasteryLevel(int timesCorrect, int totalReviews, int currentInterval)
-{
- // 輸入驗證
- if (timesCorrect < 0 || totalReviews < 0 || currentInterval < 0)
- throw new ArgumentException("參數不能為負數");
-
- if (timesCorrect > totalReviews)
- throw new ArgumentException("成功次數不能超過總複習次數");
-
- if (currentInterval > 365)
- throw new ArgumentException("間隔不能超過365天");
-
- // 邊界條件:無複習記錄時返回0
- if (totalReviews == 0)
- return 0;
-
- var successRate = (double)timesCorrect / totalReviews;
- var baseScore = Math.Min(timesCorrect * 8, 60); // 成功次數分數 (最多60分)
- var intervalBonus = Math.Min(currentInterval / 365.0 * 25, 25); // 間隔獎勵 (最多25分)
- var accuracyBonus = successRate * 15; // 準確率獎勵 (最多15分)
-
- return Math.Min(100, (int)Math.Round(baseScore + intervalBonus + accuracyBonus));
-}
-```
-
-**公式說明**:
-- **成功次數分數 (60%)**:`Math.Min(timesCorrect * 8, 60)` - 反映學習次數
-- **間隔獎勵 (25%)**:`Math.Min(currentInterval / 365.0 * 25, 25)` - 反映記憶持久性
-- **準確率獎勵 (15%)**:`successRate * 15` - 反映學習質量
-
-**業務規則**:
-- 新詞彙從0%開始
-- 復習3次後約15-25%熟悉度
-- 復習10次後約40-65%熟悉度
-- 達到90天間隔時約50-70%熟悉度
-- 達到365天間隔時約80-100%熟悉度
-
-#### **F-003: 復習排程系統**
-**描述**: 根據新算法生成每日復習列表
-
-**功能**:
-- 查詢到期詞彙 (NextReviewDate <= 今天)
-- 按優先級排序 (過期天數、難度等)
-- 支援每日復習上限設定
-- 智能分散,避免同時大量到期
-
-#### **F-004: 錯誤處理與資料驗證**
-**描述**: 全面的輸入驗證和錯誤處理機制
-
-**驗證層級**:
-1. **API層驗證**:請求格式、必填欄位、資料類型
-2. **業務邏輯層驗證**:業務規則、數值範圍、邏輯一致性
-3. **資料層驗證**:資料庫約束、參照完整性
-
-**錯誤分類**:
-```csharp
-public enum ReviewErrorCode
-{
- INVALID_INPUT = 4001, // 輸入格式錯誤
- MISSING_REQUIRED_FIELD = 4002, // 缺少必填欄位
- VALUE_OUT_OF_RANGE = 4003, // 數值超出範圍
- DATA_INCONSISTENCY = 4004, // 資料不一致
- FLASHCARD_NOT_FOUND = 4005, // 詞卡不存在
- CALCULATION_ERROR = 5001 // 計算錯誤
-}
-```
-
-**錯誤回應格式**:
-```json
-{
- "success": false,
- "error": {
- "code": "VALUE_OUT_OF_RANGE",
- "message": "信心程度必須在 1-5 範圍內",
- "field": "confidenceLevel",
- "value": 6,
- "timestamp": "2025-09-25T10:30:00Z"
- }
-}
-```
-
-#### **F-005: 資料遷移與相容性**
-**描述**: 確保現有資料平滑遷移到新算法
-
-**遷移策略**:
-1. **階段式部署**:新舊算法並行運行
-2. **資料備份**:遷移前完整備份
-3. **驗證機制**:遷移後資料一致性檢查
-4. **回滾準備**:快速回滾到舊版本
-
-**遷移腳本需求**:
-```sql
--- 為現有資料補充預設值
-UPDATE Flashcards
-SET TimesCorrect = COALESCE(TimesCorrect, 0),
- TotalReviews = COALESCE(TotalReviews, 0)
-WHERE TimesCorrect IS NULL OR TotalReviews IS NULL;
-
--- 資料一致性修正
-UPDATE Flashcards
-SET TimesCorrect = TotalReviews
-WHERE TimesCorrect > TotalReviews;
-```
-
-#### **F-006: 監控指標與效果評估**
-**描述**: 定義明確的系統監控指標和學習效果評估標準
-
-**核心指標定義**:
-
-**學習效率指標**:
-- **學習完成率** = `當日完成複習數 / 當日到期複習數 × 100%`
-- **平均復習時間** = `總復習時間 / 完成復習數`
-- **學習一致性** = `連續7天學習完成率均 > 80% 的比例`
-
-**記憶效果指標**:
-- **短期記憶率** = `7天內再次復習的正確率`
-- **長期記憶率** = `30天後仍能正確回答的比例`
-- **記憶穩定性** = `間隔 > 30天的詞彙正確率`
-
-**算法效能指標**:
-- **間隔適中性** = `復習間隔在 1-365天範圍內的比例`
-- **熟悉程度準確性** = `實際表現與預測熟悉程度的相關係數`
-- **算法響應時間** = `間隔計算平均耗時 (ms)`
-
-**用戶體驗指標**:
-- **學習滿意度** = `用戶評分 (1-5分)`
-- **系統使用頻率** = `每週平均使用天數`
-- **學習目標達成率** = `達成個人學習目標的用戶比例`
-
-**監控實現**:
-```csharp
-public class LearningMetrics
-{
- // 實時計算學習完成率
- public decimal CalculateCompletionRate(DateTime date, int userId)
- {
- var due = GetDueFlashcardsCount(date, userId);
- var completed = GetCompletedReviewsCount(date, userId);
- return due > 0 ? (decimal)completed / due * 100 : 0;
- }
-
- // 計算長期記憶率
- public decimal CalculateLongTermRetention(int userId, int daysPast = 30)
- {
- var reviews = GetReviewsAfterDays(userId, daysPast);
- var correct = reviews.Count(r => r.IsCorrect);
- return reviews.Count > 0 ? (decimal)correct / reviews.Count * 100 : 0;
- }
-}
-```
-
-#### **F-007: 配置參數管理**
-**描述**: 將算法參數外部化,提升系統可維護性和可調優性
-
-**配置結構**:
-```json
-{
- "SpacedRepetition": {
- "GrowthFactors": {
- "ShortTerm": { "Days": "1-7", "Factor": 1.8 },
- "MediumTerm": { "Days": "8-30", "Factor": 1.4 },
- "LongTerm": { "Days": "31-90", "Factor": 1.2 },
- "VeryLongTerm": { "Days": "91+", "Factor": 1.1 }
- },
- "PerformanceFactors": {
- "Confidence": {
- "Level1": 0.5,
- "Level2": 0.7,
- "Level3": 0.9,
- "Level4": 1.1,
- "Level5": 1.4
- },
- "ObjectiveQuestions": {
- "Correct": 1.1,
- "Incorrect": 0.6
- }
- },
- "MasteryCalculation": {
- "BaseScoreWeight": 0.6,
- "IntervalBonusWeight": 0.25,
- "AccuracyBonusWeight": 0.15,
- "MaxInterval": 365
- }
- },
- "Monitoring": {
- "MetricsCalculationInterval": "1h",
- "RetentionTestDays": [7, 30, 90],
- "AlertThresholds": {
- "CompletionRateMin": 0.7,
- "ResponseTimeMax": 100
- }
- }
-}
-```
-
-**配置管理服務**:
-```csharp
-public class SpacedRepetitionConfig
-{
- public GrowthFactors GrowthFactors { get; set; }
- public PerformanceFactors PerformanceFactors { get; set; }
- public MasteryCalculation MasteryCalculation { get; set; }
-}
-
-public interface IConfigurationService
-{
- SpacedRepetitionConfig GetSpacedRepetitionConfig();
- void UpdateConfiguration(SpacedRepetitionConfig config);
- bool ValidateConfiguration(SpacedRepetitionConfig config);
-}
-```
-
-**配置熱更新**:
-- 支援運行時配置更新
-- 配置變更記錄與版本控制
-- A/B測試配置支援
-
-#### **F-008: 逾期復習處理機制**
-**描述**: 處理用戶未按時復習詞卡的情況,實現記憶衰減模型和逾期懲罰機制
-
-**逾期定義**:
-- **逾期天數** = `當前日期 - 預定復習日期`
-- **逾期狀態** = 逾期天數 > 0
-
-**逾期分級**:
-```
-- 準時復習: 0天 (無懲罰)
-- 輕度逾期: 1-3天 (輕微懲罰)
-- 中度逾期: 4-7天 (中等懲罰)
-- 重度逾期: 8-30天 (重度懲罰)
-- 極度逾期: 30天以上 (接近重學)
-```
-
-**逾期懲罰係數算法**:
-```csharp
-public static double CalculateOverduePenalty(int overdueDays)
-{
- if (overdueDays <= 0) return 1.0; // 準時,無懲罰
- if (overdueDays <= 3) return 0.9; // 輕度逾期,10%懲罰
- if (overdueDays <= 7) return 0.75; // 中度逾期,25%懲罰
- if (overdueDays <= 30) return 0.5; // 重度逾期,50%懲罰
- return 0.3; // 極度逾期,70%懲罰
-}
-```
-
-**記憶衰減模型**:
-```csharp
-public static int CalculateMemoryDecay(int originalMastery, int overdueDays)
-{
- if (overdueDays <= 0) return originalMastery;
-
- double decayFactor = Math.Pow(0.95, Math.Min(overdueDays, 30)); // 每天衰減5%
- int adjustedMastery = (int)(originalMastery * decayFactor);
-
- return Math.Max(adjustedMastery, 0); // 最低不低於0%
-}
-```
-
-**修正後的間隔計算公式**:
-```
-新間隔 = (當前間隔 × 增長係數 × 表現係數) × 逾期懲罰係數
-```
-
-**逾期處理流程**:
-1. **計算逾期天數**:`當前日期 - NextReviewDate`
-2. **記憶衰減調整**:調整當前熟悉程度
-3. **懲罰係數應用**:計算逾期懲罰係數
-4. **間隔重新計算**:應用修正公式
-5. **數據更新**:更新間隔、日期、熟悉程度
-
-**特殊處理規則**:
-- **極度逾期 (>30天)**:熟悉程度降至原值的30%,間隔重置為較小值
-- **連續逾期**:連續多次逾期的詞卡,額外增加5%懲罰
-- **首次復習**:新詞卡的首次復習逾期,懲罰係數減半
-
-**逾期統計指標**:
-- **逾期率** = `逾期復習數 / 總到期復習數 × 100%`
-- **平均逾期天數** = `總逾期天數 / 逾期復習數`
-- **記憶保持率** = `逾期後正確率 / 準時復習正確率`
-
-### 3.2 API需求
-
-#### **API-001: 復習記錄API**
-```http
-POST /api/flashcards/{id}/review
-Content-Type: application/json
-
-{
- "isCorrect": boolean,
- "confidenceLevel": number, // 1-5, 翻卡題必須提供
- "questionType": "flipcard" | "multiple_choice" | "fill_blank"
-}
-```
-
-**成功響應**:
-```json
-{
- "success": true,
- "data": {
- "newInterval": 15,
- "nextReviewDate": "2025-10-10",
- "masteryLevel": 65,
- "improvementTip": "表現優秀,繼續保持!"
- }
-}
-```
-
-**錯誤響應**:
-```json
-{
- "success": false,
- "error": {
- "code": "INVALID_INPUT",
- "message": "信心程度必須在 1-5 範圍內",
- "field": "confidenceLevel"
- }
-}
-```
-
-**輸入驗證規則**:
-- `isCorrect`: 必填布林值
-- `confidenceLevel`: 翻卡題必填,範圍 1-5
-- `questionType`: 必填,限定枚舉值
-
-#### **API-002: 復習列表API**
-```http
-GET /api/flashcards/due?date=2025-09-25&limit=50
-```
-
-**響應**:
-```json
-{
- "success": true,
- "data": {
- "dueFlashcards": [...],
- "totalCount": 23,
- "priority": "由優先級排序"
- }
-}
-```
-
-#### **API-003: 學習指標API**
-```http
-GET /api/metrics/learning?userId={id}&period=7d&metrics=completion,retention
-```
-
-**響應**:
-```json
-{
- "success": true,
- "data": {
- "period": "7d",
- "metrics": {
- "completionRate": 85.5,
- "averageReviewTime": 45.2,
- "learningConsistency": 0.71,
- "shortTermRetention": 78.3,
- "longTermRetention": 65.8
- },
- "trends": {
- "completionRate": "+5.2%",
- "retention": "-2.1%"
- }
- }
-}
-```
-
-#### **API-004: 配置管理API**
-```http
-GET /api/config/spaced-repetition
-PUT /api/config/spaced-repetition
-```
-
-**取得配置響應**:
-```json
-{
- "success": true,
- "data": {
- "version": "1.4.0",
- "config": {
- "growthFactors": {
- "shortTerm": 1.8,
- "mediumTerm": 1.4,
- "longTerm": 1.2,
- "veryLongTerm": 1.1
- },
- "performanceFactors": {...},
- "lastModified": "2025-09-25T10:30:00Z",
- "modifiedBy": "admin"
- }
- }
-}
-```
-
-**更新配置請求**:
-```json
-{
- "config": {...},
- "reason": "調整短期復習間隔",
- "effectiveDate": "2025-09-26T00:00:00Z"
-}
-```
-
----
-
-## 4. 非功能需求
-
-### 4.1 性能需求
-- **計算響應時間**: < 100ms
-- **復習列表載入**: < 500ms
-- **支援並發用戶**: 1000+ 同時在線
-- **資料庫查詢優化**: 使用索引,避免全表掃描
-
-### 4.2 可靠性需求
-- **算法準確性**: 100%正確計算間隔
-- **資料一致性**: 確保 IntervalDays 和 NextReviewDate 同步
-- **錯誤處理**: 優雅處理邊界條件和異常輸入
-
-### 4.3 可用性需求
-- **學習曲線**: 新算法對用戶透明,無需額外學習
-- **向後相容**: 現有詞卡資料平滑遷移
-- **配置靈活**: 算法參數可調整
-
----
-
-## 5. 驗收標準
-
-### 5.1 功能驗收
-
-#### **AC-001: 算法正確性**
-- [ ] 新詞卡第一次答對間隔為2天
-- [ ] 新詞卡第一次答錯間隔為1天
-- [ ] 連續答對的詞彙間隔逐漸增長
-- [ ] 答錯的詞彙間隔適度縮短
-- [ ] 間隔永不超過365天
-- [ ] 輸入負數時拋出適當異常
-- [ ] 成功次數超過總次數時拋出異常
-- [ ] 信心程度超出1-5範圍時拋出異常
-
-#### **AC-002: 熟悉程度準確性** (統一公式)
-- [ ] 新詞彙熟悉程度為0%
-- [ ] totalReviews=0時熟悉程度為0%
-- [ ] 復習3次(2次正確)熟悉程度約15-25%
-- [ ] 復習10次(8次正確)熟悉程度約40-65%
-- [ ] 達到90天間隔時熟悉程度約50-70%
-- [ ] 準確率100%且達到365天間隔時熟悉程度約85-100%
-- [ ] 邊界條件處理正確(無異常拋出)
-
-#### **AC-003: 系統整合**
-- [ ] 與現有 Flashcard 實體相容
-- [ ] API響應包含所有必要資訊
-- [ ] 前端正確顯示新的熟悉程度
-
-#### **AC-004: 監控指標準確性**
-- [ ] 學習完成率計算正確 (±2% 誤差內)
-- [ ] 長期記憶率追蹤 30天數據準確
-- [ ] 指標API響應時間 < 200ms
-- [ ] 指標數據每小時更新一次
-
-#### **AC-005: 配置管理功能**
-- [ ] 配置參數熱更新無需重啟服務
-- [ ] 配置變更記錄完整保存
-- [ ] 無效配置自動回滾到上一版本
-- [ ] 配置API權限控制正確
-
-#### **AC-006: 逾期復習處理正確性**
-- [ ] 逾期天數計算準確 (日期差值正確)
-- [ ] 逾期分級判斷正確 (1-3天輕度,4-7天中度等)
-- [ ] 懲罰係數應用正確 (間隔相應縮短)
-- [ ] 記憶衰減計算正確 (每天5%衰減率)
-- [ ] 特殊情況處理正確 (首次復習、連續逾期等)
-- [ ] 極度逾期重學邏輯正確 (熟悉程度大幅降低)
-- [ ] 逾期統計指標計算準確
-
-### 5.2 性能驗收
-- [ ] 間隔計算 < 50ms
-- [ ] 復習列表生成 < 200ms
-- [ ] 1000個詞卡批次更新 < 5s
-
-### 5.3 用戶體驗驗收
-- [ ] 復習頻率感覺合理,不會太頻繁或太稀疏
-- [ ] 學習進度顯示直觀
-- [ ] 系統切換對用戶無感知
-
----
-
-## 6. 技術約束
-
-### 6.1 現有系統整合
-- **資料庫相容**: 必須使用現有 Flashcard 實體結構
-- **API相容**: 保持現有 API 介面不變
-- **前端整合**: 熟悉程度顯示邏輯需更新
-
-### 6.2 實作限制
-- **開發時間**: 2-3個工作日
-- **測試時間**: 1個工作日
-- **上線影響**: 零停機時間部署
-
-### 6.3 技術選擇
-- **算法實作**: C# 服務類別
-- **資料儲存**: SQLite 資料庫
-- **配置管理**: appsettings.json
-
----
-
-## 7. 實作規劃
-
-### 7.1 開發階段
-
-#### **階段1: 核心算法實作 (Day 1)**
-- [ ] 創建 SpacedRepetitionService 服務
-- [ ] 實作間隔計算邏輯
-- [ ] 單元測試覆蓋
-
-#### **階段2: API整合 (Day 2)**
-- [ ] 修改 FlashcardsController
-- [ ] 更新復習相關端點
-- [ ] 整合測試
-
-#### **階段3: 前端更新 (Day 3)**
-- [ ] 更新熟悉程度顯示
-- [ ] 修改復習界面
-- [ ] 端到端測試
-
-### 7.2 測試策略
-- **單元測試**: 算法邏輯正確性
-- **整合測試**: API和資料庫整合
-- **用戶測試**: 實際學習場景驗證
-
-### 7.3 部署計劃
-
-#### **階段式部署策略**
-- **Phase 1 (10% 用戶)**: 內部測試和算法驗證
-- **Phase 2 (30% 用戶)**: 擴大測試範圍,收集指標數據
-- **Phase 3 (100% 用戶)**: 全量部署新算法
-
-#### **配置管理部署**
-- **配置熱更新**: 支援運行時參數調整
-- **配置版本控制**: 每次變更記錄版本和變更原因
-- **自動回滾**: 檢測到異常時自動恢復前一版本配置
-- **監控告警**: 配置變更後24小時內密切監控關鍵指標
-
-#### **監控指標**
-- **實時監控**: 學習完成率、記憶率、響應時間
-- **告警閾值**: 完成率 < 70% 或響應時間 > 100ms 時觸發告警
-- **數據收集**: 每小時更新指標數據,生成每日/週報告
-
-#### **回滾準備**
-- **快速切換**: 一鍵切換回舊算法 (< 5分鐘)
-- **數據備份**: 部署前完整備份所有學習數據
-- **兼容性**: 新舊算法數據結構完全兼容
-
----
-
-## 8. 風險評估
-
-### 8.1 技術風險
-- **風險**: 新算法可能影響現有學習進度
-- **緩解**: 平滑遷移策略,保持用戶體驗一致性
-
-### 8.2 業務風險
-- **風險**: 用戶可能不適應新的復習頻率
-- **緩解**: 提供算法切換選項,漸進式推出
-
-### 8.3 性能風險
-- **風險**: 複雜算法可能影響系統性能
-- **緩解**: 算法預計算,結果快取
-
----
-
-## 9. 驗證和測試
-
-### 9.1 測試用例
-
-#### **TC-001: 新詞卡復習測試**
-```
-前置條件: 用戶新增詞卡 "entrepreneurship"
-測試步驟:
-1. 系統設定 IntervalDays = 1
-2. 用戶第一次復習答對
-3. 驗證新間隔 = 2天
-4. 用戶第二次復習答錯
-5. 驗證新間隔 = 約2-3天(不增長太多)
-
-預期結果: 間隔計算符合算法邏輯
-```
-
-#### **TC-002: 長期學習軌跡測試**
-```
-前置條件: 模擬一個詞彙的15次復習
-測試步驟:
-1. 模擬連續答對的情況
-2. 記錄每次間隔變化
-3. 驗證熟悉程度增長曲線
-4. 確認最終間隔不超過365天
-
-預期結果: 學習軌跡符合預期,熟悉程度平滑增長
-```
-
-#### **TC-003: 邊界條件測試**
-```
-測試場景: 異常輸入處理
-測試步驟:
-1. 測試 totalReviews = 0 的情況
-2. 測試 timesCorrect > totalReviews 的情況
-3. 測試負數輸入
-4. 測試信心等級超出範圍
-5. 測試間隔超過365天
-
-預期結果: 所有異常情況都能正確處理,返回適當錯誤訊息
-```
-
-#### **TC-004: 信心等級映射測試**
-```
-測試場景: 翻卡題信心等級處理
-測試步驟:
-1. 測試信心等級1-5的表現係數計算
-2. 驗證間隔計算結果的合理性
-3. 確認不同信心等級的學習軌跡差異
-
-預期結果: 信心等級正確映射到表現係數,影響間隔計算
-```
-
-#### **TC-005: 逾期復習處理測試**
-```
-測試場景: 不同程度的逾期復習處理
-測試步驟:
-1. 輕度逾期測試 (預定9/23,實際9/26復習)
- - 逾期天數 = 3天
- - 懲罰係數 = 0.9
- - 驗證間隔縮短10%
-2. 重度逾期測試 (預定9/15,實際9/25復習)
- - 逾期天數 = 10天
- - 懲罰係數 = 0.5
- - 驗證熟悉程度衰減和間隔大幅縮短
-3. 極度逾期測試 (預定8/25,實際9/25復習)
- - 逾期天數 = 31天
- - 懲罰係數 = 0.3
- - 驗證接近重學狀態
-
-預期結果: 逾期天數正確影響間隔計算和熟悉程度
-```
-
-#### **TC-006: 記憶衰減模型測試**
-```
-測試場景: 不同逾期天數的記憶衰減驗證
-測試數據:
-- 原始熟悉程度: 80%
-- 逾期3天: 預期約73% (80% × 0.95³)
-- 逾期7天: 預期約56% (80% × 0.95⁷)
-- 逾期15天: 預期約38% (80% × 0.95¹⁵)
-- 逾期30天: 預期約17% (80% × 0.95³⁰)
-
-預期結果: 記憶衰減計算正確,符合指數衰減模型
-```
-
-#### **TC-007: 逾期特殊情況測試**
-```
-測試場景: 特殊逾期情況處理
-測試步驟:
-1. 新詞卡首次復習逾期 (懲罰係數減半)
-2. 連續逾期詞卡處理 (額外5%懲罰)
-3. 極度逾期後答錯處理 (雙重懲罰)
-4. 逾期但表現優秀 (高信心等級) 的權衡
-
-預期結果: 特殊規則正確應用,邏輯合理
-```
-
-### 9.2 性能基準
-- **算法計算**: 平均 < 10ms,P99 < 50ms
-- **資料庫更新**: 平均 < 20ms,P99 < 100ms
-- **內存使用**: 增加 < 10MB
-
----
-
-## 10. 附錄
-
-### 10.1 術語定義
-- **間隔 (Interval)**: 兩次復習之間的天數
-- **熟悉程度 (Mastery Level)**: 詞彙掌握程度百分比
-- **增長係數**: 間隔增長的倍數
-- **表現係數**: 根據答題表現的調整倍數
-
-### 10.2 參考資料
-- Hermann Ebbinghaus 遺忘曲線理論
-- SuperMemo SM-2 算法
-- Anki 間隔重複實作
-
-### 10.3 相關文檔
-- 複習算法優化建議.md
-- 複習算法完整設計方案.md
-- 複習算法簡化說明.md
-
----
-
----
-
-## 11. 修訂記錄
-
-| 版本 | 日期 | 修改內容 | 修改者 |
-|-----|------|----------|--------|
-| 1.0 | 2025-09-25 | 初始版本 | 系統分析師 |
-| 1.1 | 2025-09-25 | **修正熟悉程度計算邏輯矛盾**
- 統一F-002中的計算公式
- 更新AC-002驗收標準
- 添加詳細公式說明和權重分配 | Claude AI |
-| 1.2 | 2025-09-25 | **基於驗證報告的全面優化**
- 明確信心等級映射邏輯 (1-5 → 0.5-1.4)
- 增強邊界條件處理和輸入驗證
- 添加 F-004 錯誤處理機制
- 添加 F-005 資料遷移策略
- 完善 API 錯誤響應格式
- 增強驗收標準覆蓋邊界條件
- 新增 TC-003/TC-004 測試用例 | Claude AI |
-| 1.3 | 2025-09-25 | **簡化輸入參數**
- 移除反應時間相關參數和驗證
- 簡化 API 請求格式
- 更新輸入驗證規則 | Claude AI |
-| 1.4 | 2025-09-25 | **新增監控與配置管理**
- 添加 F-006 監控指標與效果評估
- 添加 F-007 配置參數管理
- 新增 API-003 學習指標API
- 新增 API-004 配置管理API
- 完善部署計劃和監控策略
- 新增 AC-004/AC-005 驗收標準 | Claude AI |
-| 1.5 | 2025-09-25 | **補充逾期復習處理機制**
- 添加 F-008 逾期復習處理機制
- 設計記憶衰減模型和懲罰係數算法
- 修正間隔計算公式包含逾期處理
- 新增場景3逾期復習使用場景
- 新增 TC-005/TC-006/TC-007 逾期測試用例
- 新增 AC-006 逾期處理驗收標準
- 補充重要的負向測試案例覆蓋 | Claude AI |
-
----
-
-**審核**: [待填入]
-**批准**: [待填入]
-**簽署日期**: [待填入]
\ No newline at end of file