dramaling-vocab-learning/note/interactive-word-query-syst...

26 KiB
Raw Blame History

AI 互動式單字查詢系統 - 完整功能規格

項目: DramaLing 英語學習平台 功能模組: 智能句子分析與互動式單字查詢 版本: v1.0 文檔日期: 2025-01-18

🎯 功能概述

AI 互動式單字查詢系統是一個智能英語學習工具,允許用戶輸入英文句子,獲得 AI 驅動的完整分析,並通過點擊單字的方式進行深度學習。系統具備語法修正、高價值詞彙標記、成本優化和快取機制。

📋 核心功能特性

🔍 主要功能

  1. 智能句子分析: Gemini AI 驅動的句子翻譯和解釋
  2. 語法自動修正: 檢測並建議語法錯誤修正
  3. 互動式單字查詢: 點擊任何單字即時查看詳細信息
  4. 高價值詞彙標記: AI 識別重要學習詞彙(免費查詢)
  5. 成本優化設計: 低價值詞彙收費查詢,防止濫用
  6. 24小時快取機制: 避免重複 AI 調用,提升響應速度
  7. 使用額度管理: 免費用戶 3 小時內限制 5 次分析

🎨 用戶體驗特色

  • 即時回饋: 新句子 3-5 秒,快取結果 <200ms
  • 視覺化快取狀態: 清楚顯示結果來源AI/快取)
  • 智能語法提示: 主動發現和修正語法錯誤
  • 分層收費模式: 高價值詞彙免費,低價值詞彙收費

🔄 用戶流程圖 (User Flow)

[1. 用戶登入]
    ↓
[2. 進入分析頁面 (/generate)]
    ↓
[3. 選擇輸入模式]
    ├── ✍️ 手動輸入 (最多300字)
    └── 📷 影劇截圖 (Phase 2, 付費功能)
    ↓
[4. 輸入英文文字]
    ├── 即時字數統計
    ├── 顏色警告 (280字+黃色, 300字+紅色)
    └── 輸入驗證
    ↓
[5. 點擊「🔍 分析句子」]
    ├── 檢查使用額度 (免費用戶 5次/3小時)
    ├── 顯示載入狀態 "正在分析句子... (AI 分析約需 3-5 秒)"
    └── 調用後端 API
    ↓
[6. 後端處理邏輯]
    ├── 檢查快取 (24小時TTL)
    │   ├── Cache Hit → 立即返回 (💾 快取結果)
    │   └── Cache Miss → 調用 Gemini AI (🤖 AI 分析)
    ├── 語法檢查和修正
    ├── 高價值詞彙標記
    └── 存入快取
    ↓
[7. 分析結果顯示]
    ├── 快取狀態標籤 (💾 快取結果 / 🤖 AI 分析)
    ├── 語法修正面板 (如有錯誤)
    │   ├── 顯示原始 vs 修正版本
    │   ├── [✅ 採用修正] [❌ 保持原版]
    │   └── 說明修正原因
    ├── 句子翻譯和解釋
    └── 互動式文字區域
    ↓
[8. 互動式單字查詢]
    ├── 點擊單字觸發分析
    ├── 高價值詞彙 (🟢⭐ / 🟡⭐) → 免費彈窗
    ├── 低價值詞彙 (🔵) → 收費確認對話框
    │   ├── 顯示剩餘額度
    │   ├── [✅ 確認查詢] [❌ 取消]
    │   └── 扣除使用額度
    └── 顯示詳細詞彙信息彈窗
    ↓
[9. 詞卡生成 (可選)]
    ├── 點擊「📖 生成詞卡」
    ├── AI 自動提取重要詞彙
    ├── 預覽生成的詞卡
    └── 保存到個人詞庫
    ↓
[10. 導航選項]
    ├── 🔄 分析新句子 → 返回步驟 2
    ├── ← 返回分析 → 返回步驟 7
    └── ← 返回輸入 → 返回步驟 4

📐 詳細功能規格

🔧 技術規格

前端技術棧

  • 框架: Next.js 15.5.3 + TypeScript
  • UI 組件: React Hooks + Tailwind CSS
  • 狀態管理: useState (本地狀態)
  • API 調用: Fetch API
  • 路由: Next.js App Router

後端技術棧

  • 框架: ASP.NET Core 8.0
  • AI 整合: Google Gemini API
  • 資料庫: SQLite + Entity Framework Core
  • 快取: 資料庫快取 (24小時TTL)
  • 認證: JWT Token

📊 資料模型

1. API 請求/回應格式

句子分析請求:

interface AnalyzeSentenceRequest {
  inputText: string        // 用戶輸入的英文句子 (≤300字)
  forceRefresh?: boolean   // 強制刷新快取 (預設: false)
  analysisMode?: string    // 分析模式 (預設: 'full')
}

句子分析回應:

interface AnalyzeSentenceResponse {
  success: boolean
  message: string
  cached: boolean          // 是否來自快取
  cacheHit: boolean        // 快取命中狀態
  usingAI: boolean         // 是否使用 AI 分析
  data: {
    analysisId: string
    inputText: string
    grammarCorrection: GrammarCorrectionResult
    sentenceMeaning: {
      Translation: string    // 注意: 首字母大寫
      Explanation: string    // 注意: 首字母大寫
    }
    finalAnalysisText: string
    wordAnalysis: Record<string, WordAnalysis>
    highValueWords: string[]
    phrasesDetected: PhraseInfo[]
  }
}

2. 單字分析資料結構

interface WordAnalysis {
  word: string
  translation: string
  definition: string
  partOfSpeech: string
  pronunciation: string
  synonyms: string[]
  antonyms?: string[]
  isPhrase: boolean
  isHighValue: boolean      // 高學習價值標記
  learningPriority: 'high' | 'medium' | 'low'
  phraseInfo?: {
    phrase: string
    meaning: string
    warning: string
    colorCode: string
  }
  difficultyLevel: string   // CEFR 等級 (A1, A2, B1, B2, C1, C2)
  costIncurred?: number     // 查詢成本
}

3. 語法修正結構

interface GrammarCorrectionResult {
  hasErrors: boolean
  originalText: string
  correctedText?: string
  corrections: GrammarCorrection[]
  confidenceScore: number
}

interface GrammarCorrection {
  position: { start: number, end: number }
  errorType: string
  original: string
  corrected: string
  reason: string
  severity: 'high' | 'medium' | 'low'
}

🎨 UI/UX 規格

1. 主介面佈局 (/generate)

┌─────────────────────────────────────────┐
│ Navigation Bar                          │
├─────────────────────────────────────────┤
│ 📝 AI 智能生成詞卡                        │
│                                         │
│ ┌─── 原始例句類型 ──────────────────────┐ │
│ │ [✍️ 手動輸入] [📷 影劇截圖 🔒]         │ │
│ └───────────────────────────────────────┘ │
│                                         │
│ ┌─── 輸入英文文本 ──────────────────────┐ │
│ │ ┌─────────────────────────────────┐   │ │
│ │ │ [Textarea: 最多300字元]         │   │ │
│ │ │ "輸入英文句子最多300字..."    │   │ │
│ │ └─────────────────────────────────┘   │ │
│ │ 最多 300 字元 • 目前0 字元           │ │
│ └───────────────────────────────────────┘ │
│                                         │
│ ┌─────────────────────────────────────┐ │
│ │ [🔍 分析句子] (全寬按鈕)              │ │
│ └─────────────────────────────────────┘ │
│                                         │
│ 免費用戶:已使用 0/5 次 (3小時內)        │
└─────────────────────────────────────────┘

2. 分析結果介面

┌─────────────────────────────────────────┐
│ 📝 句子分析結果              💾 快取結果  │
│                               [← 返回]  │
├─────────────────────────────────────────┤
│ ⚠️  語法修正建議 (如有錯誤)             │
│ ┌─ 原文I go to school yesterday ──┐   │
│ │ 修正I went to school yesterday   │   │
│ │ [✅ 採用修正] [❌ 保持原版]          │   │
│ └───────────────────────────────────┘   │
├─────────────────────────────────────────┤
│ 📝 句子分析                             │
│ ┌─ 用戶輸入 ────────────────────────┐   │
│ │ I go to school yesterday          │   │
│ └───────────────────────────────────┘   │
│ ┌─ 整句意思 ────────────────────────┐   │
│ │ 我昨天去學校。這句話表達了過去...   │   │
│ └───────────────────────────────────┘   │
├─────────────────────────────────────────┤
│ 💡 點擊查詢單字意思                      │
│ 🟡⭐高價值片語 🟢⭐高價值單字 🔵普通單字  │
│ ┌─────────────────────────────────────┐ │
│ │ I [went] to [school] [yesterday]    │ │
│ │    🟢⭐    🔵    🟡⭐               │ │
│ └─────────────────────────────────────┘ │
├─────────────────────────────────────────┤
│ [🔄 分析新句子] [📖 生成詞卡]            │
└─────────────────────────────────────────┘

