RL 最佳实践(实用 Checklist)
这一页是一份面向 MinT 强化学习(RL)训练的经验清单,刻意保持通用:数学、代码、工具调用型 Agent 都能套用。
1)先判断:RL 是不是合适的“杠杆”
RL 更适合这些情况:
- 你能写出可编程 reward:计算成本低、稳定、且不容易被“钻空子”。
- 任务有明确可验证的成功标准:可判定对错、可运行测试、可执行校验。
- 你关心端到端行为:约束、风格、安全、成本等,而不仅是模仿示例。
更适合先用其他方法的情况:
- 你能提供高质量示例:优先从 SFT 开始。
- 你能做输出对比但很难稳定打分:可考虑 偏好学习(如 DPO/RLHF)。
2)选训练形态:Model RL vs Agentic RL
Model RL(单步):
- 输入:
prompt - 输出:
completion - Reward:主要看输出本身
- 典型任务:分类、数学、代码生成、单轮问答
Agentic RL(多步):
- 模型在多步交互里调用工具/环境,过程更像“执行任务”而不是“回答问题”。
- Reward 可以同时包含最终结果与过程指标(工具成本、步数、合规性等)。
- 典型任务:工具调用、搜索、工作流、多轮助手
一个便于落地的抽象(伪代码,不是 MinT 的固定 API):
def sample_with_trace(prompt: str) -> tuple[str, dict]:
# 产出最终答案 + 可回放的 trace(便于排查与评估)。
answer = run_agent(prompt)
trace = {"tool_calls": [], "messages": []}
return answer, trace
def compute_reward(prompt: str, answer: str, trace: dict) -> float:
return score(prompt, answer, trace)对应到 MinT:这里的 sample_with_trace(...) 本质就是采样/执行你的 agent(例如 sampling_client.sample(...)),而 compute_reward(...) 就是你自己写的评分器。最后把 tokens、旧 logprobs、advantages 填进 types.Datum 里喂给训练。
3)Reward 设计:既要"可学",也要"难被投机"
- 先从最小可用 reward 做通,再逐步丰富。
- Reward 尺度尽量有界且一致(比如
[0, 1]),混合任务时更重要。 - Loop 跑通后,尽量用部分得分替代纯 0/1(也能减少
datums=0)。 - 把“永远不希望出现”的行为明确惩罚掉(不安全内容、滥用工具、过度冗长等)。
- 保留一小份固定评估集,不要只盯训练 reward 调参。
4)采样策略:要多样性,也要控制成本
group_size越大,相对比较信号越强,但推理成本也会线性上升。- 前期可提高温度探索,后期再降低温度稳定收敛。
max_tokens要够用;截断会导致 reward 误判、训练方向偏掉。- 设置 stop token / 终止规则,避免无穷输出和跑偏轨迹。
5)数据策略:先小规模验证,再把有效的部分放大
- 先用几十到几百条高质量样本验证闭环。
- 关注“饱和”:模型已经稳定做对的样本,继续训练几乎不给信号。
- 更推荐构造“刚好有挑战”的样本,而不是堆大量简单数据。
6)稳定性开关(训练变吵/变崩时用)
importance_sampling适合作为最简单的 baseline。- 若出现不稳定(reward 暴涨暴跌、模式坍塌),可考虑换用带裁剪的目标(PPO/CISPO)和/或降低学习率。
- 频繁保存 checkpoint,方便回溯定位回归点。
7)可观测性与排查 Checklist
每一步至少抽样看几条并记录:
- Prompt、completion、reward、长度
- 有工具/环境时:tool 调用与 trace
- 两个核心指标:成功率 + 平均 reward
常见坑:
- 没有学习信号:组内样本 reward 全相同(见 Mini RL Trip 的
datums=0说明)。 - Reward 被投机:模型学会“骗过评分器”而不是解决任务。
- mask 出错:把 prompt token 也训练进去了(确保 weights 正确 mask prompt)。