From 3f984acc18bdc680ca67fcffa40d335b61b40c90 Mon Sep 17 00:00:00 2001 From: iomgaa Date: Tue, 14 Jul 2026 13:53:17 -0400 Subject: [PATCH] feat: add uses_grounded_selector strategy switch (AR only) --- app/question_gen/strategy.py | 8 ++++++++ .../strategy_action_recognition.py | 5 +++++ tests/unit/test_strategy_grounded_flag.py | 19 +++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 tests/unit/test_strategy_grounded_flag.py diff --git a/app/question_gen/strategy.py b/app/question_gen/strategy.py index 8b88257..5c54337 100644 --- a/app/question_gen/strategy.py +++ b/app/question_gen/strategy.py @@ -91,6 +91,9 @@ class TaskTypeStrategy(Protocol): @property def leak_probe_template(self) -> str: ... + @property + def uses_grounded_selector(self) -> bool: ... + def select_sub_pattern(self, rng: random.Random) -> SubPattern | None: ... def build_prompt_context(self, material: Any, sub_pattern: SubPattern | None) -> dict: ... @@ -168,6 +171,11 @@ class BaseTaskTypeStrategy: """返回泄漏探测模板文件名(委托给绑定的 family.leak_profile)。""" return self._family.leak_profile.probe_template + @property + def uses_grounded_selector(self) -> bool: + """默认不启用 grounded selector(11 类题型走原路径)。""" + return False + def select_sub_pattern(self, rng: random.Random) -> SubPattern | None: """BaseTaskTypeStrategy 无子模式。""" return None diff --git a/app/question_gen/strategy_action_recognition.py b/app/question_gen/strategy_action_recognition.py index f681238..588f7a3 100644 --- a/app/question_gen/strategy_action_recognition.py +++ b/app/question_gen/strategy_action_recognition.py @@ -289,6 +289,11 @@ class ActionRecognitionStrategy: """返回泄漏探测模板文件名。""" return "gate_leak_retrieval.md" + @property + def uses_grounded_selector(self) -> bool: + """AR 启用候选池 + VLM 视觉打分 selector。""" + return True + def select_sub_pattern(self, rng: random.Random) -> SubPattern: """按权重随机选择一个 SubPattern。 diff --git a/tests/unit/test_strategy_grounded_flag.py b/tests/unit/test_strategy_grounded_flag.py new file mode 100644 index 0000000..da7eb50 --- /dev/null +++ b/tests/unit/test_strategy_grounded_flag.py @@ -0,0 +1,19 @@ +"""uses_grounded_selector 分流:仅 AR=True,其余 11 类=False。""" + +from app.question_gen.strategy import get_strategy + +_NON_AR = [ + "Action Reasoning", "Attribute Perception", "Counting Problem", + "Information Synopsis", "Object Recognition", "Object Reasoning", + "OCR Problems", "Spatial Perception", "Spatial Reasoning", + "Temporal Perception", "Temporal Reasoning", +] + + +def test_action_recognition_uses_grounded_selector(): + assert get_strategy("Action Recognition").uses_grounded_selector is True + + +def test_non_ar_do_not_use_grounded_selector(): + for tt in _NON_AR: + assert get_strategy(tt).uses_grounded_selector is False, tt