3. 單字查詢彈窗

┌─── went ─────────────── ✕ ─┐
│ ⭐ 高價值詞彙(免費查詢)      │
│ ⭐⭐⭐⭐⭐ 學習價值           │
│                            │
│ [verb] /went/  🔊           │
│                            │
│ 翻譯: 去 (go的過去式)        │
│ 定義: Past tense of go     │
│                            │
│ 同義詞: [traveled] [moved]  │
│ 反義詞: [came] [stayed]     │
│                            │
│ 難度等級: [CEFR A1] (基礎)   │
└────────────────────────────┘

4. 收費確認對話框

┌─── school ─────────── ✕ ─┐
│ 💰 低價值詞彙(需消耗額度)   │
│ 此查詢將消耗 1 次 使用額度   │
│ 剩餘額度4 次              │
│                            │
│ [✅ 確認查詢] [❌ 取消]      │
└────────────────────────────┘

🔧 技術實現規格

1. 前端組件架構

GeneratePage (主頁面)
├── Navigation (導航欄)
├── InputModeSelection (輸入模式選擇)
├── TextInputArea (文字輸入區域)
├── AnalysisButton (分析按鈕)
├── UsageCounter (使用次數顯示)
├── AnalysisView (分析結果檢視)
│   ├── CacheStatusBadge (快取狀態標籤)
│   ├── GrammarCorrectionPanel (語法修正面板)
│   ├── SentenceAnalysisPanel (句子分析面板)
│   └── ClickableTextV2 (互動式文字組件)
│       ├── WordClickHandler (單字點擊處理)
│       ├── CostConfirmDialog (收費確認對話框)
│       └── WordInfoPopup (單字資訊彈窗)
└── CardPreview (詞卡預覽, 可選)

2. 後端API架構

AIController
├── AnalyzeSentence (句子分析主API)
│   ├── 使用限制檢查
│   ├── 快取查詢邏輯
│   ├── Gemini AI 調用
│   ├── 語法修正處理
│   ├── 高價值詞彙標記
│   └── 快取寫入
├── QueryWord (單字查詢API)
│   ├── 高/低價值判斷
│   ├── 收費邏輯處理
│   └── 即時詞彙分析
└── CacheManagement (快取管理API)
    ├── GetCacheStats (快取統計)
    ├── CleanupCache (清理過期快取)
    └── InvalidateCache (手動清除快取)

3. 快取系統規格

SentenceAnalysisCache (資料表)
├── InputTextHash (SHA-256, 索引)
├── AnalysisResult (JSON格式)
├── ExpiresAt (過期時間, 索引)
├── AccessCount (存取次數)
├── CreatedAt / LastAccessedAt
└── 複合索引 (Hash + ExpiresAt)

快取策略:
├── TTL: 24小時
├── 清理: 自動背景任務
├── 命中率: >80% (預期)
└── 儲存格式: JSON序列化

🎮 詳細互動規格

📝 輸入階段

輸入模式

  • 手動輸入: 300字元限制即時字數統計
  • 影劇截圖: Phase 2 功能,付費用戶限定

輸入驗證

// 字數限制邏輯
if (mode === 'manual' && value.length > 300) {
  return // 阻止輸入
}

// 視覺回饋
const borderColor =
  textLength >= 300 ? 'border-red-400' :
  textLength >= 280 ? 'border-yellow-400' :
  'border-gray-300'

按鈕狀態

// 分析按鈕啟用條件
disabled = isAnalyzing ||
          (mode === 'manual' && (!textInput || textInput.length > 300)) ||
          (mode === 'screenshot')

🔍 分析階段

載入狀態

  • 初始: "🔍 分析句子"
  • 載入中: "正在分析句子... (AI 分析約需 3-5 秒)" + 旋轉動畫
  • 完成: 自動跳轉到分析結果頁面

