Skip to content

feat(vision_mcq): implement VisionMCQExtractor + evaluator vision routing #129

@lianghsun

Description

@lianghsun

實作 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 時夾帶圖片

任務內容

新增檔案

  1. twinkle_eval/metrics/extractors/vision_mcq.py

    • VisionMCQExtractor with uses_vision: bool = True
    • extract() 重用 PatternExtractor 的答案提取邏輯
    • 支援 A/B/C/D letter 與 Yes/No (POPE) 雙模式
  2. 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)

修改檔案

  1. 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 相同流程)
  2. twinkle_eval/metrics/__init__.py

    • Import VisionMCQExtractor
    • PRESETS[\"vision_mcq\"] = (VisionMCQExtractor, ExactMatchScorer)
  3. twinkle_eval/benchmarks.py

    • 新增 4 個 benchmark entries (mmbench, mmstar, mmmu, pope),eval_method="vision_mcq"
  4. twinkle_eval/__init__.py

    • Export VisionMCQExtractor
  5. pyproject.toml

    • 新增 vision = [\"Pillow>=10.0.0\"] optional dependency group

驗收標準

  • VisionMCQExtractor 可正確提取 A/B/C/D 與 Yes/No
  • evaluator.py 的 vision 分支可處理本地檔案與 URL
  • 支援可選的 Pillow image resize(避免超過 API token 限制)
  • PRESETS 註冊正確
  • 4 個 benchmark 已加入 registry

Part of Milestone #22

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    Status

    Backlog

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions