"""Phase B 对抗过滤层配置 — filter 层配置(非 strategy 属性)。 设计: research-wiki/designs/2026-07-14-adversarial-question-gen-phaseB-design.md §8 """ from __future__ import annotations from dataclasses import dataclass from typing import TYPE_CHECKING import yaml if TYPE_CHECKING: from pathlib import Path @dataclass(frozen=True) class AdversarialFilterConfig: """后置对抗过滤配置。 属性: filter_task_types: 被过滤的题型(仅这些走 agent 门),默认仅 AR。 adversarial_max_rounds: 补生成迭代上限。 adversarial_agent_max_steps: agent 试答步数上限。 difficulty_warn_threshold: 批次 agent 正确率告警阈值。 """ filter_task_types: tuple[str, ...] = ("Action Recognition",) adversarial_max_rounds: int = 5 adversarial_agent_max_steps: int = 40 difficulty_warn_threshold: float = 0.85 def load_adversarial_config(config_path: Path) -> AdversarialFilterConfig: """从 YAML 的 adversarial_filter 区段加载配置,缺段/缺键用默认值。 参数: config_path: YAML 配置文件路径。 返回: AdversarialFilterConfig 实例。 """ with open(config_path, encoding="utf-8") as f: raw = yaml.safe_load(f) or {} section = raw.get("adversarial_filter", {}) or {} default = AdversarialFilterConfig() types = section.get("filter_task_types") return AdversarialFilterConfig( filter_task_types=tuple(types) if types else default.filter_task_types, adversarial_max_rounds=int( section.get("adversarial_max_rounds", default.adversarial_max_rounds) ), adversarial_agent_max_steps=int( section.get("adversarial_agent_max_steps", default.adversarial_agent_max_steps) ), difficulty_warn_threshold=float( section.get("difficulty_warn_threshold", default.difficulty_warn_threshold) ), )