快取邏輯

// 後端快取檢查流程
1. 計算輸入文字的 SHA-256 hash
2. 查詢資料庫是否有未過期的快取
3. Cache Hit: 立即返回 + 更新統計
4. Cache Miss: 調用 Gemini AI + 存入快取

錯誤處理

  • API 錯誤: 顯示錯誤訊息
  • 網路錯誤: 重試機制
  • 使用額度超限: 提示升級或等待

🖱️ 互動查詢階段

單字分類和視覺設計

/* 高價值片語 */
.high-value-phrase {
  background: bg-yellow-100
  border: 2px solid border-yellow-400
  icon: 
  hover: bg-yellow-200 + shadow + transform
}

/* 高價值單字 */
.high-value-word {
  background: bg-green-100
  border: 2px solid border-green-400
  icon: 
  hover: bg-green-200 + shadow + transform
}

/* 普通單字 */
.normal-word {
  border-bottom: border-blue-300
  hover: bg-blue-100 + border-blue-400
}

點擊行為邏輯

// 單字點擊處理流程
onClick(word) => {
  const wordAnalysis = analysis[cleanWord]

  if (wordAnalysis.isHighValue) {
    // 高價值詞彙 - 立即顯示彈窗
    showWordPopup(word, analysis)
    // 不扣除使用額度
  } else {
    // 低價值詞彙 - 顯示收費確認
    showCostConfirmDialog(word, cost: 1)
    // 確認後扣除額度並調用API
  }
}

彈窗內容結構

WordInfoPopup
├── Header (單字 + 關閉按鈕)
├── ValueBadge (高價值標記 + 學習價值星級)
├── PhraseWarning (片語警告,如適用)
├── BasicInfo (詞性 + 發音 + 發音按鈕)
├── Translation (翻譯)
├── Definition (英文定義)
├── Synonyms (同義詞標籤)
├── Antonyms (反義詞標籤)
└── DifficultyLevel (CEFR難度等級)

💰 收費模式規格

免費用戶限制

const FREE_USER_LIMITS = {
  sentenceAnalysis: 5,      // 3小時內最多5次句子分析
  timeWindow: 3 * 60 * 60,  // 3小時窗口 (秒)
  wordQueryCost: 1,         // 每次低價值詞彙查詢成本
  highValueWordsFree: true  // 高價值詞彙永遠免費
}

高價值詞彙判定邏輯

// 高價值詞彙標準
const isHighValue =
  cefrLevel >= 'B1' ||           // B1+ 等級詞彙
  isIdiomOrPhrase ||             // 慣用語和片語
  isAcademicVocabulary ||        // 學術詞彙
  learningFrequency === 'high'   // 高學習頻率詞彙

🗄️ 資料持久化規格

快取資料表結構

CREATE TABLE SentenceAnalysisCache (
    Id UNIQUEIDENTIFIER PRIMARY KEY,
    InputTextHash NVARCHAR(64) NOT NULL,     -- SHA-256 hash
    InputText NVARCHAR(1000) NOT NULL,       -- 原始輸入
    AnalysisResult NVARCHAR(MAX) NOT NULL,   -- JSON格式分析結果
    HasGrammarErrors BIT NOT NULL,           -- 是否有語法錯誤
    CorrectedText NVARCHAR(1000) NULL,       -- 修正後文字
    GrammarCorrections NVARCHAR(MAX) NULL,   -- 語法修正JSON
    HighValueWords NVARCHAR(MAX) NULL,       -- 高價值詞彙JSON
    PhrasesDetected NVARCHAR(MAX) NULL,      -- 檢測到的片語JSON
    CreatedAt DATETIME2 NOT NULL,            -- 建立時間
    ExpiresAt DATETIME2 NOT NULL,            -- 過期時間
    LastAccessedAt DATETIME2 NULL,           -- 最後存取時間
    AccessCount INT NOT NULL DEFAULT 0       -- 存取次數
);

-- 索引
CREATE INDEX IX_SentenceAnalysisCache_Hash ON SentenceAnalysisCache(InputTextHash);
CREATE INDEX IX_SentenceAnalysisCache_Expires ON SentenceAnalysisCache(ExpiresAt);
CREATE INDEX IX_SentenceAnalysisCache_Hash_Expires ON SentenceAnalysisCache(InputTextHash, ExpiresAt);

