diff --git a/skills/model-iteration/SKILL.md b/skills/model-iteration/SKILL.md index 0cd364b..d0b5f28 100644 --- a/skills/model-iteration/SKILL.md +++ b/skills/model-iteration/SKILL.md @@ -73,13 +73,14 @@ when_to_use: | - [ ] **凡是要让用户拍板的检查点(R0 baseline 之后、R{n} regression 之后、>200 候选要定 pattern、Gold drift 复核 等),必须先 append `step:"human-check"` 或 `step:"human-review"` running entry,再用 chat reply 提问**。**禁止只在 chat 里问而不写 gate entry**——UI 看不到拦截 = 视为没做这步,用户面板上看不到任何卡。详见下方 "Human-in-the-Loop 信号 → 写 gate 节点"。 ### Step 4 准入(`augment`,需要修改训练集才进) +- [ ] **runDic 必须在当轮 eval `lark_template.json` 落盘后重新 `eval "$(./scripts/resolve_run_ids.sh)"` 取**——禁止复用之前缓存值或手算,eval 期间 resolve 会得到上一轮 workflow id 导致偏移 -1 - [ ] **§4.0 原始训练数据清洗(增强前必做)**——按 4 种动作走完逐 pattern 判定 - [ ] §4.0.1 Step A:候选定位输出 csv,**不直接改** - [ ] §4.0.1 Step A.5:**先走 label-master 预审**(用推荐标签覆盖 new_label,剔除 label-master 不认同要改的条目) - [ ] §4.0.1 Step B:量级判定基于 label-master 处理后的**残留候选量**走对应支线(≤50 自动按 label-master 推荐改 / 51-200 全量人审 / >200 触发 #3,全量交付) - [ ] §4.0.1 Step C:备份 `.bak` 文件 - [ ] §4.1 输入准备 / §4.2 GPT 调用 / §4.3 sanity check / §4.4 写入 -- [ ] **§4.5 label-master 标签复核(落盘后必做,强制)**:H1 `modified_samples.jsonl` 只跑层 1(格式)—— 语义已在 §4.0.1 Step A.5 完成;H2 `augment_.jsonl` 跑两层(`validate_label_output.py` 格式 + Skill 调用 `label-master` 语义),**逐条 1:1 全量覆盖**(`augment` 多少行 `label_master_review.jsonl` H2 部分就多少行,禁止抽样 / spot-check / X/X pass 外推),verdict 写 `results/data_clean_/label_master_review.jsonl`,不通过比例 ≤ 5% 才能进 Step 5 +- [ ] **§4.5 label-master 标签复核(落盘后必做,强制)**:H1 `modified_samples.jsonl` 只跑层 1(格式)—— 语义已在 §4.0.1 Step A.5 完成;H2 `augment_.jsonl` 跑两层(`validate_label_output.py` 格式 + Skill 调用 `label-master` 语义),**逐条 1:1 全量覆盖**(`augment` 多少行 `label_master_review.jsonl` H2 部分就多少行,禁止抽样 / spot-check / X/X pass 外推),verdict 写 `results/data_clean_/label_master_review.jsonl`,**不通过必须 = 0**(任何不通过必须修正后重新 review 直到全 pass 才能进 Step 5) ### Step 4 → Step 5 边界(**NEVER STOP 硬连接**,反复踩坑) - [ ] 写完 `augment=complete` 那一刻,**同一轮 bash 不许结束**:紧接着跑 §4.5 label-master 复核 → 写 `sft=running` → 调 `submit_sft.sh` → 挂 watcher(评测在 SFT `_SUCCESS` 落盘后的下一轮单独用 `submit_cml_eval.sh` 起,不要在 SFT bg 里串接评测) @@ -87,7 +88,7 @@ when_to_use: | - [ ] H2 后台任务回调(`[system] 后台任务 ... exit_code=0`)**不是 turn 结束信号**——它只是 augment 子流程的一个中间节拍,agent 必须在同轮里继续走完 §4.5 → Step 5 ### Step 5 准入(`sft`) -- [ ] §4.5 label-master 复核报告 `label_master_review.jsonl` 存在且不通过 ≤ 5% +- [ ] §4.5 label-master 复核报告 `label_master_review.jsonl` 存在、行数 = augment 行数(全量不抽样)、不通过 = 0(任何不通过必须修正后重新 review 直到全 pass) - [ ] 旧 sft_output 已 `mv sft_output sft_output_r{prev}` 备份 - [ ] 训练参数从 config.yaml 读,model_path = basemodel(**不从上轮 ckpt 续训**) diff --git a/skills/model-iteration/references/program.md b/skills/model-iteration/references/program.md index 476cb9d..fbf58ec 100644 --- a/skills/model-iteration/references/program.md +++ b/skills/model-iteration/references/program.md @@ -755,6 +755,8 @@ with open(out_csv, 'w', encoding='utf-8-sig') as fp: > ``` > > 已踩坑:R2 augment 把 `data_clean_/` 写成了 `EVAL_RUNDIC`(多 +1 一次),跳过了 R1.runDic 整段命名空间,前端 augment 卡片直接读不到。**写 augment / SFT / 归档脚本时一律用 `$SFT_RUNDIC`,不要写 `${RUNDIC}` 也不要写 `${EVAL_RUNDIC}`**。 +> +> 🚨 **调用时序(CRITICAL)**:`resolve_run_ids.sh` **只能在当轮 CML eval 的 `lark_template.json` 已落盘之后调用**。禁止在 eval 提交前或 watcher 等待期间预先调用——此时 max workflow 仍是上一轮的值,会导致 SFT_RUNDIC 偏移 -1(已踩坑:R0 workflow17823 评测中提前 resolve 得到 17822,augment 文件全部错位)。正确时序:`cml step=complete` → `resolve_run_ids.sh` → augment/SFT。每次进入 augment/SFT 步骤前**必须重新调用**,不许复用之前缓存的值。 **Step A.5:label-master 预审(量级判定之前必跑,强制)** @@ -1276,9 +1278,8 @@ H1 在 §4.0.1 Step A.5 已经过 label-master 推荐覆盖,这里**不再重 | 比例 | 处置 | |---|---| -| 不通过 ≤ 5% | 自动丢弃这些样本(H2 → 从 augment_.jsonl 删行;H1 → 回滚改动到 .bak)+ 写明丢弃数到 iteration_log | -| 不通过 5%~20% | **触发 H-i-T-L #6**(gold 可疑),把不通过样本导出飞书 sheet 让人审 | -| 不通过 > 20% | **强制暂停**,Step 4 假设本身有问题,回 Step 3 重新形成假设 | +| 不通过 = 0 | ✅ 全量通过,允许进入 Step 5 | +| 不通过 > 0 | ❌ **必须修正**(H2 → 修正 augment 样本后重新 review;H1 → 回滚或修正后重新 review),循环直到不通过 = 0 才能进 Step 5。禁止"自动丢弃不通过样本继续"——每条都必须过 | **写完复核报告才允许进 Step 5。**verdict 文件不存在 / 没跑层 2 → Step 5 拒绝启动(5.0 的准入检查会查 `label_master_review.jsonl` 存在)。 @@ -1314,9 +1315,8 @@ H1 在 §4.0.1 Step A.5 已经过 label-master 推荐覆盖,这里**不再重 REVIEW="$AUTORESEARCH_CHAT_ROOT/results/data_clean_${RUNDIC}/label_master_review.jsonl" [ -f "$REVIEW" ] || { echo "label-master 复核未完成,回 §4.5"; exit 1; } NOT_PASS=$(grep -c '"verdict":"不通过"' "$REVIEW" || echo 0) -TOTAL=$(wc -l < "$REVIEW") -if [ "$TOTAL" -gt 0 ] && [ $((NOT_PASS * 100 / TOTAL)) -gt 5 ]; then - echo "不通过比例 $NOT_PASS/$TOTAL > 5%,按 §4.5 处置规则走 H-i-T-L 或回 Step 3" +if [ "$NOT_PASS" -gt 0 ]; then + echo "label-master 不通过 $NOT_PASS 条(要求 = 0),必须修正后重新 review 直到全 pass" exit 1 fi diff --git a/skills/model-iteration/scripts/sft_train_job.yaml.tpl b/skills/model-iteration/scripts/sft_train_job.yaml.tpl index 6b926f6..88f611c 100644 --- a/skills/model-iteration/scripts/sft_train_job.yaml.tpl +++ b/skills/model-iteration/scripts/sft_train_job.yaml.tpl @@ -44,11 +44,11 @@ imageConfig: rm -rf sft_output # 1. 组装数据 - python3 {AUTORESEARCH_ROOT}/prepare_and_train_sft.py prepare \ + python3 {AUTORESEARCH_ROOT}/scripts/prepare_and_train_sft.py prepare \ --output_dir {AUTORESEARCH_ROOT}/sft_data # 2. 启动训练(绝对路径,避免相对路径在容器内找不到 zk_trainer) - python3 {AUTORESEARCH_ROOT}/prepare_and_train_sft.py train \ + python3 {AUTORESEARCH_ROOT}/scripts/prepare_and_train_sft.py train \ --data_dir {AUTORESEARCH_ROOT}/sft_data \ --model_path /mnt/wangsenhao/verl_zk/Qwen3-4B-Instruct-2507 \ --model_type qwen3 \