# 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 的主機。