🧪 測試規格

🔬 功能測試案例

1. 句子分析功能測試

測試案例 1.1: 新句子分析

輸入: "I went to school yesterday"
預期結果:
- 載入時間: 3-5 秒
- 快取狀態: 🤖 AI 分析
- 翻譯: "我昨天去學校。"
- 解釋: 包含語法結構說明
- 高價值詞彙: went, school, yesterday 標記為 ⭐

測試案例 1.2: 快取命中測試

前置條件: 已分析過 "I went to school yesterday"
輸入: "I went to school yesterday" (相同句子)
預期結果:
- 載入時間: <200ms
- 快取狀態: 💾 快取結果
- 內容: 與首次分析完全相同
- 使用額度: 不增加

測試案例 1.3: 語法錯誤修正

輸入: "I go to school yesterday"
預期結果:
- 語法修正面板出現
- 原文: "I go to school yesterday"
- 修正: "I went to school yesterday"
- 修正原因: "過去式時態修正:句子中有 'yesterday',應使用過去式"
- 用戶可選擇採用或拒絕修正

2. 互動式單字查詢測試

測試案例 2.1: 高價值詞彙查詢

前置條件: 已完成句子分析
操作: 點擊標記為 ⭐ 的單字 "went"
預期結果:
- 立即顯示詞彙資訊彈窗
- 顯示 "⭐ 高價值詞彙(免費查詢)"
- 不扣除使用額度
- 包含完整詞彙信息

測試案例 2.2: 低價值詞彙查詢

前置條件: 已完成句子分析,剩餘額度 > 0
操作: 點擊普通單字 (藍色下劃線)
預期結果:
1. 顯示收費確認對話框
2. 顯示消耗額度和剩餘額度
3. 用戶確認後扣除 1 次額度
4. 調用 query-word API
5. 顯示詞彙資訊彈窗

測試案例 2.3: 額度不足測試

前置條件: 剩餘額度 = 0
操作: 點擊低價值詞彙
預期結果:
- 顯示 "❌ 使用額度不足,無法查詢低價值詞彙"
- 不調用 API
- 不顯示詞彙彈窗

3. 使用限制測試

測試案例 3.1: 免費用戶限制

前置條件: 免費用戶3小時內已分析 5 次
操作: 嘗試分析新句子
預期結果:
- 顯示 "❌ 免費用戶 3 小時內只能分析 5 次句子,請稍後再試或升級到付費版本"
- 不調用分析 API
- 使用計數不增加

測試案例 3.2: 付費用戶無限制

前置條件: isPremium = true
操作: 多次分析句子
預期結果:
- 顯示 "🌟 付費用戶:無限制使用"
- 所有分析正常執行
- 無使用次數限制

🚀 效能測試規格

1. 回應時間測試

測試情境 預期時間 測試方法
新句子 AI 分析 3-5 秒 測量從點擊到結果顯示的時間
快取命中查詢 <200ms 重複查詢相同句子
高價值詞彙點擊 <100ms 點擊已標記的高價值詞彙
低價值詞彙查詢 1-2 秒 確認後的API調用時間

2. 快取效能測試

測試指標 目標值 測試方法
快取命中率 >80% 重複查詢統計
快取寫入成功率 >99% 監控快取失敗日誌
快取過期清理 24小時 測試過期資料自動清理

🔧 整合測試規格

1. 端到端測試流程

完整用戶旅程測試:

1. 登入系統
2. 導航到 /generate 頁面
3. 輸入測試句子 "She felt ashamed of her mistake and apologized"
4. 點擊 "🔍 分析句子"
5. 驗證分析結果正確顯示
6. 點擊高價值詞彙 "ashamed" (免費)
7. 驗證詞彙彈窗內容
8. 點擊低價值詞彙 "her" (收費)
9. 確認收費對話框
10. 驗證額度扣除
11. 點擊 "🔄 分析新句子"
12. 輸入相同句子
13. 驗證快取命中 (💾 快取結果)
14. 點擊 "📖 生成詞卡"
15. 驗證詞卡生成功能

2. API 整合測試

測試案例: API 連接性

# 1. 句子分析 API 測試
curl -X POST http://localhost:5000/api/ai/analyze-sentence \
  -H "Content-Type: application/json" \
  -d '{"inputText": "Hello world", "analysisMode": "full"}'

