CustomizeRL
Custom Environment
RL 训练需要一个环境:接收 model 的动作(生成的 token),返回 reward 信号。MinT 的 RLAdapter 基类让你可以为任意任务实现自定义环境:数学验证、代码执行、多轮对话、tool use 或领域特定反馈。
Concept
MinT 的 RL 环境实现 RLAdapter 接口:
class MyEnvironment(RLAdapter):
def __call__(self, prompt: ModelInput, response: ModelInput) -> Reward:
# 接收 model 的 response,计算 reward
# 返回:Reward(score=float, metadata=dict)环境收到:
- prompt —— 输入上下文(model 看到的 token)。
- response —— Model 生成的 completion(model 输出的 token)。
环境返回:
- score —— 标量 reward(越高越好)。
- metadata —— 可选的 dict,含调试信息(错误消息、中间分数等)。
常见环境模式:
- Verification —— 检查 response 是否正确(如数学解答对不对)。返回 1.0 或 0.0。
- Scoring —— 用某个指标函数(BLEU、edit distance、语义相似度)。返回 0.0–1.0。
- External system —— 调用 API 或子进程(代码执行、事实核查)。返回分数 + 错误信息。
- Multi-step —— 模拟对话环境;检查 model 的 response 是否达成目标。
Pattern
import mint
from mint.rl_core import RLAdapter, Reward
class MathVerificationEnv(RLAdapter):
"""通过符号计算验证数学题解答。"""
def __call__(self, prompt: mint.types.ModelInput, response: mint.types.ModelInput) -> Reward:
tokenizer = self.get_tokenizer()
# token 解码成文本
response_text = tokenizer.decode(response.to_ints())
# 从 response 提数字答案
import re
match = re.search(r'\d+', response_text)
if not match:
return Reward(score=0.0, metadata={"error": "No number found"})
predicted_answer = int(match.group())
expected_answer = 42 # 实操中从 prompt 或标准答案提取
# reward:对得 1.0,错得 0.0
is_correct = predicted_answer == expected_answer
return Reward(
score=1.0 if is_correct else 0.0,
metadata={"predicted": predicted_answer, "expected": expected_answer},
)
class ToolUseEnv(RLAdapter):
"""学习使用工具的 reward model。"""
def __call__(self, prompt: mint.types.ModelInput, response: mint.types.ModelInput) -> Reward:
tokenizer = self.get_tokenizer()
response_text = tokenizer.decode(response.to_ints())
# 检查 model 是否调用了工具(如含有 <tool_call>)
used_tool = "<tool_call>" in response_text
tool_score = 1.0 if used_tool else 0.0
# 检查 response 是否连贯
coherence_score = 1.0 if len(response_text) > 20 else 0.0
# 合成总分
total_score = 0.7 * tool_score + 0.3 * coherence_score
return Reward(
score=total_score,
metadata={"used_tool": used_tool, "coherence": coherence_score},
)
# 在 RL 训练里使用
training_client = service_client.create_lora_training_client(base_model="Qwen/Qwen3-0.6B", rank=16)
env = MathVerificationEnv(training_client.get_tokenizer())
# 从 model 采样并评估
sampler = service_client.create_sampling_client(base_model="Qwen/Qwen3-0.6B")
sampler.sample(prompt=..., sampling_params=...) # 拿到 response token
# 用环境评估
reward = env(prompt_tokens, response_tokens)
print(f"Reward: {reward.score}, Metadata: {reward.metadata}")API Surface
| 类 | 方法 | 用途 |
|---|---|---|
RLAdapter | __call__(prompt, response) | 给一个 (prompt, response) 算 reward |
Reward | score: float | 标量 reward 值 |
Reward | metadata: dict | 可选的调试 / 日志信息 |
RLAdapter 的 helper 方法:
get_tokenizer()—— 取出 tokenizer 用于 token 解码。get_model_info()—— 查询 model 家族和配置。
Caveats & Pitfalls
- Reward 量级:reward 应归一化到合理范围(如 0–1 或 -1 到 1)。极大的 reward 会让梯度更新不稳定。
- 稀疏 reward:二值 reward(对/错)训练信号弱。如果可能,给出稠密反馈(部分 credit、语义相似度分数等)。
- 执行安全:代码执行环境一定要小心。沙箱是必须的,不然恶意代码会破坏系统。
- 延迟:环境如果要调外部 API(搜索、代码执行),考虑用异步和超时。慢环境会成为训练瓶颈。
- 确定性:环境如果有随机元素,考虑设 seed 让训练可复现。把随机源记录到 metadata 里。