$npx -y skills add QFIN-tech/model-evo --skill classification-model-development模型开发总控。在 orchestration 用户确认建模后调起,按迭代式流程串联 classification-model-training / classification-model-tuning / classification-model-comparison 三个 sub-skill,管理路径接力、决策点询问、report.md 回填、断点续跑、无上游 session 时的历史 session 列举与新建。触发词:开发模型、跑 baseline、调参、多模型对比、列历史 session。
| 1 | # 模型开发总控(classification-model-development) |
| 2 | |
| 3 | ## 1. 角色与边界 |
| 4 | |
| 5 | 你是开发阶段的总调度,**不是工程师**。本 skill 只编排 4 个 sub-skill 已有的 CLI,外加一个 session 决议工具 `list_sessions.py`(扫描 `runs/` 下历史 sessions 供用户选择): |
| 6 | - 上游: `classification-model-orchestration` Step 5 在用户选"是"后调起本 skill,传入 `session_dir` 及各上游产物路径。 |
| 7 | - 下游: 4 个 sub-skill |
| 8 | 0. `feature-analysis` — 特征质量分析(IV/PSI/基础统计,一次性必跑) |
| 9 | 1. `classification-model-training` — baseline 训练(8-stage 产物管线) |
| 10 | 2. `classification-model-tuning` — 特征筛选 / 超参调优迭代 |
| 11 | 3. `classification-model-comparison` — session 级 N-way 横向对比 |
| 12 | |
| 13 | 你不替代任何 sub-skill 的内部逻辑,只负责:**何时跑哪个、读哪些产物、问用户什么决策、怎么写回 report.md、怎么断点续跑**。 |
| 14 | |
| 15 | > `feature-analysis` 由本 skill Stage 0 调起,产 `sample-features/feature-analysis/analysis/*.csv` + `sample-features/splits/{train,test,oot}.parquet`,Stage 2a feat 筛选直接消费。 |
| 16 | |
| 17 | ## 2. 输入契约(从 orchestration 接力) |
| 18 | |
| 19 | 启动时**先验证**这 6 项都存在,缺任一 → 报错并指明缺哪个、上游哪个 skill 该补。 |
| 20 | (feature-analysis 产物不在此校验 — 它是本 skill Stage 0 自产,见 3. 节) |
| 21 | |
| 22 | | 输入 | 路径 | 来源 skill | |
| 23 | |------|------|-----------| |
| 24 | | `session_dir` | `runs/{timestamp}-{model_name}/` | orchestration Step 2(或本 skill 2.1 节 session 决议新建) | |
| 25 | | 需求文档 | `task-spec/task-spec.md` + `_manifest.json` | classification-model-task-spec | |
| 26 | | 样本分析 | `data-profile/_manifest.json` | classification-model-task-spec | |
| 27 | | 特征宽表 | `sample-features/feature-matching/sample.parquet` + `feature-list.csv` | feature-matching (spark 模式 / local_file 模式均产, 路径一致) | |
| 28 | | 历史推荐 | `model-recommend/{model_id}/`(含 `evaluation/` 三档 eval JSON) | classification-model-recommend (**local_file 模式下无此产物, 跳过 recommend**; Stage 1 baseline 不对齐历史 baseline) | |
| 29 | | base 对比列 | `model-recommend/{model_id}/evaluation/` 或 yaml `model.baseline_eval_dir` | classification-model-recommend (**local_file 模式下无此产物**; Stage 1 baseline 不做 base 对比) | |
| 30 | |
| 31 | ### 2.1 Session 决议(无上游 session 时由本 skill 负责) |
| 32 | |
| 33 | 当 orchestration 已传入 `session_dir` 时**直接复用,不询问**。当用户新启动一个会话直接调本 skill(无上游 session 上下文)时,本 skill 负责 session 决议: |
| 34 | |
| 35 | 1. 调本 skill 的 `list_sessions.py` 列出历史 sessions(输出 markdown 表:序号/session_id/task_name/created_at/description): |
| 36 | |
| 37 | ```bash |
| 38 | python <skill_dir>/scripts/list_sessions.py |
| 39 | ``` |
| 40 | |
| 41 | 2. 用 `AskUserQuestion` 问用户:选**历史**(给编号)则 `session_dir` 拼该 session 目录;**新建**则追问 `task_name` + 可选 `description`,按 `ts=$(date +%Y%m%d-%H%M%S)` 建 `runs/${ts}-${task_name}/` 并写 `session.json`(字段同根目录 CLAUDE.md 约定) |
| 42 | 3. 同一会话内**不重复询问** |
| 43 | |
| 44 | `list_sessions.py` 参数: |
| 45 | |
| 46 | | 参数 | 必选 | 默认值 | 说明 | |
| 47 | |---|:---:|---|---| |
| 48 | | `--outputs_dir` | 否 | 自动查找 | sessions 根目录;默认从脚本位置向上查找 `runs/` | |
| 49 | |
| 50 | 无历史 session(输出"无历史 session")时走新建流程,追问 `task_name`。 |
| 51 | |
| 52 | ## 3. 阶段流水(迭代式,不是线性) |
| 53 | |
| 54 | ``` |
| 55 | Stage 0: feature-analysis (一次性, 必跑) |
| 56 | ↓ 产 sample-features/feature-analysis/analysis/{stats,iv_table,psi_table}.csv + report.md |
| 57 | ↓ 产 sample-features/splits/{train,test,oot}.parquet (feature-analysis 内部切分) |
| 58 | ↓ fill_report.py --section V 回填 report.md 第五段 |
| 59 | Stage 1: baseline training (一次性, 必跑) |
| 60 | ↓ 产 new-models/{algo}-v{N}/ (8 stages) |
| 61 | ↓ run_build 自动 chain: evaluation → per-run comparison → session-aggregate |
| 62 | Stage 2: 迭代决策点 (loop, 可重复 0~N 次) |
| 63 | ├─ 2a: feature selection → -feat 新 run (消费 feature-analysis 的 csv) |
| 64 | ├─ 2b: hyperparameter tuning → -tuned 新 run |
| 65 | └─ 2c: 换算法 → 新 algo run (回到 Stage 1, 用不同 model.algo) |
| 66 | Stage 3: session-level comparison (auto, 由 run_build 触发) |
| 67 | ↓ 产 model-comparison/model-comparison_{split}.{json,md,xlsx} × 2 (oot, all) + 对比报告.{json,md,xlsx} + _manifest.json |
| 68 | Stage 4: 收口 — 回填 report.md 第七段, 询问用户是否上线候选; 上线候选填入附录「待处理项」 |
| 69 | ``` |
| 70 | |
| 71 | **关键: Stage 2 是 loop,不是单次。** 每个 run 完成后都问用户"继续迭代 / 换路子 / 停下对比",不自动推进。 |
| 72 | |
| 73 | ### 3.0 驾驶模式感知(进入 skill 首要动作) |
| 74 | |
| 75 | 进入本 skill 后,**首要动作是读** `<session_dir>/task-spec/_manifest.json` 的 `driving_mode` 字段,按其取值决定 5. 节决策点话术是否触发。字段定义、关键词检测、`auto` 模式下各 Stage 自动推进路径、默认 baseline 算法、日志格式详见 [../classification-model-orchestration/references/driving-mode.md](../classification-model-orchestration/references/driving-mode.md) 第 6.4 节。本 skill 是 `driving_mode` 的**消费者**,不改字段。 |
| 76 | |
| 77 | ## 4. 路径接力契约(强制) |
| 78 | |
| 79 | 每个阶段的"读什么 / 写什么 / 跑哪条 CLI / 跑完调哪条回填"如下表钉死,避免 agent 跑错路径: |
| 80 | |
| 81 | | 阶段 | 读 | 写 | 接力 CLI | report.md 回填 | |
| 82 | |------|----|----|---------|---------------| |
| 83 | | Stage 0 | `sample-features/feature-matching/sample.parquet` + `feature-list.csv` | `sample-features/feature-analysis/analysis/{report.md,stats,iv_table,psi_table}.csv` + `_manifest.json` + `sample-features/splits/{train,test,oot}.parquet` | `python feature-analysis/scripts/run_analysis.py --config <session_dir>/sample-features/feature-analysis/feature_config.yaml --data_path <session_dir>/sample-features/feature-matching/sample.parquet --output_dir <session_dir>/sample-features/feature-analysis/analysis` | `--section V` | |
| 84 | | Stage 1 | `sample-features/feature-matching/sample.parquet` + `feature-list.csv`(全量) | `new-models/{algo}-v{N}/{config,features,model,evaluation,predictions,explainability,comparison,logs}/` | `python |