# 2. 單字查詢 API 測試
curl -X POST http://localhost:5000/api/ai/query-word \
  -H "Content-Type: application/json" \
  -d '{"word": "hello", "sentence": "Hello world"}'

# 3. 快取統計 API 測試
curl -X GET http://localhost:5000/api/ai/cache-stats

3. 邊界條件測試

輸入驗證測試:

測試案例 3.1: 空白輸入
輸入: ""
預期: 按鈕禁用,無法提交

測試案例 3.2: 超長輸入
輸入: 301字元的文字
預期: 無法輸入,紅色邊框警告

測試案例 3.3: 特殊字元
輸入: "Hello @#$%^&*() world!"
預期: 正常分析,特殊字元適當處理

測試案例 3.4: 純中文輸入
輸入: "你好世界"
預期: 系統應適當處理或給出提示

🐛 錯誤處理測試

1. 網路錯誤測試

測試案例 1: 後端服務停止
操作: 停止後端服務後嘗試分析
預期: 顯示連接錯誤訊息,不崩潰

測試案例 2: Gemini API 失敗
模擬: API key 無效或 API 服務不可用
預期: 回退到本地分析,不中斷用戶體驗

2. 資料錯誤測試

測試案例 1: 損壞的快取資料
模擬: 資料庫中有格式錯誤的 JSON
預期: 忽略損壞快取,重新調用 AI 分析

測試案例 2: 不完整的API回應
模擬: 後端回傳缺少某些欄位的資料
預期: 使用預設值,顯示部分資訊而非崩潰

🎯 驗收標準

功能驗收標準

  1. 基本功能完整性

    • 用戶可成功輸入並分析英文句子
    • 所有UI組件正確顯示和互動
    • API調用成功且資料正確處理
  2. AI功能正確性

    • Gemini AI 整合正常運作
    • 翻譯和解釋內容品質符合要求
    • 語法修正建議合理且準確
  3. 互動查詢功能

    • 高價值詞彙免費查詢正常
    • 低價值詞彙收費機制正確
    • 詞彙彈窗內容完整準確
  4. 快取系統功能

    • 新句子使用 AI 分析
    • 重複句子使用快取結果
    • 快取狀態正確顯示
  5. 使用限制功能

    • 免費用戶額度限制生效
    • 付費用戶無限制使用
    • 額度計算準確無誤

📊 效能驗收標準

  1. 回應時間要求

    • 快取命中 < 200ms
    • AI分析 < 10秒 (95%的情況下 < 5秒)
    • 頁面導航 < 100ms
  2. 系統穩定性

    • 24小時連續運行無崩潰
    • 記憶體使用穩定
    • 資料庫連接池正常
  3. 用戶體驗標準

    • 用戶操作回饋及時 (<100ms)
    • 載入狀態清晰可見
    • 錯誤訊息用戶友善

🔧 開發和部署規格

📁 檔案結構

frontend/
├── app/generate/page.tsx              (主要分析頁面)
├── components/ClickableTextV2.tsx     (互動式文字組件)
├── components/GrammarCorrectionPanel.tsx (語法修正面板)
└── contexts/AuthContext.tsx          (認證上下文)

backend/
├── Controllers/AIController.cs        (AI API 控制器)
├── Services/GeminiService.cs         (Gemini AI 服務)
├── Services/AnalysisCacheService.cs  (快取服務)
├── Services/UsageTrackingService.cs  (使用追蹤服務)
└── Models/Entities/               (資料模型)

🚀 部署需求

環境變數

# Gemini AI
GEMINI_API_KEY=your_gemini_api_key

# 資料庫
CONNECTION_STRING=Data Source=dramaling.db

# CORS
ALLOWED_ORIGINS=http://localhost:3000,http://localhost:3002

# 快取設定
CACHE_TTL_HOURS=24
CACHE_CLEANUP_INTERVAL_HOURS=6

系統需求

  • 前端: Node.js 18+, Next.js 15+
  • 後端: .NET 8.0+, ASP.NET Core
  • 資料庫: SQLite 3.x (開發), SQL Server (生產)
  • 外部API: Google Gemini API access

文檔版本: v1.0 最後更新: 2025-01-18 負責人: Claude Code 審核狀態: 完成