"""视频级切分选择:signal 分层、视频聚合、贪心联合约束选择(纯函数)。 结果驱动切分管线的核心:把诊断信号投影为多样性格子,供贪心选择器最大化覆盖。 本模块起步定义 evolution_target 派生与多样性格子;后续追加 score_signal / build_video_records / select_split。 """ from __future__ import annotations from dataclasses import dataclass _EVOLUTION_TARGET = { "extraction_failure": "tool", "search_failure": "skill", "reasoning_failure": "skill", "mixed": "system", } def evolution_target_of(error_type: str) -> str: """由 error_type 确定性派生进化目标(tool/skill/system)。 这是报告用的派生标注,非独立多样性轴(多样性主格子=task_type×error_type)。 参数: error_type: 诊断瀑布归因的错误类别(extraction/search/reasoning/mixed_failure)。 返回: 进化目标字符串 tool / skill / system。 异常: ValueError: error_type 不在已知集合内(不静默兜底)。 """ if error_type not in _EVOLUTION_TARGET: raise ValueError(f"未知 error_type: {error_type}") return _EVOLUTION_TARGET[error_type] def cell_of(task_type: str, error_type: str) -> tuple[str, str]: """构造多样性主格子 = (task_type, error_type)。 参数: task_type: 题型(12 类之一)。 error_type: 错误类别(4 类之一)。 返回: (task_type, error_type) 二元组,作为覆盖计数的格子键。 """ return (task_type, error_type) @dataclass(frozen=True) class SignalLabel: """诊断信号分层标签(DiagnosisResult 的确定性投影)。 字段: tier: 信号层级,取值 T0 / T1 / T2 / uncertain(判据见 score_signal)。 """ tier: str def score_signal(*, cause_category: str | None, infra: bool, degraded: bool) -> SignalLabel: """把诊断产物投影为信号分层 tier(不发明新分类,是确定性投影)。 分层优先级顺序固定(用早返回表达,不用魔法权重): 先判 INFRA,再判 degraded,然后 defect / lapse,最后兜底 uncertain。 各层判据来源: T0 — infra=True,即诊断 INFRA 排除(stop_reason ∈ {error, parse_error}), 基础设施失败先于一切判定,排除出可训练主体。 uncertain — degraded=True(judge 解析失败)或 cause_category 落不到 defect/lapse 上(如为 None),信号不可信,排除出 T2。 T2 — cause_category == "defect",可训练核心,进多样性覆盖与训练主体。 T1 — cause_category == "lapse",低信号(含无解题),接受但不作训练主体。 参数: cause_category: 诊断的缺陷归因("defect" / "lapse" / None)。 infra: 是否被 INFRA 护栏排除(基础设施失败)。 degraded: judge 是否解析失败导致诊断降级。 返回: SignalLabel,其 tier 字段为上述四层之一。 实现细节: 关键字参数强制传入,防止 infra / degraded 两个 bool 位置混淆。 """ if infra: return SignalLabel(tier="T0") if degraded: return SignalLabel(tier="uncertain") if cause_category == "defect": return SignalLabel(tier="T2") if cause_category == "lapse": return SignalLabel(tier="T1") return SignalLabel(tier="uncertain")