$npx -y skills add QFIN-tech/model-evo --skill classification-model-orchestration分类建模流程编排(覆盖营销/增长/获客/运营/风控场景),作为 model-task-routing 的下游。当 task_type=classification 后拉起本 skill,接收 routing_input JSON,自动创建任务目录、管理 session 时间戳和命名规范,通过 report.md 和各目录 _manifest.json 追踪进度。
| 1 | # 分类建模流程编排器 |
| 2 | |
| 3 | ## 1. 角色定义 |
| 4 | |
| 5 | 你是**分类建模流程**的总调度。职责不是做需求挖掘或方案设计,而是**确保分类流水线按顺序执行、文件落在正确的位置、命名符合规范**。本 skill 由 `model-task-routing` 在判定为 classification 方向后拉起,接收 routing_input JSON,不向用户重复询问已知字段。 |
| 6 | |
| 7 | 核心原则: |
| 8 | - **下游身份**:所有请求先经 `model-task-routing` 路由后再进入 |
| 9 | - **信息透传**:routing_input JSON 中的已知字段直接透传给下游,不重复提问 |
| 10 | - **每个新需求独立对待**,不假设与历史需求有关联 |
| 11 | - **文件命名规范化**,确保后续 skill 能自动定位 |
| 12 | - **Session 组织**:每次任务以 `{timestamp}-{model_name}` 组织 |
| 13 | - **进度透明**:通过 `report.md` 和各目录 `_manifest.json` 追踪 |
| 14 | |
| 15 | ## 2. 输入依赖 |
| 16 | |
| 17 | ### 2.1 routing_input JSON(从 model-task-routing 接力) |
| 18 | |
| 19 | 启动时**先验证** routing_input JSON 是否存在且 `task_type == "classification"`,缺关键字字段 → 报错并指明缺哪个。 |
| 20 | |
| 21 | | 字段 | 含义 | |
| 22 | |------|------| |
| 23 | | `task_type` | 必须为 `"classification"` | |
| 24 | | `routing_basis` | 路由判定依据 | |
| 25 | | `user_raw_request` | 用户最初诉求原话 | |
| 26 | | `routed_at` | 路由时间戳 | |
| 27 | |
| 28 | ### 2.2 路径约定 |
| 29 | |
| 30 | - `<session_dir>` = `runs/{timestamp}-{model_name}/`,timestamp 为 session 启动时间(`YYYYMMDD-HHMMSS`),model_name 全小写+下划线 |
| 31 | - 本 skill 在 task-spec 完成后创建 `<session_dir>` 及子目录 |
| 32 | |
| 33 | ### 2.3 触发条件 |
| 34 | |
| 35 | 本 skill **不由用户直接触发**,由 `model-task-routing` 在判定 `task_type == "classification"` 后拉起。 |
| 36 | |
| 37 | ## 3. 工作流程 |
| 38 | |
| 39 | ### 3.1 会话启动检查 |
| 40 | |
| 41 | 扫描 `runs/` 下所有 `{timestamp}-{model_name}` 命名的任务文件夹,按时间戳倒序取最近 5 个,对每个文件夹读 `task-spec/_manifest.json` 推断进度,主动询问用户继续历史或新建。**用户已表达"新建"/"继续某 session"等意图的,直接按其意图执行。** |
| 42 | |
| 43 | 进度推断规则(8 阶段:task-spec / 样本分析 / model-recommend / feature-matching / feature-analysis / Dev Stage 1~3)详见 [references/session-progress-inference.md](references/session-progress-inference.md)。 |
| 44 | |
| 45 | ### 3.2 驾驶模式选择 |
| 46 | |
| 47 | 新建 session 时**首先询问驾驶模式**(辅助驾驶 = 完整需求澄清 + 建模决策询问;全自动驾驶 = 默认值填充 + 跳过建模决策直接推进)。关键词「全自动驾驶」/「自动驾驶」自动触发全自动驾驶。字段定义、关键词检测、6-row 对比表、流程要点、默认值表、各 skill 消费行为详见 [references/driving-mode.md](references/driving-mode.md)。 |
| 48 | |
| 49 | - 用户选择全自动驾驶 → 进入 3.8 节;辅助驾驶 → 进入 3.3 节 |
| 50 | |
| 51 | **全自动驾驶模式只支持 local_file**:进入 3.8 节后直接走本地 parquet/csv 路径,**不给用户选择 spark 取数模式**。用户在全自动驾驶下表达 spark 诉求时,输出提示并停止: |
| 52 | |
| 53 | ``` |
| 54 | 全自动驾驶模式仅支持本地样本(local_file),不支持 spark 取数。请改用本地 parquet/csv,或切回辅助驾驶模式走 spark。 |
| 55 | ``` |
| 56 | |
| 57 | 用户改口切回辅助驾驶 → 重新进入 3.3 节走分支 A;用户改口提供本地 parquet → 继续 3.8 节。 |
| 58 | |
| 59 | > **切分硬规则(两种模式通用)**:Train/Test/OOT 必须按 `dt_col` 升序后切分,**禁止随机切分**。用户输入二选一:(a) 显式时间区间;(b) 比例(如 7:2:1),由脚本按时间顺序切到对应比例。不得接受随机 seed 切分或 sklearn shuffle 切分。 |
| 60 | |
| 61 | ### 3.3 数据源模式选择(辅助驾驶) |
| 62 | |
| 63 | 辅助驾驶模式下,如果用户提供完整本地样本数据走分支B,其余走分支A。用户已表达"用本地 parquet"/"用 spark 取数"等明确意图的,直接按其意图分支。 |
| 64 | |
| 65 | - **分支 A:Spark 取数(默认)** → 走完整 task-spec/recommend/feature-matching 流程 |
| 66 | - **分支 B:本地 parquet(mode=local_file)** → 见 3.7 节 |
| 67 | |
| 68 | ### 3.4 需求确认 + 样本分析 + 创建目录 + report.md 初始化 |
| 69 | |
| 70 | 调用 `classification-model-task-spec`,**跳过其问题类型判定**(上游已判定),将 routing_input JSON 透传。task-spec 自身的 `fetch_sample_task_spec.py` 拉样本,`run_sample_analysis_task_spec.py` 做切分+分析。 |
| 71 | |
| 72 | **完成标准**:需求成熟度 A 或 B 级,且样本分析通过。 |
| 73 | |
| 74 | **出口校验(强制)**: |
| 75 | |
| 76 | ```bash |
| 77 | [ -f <session_dir>/task-spec/task-spec.md ] && \ |
| 78 | [ -f <session_dir>/task-spec/_manifest.json ] && \ |
| 79 | [ -f <session_dir>/task-spec/.done ] || \ |
| 80 | echo "ERROR: task-spec 三件套缺失" |
| 81 | ``` |
| 82 | |
| 83 | task-spec 完成后立即创建 session 目录、保存 task-spec 三件套(含 routing 溯源 + driving_mode 字段)、初始化 `report.md`: |
| 84 | |
| 85 | ```bash |
| 86 | TIMESTAMP=$(date +%Y%m%d-%H%M%S) |
| 87 | mkdir -p runs/${TIMESTAMP}-{model_name}/{task-spec,data-profile,model-recommend} |
| 88 | ``` |
| 89 | |
| 90 | - `task-spec.md` 顶部标注 `> 驾驶模式: {全自动驾驶 | 辅助驾驶}` |
| 91 | |
| 92 | **report.md 章节结构**(7 节固定顺序 + 1 附录,编号统一汉字 `一、二、...七、`,与 `fill_report.py` 锚点对齐): |
| 93 | |
| 94 | ```markdown |
| 95 | # 建模全流程报告 — {model_name} |
| 96 | > 模型简称 / 需求 / 源表 / session |
| 97 | |
| 98 | ## 一、需求 ← task-spec 完成后填 |
| 99 | ## 二、样本 ← data-profile 完成后填 |
| 100 | ## 三、历史模型推荐 ← recommend 完成后填 |
| 101 | ## 四、特征宽表 ← fill_report.py --section IV 回填 |
| 102 | ## 五、特征分析 ← fill_report.py --section V 回填 |
| 103 | ## 六、模型迭代 ← fill_report.py --section VI 回填 |
| 104 | ## 七、横向对比 ← fill_report.py --section VII 回填 |
| 105 | ## 附录:待处理项与下一步建议 |
| 106 | ``` |
| 107 | |
| 108 | > `fill_report.py --section` key(IV/V/VI/VII)是脚本内部 key,对应 report.md 第「四~七」节,**不错位**。一/二/三 节 + 附录由 orchestration 自填。 |
| 109 | |
| 110 | **子目录内容规范**: |
| 111 | |
| 112 | | 子目录 | 产出 skill | 关键内容 | 完成标志 | |
| 113 | |--------|-----------|---------|---------| |
| 114 | | `task-spec/` | task-spec | `task-spec.md` + `_manifest.json` + `.done` | `.done` 存在 | |
| 115 | | `data-profile/` | task-spec | `report.md`/`xlsx` + `_manifest.json` + `_split_manifest.json` + `{model_name}_sample_*.parquet` + 三档 parquet | `_manifest.json` 存在 | |
| 116 | | `model-recommend/` | recommend | `recommendations_*.md`(local_file 模式下无此目录) | `recommendations_*.md` 存在 | |
| 117 | | `sample-features/feature-matching/` | feature-matching | `sample.parquet` + `feature-list.csv` + `sample_config.<model_name>.yaml` | `sample.parquet` + `feature-list.csv` 存在 | |
| 118 | | `sample-features/feature-analysis/` | feature-analysis | `feature_config.yaml` + `analysis/`(report.md/xlsx + _manifest + stats/iv/psi/woe/feature-profile/feature-quality 表) | `analysis/_manifest.json` 存在 | |
| 119 | | `sample-features/splits/` | feature-analysis | `train/test/oot.parquet` | 三个 parquet 存在 | |
| 120 | | `new-models/{algo}-{run_label}/` | development | `config.json` + `model/` + `features/` + `evaluation/` + `predictions/` + `explainability/` + `logs/run.log` + `report.md` | `config.json` + `model/` + `evaluation/` 存在 |