$npx -y skills add QFIN-tech/model-evo --skill classification-model-recommend给业务人员推荐历史营销模型——解析自然语言需求(客群+用途)→读模型台账语义筛选排序→展示详情→询问是否评估→(可选)委托 classification-model-evaluation 产三档评估。当用户说"推荐历史模型""找可复用模型""有没有现成模型""历史模型""模型推荐"时使用。
| 1 | # 历史模型推荐 |
| 2 | |
| 3 | > 给业务人员从历史营销模型列表中找到可复用模型,支持可选的样本上评估(委托 classification-model-evaluation 产三档标准化三件套)。 |
| 4 | |
| 5 | ## 1. 输入依赖 |
| 6 | |
| 7 | | 输入 | 必选 | 来源 | 说明 | |
| 8 | |---|:---:|---|---| |
| 9 | | 需求自由描述 | ✅ | 用户输入 | 一段话,从中抽取 `business`(业务线)/ `segment`(训练客群)/ `keyword`(用途关键词,可多个);条件缺失不臆造,留空=该维度不限 | |
| 10 | | 模型台账 | ✅ | `model-knowledge/assets/historical-model-knowledge/model_catalog.csv` | 14 列 CSV;数据资产,不属于 session | |
| 11 | | 模型报告 | 否 | `model-knowledge/assets/historical-model-knowledge/reports/` | `{model_id}_{模型简称}.md` 及同名 `.json`;`模型报告路径` 列非空时提取历史指标展示 | |
| 12 | | `session_dir` | 评估时必选 | 会话启动确认(见根目录 CLAUDE.md) | 推荐落盘与评估产物目录 `${session_dir}/model-recommend/{model_id}/` | |
| 13 | | `split_ranges` | 评估时必选 | `task-spec/_manifest.json` 或 `data-profile/_manifest.json` | train_range / test_range / oot_range 三档切分区间 | |
| 14 | | 样本表 / 模型表 | 评估时必选 | task-spec manifest / 台账 `模型表` 字段 | 样本表提供 label,模型表提供 score,默认按 `[user_no, pday]` JOIN | |
| 15 | |
| 16 | ## 2. 执行命令 |
| 17 | |
| 18 | `<skill_dir>` 指本 skill 所在目录(即本文件所在目录),执行时替换为实际绝对路径,不要依赖当前工作目录。 |
| 19 | |
| 20 | **模型推荐**(工作流程 Step 2-3):无独立召回脚本。Claude 直接读 `model-knowledge/assets/historical-model-knowledge/model_catalog.csv`(14 列 CSV)作为候选池,按解析出的 `business`/`segment`/`keyword` 语义筛选 + 排序,默认 Top3。台账规模建议 ≤ 数百行;超出时由调用方先按业务线等维度自行切片。 |
| 21 | |
| 22 | **评估委托**(工作流程 Step 6,用户选择评估时;单条 entry,wrapper 内部 4 步: fetch → get → split → eval): |
| 23 | |
| 24 | ```bash |
| 25 | python <skill_dir>/scripts/fetch_eval_sample.py \ |
| 26 | --session-dir <session_dir> \ |
| 27 | --model-id <model_id> \ |
| 28 | --sample-table <db>.<sample_table> \ |
| 29 | --score-table <db>.<score_table> \ |
| 30 | --join-keys user_no,pday \ |
| 31 | --fetch-start <YYYYMMDD> --fetch-end <YYYYMMDD> \ |
| 32 | --train-range <YYYYMMDD>,<YYYYMMDD> \ |
| 33 | --test-range <YYYYMMDD>,<YYYYMMDD> \ |
| 34 | --oot-range <YYYYMMDD>,<YYYYMMDD> \ |
| 35 | --score-col score --label-col label |
| 36 | # 加 --submit 同步执行 wrapper; 加 --no-eval 仅产 predictions 跳过评估 |
| 37 | ``` |
| 38 | |
| 39 | `fetch_eval_sample.py` 内部生成的 `fetch_eval_{model_id}.sh` 4 步: |
| 40 | 1. **STEP1** spark-submit 调 shared `fetch_spark.py`,样本表⋈模型表 LEFT JOIN,写 HDFS `sample.parquet` |
| 41 | 2. **STEP2** `hdfs dfs -get` 拉本地 `predictions/sample.parquet` |
| 42 | 3. **STEP3** 本地 `split_sample.py` 按 pday 区间切 train/test/oot 三档 |
| 43 | 4. **STEP4** `invoke_evaluation.py` 委托 `classification-model-evaluation/scripts/eval_single.py` 产三件套 |
| 44 | |
| 45 | ## 3. 参数说明 |
| 46 | |
| 47 | ### 3.1 完整工作流程 |
| 48 | |
| 49 | #### 3.1.1 解析自由描述(Step 1) |
| 50 | |
| 51 | 从业务人员的一段话里抽取: |
| 52 | - `business`(业务线,与台账 `业务线` 列取值对齐;未提到则不限) |
| 53 | - `segment`(训练客群,与台账 `训练客群` 列对齐;未提到则不限) |
| 54 | - `keyword`(用途/场景关键词,可多个) |
| 55 | |
| 56 | 抽取后**回显解析出的条件**给用户确认。条件缺失不要臆造,留空即可(留空=该维度不限)。 |
| 57 | |
| 58 | **客群口径**:模型列表 `训练客群` 字段是自由文本,Claude 在语义匹配时综合处理:状态口径(细分状态)、全量口径(含"全量/全客群/全部"等视为不限客群)、自由文本(语义近似匹配)。无需额外规则配置。 |
| 59 | |
| 60 | #### 3.1.2 语义筛选与排序(Step 2-3) |
| 61 | |
| 62 | 直接读 `model-knowledge/assets/historical-model-knowledge/model_catalog.csv` 作为候选池。先按 `状态=可用` 过滤(用户要求含不可用模型时放宽),再结合以下因素给出最终排序(模型列表无 KS/AUC/PSI 指标列,故主要靠语义与时效): |
| 63 | - **语义相关性**:候选的 `模型中文名`、`预测目标`、`正样本定义`、`训练客群` 与用户真实意图的贴合度 |
| 64 | - **时效**:`训练时间窗` 越近越好(注意区分 train 与 oot 区间) |
| 65 | - **可用性**:`状态`=可用 优先;非可用需明确告知 |
| 66 | |
| 67 | #### 3.1.3 展示推荐详情(Step 4,强制) |
| 68 | |
| 69 | **必须**向用户展示推荐结果,默认 Top3(不足则按实际)。每个模型完整展示 14 个字段(排名+适配度 / model_id / 模型中文名 / 预测目标 / 正样本定义 / 算法类型 / 训练客群 / 训练时间窗 / 模型表 / 状态 / 负责人 / 推荐理由 / 历史指标 / 可复用点),展示原则、落盘规则、降级处理、报告指标提取(含 `data_profile.data_splits[]` 性能表与 `performance.score_buckets[]` 分档表)详见 `references/recommendation-details.md`。**不允许只输出 model_id 列表**。 |
| 70 | |
| 71 | #### 3.1.4 询问是否在样本上评估(Step 5,强制) |
| 72 | |
| 73 | **推荐展示完成后,必须主动询问用户是否在当前样本上评估推荐模型的表现**,不能跳过、不能默认不评估。 |
| 74 | |
| 75 | 询问话术(示例): |
| 76 | ``` |
| 77 | > 推荐已完成,Top1 是 `<model_id>`(高适配度)。 |
| 78 | > |
| 79 | > 是否需要基于当前任务样本(50,000 条,5 个 pday)在样本上评估 `<model_id>` 的实际表现? |
| 80 | > - 评估 → 按 Train/Test/OOT 三档切分,分别计算 KS/AUC/分档分布,产出三份报告 |
| 81 | > - 跳过 → 直接进入下一步(feature-matching 拉训练特征宽表) |
| 82 | ``` |
| 83 | |
| 84 | **用户选择"评估"**:走「Step 6 生成评估脚本并提交」;评估脚本调用 `fetch_eval_sample.py`(取数+切分+委托评估一条龙),一次作业产三档标准化三件套。 |
| 85 | |
| 86 | **用户选择"跳过"**:不生成评估脚本,直接进入下游 feature-matching;在 `_manifest.json` 中标注 `eval_performed: false`。 |
| 87 | |
| 88 | #### 3.1.5 生成评估脚本并提交(Step 6,当用户选择评估时) |
| 89 | |
| 90 | **输入信息传递**: |
| 91 | - 样本表: `task-spec/_manifest.json` 中的 `source_table`(含 label + 关联键) |
| 92 | - 模型表: 推荐结果 Top1 的 `model_table`(提供 score) |
| 93 | - 关联键: 默认 `[user_no, pday]`,两表同名(否则需建视图别名) |
| 94 | - 切分区间: 复用 `data-profile/_manifest.json` 中的 `split_ranges` |
| 95 | - 分数字段: 默认 `score`,可在 CLI `--score-col` 覆盖 |
| 96 | - 标签字段: 默认 `label`,可在 CLI `--label-col` 覆盖 |
| 97 | |
| 98 | **配置文件**:`<session_dir>/model-recommend/{model_id}/eval_config.yaml`(由 `fetch_eval_sample.py` 自动落盘)。完整模板见 `references/recommendation-details.md` 第 2 节。 |
| 99 | |
| 100 | **评估完成后**: |
| 101 | - 读取三份 JSON,向用户展示 Train/Test/OOT 的 AUC/KS/标签率汇总表 + 分档分布摘要 |
| 102 | - 将评估结果摘要追加到 `<session_dir>/report.md` 的"三、历史模型推荐"段 |
| 103 | - 在 `<session_dir>/model-recommend/{model_id}/_manifest.json` 中记录 `eval_performed: true` + 三档指标 |
| 104 | - 若发现模型在 OOT 上明显衰减(AUC 跌幅 > 0.03),提示用户注意 |
| 105 | |
| 106 | ### 3.2 fetch_eval_sample.py(评估 entry:取数+切分+委托评估一条龙) |
| 107 | |
| 108 | 详见 `references/script-parameters.md` 第 2 节。关键参数:`--session-dir` / `--model-id` / `--sample-table` / `--score-table` / 三档 `*-range` / `--score-lag-day`(t-1 滞后 JOIN)。 |
| 109 | |
| 110 | ### 3.3 split_sample.py(本地三档切分) |
| 111 | |
| 112 | 详见 `references/script-parameters.md` 第 2 节。支持比例模式(`--ratios`)与显式区间模式(`--train-range/--test-range/--oot-range`)。 |
| 113 | |
| 114 | ### 3.4 invoke_evaluation.py(评估委托) |
| 115 | |
| 116 | 详见 `references/script-parameters.md` 第 3 节 |