feat: 完成智能複習系統7種複習方式整合與文檔更新

## 📋 主要更新內容

### 🎯 新增7種複習題型設計
- 翻卡題: 基於信心程度的主觀評估
- 選擇題: 定義匹配的客觀測試
- 填空題: 拼字練習和情境應用
- 例句重組: 語法和句型練習
- 詞彙聽力: 發音記憶強化
- 例句聽力: 聽力理解練習
- 例句口說: 發音和表達練習

### 🧠 智能題型推薦算法
- A1學習者專屬保護機制
- 根據學習程度vs詞彙難度適配題型
- 避免連續重複,確保學習多樣性
- 基於表現動態調整推薦策略

### 📚 文檔全面更新
- **前端功能規格書**: 新增完整React組件實現
- **產品需求規格書**: 擴展用戶故事和功能需求
- **測試規格書**: 新增8個複習題型測試案例
- **演算法規格書**: 完善複習方式選擇算法

### 🎨 用戶體驗優化
- A1初學者友好的學習路徑
- 音頻錄製和播放功能整合
- 程度適配的漸進式題型解鎖
- 智能推薦準確率>75%目標

## 🔧 技術實現亮點
- 7種題型的完整前端組件
- 複習方式選擇算法 (O(k)複雜度)
- A1學習者權重分配機制
- 音頻API跨瀏覽器兼容處理

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
鄭沛軒 2025-09-25 16:40:36 +08:00
parent 656916bbd9
commit 82a959863d
7 changed files with 2389 additions and 370 deletions

View File

