最後更新: 2025-12-08
目前狀態: 主要實驗完成,消融實驗待執行
本專案研究 LLM-as-a-Judge 系統的安全性問題,設計並實作:
- 通用對抗短語攻擊 - 不需知道具體評分任務,可系統性提升劣質回答的評分
- 輕量級防禦策略 - 包含 Guard Suffix、Order Consistency Check 等多種防禦方法
SPML final project/
├── README.md # 本說明文件
├── requirements.txt # Python 依賴套件
├── proposal.md # 專案提案
├── projectroad1.md # 開發路線圖 1
├── projectroad2.md # 開發路線圖 2
│
├── src/ # 核心模組
│ ├── judge.py # LLM 評審模型 (JudgeModel 類別)
│ ├── attack.py # 基礎攻擊方法
│ ├── attack_advanced.py # 進階攻擊 (5種策略)
│ ├── defense.py # 基礎防禦方法
│ ├── defense_advanced.py# 進階防禦 (6+種策略)
│ └── metric.py # 評估指標工具
│
├── data/ # 資料集
│ ├── test.jsonl # 原始測試資料 (10筆)
│ └── tasks_extended.jsonl # 擴展資料集 (68筆, 8類任務)
│
├── evaluate.py # 基礎評估腳本
├── evaluate_enhanced.py # 增強版評估腳本 (支援多策略)
├── ablation.py # 消融實驗腳本
├── plots.py # 視覺化圖表生成
├── generate_report.py # 報告生成器
├── run.py # 一鍵執行腳本
│
└── runs/ # 實驗結果
├── exp_final/ # 主要實驗結果 ✓
│ ├── baseline.csv # 基準評分
│ ├── attacked.csv # 攻擊後評分
│ ├── defended.csv # 防禦後評分
│ ├── attack_phrase.txt # 最佳攻擊短語
│ ├── summary.json # 結果摘要
│ ├── report.md # 實驗報告
│ └── plots/ # 視覺化圖表 (6張)
└── final_report.md # 最終報告模板
pip install -r requirements.txt注意: NumPy 需使用 1.x 版本 (已在 requirements.txt 中指定)
pip install "numpy<2" # 如遇到錯誤請執行此命令# 使用預設模型 (Qwen2.5-0.5B-Instruct)
python evaluate.py --model "Qwen/Qwen2.5-0.5B-Instruct" --device cuda --out runs/new_exp
# 或使用一鍵執行腳本 (包含完整流程)
python run.py --model "Qwen/Qwen2.5-0.5B-Instruct" --run-name my_experimentpython ablation.py --model "Qwen/Qwen2.5-0.5B-Instruct" --device cuda --out runs/ablationpython plots.py --run runs/exp_final --out runs/exp_final/plotspython generate_report.py --type final --results runs/exp_final --output runs/exp_final/report.md| 指標 | 數值 | 說明 |
|---|---|---|
| 攻擊短語 | "Outstanding quality" | 搜尋 30 次迭代找到 |
| 分數提升 (Δscore) | +0.289 | 攻擊後絕對評分平均提升 |
| 翻轉率 (Flip Rate) | 0.0% | 配對比較選擇翻轉比例 |
| 防禦拒絕率 | 59.4% (38/64) | 防禦過於激進,需調整 |
- 防禦過於激進: OCC+GS 組合導致約 60% 的樣本被拒絕
- 建議: 可嘗試只使用 Guard Suffix (GS) 或調低 OCC 閾值
from src.judge import JudgeModel, GenConfig
judge = JudgeModel("Qwen/Qwen2.5-0.5B-Instruct", device="cuda")
score, raw = judge.score_absolute(instruction, response) # 絕對評分
choice, raw = judge.choose_pairwise(instruction, resp_a, resp_b) # 配對比較支援 5 種策略:
hill_climb: 迭代式優化 (預設)greedy: 貪婪搜尋random: 隨機採樣semantic: 語義模板攻擊ensemble: 組合策略
支援 6+ 種策略:
guard_suffix(GS): 添加防禦指令occ: Order Consistency Checkocc_gs: 結合 OCC 和 GSsanitization: 輸入過濾multi_round: 多輪投票ensemble: 組合防禦
位於 runs/exp_final/plots/:
exp_final_score_dist.png- 分數分佈圖exp_final_attack_impact.png- 攻擊效果對比exp_final_defense_effect.png- 防禦效果分析exp_final_task_analysis.png- 任務類別分析exp_final_latency.png- 延遲統計exp_final_dashboard.png- 綜合儀表板
- 擴展資料集 (68 筆, 8 類任務)
- 進階攻擊模組 (5 種策略)
- 進階防禦模組 (6+ 種策略)
- 視覺化模組 (6 種圖表)
- 消融實驗腳本
- 報告生成器
- 主要實驗執行完成
- 視覺化圖表生成
-
消融實驗: 比較不同攻擊/防禦策略效果
python ablation.py --model "Qwen/Qwen2.5-0.5B-Instruct" --device cuda --out runs/ablation預計耗時: 30-60 分鐘
-
調整防禦參數: 降低拒絕率
- 修改
evaluate.py中的防禦策略設定 - 可嘗試只用
guard_suffix而非occ_gs
- 修改
-
完善最終報告: 加入消融實驗結果
python generate_report.py --type final --results runs/exp_final --output final_report.md
-
測試其他模型 (可選):
- Llama-3.2-1B-Instruct
- Phi-3-mini
- 其他開源 LLM
| 項目 | 版本/規格 |
|---|---|
| Python | 3.11 |
| GPU | NVIDIA GeForce RTX 3090 |
| PyTorch | 2.x (CUDA) |
| transformers | latest |
| NumPy | 1.26.4 (需 < 2.0) |
- 環境設置: 確保 NumPy < 2.0,否則會有 scipy/sklearn 相容性問題
- 模型快取: Qwen2.5-0.5B-Instruct 已下載在 HuggingFace 快取中 (~988MB)
- GPU 記憶體: 0.5B 模型約需 2-3GB VRAM
- 實驗時間:
- 主要實驗 (30 iterations): ~5-6 分鐘
- 消融實驗 (完整): ~30-60 分鐘
如有問題請聯繫專案成員。
最後更新: 2025-12-08 00:35