Custom Reward
这一页对应 mint-quickstart 里的 quickstart/custom_reward.py。
这个示例做什么
- 展示 MinT 中最常见的 custom reward 训练形态:服务端采样,客户端打分,把 reward 转成 advantage,再用
importance_sampling训练。 - 用算术任务保证 reward 逻辑足够直观、容易检查。
- 相比基础 quickstart 的纯二值
0/1打分,这个脚本用了带 partial credit 的 reward。
Reward 分解
脚本把总 reward 控制在 [0, 1]:
| 组成项 | 范围 | 含义 |
|---|---|---|
format_reward | 0.0 或 0.2 | 回答里能解析出整数 |
distance_reward | 0.0 到 0.5 | 预测值和目标值足够接近 |
exact_bonus | 0.0 或 0.3 | 解析出的整数与标准答案完全一致 |
这样既保留了最小可运行闭环,又比基础 quickstart 的纯 0/1 更容易产生学习信号。
运行方式
export MINT_API_KEY=sk-...
python quickstart/custom_reward.py参数(环境变量)
MINT_BASE_MODEL:默认Qwen/Qwen3-0.6BMINT_LORA_RANK:默认16MINT_CUSTOM_REWARD_STEPS:默认8MINT_CUSTOM_REWARD_BATCH:默认8MINT_CUSTOM_REWARD_GROUP:默认6MINT_CUSTOM_REWARD_LR:默认2e-5MINT_CUSTOM_REWARD_MAX_TOKENS:默认16MINT_CUSTOM_REWARD_TEMPERATURE:默认0.8
关键代码
def compute_reward_breakdown(response: str, correct_answer: int) -> RewardBreakdown:
prediction = extract_prediction(response)
if prediction is None:
return RewardBreakdown(total=0.0, format_reward=0.0, distance_reward=0.0, exact_bonus=0.0)
format_reward = 0.2
error = abs(prediction - correct_answer)
distance_scale = max(abs(correct_answer), 20)
closeness = max(0.0, 1.0 - min(error / distance_scale, 1.0))
distance_reward = 0.5 * closeness
exact_bonus = 0.3 if prediction == correct_answer else 0.0
total = min(1.0, format_reward + distance_reward + exact_bonus)
return RewardBreakdown(total, format_reward, distance_reward, exact_bonus)mean_reward = sum(group_rewards) / len(group_rewards)
advantages = [reward - mean_reward for reward in group_rewards]
training_client.forward_backward(
training_datums,
loss_fn="importance_sampling",
).result()
training_client.optim_step(types.AdamParams(learning_rate=RL_LR)).result()期望输出
- 每一步打印
avg_reward、exact_rate、format_rate、datums。 - 结束时输出
Saved: ...。
什么时候用这种模式
- 你能直接在 Python 里给模型输出打分。
- 你想加入 partial credit、风格惩罚、工具成本等客户端 reward 逻辑。
- 你不需要“把 reward 函数上传到服务端执行”;reward 逻辑完全留在客户端脚本里。