@ -38,54 +38,6 @@
- 複習方式:翻卡題、選擇題
## 複習流程
### 複習時間
下次複習時間根據以下參數計算
1. 成功複習次數(間隔重複算法)
- 下次複習時間 = 2^成功複習次數
2. 答題錯誤校正:
- 計算時機:當測驗題目答錯時,對於下次複習時間進行調整
3. 當下次複習時間計算後大於365天時標記該詞彙為已熟悉
4. 熟悉程度 = 下次複習天數/365天
#### 間隔重複算法SM-2
- **算法參數**
- 初始間隔2^0天、2^1天...依此類推
- 最小間隔1天
- 最大間隔365天
#### 答題錯誤校正
- 翻卡答題:
- 完全不記得:下次複習天數 x 0.6
- 猶豫但正確:下次複習天數 x 1
- 輕鬆正確:下次複習天數 x 1.4
- 選擇題:
- 答對:下次複習天數 x 1
- 答錯:下次複習天數 x 0.6
- 詞彙聽力題:
- 答對:下次複習天數 x 1
- 答錯:下次複習天數 x 0.6
- 例句聽力題:
- 答對:下次複習天數 x 1
- 答錯:下次複習天數 x 0.6
- 填空題:
- 答對:下次複習天數 x 1
- 答錯:下次複習天數 x 0.6
- 例句重組題:
- 答對:下次複習天數 x 1
- 答錯:下次複習天數 x 0.6
- 例句口說題:
- 答對:下次複習天數 x 1
- 答錯:下次複習天數 x 0.6
#### 複習排程
- 每日複習上限設定預設50個
- 優先級排序(過期天數)
- 智能分散(避免同時大量到期)
## 複習進度

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
# 智能複習系統 - 技術規格書 (TSD)
# 智能複習系統 - 後端功能規格書 (BFS)
**目標讀者**: 後端開發工程師、系統架構師
**版本**: 1.0
@ -144,6 +144,27 @@ public class SpacedRepetitionService
}
```
#### **批次查詢 API**
```http
GET /api/flashcards/batch?ids=1,2,3,4,5
```
```json
{
"success": true,
"data": [
{
"id": 1,
"baseMasteryLevel": 75,
"currentMasteryLevel": 68,
"isOverdue": true,
"overdueDays": 1
},
// ... 更多詞卡
]
}
```
#### **錯誤響應**
```json
{
@ -290,6 +311,41 @@ public class ReviewMetrics
---
## 🧪 **測試策略**
### **單元測試**
```csharp
[Test]
public void CalculateCurrentMasteryLevel_ShouldApplyDecay_WhenOverdue()
{
// Arrange
var flashcard = new Flashcard
{
BaseMasteryLevel = 80,
LastReviewDate = DateTime.Now.AddDays(-7)
};
// Act
var result = _service.CalculateCurrentMasteryLevel(flashcard);
// Assert
Assert.That(result, Is.LessThan(80)); // 應該有衰減
Assert.That(result, Is.GreaterThan(50)); // 不應該衰減太多
}
```
### **整合測試**
- API 端點測試
- 資料庫整合測試
- 錯誤處理測試
### **性能測試**
- 1000+ 並發用戶測試
- 大量詞卡批次處理測試
- 記憶體使用量監控
---
**實施時間**: 2-3個工作日
**測試時間**: 1個工作日
**上線影響**: 零停機時間部署

View File

@ -8,20 +8,20 @@
## 📚 **文檔架構**
為了提升可讀性和針對性,原始的複雜需求規格書 (875行) 已重構為個專用文檔:
為了提升可讀性和針對性,原始的複雜需求規格書 (875行) 已重構為個專用文檔:
### **🎯 按角色分類**
| 角色 | 文檔 | 內容重點 | 頁數 |
|------|------|---------|------|
| **產品經理** | [智能複習系統-產品需求規格書.md](./智能複習系統-產品需求規格書.md) | 業務目標、用戶故事、KPI、產品路線圖 | ~2頁 |
| **技術人員** | [智能複習系統-技術規格書.md](./智能複習系統-技術規格書.md) | 系統架構、API設計、資料庫設計、部署 | ~3頁 |
| **演算法工程師** | [智能複習系統-演算法規格書.md](./智能複習系統-演算法規格書.md) | 數學模型、算法驗證、參數調優 | ~3頁 |
| **後端工程師** | [智能複習系統-後端功能規格書.md](./智能複習系統-後端功能規格書.md) | API設計、資料庫設計、系統架構、部署 | ~4頁 |
| **前端工程師** | [智能複習系統-前端功能規格書.md](./智能複習系統-前端功能規格書.md) | UI組件、API整合、狀態管理、用戶體驗 | ~4頁 |
| **測試人員** | [智能複習系統-測試規格書.md](./智能複習系統-測試規格書.md) | 測試案例、負向測試、性能測試 | ~3頁 |
### **📋 參考文檔**
- [智能複習系統驗證報告.md](./智能複習系統驗證報告.md) - 詳細驗證分析
- [智能複習系統需求規格書.md](./智能複習系統需求規格書.md) - 原始完整規格 (備查)
---
@ -32,11 +32,16 @@
2. 查看 KPI 指標和產品路線圖
3. 評估投資回報和風險
### **開發工程師**:
1. 閱讀 [技術規格書](./智能複習系統-技術規格書.md) 了解架構設計
### **後端工程師**:
1. 閱讀 [後端功能規格書](./智能複習系統-後端功能規格書.md) 了解系統架構
2. 查看 API 接口和數據庫變更
3. 檢查部署檢查清單
### **前端工程師**:
1. 閱讀 [前端功能規格書](./智能複習系統-前端功能規格書.md) 了解組件設計
2. 查看 UI/UX 規範和API整合方式
3. 實現響應式設計和動畫效果
### **演算法工程師**:
1. 閱讀 [演算法規格書](./智能複習系統-演算法規格書.md) 了解數學模型
2. 理解核心算法公式和設計理念

View File

@ -13,10 +13,16 @@
- 確保逾期處理邏輯合理
- 驗證API輸入輸出正確性
- 確保系統性能符合要求
- 驗證7種複習題型功能正確性
- 測試智能題型推薦算法準確性
- 確保音頻功能在不同設備上正常運作
- 驗證A1學習者專屬邏輯
### **不測試範圍**
- 前端UI/UX測試
- 第三方服務整合測試
- 語音識別準確度 (依賴第三方服務)
- 音頻品質主觀評價
---
@ -75,6 +81,135 @@ Scenario: 準時復習基準測試
And 下次復習日期 = 2025-09-20 + 21天 = 2025-10-11
```
### **TC-010: 複習題型選擇測試**
```gherkin
Scenario: A1學習者題型選擇
Given 用戶是A1程度學習者 (userLevel = 15)
When 系統為其推薦複習題型
Then 推薦題型應限制為 ["flipcard", "multiple_choice", "vocabulary_listening"]
And 不應推薦 ["fill_blank", "sentence_reconstruction", "sentence_speaking"]
Scenario: 簡單詞彙題型選擇
Given 用戶程度60詞彙難度40 (difficulty = -20)
When 系統計算適合的複習題型
Then 推薦題型應為 ["sentence_reconstruction", "fill_blank"]
Scenario: 困難詞彙題型選擇
Given 用戶程度40詞彙難度70 (difficulty = +30)
When 系統計算適合的複習題型
Then 推薦題型應為 ["flipcard", "multiple_choice"]
```
### **TC-011: 翻卡題測試**
| 測試案例 | 輸入 | 預期輸出 | 優先級 |
|---------|------|---------|--------|
| 高信心翻卡 | confidenceLevel=5 | performanceFactor=1.4 | P0 |
| 低信心翻卡 | confidenceLevel=1 | performanceFactor=0.5 | P0 |
| 中等信心翻卡 | confidenceLevel=3 | performanceFactor=0.9 | P1 |
### **TC-012: 選擇題測試**
```gherkin
Scenario: 選擇題答對
Given 詞卡 "apple" 定義 "a red fruit"
When 用戶選擇正確答案 "apple"
Then isCorrect = true
And performanceFactor = 1.1
Scenario: 選擇題答錯
Given 詞卡 "apple" 定義 "a red fruit"
When 用戶選擇錯誤答案 "orange"
Then isCorrect = false
And performanceFactor = 0.6
```
### **TC-013: 填空題測試**
```gherkin
Scenario: 填空題拼字正確
Given 例句 "I eat an ___ every day"
And 正確答案 "apple"
When 用戶填入 "apple"
Then 答案應標記為正確
Scenario: 填空題大小寫不敏感
Given 例句 "I eat an ___ every day"
And 正確答案 "apple"
When 用戶填入 "Apple" 或 "APPLE"
Then 答案應標記為正確
```
### **TC-014: 例句重組測試**
```gherkin
Scenario: 句子重組正確
Given 打亂的單字 ["I", "eat", "an", "apple"]
And 正確順序 "I eat an apple"
When 用戶重組為 "I eat an apple"
Then 答案應標記為正確
Scenario: 句子重組順序錯誤
Given 打亂的單字 ["I", "eat", "an", "apple"]
When 用戶重組為 "apple eat I an"
Then 答案應標記為錯誤
```
### **TC-015: 聽力題測試**
```gherkin
Scenario: 詞彙聽力題
Given 音頻檔案播放 "apple"
And 選項 ["apple", "orange", "banana"]
When 用戶選擇 "apple"
Then 答案應標記為正確
Scenario: 音頻載入失敗
Given 音頻檔案不存在或損壞
When 用戶嘗試播放音頻
Then 系統應顯示錯誤訊息
And 提供跳過此題的選項
```
### **TC-016: 口說題測試**
```gherkin
Scenario: 口說錄音成功
Given 用戶設備支援麥克風
When 用戶開始錄音並說話
Then 應成功錄製音頻檔案
And 檔案大小應 > 0
Scenario: 麥克風權限被拒絕
Given 用戶拒絕麥克風權限
When 系統嘗試開始錄音
Then 應顯示權限請求提示
And 提供手動授權指導
```
### **TC-017: 智能推薦系統測試**
```gherkin
Scenario: 避免連續重複題型
Given 用戶最近3次都使用翻卡題
When 系統推薦下一個題型
Then 不應推薦翻卡題
And 應從其他可用題型中選擇
Scenario: A1權重分配測試
Given A1學習者可用題型 ["flipcard", "multiple_choice", "vocabulary_listening"]
When 系統執行100次推薦
Then 翻卡題出現約40次選擇題約40次聽力題約20次
```
### **TC-018: A1學習者專屬測試**
```gherkin
Scenario: A1學習者信心建立
Given A1用戶 (userLevel ≤ 20)
When 用戶完成復習
Then 應優先選擇成功率較高的題型
And 應提供更多鼓勵性反饋
Scenario: A1學習者題型限制
Given A1用戶嘗試訪問高難度題型
When 系統檢查用戶程度
Then 應溫和地建議使用基礎題型
And 提供程度提升的學習建議
```
---
## ❌ **負向測試案例**
@ -87,6 +222,9 @@ Scenario: 準時復習基準測試
| 缺少必填欄位 | {} | 400錯誤 | MISSING_REQUIRED_FIELD |
| 錯誤資料類型 | isCorrect="yes" | 400錯誤 | INVALID_INPUT |
| 不存在詞卡ID | id=99999 | 404錯誤 | FLASHCARD_NOT_FOUND |
| 不支援的題型 | questionType="unknown" | 400錯誤 | INVALID_QUESTION_TYPE |
| 空白用戶答案 | userAnswer="" | 400錯誤 | EMPTY_ANSWER |
| 音頻檔案過大 | audioFile > 10MB | 413錯誤 | FILE_TOO_LARGE |
### **邊界條件測試**
```
@ -115,6 +253,10 @@ Scenario: 準時復習基準測試
| 單次復習記錄 | < 100ms | 100次請求平均值 |
| 複習列表查詢 | < 500ms | 查詢50個到期詞卡 |
| 批量數據更新 | < 5s | 1000個詞卡批量更新 |
| 題型推薦算法 | < 10ms | 單次計算響應時間 |
| 音頻檔案上傳 | < 3s | 5MB音頻檔案上傳 |
| 複習題目生成 | < 200ms | 包含選項和音頻URL |
| A1用戶專屬邏輯 | < 50ms | 程度檢查和題型篩選 |
### **併發測試**
```
@ -136,12 +278,29 @@ Scenario: 準時復習基準測試
### **測試資料準備**
```sql
-- 創建測試用詞卡數據
INSERT INTO Flashcards (Word, NextReviewDate, IntervalDays, TimesCorrect, TotalReviews)
INSERT INTO Flashcards (Word, Definition, Example, NextReviewDate, IntervalDays, TimesCorrect, TotalReviews, UserLevel, WordLevel)
VALUES
('test1', '2025-09-25', 1, 0, 0), -- 新詞卡
('test2', '2025-09-20', 7, 3, 4), -- 逾期詞卡
('test3', '2025-09-25', 30, 8, 10), -- 正常詞卡
('test4', '2025-08-25', 90, 15, 15); -- 極度逾期
('test1', 'a test word', 'This is a test1 example', '2025-09-25', 1, 0, 0, 15, 20), -- A1新詞卡
('test2', 'another test word', 'This is a test2 example', '2025-09-20', 7, 3, 4, 60, 40), -- 簡單逾期詞卡
('test3', 'advanced test word', 'This is a test3 example', '2025-09-25', 30, 8, 10, 50, 50), -- 適中詞卡
('test4', 'difficult test word', 'This is a test4 example', '2025-08-25', 90, 15, 15, 40, 70); -- 困難逾期詞卡
-- 創建測試用音頻資料
INSERT INTO AudioFiles (FlashcardId, AudioType, FilePath)
VALUES
(1, 'vocabulary', '/test-audio/test1-vocab.mp3'),
(1, 'sentence', '/test-audio/test1-sentence.mp3'),
(2, 'vocabulary', '/test-audio/test2-vocab.mp3');
-- 創建測試用選項資料 (選擇題用)
INSERT INTO QuestionOptions (FlashcardId, OptionText, IsCorrect)
VALUES
(1, 'test1', true),
(1, 'wrong1', false),
(1, 'wrong2', false),
(2, 'test2', true),
(2, 'wrong3', false),
(2, 'wrong4', false);
```
### **測試工具**
@ -149,6 +308,14 @@ VALUES
- **API測試**: Postman/Newman
- **負載測試**: JMeter/k6
- **資料庫測試**: 直接SQL驗證
- **音頻測試**:
- 瀏覽器相容性測試: BrowserStack
- 音頻檔案驗證: FFmpeg
- 錄音功能測試: MediaRecorder API
- **演算法測試**:
- 題型推薦準確性: 自訂測試框架
- A1邏輯驗證: 單元測試 + 模擬資料
- **前端整合測試**: Cypress/Playwright (UI互動)
---
@ -160,27 +327,51 @@ VALUES
- [ ] 逾期處理邏輯正確
- [ ] 熟悉程度計算準確
- [ ] API輸入驗證完整
- [ ] 7種複習題型功能正確
- [ ] 智能題型推薦準確
- [ ] A1學習者專屬邏輯正確
- [ ] 音頻播放和錄製功能正常
### **複習題型專項測試**
- [ ] 翻卡題信心等級處理
- [ ] 選擇題答案驗證
- [ ] 填空題大小寫處理
- [ ] 例句重組邏輯正確
- [ ] 詞彙聽力音頻播放
- [ ] 例句聽力選項生成
- [ ] 口說題錄音和上傳
### **非功能測試**
- [ ] 響應時間符合要求
- [ ] 併發測試無錯誤
- [ ] 記憶體使用穩定
- [ ] 負向測試全部通過
- [ ] 音頻處理性能達標
- [ ] 題型推薦算法效能
### **整合測試**
- [ ] 與現有系統相容
- [ ] 資料庫操作正確
- [ ] 錯誤處理機制有效
- [ ] 前端題型組件整合
- [ ] 音頻API跨瀏覽器相容
### **用戶體驗測試**
- [ ] A1學習者友好性
- [ ] 題型切換流暢性
- [ ] 音頻品質可接受
- [ ] 錯誤訊息清晰易懂
---
## 🐛 **缺陷分類**
### **嚴重等級定義**
- **P0 (Blocker)**: 算法計算錯誤、系統崩潰
- **P1 (Critical)**: 逾期處理錯誤、性能不達標
- **P2 (Major)**: 輸入驗證缺失、錯誤訊息不準確
- **P3 (Minor)**: 日誌格式、響應字段缺失
- **P0 (Blocker)**: 算法計算錯誤、系統崩潰、主要題型無法使用
- **P1 (Critical)**: 逾期處理錯誤、性能不達標、音頻功能完全失效
- **P2 (Major)**: 輸入驗證缺失、錯誤訊息不準確、特定題型功能異常
- **P3 (Minor)**: 日誌格式、響應字段缺失、音頻品質次佳
- **P4 (Trivial)**: 題型推薦不夠精準、A1用戶體驗可優化
### **測試報告模板**
```

View File

@ -70,13 +70,29 @@ def get_growth_factor(current_interval):
### **2. 表現係數函數**
```python
def get_performance_factor(is_correct, confidence_level=None, question_type="flipcard"):
"""
根據不同題型計算表現係數
"""
if question_type == "flipcard":
# 信心等級映射 (1-5 → 0.5-1.4)
# 翻卡題:信心等級映射 (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:
# 客觀題
elif question_type in ["multiple_choice", "fill_blank", "sentence_reconstruction"]:
# 客觀題:正確性導向
return 1.1 if is_correct else 0.6
elif question_type in ["vocabulary_listening", "sentence_listening"]:
# 聽力題:正確性 + 輕微加權 (聽力更困難)
return 1.2 if is_correct else 0.5
elif question_type == "sentence_speaking":
# 口說題:主觀評估 (通常標記為成功)
return 1.0 # 口說練習重在參與,不重罰
else:
# 預設情況
return 0.9
```
**設計理念**: 翻卡題依據主觀信心,客觀題依據正確性,反映不同題型的認知特點。
@ -113,6 +129,132 @@ def calculate_memory_decay(original_mastery, overdue_days):
**設計理念**: 符合認知科學的遺忘曲線,逾期越久記憶衰減越多。
### **6. 複習方式選擇算法**
#### **6.1 學習程度適配算法**
```python
def get_review_types_by_difficulty(user_level, word_level):
"""
根據學習者程度和詞彙難度決定可用的複習方式
Args:
user_level: 學習者程度 (1-100)
word_level: 詞彙難度 (1-100)
Returns:
List[str]: 適合的複習題型列表
"""
difficulty = word_level - user_level
if user_level <= 20:
# A1學習者 - 統一基礎題型,建立信心
return ['flipcard', 'multiple_choice', 'vocabulary_listening']
elif difficulty < -10:
# 簡單詞彙 (學習者程度 > 詞彙程度)
# 重點練習應用和拼寫
return ['sentence_reconstruction', 'fill_blank']
elif difficulty >= -10 and difficulty <= 10:
# 適中詞彙 (學習者程度 ≈ 詞彙程度)
# 全方位練習,包括口說
return ['fill_blank', 'sentence_reconstruction', 'sentence_speaking']
else:
# 困難詞彙 (學習者程度 < 詞彙程度)
# 回到基礎,重建記憶
return ['flipcard', 'multiple_choice']
```
**設計原則**:
- **A1優先**: 初學者使用最基本的3種題型避免挫折
- **能力匹配**: 難度適中時使用高階題型 (口說、重組)
- **困難降級**: 詞彙太難時回歸基礎題型
- **逐步進階**: 隨著能力提升,逐漸解鎖更多題型
#### **6.2 智能題型推薦算法**
```python
def select_review_mode(available_modes, flashcard, review_history=None):
"""
從可用題型中智能選擇當前最適合的複習方式
Args:
available_modes: 可用的複習題型列表
flashcard: 當前詞卡資訊
review_history: 最近的復習歷史 (可選)
Returns:
str: 推薦的複習題型
"""
if not review_history:
review_history = []
# 1. 避免連續重複 (反單調算法)
recent_modes = [r.question_type for r in review_history[-3:]]
if recent_modes:
last_mode = recent_modes[-1]
consecutive_count = 0
for mode in reversed(recent_modes):
if mode == last_mode:
consecutive_count += 1
else:
break
# 連續2次以上強制切換
if consecutive_count >= 2:
available_modes = [m for m in available_modes if m != last_mode]
if not available_modes: # 如果沒有其他選項,保留原選項
available_modes = [last_mode]
# 2. A1學習者權重分配
if flashcard.user_level <= 20:
weights = {
'flipcard': 0.4, # 40% - 主要熟悉方式
'multiple_choice': 0.4, # 40% - 概念強化
'vocabulary_listening': 0.2 # 20% - 發音練習
}
return weighted_random_select(available_modes, weights)
# 3. 根據最近表現調整
if review_history:
recent_performance = sum([r.is_correct for r in review_history[-5:]]) / len(review_history[-5:])
if recent_performance < 0.6:
# 表現不佳,偏向基礎題型
priority_order = ['flipcard', 'multiple_choice', 'fill_blank',
'sentence_reconstruction', 'vocabulary_listening', 'sentence_speaking']
else:
# 表現良好,偏向挑戰題型
priority_order = ['sentence_speaking', 'sentence_reconstruction', 'fill_blank',
'vocabulary_listening', 'multiple_choice', 'flipcard']
for mode in priority_order:
if mode in available_modes:
return mode
# 4. 預設隨機選擇
return random.choice(available_modes)
def weighted_random_select(items, weights):
"""權重隨機選擇"""
total_weight = sum(weights.get(item, 1.0/len(items)) for item in items)
random_num = random.random() * total_weight
for item in items:
weight = weights.get(item, 1.0/len(items))
random_num -= weight
if random_num <= 0:
return item
return items[0] # 備用返回
```
**演算法特點**:
- **反單調性**: 避免連續使用相同題型超過2次
- **適應性**: 根據最近表現動態調整題型偏好
- **穩定性**: A1學習者有固定的權重分配
- **魯棒性**: 各種邊界情況都有合理的備用方案
### **5. 熟悉程度計算 (雙重概念)**
#### **5.1 基礎熟悉度計算 (存入資料庫)**
@ -181,6 +323,13 @@ def calculate_current_mastery_level(base_mastery, last_review_date):
- **間隔上限**: 365天確保不會無限增長
- **收斂速度**: 約15-20次復習達到長期記憶階段
- **穩定性**: 表現波動不會導致劇烈間隔變化
- **題型收斂**: A1學習者在基礎題型間穩定切換進階學習者逐步使用高階題型
### **複習方式算法分析**
- **覆蓋性**: 保證每個學習者都有適合的題型可用
- **多樣性**: 避免單一題型平均每次復習切換1-2種題型
- **適應性**: 根據表現調整,表現好→挑戰題型,表現差→基礎題型
- **公平性**: A1學習者有專屬的保護機制不會被推薦困難題型
### **參數敏感性**
| 參數 | 影響程度 | 調優建議 |
@ -189,6 +338,8 @@ def calculate_current_mastery_level(base_mastery, last_review_date):
| 逾期懲罰 | 中 | 可根據用戶行為數據調優 |
| 衰減率 | 中 | 建議基於記憶實驗數據設定 |
| 權重分配 | 低 | 相對穩定,微調即可 |
| A1題型權重 | 中 | 影響初學者體驗,需謹慎調整 |
| 連續重複限制 | 低 | 2-3次為佳過低影響深入練習 |
### **邊界條件處理**
```python
@ -218,10 +369,14 @@ def validate_inputs(interval, times_correct, total_reviews):
### **性能複雜度**
- **基礎熟悉度**: O(1) - 常數時間計算
- **當前熟悉度**: O(1) - 常數時間計算
- **題型選擇**: O(k) - k為可用題型數量 (通常≤7)
- **智能推薦**: O(h) - h為歷史記錄查看數量 (通常≤5)
- **空間複雜度**: O(1) - 無額外存儲需求
- **預期性能**:
- 單次計算: < 1ms
- 題型推薦: < 5ms
- 列表頁批次計算: < 10ms (100個詞卡)
- A1邏輯檢查: < 1ms
---
@ -230,7 +385,7 @@ def validate_inputs(interval, times_correct, total_reviews):
### **A/B 測試建議**
```json
{
"test_groups": {
"interval_algorithm": {
"conservative": {
"growth_factors": [1.6, 1.3, 1.1, 1.05],
"description": "保守增長,更多復習機會"
@ -243,6 +398,40 @@ def validate_inputs(interval, times_correct, total_reviews):
"growth_factors": [1.8, 1.4, 1.2, 1.1],
"description": "當前推薦參數"
}
},
"review_type_strategy": {
"diversity_focused": {
"consecutive_limit": 1,
"a1_weights": {"flipcard": 0.33, "multiple_choice": 0.33, "vocabulary_listening": 0.34},
"description": "最大多樣性,每次都換題型"
},
"stability_focused": {
"consecutive_limit": 3,
"a1_weights": {"flipcard": 0.5, "multiple_choice": 0.3, "vocabulary_listening": 0.2},
"description": "允許深入練習,偏重翻卡題"
},
"current": {
"consecutive_limit": 2,
"a1_weights": {"flipcard": 0.4, "multiple_choice": 0.4, "vocabulary_listening": 0.2},
"description": "平衡多樣性和穩定性"
}
},
"a1_protection": {
"strict": {
"level_threshold": 25,
"allowed_types": ["flipcard", "multiple_choice"],
"description": "更嚴格保護只允許2種題型"
},
"moderate": {
"level_threshold": 20,
"allowed_types": ["flipcard", "multiple_choice", "vocabulary_listening"],
"description": "當前標準"
},
"relaxed": {
"level_threshold": 15,
"allowed_types": ["flipcard", "multiple_choice", "vocabulary_listening", "fill_blank"],
"description": "較寬鬆,允許填空題"
}
}
}
```
@ -251,6 +440,11 @@ def validate_inputs(interval, times_correct, total_reviews):
- **學習軌跡分布**: 檢查間隔分布是否合理
- **用戶滿意度**: 復習頻率是否符合預期
- **記憶效果**: 長期記憶率是否提升
- **題型使用分布**: 各題型使用率是否平衡
- **A1用戶體驗**: 初學者完成率和信心提升
- **推薦算法準確率**: 用戶接受推薦題型的比例
- **切換頻率**: 平均每次復習的題型切換次數
- **表現關聯性**: 不同題型的答對率差異
---
@ -261,6 +455,12 @@ def validate_inputs(interval, times_correct, total_reviews):
# 未來可考慮的個人化係數
personal_factor = calculate_personal_learning_ability(user_id)
new_interval *= personal_factor
# 個人化題型偏好
def get_personal_type_preference(user_id):
user_stats = get_user_performance_by_type(user_id)
# 根據各題型的歷史表現調整權重
return calculate_preference_weights(user_stats)
```
### **遺忘曲線整合**
@ -268,12 +468,31 @@ new_interval *= personal_factor
# 更精確的記憶強度模型
memory_strength = math.exp(-time_since_review / forgetting_constant)
review_urgency = 1 - memory_strength
# 題型特定的遺忘曲線
def get_type_specific_decay(question_type):
# 不同題型可能有不同的記憶保持率
decay_rates = {
'flipcard': 0.05, # 概念記憶
'fill_blank': 0.07, # 拼寫記憶衰減較快
'sentence_speaking': 0.03 # 口說記憶保持較久
}
return decay_rates.get(question_type, 0.05)
```
### **多維度考量**
- 詞彙難度係數
- 學習時間分布
- 情境相關性
- **詞彙難度係數**: 基於語料庫統計的客觀難度
- **學習時間分布**: 用戶的學習時間偏好和效率
- **情境相關性**: 詞彙在不同情境下的重要性
- **認知負荷**: 不同題型的認知負荷評估
- **學習風格適配**: 視覺型、聽覺型、動覺型學習者的偏好
- **進度同步**: 多設備間的學習進度同步策略
### **高級算法方向**
- **深度學習預測**: 使用神經網路預測最佳復習時間
- **強化學習優化**: 基於用戶反饋動態優化推薦策略
- **群體智慧**: 利用相似用戶的學習軌跡改進推薦
- **多目標優化**: 同時優化學習效率、用戶滿意度、長期留存
---

View File

@ -46,6 +46,34 @@
**商業價值**: 提升用戶參與度和完課率
### **US-004: 多樣化複習體驗**
**作為**學習者
**我希望**系統提供多種複習方式(翻卡、選擇題、填空題等)
**以便**通過不同的練習方式加深對詞彙的理解和記憶
**商業價值**: 提高學習效果,增加用戶黏性
### **US-005: A1初學者友好體驗**
**作為**A1程度的語言初學者
**我希望**系統為我提供適合的基礎複習方式
**以便**我能循序漸進地建立語言基礎和學習信心
**商業價值**: 擴大目標用戶群,提高初學者留存率
### **US-006: 智能複習方式推薦**
**作為**學習者
**我希望**系統能根據我的學習程度和詞彙難度自動選擇最適合的複習方式
**以便**我能獲得最佳的學習效果
**商業價值**: 個人化學習體驗,提升學習成效
### **US-007: 聽力和口說練習**
**作為**想要提升聽說能力的學習者
**我希望**能進行詞彙聽力練習和例句朗讀練習
**以便**全面提升我的語言技能
**商業價值**: 提供完整的語言學習體驗,增加產品競爭力
---
## 🎯 **功能需求**
@ -55,12 +83,32 @@
2. **逾期懲罰機制** - 延遲復習時合理縮短下次間隔
3. **熟悉程度追蹤** - 準確反映學習進度
4. **個人化復習** - 根據用戶表現調整復習頻率
5. **多元複習題型** - 提供7種不同類型的複習方式
6. **智能題型推薦** - 根據學習程度自動選擇最適合的復習方式
7. **聽力和口說整合** - 支援音頻播放和錄音功能
### **複習題型功能**
- **翻卡題**: 基於信心程度的主觀評估
- **選擇題**: 定義匹配的客觀測試
- **填空題**: 拼字練習和情境應用
- **例句重組**: 語法和句型練習
- **詞彙聽力**: 發音記憶強化
- **例句聽力**: 聽力理解練習
- **例句口說**: 發音和表達練習
### **程度適配功能**
- **A1學習者專屬**: 基礎題型組合,重點建立信心
- **難度智能匹配**: 根據學習者程度vs詞彙難度選擇題型
- **學習路徑優化**: 避免重複題型,確保學習效果
### **支援功能**
- 學習統計和報表
- 復習提醒和計劃
- 學習目標設定
- 進度分享功能
- 複習方式使用統計
- 音頻品質管理
- 離線復習支援
---
@ -71,11 +119,25 @@
- **用戶留存率**: 7天留存 > 70%30天留存 > 50%
- **學習效率**: 單詞掌握時間縮短 30%
- **用戶滿意度**: NPS分數 > 50
- **複習方式多樣性**: 用戶平均使用 > 4種複習題型
- **智能推薦準確率**: 用戶接受推薦題型比例 > 75%
### **A1學習者專屬指標**
- **初學者完成率**: A1用戶復習完成率 > 85%
- **信心建立效果**: A1用戶平均信心等級提升 > 1.5
- **基礎題型偏好**: A1用戶對推薦題型滿意度 > 80%
### **題型使用指標**
- **翻卡題使用率**: > 90% (最常用)
- **口說題完成率**: > 60% (技術挑戰較高)
- **聽力題正確率**: > 75% (音頻品質要求)
- **題型切換頻率**: 每次復習平均切換 1-2 種題型
### **業務指標**
- **活躍用戶增長**: 月活用戶增長 20%
- **完課率提升**: 課程完成率提升 25%
- **用戶反饋**: 4星以上評價 > 85%
- **功能使用深度**: 多題型用戶的付費轉換率 +15%
---
@ -85,16 +147,33 @@
- 核心間隔算法實現
- 基本逾期處理
- 基礎熟悉程度計算和實時熟悉度顯示
- 基礎複習題型:翻卡題、選擇題
### **V1.0 (1-2個月)**
- 完整逾期處理機制
- 學習統計面板 (含熟悉度變化趨勢)
- 復習提醒功能
- 擴展複習題型:填空題、例句重組題
- 程度適配算法 (A1學習者支援)
- 智能題型推薦系統
### **V2.0 (3-6個月)**
- 個人化學習路徑
- 智能復習建議
### **V1.5 (3-4個月)**
- 聽力功能:詞彙聽力題、例句聽力題
- 音頻播放和管理系統
- 複習方式使用統計
- 題型效果分析和優化
### **V2.0 (5-6個月)**
- 口說功能:例句口說題
- 音頻錄製和語音識別
- 個人化學習路徑優化
- 智能復習建議增強
### **V2.5 (7-8個月)**
- 高級程度適配 (B1, B2 支援)
- 複習方式個人化定制
- 社交學習功能
- 多語言複習方式支援
---
@ -103,25 +182,59 @@
### **產品風險**
- 用戶可能不適應新的復習頻率變化
- 算法調整可能影響現有學習進度
- 複習題型過多可能造成用戶選擇困難
- A1學習者可能對聽力和口說功能感到困難
- 音頻功能的技術複雜度和設備兼容性問題
### **技術風險**
- 瀏覽器音頻API兼容性限制
- 語音錄製品質受設備影響
- 智能題型推薦算法準確性有待驗證
- 複雜題型可能影響系統響應速度
### **用戶體驗風險**
- 題型切換頻繁可能打斷學習節奏
- 不同題型的學習曲線差異
- A1學習者可能對某些題型產生挫折感
### **緩解策略**
- 階段式推出 (10% → 30% → 100% 用戶)
- 提供算法切換選項
- 密切監控用戶反饋和學習數據
- 為A1學習者提供引導式教程
- 音頻功能提供降級方案 (無音頻設備時)
- 智能推薦系統提供手動覆蓋選項
- 題型難度分層,循序漸進引入
---
## 📈 **商業論證**
### **投資回報**
- **開發成本**: 2-3個工作周 (約15-20人天)
- **預期收益**: 用戶留存提升 → 月收入增長 15-25%
- **ROI**: 預計3-6個月回收開發投資
- **開發成本**:
- MVP: 2-3個工作周 (約15-20人天)
- V1.0: 4-6個工作周 (約30-40人天)
- V2.0 完整版: 8-10個工作周 (約60-80人天)
- **預期收益**:
- 用戶留存提升 → 月收入增長 15-25%
- A1市場擴展 → 新用戶獲取增長 20-30%
- 多題型功能 → 付費轉換率提升 10-15%
- **ROI**: 預計4-8個月回收開發投資
### **競爭優勢**
- 科學的記憶衰減模型
- 個人化的復習體驗
- 完整的逾期處理機制
- **業界最豐富的複習題型組合**
- **AI驅動的智能題型推薦**
- **A1初學者友好的學習路徑**
- **整合聽說讀寫的完整語言學習體驗**
### **市場差異化**
- 大多數競品只提供1-2種複習方式
- 市場上缺少專門針對A1學習者的適配算法
- 少有產品整合音頻錄製和播放功能
- 智能推薦算法基於認知科學研究,非簡單隨機
---