Mind Lab Toolkit (MinT)
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}")

完整源码:https://github.com/MindLab-Research/mint-quickstart/blob/main/demos/rl/adapters/environment_tooluse.py

API Surface

方法用途
RLAdapter__call__(prompt, response)给一个 (prompt, response) 算 reward
Rewardscore: float标量 reward 值
Rewardmetadata: 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 里。

本页目录