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.
本文基于开源项目 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 会发生什么?实测结果很典型:
| Checkpoint | MedQA-zh(600题) | C-Eval non-med(300题) |
|---|---|---|
| Qwen3.5-4B Base | 72.17% | 81.67% |
| Medical SFT epoch 3 | 79.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 把训练拆成三个阶段,每个目标都清晰:
- Stage 1|Medical SFT:用
medical-o1-reasoning-SFT中文数据微调 Qwen3.5-4B,得到冻结的 Medical Teacher(02-opd/02-medical-sft.py) - Stage 2|Medical OPD:从 Base 创建 fresh LoRA Student,由 Medical Teacher 做 300 step 的 on-policy 蒸馏,医疗能力 72.17% → 80.00%
- 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-OPD | IDT-OPD |
|---|---|---|
| 训练结构 | 分阶段顺序训练 | 双 Teacher 按 step 交替 |
| 最佳 MedQA-zh | 84.33% | 79.17% |
| 最佳 C-Eval | 84.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_mean | Student 与 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-zh
72.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.
相关推荐
1/400的数据规模反超同行?open-audio-opd实验结果与OPD论文深度解读
1/400的数据规模反超同行?open audio opd实验结果与OPD论文深度解读 open audio opd 是一套开源的工业级音频在线策略蒸馏(OPD
Jasna 教程:4 步跑通 JAV 马赛克修复
Jasna 教程:4 步跑通 JAV 马赛克修复 视频里只打了几秒马赛克,手动逐帧抠图没人干得完。Jasna 是一款免费的 JAV 马赛克修复工具,图形界面加命
人工智能AI 应用计算机视觉视频处理图像处理深度学习brpc与医疗健康:远程医疗系统的通信保障
brpc与医疗健康:远程医疗系统的通信保障 引言:数字医疗时代的通信挑战 在当今数字化医疗时代,远程医疗系统正成为医疗健康服务的重要支柱。从在线问诊、远程会诊到
后端RPC框架微服务
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考