實作 VisionMCQExtractor 與 evaluator.py 的 vision 路由分支,為 Twinkle Eval 加入 VLM 評測能力。
對應 CLAUDE.md
Section 6.2 - 依參考框架重構為本專案架構
設計決策
- 不需新 Model class:OpenAIModel 已支援 messages 參數,可直接傳 multimodal content
- uses_vision flag:Extractor 以 class-level flag 觸發 evaluator 路由(與 ASR 的 uses_audio 模式一致)
- 重用 ExactMatchScorer:MCQ 的評分邏輯不變,差別只在於送出 prompt 時夾帶圖片
任務內容
新增檔案
-
twinkle_eval/metrics/extractors/vision_mcq.py
VisionMCQExtractor with uses_vision: bool = True
extract() 重用 PatternExtractor 的答案提取邏輯
- 支援 A/B/C/D letter 與 Yes/No (POPE) 雙模式
-
twinkle_eval/templates/vision_mcq.yaml
evaluation_method: \"vision_mcq\"
strategy_config.image_field: \"image_path\" (預設值,可覆寫)
strategy_config.max_image_size: null (optional Pillow resize)
修改檔案
-
twinkle_eval/runners/evaluator.py
- 在
uses_audio 分支之後新增 elif getattr(self.extractor, \"uses_vision\", False):
- 邏輯:
a. 從 question_data 讀取 image_path(欄位名由 strategy_config 控制)
b. 本地檔案 → base64 data URI;URL → 直接傳遞
c. 建構 multimodal messages with image_url + text content blocks
d. 呼叫 self.llm.call(messages=messages)
e. 提取答案 + 評分(與 text MCQ 相同流程)
-
twinkle_eval/metrics/__init__.py
- Import VisionMCQExtractor
PRESETS[\"vision_mcq\"] = (VisionMCQExtractor, ExactMatchScorer)
-
twinkle_eval/benchmarks.py
- 新增 4 個 benchmark entries (mmbench, mmstar, mmmu, pope),eval_method="vision_mcq"
-
twinkle_eval/__init__.py
- Export VisionMCQExtractor
-
pyproject.toml
- 新增
vision = [\"Pillow>=10.0.0\"] optional dependency group
驗收標準
Part of Milestone #22
實作 VisionMCQExtractor 與 evaluator.py 的 vision 路由分支,為 Twinkle Eval 加入 VLM 評測能力。
對應 CLAUDE.md
Section 6.2 - 依參考框架重構為本專案架構
設計決策
任務內容
新增檔案
twinkle_eval/metrics/extractors/vision_mcq.pyVisionMCQExtractorwithuses_vision: bool = Trueextract()重用 PatternExtractor 的答案提取邏輯twinkle_eval/templates/vision_mcq.yamlevaluation_method: \"vision_mcq\"strategy_config.image_field: \"image_path\"(預設值,可覆寫)strategy_config.max_image_size: null(optional Pillow resize)修改檔案
twinkle_eval/runners/evaluator.pyuses_audio分支之後新增elif getattr(self.extractor, \"uses_vision\", False):a. 從 question_data 讀取 image_path(欄位名由 strategy_config 控制)
b. 本地檔案 → base64 data URI;URL → 直接傳遞
c. 建構 multimodal messages with image_url + text content blocks
d. 呼叫 self.llm.call(messages=messages)
e. 提取答案 + 評分(與 text MCQ 相同流程)
twinkle_eval/metrics/__init__.pyPRESETS[\"vision_mcq\"] = (VisionMCQExtractor, ExactMatchScorer)twinkle_eval/benchmarks.pytwinkle_eval/__init__.pypyproject.tomlvision = [\"Pillow>=10.0.0\"]optional dependency group驗收標準
Part of Milestone #22