agentic-rl-lab医疗OPD实战:SAR-OPD与IDT-OPD双方案,增强医疗能力同时保住通用能力

发布时间:2026/11/5 3:19:01
agentic-rl-lab医疗OPD实战:SAR-OPD与IDT-OPD双方案,增强医疗能力同时保住通用能力

【免费下载链接】agentic-rl-lab

Reproducing and studying RL algorithms for LLM agents, including GRPO, GSPO, DAPO, OPD, Search-R1, ReTool, ALFWorld and beyond.

项目地址:https://gitcode.com/gh_mirrors/ag/agentic-rl-lab
点击查看免费下载

本文基于开源项目 agentic-rl-lab 的 02-opd 模块,完整拆解医疗 OPD(On-Policy Distillation,在策略蒸馏)实战:以 Qwen3.5-4B 为底座,先 Medical SFT 得到医疗教师模型,再用 SAR-OPD 与 IDT-OPD 两套蒸馏方案训练 Student——最终 MedQA-zh 医疗准确率从 72.17% 提升到 84.33%,C-Eval 通用能力不降反升到 84.67%。适合想给 LLM 增强垂直领域能力、又怕"学了新本领、忘了老本事"的新手读者。

为什么做医疗OPD:领域增强引发的能力遗忘难题

直接用医疗数据做 SFT 会发生什么?实测结果很典型:

CheckpointMedQA-zh(600题)C-Eval non-med(300题)
Qwen3.5-4B Base72.17%81.67%
Medical SFT epoch 379.00%69.33%⬇️

医疗能力涨了 7 个百分点,通用能力却掉了 12 个百分点——只看领域 benchmark,很容易忽略这种"能力交换"。

本实验真正要回答的问题是:

能不能让 Medical Teacher 教 Student 医疗能力,同时让原始 Base Model 充当通用能力锚点,得到一个两项能力都比 Base 更好的模型?

为此设计了两套方案(均为 02-opd 中的实验命名,非论文标准算法):

  • SAR-OPD(Staged Anchor-Restoration):先做 Medical OPD,再用 Base Teacher 分阶段恢复通用能力
  • IDT-OPD(Interleaved Dual-Teacher):同一训练循环里,两个 Teacher 按 step 交替指导同一个 Student

OPD训练循环原理:学生先作答,老师后打分

与 GRPO 等 reward 驱动的 RL 不同,OPD 不需要标准答案,也不需要写 reward function:

  • GRPO:advantage 来自同一组回答的相对 reward
  • OPD:advantage 来自 Teacher 与 Student 的 token logprob 差

一次最小训练循环:Student 对医疗问题采样自己的回答 → Teacher 接收完全相同的 prompt + completion,逐 token 计算 logprobs → 构造 reverse-KL advantage:Student 比 Teacher 更偏爱的 token 被压低概率,反之被提高 → 用 PPO 更新 Student。

关键点:Teacher 不重新回答问题,只对 Student 真实走过的轨迹打分,监督信号来自 Teacher 的分布而非数据集答案。核心实现见 02-opd/03-medical-opd-async.py。

SAR-OPD训练步骤:先学医疗,再恢复通用能力

SAR-OPD 把训练拆成三个阶段,每个目标都清晰:

  1. Stage 1|Medical SFT:用medical-o1-reasoning-SFT中文数据微调 Qwen3.5-4B,得到冻结的 Medical Teacher(02-opd/02-medical-sft.py)
  2. Stage 2|Medical OPD:从 Base 创建 fresh LoRA Student,由 Medical Teacher 做 300 step 的 on-policy 蒸馏,医疗能力 72.17% → 80.00%
  3. Stage 3|Base-anchor OPD:恢复 Stage 2 的 Train state,用原始 4B Base当 Teacher,在 C-Eval 非医疗题目上再做 300 step 蒸馏(02-opd/04-ceval-opd-async.py)

第三阶段的精妙之处:学习率从4e-5降到5e-6,只做"能力恢复"而不冲掉刚学到的医疗知识。C-Eval 从 73.00% 逐步拉回 84.67%;更意外的是,MedQA-zh 也从 80.00% 升到了84.33%——恢复通用分布与保持医疗能力并不是零和关系。

IDT-OPD训练步骤:双教师1:1交替调度

SAR-OPD 流程较长,IDT-OPD 则把两个 Teacher 放进同一个训练循环:固定Medical → C-Eval → Medical → C-Eval ...的 1:1 调度,共用同一个 LoRA Student、同一份 Adam 状态,每个全局 step 结束后用最新权重继续。

调度逻辑只有几行,非常易读(02-opd/05-interleaved-multi-teacher-opd.py):

def build_task_schedule(args): return ( ("medical",) * args.medical_steps_per_cycle + ("ceval",) * args.ceval_steps_per_cycle )

600 step 下两类任务各 300 step。想偏向医疗,只需把--medical-steps-per-cycle改为 2。另一个细节:两类任务各自维护独立的 task step(batch_for_task_step),按自己的进度取 batch,不会因交替而跳数据。

结果很有意思:IDT-OPD 没有"越训越好"的终点。step 100 偏医疗(MedQA-zh 79.17%),step 200 偏通用(C-Eval 86.00%,全实验最高),继续训到 step 600 两项都回落。结论:多 Teacher 蒸馏里,checkpoint 选择和早停比跑满训练更重要,step 100 与 step 200 是两个 Pareto 有效点。

