dramaling-vocab-learning/note/UPDATED_PERSONALIZED_WORDS_...

345 lines
10 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.

# 🎯 個人化高價值詞彙判定系統 - 更新版實施計劃
**專案**: DramaLing 英語學習平台
**功能**: 個人化高價值詞彙智能判定
**計劃版本**: v2.0 (根據當前代碼狀況更新)
**更新日期**: 2025-01-18
**預計開發時程**: 1.5週 (優化後的架構加速開發)
---
## 📋 **當前代碼狀況分析**
### **✅ 已完成的優化 (有利於個人化實施)**
-**移除快取機制**: 簡化了邏輯,每次都是新 AI 分析
-**移除 explanation**: 簡化了回應格式
-**代碼大幅精簡**: AIController 減少 200+ 行
-**架構清晰**: Service 層職責明確
### **🔧 當前架構分析**
#### **User 實體**
**位置**: `/backend/DramaLing.Api/Models/Entities/User.cs:30`
**狀態**: ✅ 完美適合擴充Preferences 後正好可新增 EnglishLevel
#### **AnalyzeSentenceRequest**
**位置**: `/backend/DramaLing.Api/Controllers/AIController.cs:1313`
**當前結構**:
```csharp
public class AnalyzeSentenceRequest
{
public string InputText { get; set; } = string.Empty;
public bool ForceRefresh { get; set; } = false;
public string AnalysisMode { get; set; } = "full";
}
```
**狀態**: ✅ 簡潔易擴充
#### **GeminiService.AnalyzeSentenceAsync**
**位置**: `/backend/DramaLing.Api/Services/GeminiService.cs:55`
**當前簽名**: `AnalyzeSentenceAsync(string inputText)`
**當前 Prompt** (第64-96行): 已簡化,無 explanation 欄位
**狀態**: ✅ 適合個人化擴充
---
## 🛠️ **更新版實施計劃**
## **📋 Phase 1: 資料模型擴充 (第1天)**
### **1.1 User 實體擴充** ✅ 無變動
**檔案**: `/backend/DramaLing.Api/Models/Entities/User.cs`
**位置**: 第30行 `public Dictionary<string, object> Preferences`
```csharp
[MaxLength(10)]
public string EnglishLevel { get; set; } = "A2"; // A1, A2, B1, B2, C1, C2
public DateTime LevelUpdatedAt { get; set; } = DateTime.UtcNow;
public bool IsLevelVerified { get; set; } = false; // 是否通過測試驗證
[MaxLength(500)]
public string? LevelNotes { get; set; } // 程度設定備註
```
### **1.2 API 請求模型更新** ✅ 無變動
**檔案**: `/backend/DramaLing.Api/Controllers/AIController.cs:1313`
```csharp
public class AnalyzeSentenceRequest
{
public string InputText { get; set; } = string.Empty;
public string UserLevel { get; set; } = "A2"; // 🆕 新增
public bool ForceRefresh { get; set; } = false;
public string AnalysisMode { get; set; } = "full";
}
```
### **1.3 資料庫遷移** ✅ 無變動
```bash
cd /backend/DramaLing.Api/
dotnet ef migrations add AddUserEnglishLevel
dotnet ef database update
```
---
## **📋 Phase 2: Service 層個人化 (第2-3天)**
### **2.1 建立 CEFR 等級服務** ✅ 無變動
**新檔案**: `/backend/DramaLing.Api/Services/CEFRLevelService.cs`
(代碼與原計劃相同)
### **2.2 更新 GeminiService** 🔄 根據當前狀況調整
**檔案**: `/backend/DramaLing.Api/Services/GeminiService.cs`
**修改位置**: 第55行的 `AnalyzeSentenceAsync` 方法
**當前方法簽名**:
```csharp
public async Task<SentenceAnalysisResponse> AnalyzeSentenceAsync(string inputText)
```
**修改後簽名**:
```csharp
public async Task<SentenceAnalysisResponse> AnalyzeSentenceAsync(
string inputText,
string userLevel = "A2")
```
**🔄 更新版 Prompt (第64-96行) - 已適配移除 explanation**:
```csharp
var prompt = $@"
請分析以下英文句子,提供翻譯和個人化詞彙分析:
句子:{inputText}
學習者程度:{userLevel}
請按照以下JSON格式回應不要包含任何其他文字
{{
""translation"": ""自然流暢的繁體中文翻譯"",
""grammarCorrection"": {{
""hasErrors"": false,
""originalText"": ""{inputText}"",
""correctedText"": null,
""corrections"": []
}},
""highValueWords"": [""重要詞彙1"", ""重要詞彙2""],
""wordAnalysis"": {{
""單字"": {{
""translation"": ""中文翻譯"",
""definition"": ""英文定義"",
""partOfSpeech"": ""詞性"",
""pronunciation"": ""音標"",
""isHighValue"": true,
""difficultyLevel"": ""CEFR等級""
}}
}}
}}
要求:
1. 翻譯要自然流暢,符合中文語法
2. **基於學習者程度({userLevel}),標記 {CEFRLevelService.GetTargetLevelRange(userLevel)} 等級的詞彙為高價值**
3. 如有語法錯誤請指出並修正
4. 確保JSON格式正確
高價值判定邏輯:
- 學習者程度: {userLevel}
- 高價值範圍: {CEFRLevelService.GetTargetLevelRange(userLevel)}
- 太簡單的詞彙(≤{userLevel})不要標記為高價值
- 太難的詞彙謹慎標記
- 重點關注適合學習者程度的詞彙
";
```
---
## **📋 Phase 3: Controller 層整合 (第4天) - 🔄 簡化版**
### **3.1 更新 AnalyzeSentence API**
**檔案**: `/backend/DramaLing.Api/Controllers/AIController.cs`
**位置**: 第501行的 `AnalyzeSentence` 方法
**🔄 簡化版用戶程度取得邏輯** (在第538行 AI 調用前新增):
```csharp
// 取得用戶英語程度
string userLevel = request.UserLevel ?? "A2";
// 🔄 簡化版:暫不從資料庫讀取,先使用 API 參數或預設值
if (string.IsNullOrEmpty(userLevel))
{
userLevel = "A2"; // 預設程度
}
_logger.LogInformation("Using user level for analysis: {UserLevel}", userLevel);
```
**🔄 更新 AI 調用** (當前約第540行):
```csharp
// 原本:
// var aiAnalysis = await _geminiService.AnalyzeSentenceAsync(request.InputText);
// 修改為:
var aiAnalysis = await _geminiService.AnalyzeSentenceAsync(request.InputText, userLevel);
```
### **3.2 回應資料增強** 🔄 適配無快取版本
**位置**: 約第550行的 baseResponseData 物件
```csharp
var baseResponseData = new
{
AnalysisId = Guid.NewGuid(),
InputText = request.InputText,
UserLevel = userLevel, // 🆕 新增:顯示使用的程度
HighValueCriteria = CEFRLevelService.GetTargetLevelRange(userLevel), // 🆕 新增
GrammarCorrection = aiAnalysis.GrammarCorrection,
SentenceMeaning = new
{
Translation = aiAnalysis.Translation // 🔄 已移除 Explanation
},
FinalAnalysisText = finalText ?? request.InputText,
WordAnalysis = aiAnalysis.WordAnalysis,
HighValueWords = aiAnalysis.HighValueWords,
PhrasesDetected = new object[0]
};
```
---
## **📋 Phase 4: 前端個人化體驗 (第5-7天) - ✅ 基本無變動**
### **4.1 建立用戶程度設定頁面** ✅ 原計劃可直接使用
**新檔案**: `/frontend/app/settings/page.tsx`
(完整代碼與原計劃相同,已針對無 explanation 優化)
### **4.2 更新導航選單** ✅ 無變動
**檔案**: `/frontend/components/Navigation.tsx`
### **4.3 修改句子分析頁面** 🔄 微調
**檔案**: `/frontend/app/generate/page.tsx`
**修改位置**: 第28行的 `handleAnalyzeSentence` 函數 (行數已更新)
### **4.4 個人化詞彙標記顯示** ✅ 基本無變動
(原計劃的 WordAnalysisCard 組件可直接使用)
---
## **🔄 主要調整說明**
### **1. 移除過時的快取相關邏輯**
```diff
- 原計劃: 修改快取檢查和存入邏輯
+ 更新版: 已無快取機制,直接修改 AI 調用
```
### **2. 適配簡化的回應格式**
```diff
- 原計劃: SentenceMeaning { Translation, Explanation }
+ 更新版: SentenceMeaning { Translation } // 已移除 explanation
```
### **3. 簡化錯誤處理**
```diff
- 原計劃: 複雜的快取錯誤處理
+ 更新版: 簡化的 AI 錯誤處理
```
### **4. 更新行數引用**
```diff
- 原計劃: 基於舊版本的行數
+ 更新版: 基於當前優化後的行數
```
---
## **⏰ 更新版開發時程**
| 天數 | 階段 | 主要任務 | 預計工時 | 變化 |
|------|------|----------|----------|------|
| Day 1 | **資料模型** | User 實體擴充、API 擴充、資料庫遷移 | 8h | -4h (簡化) |
| Day 2-3 | **Service 層** | CEFRLevelService、GeminiService 個人化 | 12h | -4h (無快取) |
| Day 4 | **Controller 整合** | 簡化版 API 邏輯整合 | 6h | -4h (已優化) |
| Day 5-6 | **前端設定頁** | 程度設定介面、導航整合 | 12h | 無變動 |
| Day 7 | **前端分析整合** | generate 頁面修改、個人化顯示 | 6h | -2h (簡化) |
| Day 8-9 | **測試開發** | 單元測試、整合測試 | 8h | -4h (簡化) |
| Day 10 | **優化除錯** | 性能調整、UI 優化 | 4h | -2h |
**總計**: 56 工時 (約1.5週) - **節省 26 工時!**
---
## **🎯 實施優勢分析**
### **🚀 當前架構的優勢**
1. **代碼更乾淨**: 移除冗餘後更容易擴充
2. **邏輯更清晰**: 無快取干擾,邏輯線性化
3. **Service 層完整**: GeminiService 架構良好
4. **API 簡潔**: 統一的錯誤處理
### **💡 實施建議**
#### **立即可開始的項目**
1. **User 實體擴充** - 完全 ready
2. **CEFRLevelService 建立** - 獨立功能
3. **前端設定頁面** - 無依賴
#### **需要小幅調整的項目**
1. **GeminiService Prompt** - 適配無 explanation
2. **Controller 行數** - 更新引用位置
---
## **📋 風險評估更新**
### **🟢 降低的風險**
-**複雜度降低**: 無快取邏輯干擾
-**測試簡化**: 線性邏輯更易測試
-**維護容易**: 代碼結構清晰
### **🟡 保持的風險**
- ⚠️ **AI Prompt 複雜化**: 仍需謹慎測試
- ⚠️ **用戶理解度**: CEFR 概念對用戶的理解
### **🔴 新增風險**
- ⚠️ **AI 成本**: 無快取後每次都調用 AI (但您已選擇此方向)
---
## **🎯 執行建議**
### **🚀 立即開始**
建議從 **Phase 1** 開始,因為:
- ✅ 完全獨立,無依賴
- ✅ 為後續階段打基礎
- ✅ 可以快速看到成果
### **🔄 調整重點**
1. **更新所有行數引用**
2. **移除 explanation 相關邏輯**
3. **簡化快取相關的修改步驟**
### **📊 成功機率**
**95%** - 當前架構非常適合個人化功能實施
---
## **💡 額外建議**
### **漸進式實施**
可以考慮分階段發佈:
1. **MVP版**: 僅前端本地存儲用戶程度
2. **完整版**: 後端資料庫 + 完整個人化
### **測試策略**
由於代碼已大幅簡化,測試工作量也相應減少
---
**結論: 這個計劃不僅可行,而且由於當前代碼優化,實施會比原計劃更簡單快速!** 🎉
**© 2025 DramaLing Development Team**
**更新基於**: 當前代碼狀況 (commit 1b937f8)
**主要改善**: 適配優化後的簡潔架構