# LLM 測試策略評估報告 | 屬性 | 值 | |------|-----| | **評估日期** | 2026-03-26 | | **評估者** | 首席架構師 | | **狀態** | ✅ 方案 A 已實施 | --- ## 1. 問題定義 **現象**: CI 中 7 個 LLM 測試失敗 - `test_model_regression.py`: 4 failed - `test_prompt_validation.py`: 3 failed **根因分析**: | 問題 | 詳情 | |------|------| | 測試與生產不一致 | 測試直接呼叫 Ollama API,未使用 OpenClaw Service | | 缺少確定性參數 | 測試未設定 `seed`, `temperature: 0.0` | | 字串匹配過嚴 | 使用 lambda 檢查特定子字串存在 | --- ## 2. 現有架構盤點 ### 2.1 OpenClaw Service (生產環境) **檔案**: `src/services/openclaw.py` **已有配置**: ```python "options": { "num_predict": 1024, "temperature": 0.1, # ← 已設定低溫度 "top_p": 0.9, }, "format": "json", # ← 已啟用 JSON 模式 ``` **結論**: 生產環境已有穩定配置,測試應該復用 ### 2.2 測試檔案 (問題所在) **檔案**: `tests/test_model_regression.py`, `tests/test_prompt_validation.py` **問題配置**: ```python # 無 seed # 無 temperature 設定 # 無 format: json response = await client.post( f"{OLLAMA_URL}/api/generate", json={ "model": model, "prompt": prompt, "stream": False, # 缺少 options }, ) ``` **結論**: 測試未使用生產配置,導致不一致 --- ## 3. 解決方案比較 ### 方案 A: Ollama 確定性參數 (最小改動) **改動範圍**: 僅修改 2 個測試檔案 ```python # 加入確定性參數 "options": { "seed": 42, # 固定種子 "temperature": 0.0, # 零溫度 }, "format": "json", # JSON 模式 ``` **優點**: - 最小改動 - 與生產環境一致 - 無新增依賴 **缺點**: - 仍依賴 Live LLM (CI 需要 Ollama 可用) - 無法完全消除網路波動 **評估**: ✅ **推薦 - 第一步** --- ### 方案 B: 測試呼叫 OpenClaw Service **改動範圍**: 修改測試使用 OpenClaw Service ```python # 直接使用 OpenClaw Service from src.services.openclaw import get_openclaw openclaw = get_openclaw() result = await openclaw.analyze_alert(...) ``` **優點**: - 測試生產代碼路徑 - 配置自動同步 - 更接近真實場景 **缺點**: - 需要更多設定 (Redis, Settings) - 增加測試複雜度 **評估**: ⭕ 可考慮 - 整合測試 --- ### 方案 C: 三層測試框架 (ADR-018 原提案) **改動範圍**: 新增完整測試框架 **優點**: - 完整的測試分層 - 支援 Golden Response Mock - 語意相似度測試 **缺點**: - 大量新增代碼 (~1000 行) - 增加維護成本 - 可能與現有測試衝突 - 過度工程化風險 **評估**: ❌ 暫緩 - 先嘗試方案 A --- ## 4. 衝突檢測 ### 4.1 與現有 ADR 衝突 | ADR | 檢查結果 | |-----|---------| | ADR-006 AI Fallback | ✅ 無衝突 | | ADR-015 MCP 模組化 | ✅ 無衝突 | ### 4.2 與現有 Memory 衝突 | Memory | 檢查結果 | |--------|---------| | feedback_no_mock_testing.md | ⚠️ **注意**: 禁止 Mock,方案 A/B 符合 | | feedback_modular_architecture.md | ✅ 方案 B 更符合 | ### 4.3 與現有 Skills 衝突 無直接衝突 --- ## 5. 推薦行動 ### 第一步: 方案 A - 最小改動 (1 小時) 1. 修改 `test_model_regression.py`: - 加入 `seed: 42`, `temperature: 0.0` - 加入 `format: "json"` 2. 修改 `test_prompt_validation.py`: - 同上 3. 調整 validators: - 改為 JSON Schema 驗證 (與 OpenClaw 一致) ### 第二步: 驗證效果 (30 分鐘) - 執行測試 3 次,確認穩定性 - 比較修改前後通過率 ### 第三步: 評估是否需要方案 B/C - 若方案 A 效果良好 → 完成 - 若仍有問題 → 考慮方案 B 整合測試 - 方案 C 暫緩,待需求更明確時再議 --- ## 6. ADR-018 處理建議 **建議**: 將 ADR-018 標記為「評估中」,先實施方案 A **原因**: 1. 方案 A 更簡單且無新增複雜度 2. 未完成「解決方案導入評估 7 問」 3. 過度工程化風險 **已建立新增代碼處理**: - `tests/llm_testing/` 框架已建立 - 若方案 A 不足,可作為備用方案 - 但不應立即整合到 CI --- ## 7. 決策等待項目 1. **Ollama 確定性測試結果** - 確認 `seed` 參數是否有效 2. **統帥確認** - 是否採用方案 A 先行 --- ## 8. 後續追蹤 - [x] Ollama seed 測試完成 (2026-03-26) - [x] 統帥確認方案選擇 (2026-03-26 批准方案 A) - [x] 方案 A 實施 (2026-03-26) - `test_model_regression.py`: 加入 `temperature: 0.0`, `seed: 42` - `test_prompt_validation.py`: 加入 `temperature: 0.0`, `seed: 42` - System Prompt 強化繁體中文指令 - [x] CPU 模式超時調整 (2026-03-26 統帥批准) - 超時從 120 秒 → 300 秒 - 計算基準: 0.45 tok/s × 300 tokens = 666 秒 - [x] 繁體中文修復 (2026-03-26) - OpenClaw System Prompt v7.0 → v7.1 - 加入 Language Requirement 章節 - 明確禁止簡體字 - [ ] 效果驗證 (待 CI 執行) - [ ] 決定是否需要方案 B/C ## 9. GPU 診斷結果 (2026-03-26) **192.168.0.188 無 GPU 硬體** | 檢查項目 | 結果 | |---------|------| | `lspci \| grep nvidia` | 無輸出 | | NVIDIA Driver | 未安裝 | | NVIDIA Libs | 未找到 | **結論**: 此伺服器為純 CPU 機器,Ollama 以 CPU 模式運行 (0.45 tok/s)。 需評估是否遷移到有 GPU 的主機。