两套OPD方案怎么选

对比项SAR-OPDIDT-OPD
训练结构分阶段顺序训练双 Teacher 按 step 交替
最佳 MedQA-zh84.33%79.17%
最佳 C-Eval84.67%86.00%
优点综合效果最好,能力恢复过程清楚结构统一,易扩展更多 Teacher 与调度比例
难点需正确保存/恢复 Train state对调度比例、学习率、早停敏感
适合场景追求最终综合性能多领域、多 Teacher 的 Pareto 探索

💡 只根据这轮实验选最终模型,SAR-OPD step 300 是综合最优 checkpoint;若要多领域扩展(代码、数学、Agent 等),IDT-OPD 的结构更通用。

医疗OPD快速启动:如何运行这套实验

完整教程见 02-opd/start.md,核心步骤如下(要求 Python ≥3.13,全程成本约 200 元内,只跑几十个 step 理解原理几元即可):

git clone https://gitcode.com/gh_mirrors/ag/agentic-rl-lab cd agentic-rl-lab uv sync trio login cp 02-opd/.env.example 02-opd/.env # 填入 PYTRIO_API_KEY

① 下载数据(Medical SFT + MedQA-zh + C-Eval 三类数据):

uv run python 02-opd/00-download-dataset.py

② 训练 Medical SFT Teacher:

uv run python 02-opd/02-medical-sft.py \ --num-epochs 3 --batch-size 16 --max-length 2048 --swanlab-mode online

③ 跑 Medical OPD(把--teacher-model-path换成上一步的sampler_weights路径):

uv run python 02-opd/03-medical-opd-async.py \ --teacher-model-path 'trio://RUN_ID/sampler_weights/SFT_WEIGHTS_NAME' \ --steps 300 --batch-size 4 --group-size 4 \ --max-tokens 2048 --learning-rate 4e-5

④a SAR-OPD 第三阶段(--student-state-path必须传 Train state,不能传 sampler_weights):

uv run python 02-opd/04-ceval-opd-async.py \ --student-state-path YOUR_MEDICAL_OPD_TRAIN_STATE_PATH \ --steps 300 --learning-rate 5e-6 --save-every-steps 50

④b IDT-OPD 替代方案(2:1 医疗偏置只需改--medical-steps-per-cycle 2):

uv run python 02-opd/05-interleaved-multi-teacher-opd.py \ --medical-teacher-model-path YOUR_SFT_SAMPLER_WEIGHTS_PATH \ --steps 600 --medical-steps-per-cycle 1 --ceval-steps-per-cycle 1 \ --learning-rate 1e-5 --save-every-steps 50

⑤ 评测(逐题 JSONL 与汇总指标写入02-opd/eval-results/):

uv run python 02-opd/01-eval-medical.py --model 'trio://RUN_ID/sampler_weights/OPD_WEIGHTS_NAME' --max-tokens 1024 uv run python 02-opd/01-eval-ceval.py --model 'trio://RUN_ID/sampler_weights/OPD_WEIGHTS_NAME' --max-tokens 8192

⚠️ 比较不同 checkpoint 时,务必保持数据文件、system prompt、temperature 和输出预算一致,否则准确率不可比。

训练指标观测与实验边界

训练过程记录在 SwanLab,重点盯这几个指标:

指标含义
opd/reverse_kl_meanStudent 与 Teacher 在采样 token 上的平均 logprob 差
data/datums、data/completion_tokens_mean每 step 进入训练的 completion 数与平均长度
step/completion_tokens_per_second整步 OPD token 吞吐(含采样+打分+更新)
medical/*与ceval/*(IDT)两类任务分别记录的 KL、吞吐与占比

注意:reverse KL 下降只说明 Student 更接近当前 Teacher,不代表 benchmark 一定涨——尤其 IDT-OPD 有两个目标不同的 Teacher,务必定期存 checkpoint、用独立评测集验证。

边界也要说清楚:每套方案只有一条训练轨迹(无多随机种子方差);两套方案学习率不同,差异不能全归因于训练结构;MedQA-zh 与 C-Eval 都是选择题,不能代表真实临床问答安全性。

小结:医疗OPD实战的两条路

  • SAR-OPD:先专注学医疗,再用 Base 锚点恢复通用,当前实验综合最佳——MedQA-zh72.17% → 84.33%,C-Eval81.67% → 84.67%,双双超越原始 Base
  • IDT-OPD:把"能力调度"做成训练结构,1:1 交替不单调变好,但给出 step 100/200 两个 Pareto 有效点,checkpoint 选择是核心技能

OPD 最有意思的地方在于:只要 Teacher 和 Student 能在同一条 token 轨迹上对齐 logprobs,就可以让不同 Teacher 代表不同能力,再决定 Student 在什么时候、哪类 prompt 上向谁学习——这套思路在 agentic-rl-lab 的 02-opd 模块中已完整落地,可直接复现。

【免费下载链接】agentic-rl-lab

Reproducing and studying RL algorithms for LLM agents, including GRPO, GSPO, DAPO, OPD, Search-R1, ReTool, ALFWorld and beyond.

项目地址:https://gitcode.com/gh_mirrors/ag/agentic-rl-lab
点击查看免费下载

相关推荐

上一篇:推荐使用:Wayland Rust 库 - 完美的图形协议解决方案
下一篇:如何用 pykan 快速完成你的第一次 KAN 函数拟合:完整指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考