跳转至

naive.py — NaiveRewardManager 是最基础的奖励管理器实现

文件路径: verl/experimental/reward_loop/reward_manager/naive.py

文件概述

NaiveRewardManager 是最基础的奖励管理器实现。它支持同步和异步两种模式来计算奖励分数,是其他更复杂管理器的基础。

关键代码

类定义

@register("naive")
class NaiveRewardManager(RewardManagerBase):
    """基础奖励管理器,支持同步/异步奖励计算"""

    def __init__(self, config, tokenizer, num_examine, ...):
        self.config = config
        self.tokenizer = tokenizer
        self.num_examine = num_examine  # 日志中打印多少个样本用于检查

@register("naive") 将这个类注册到全局注册表中,配置文件中设置 reward_manager.name: naive 就会使用这个管理器。

核心方法 run_single

def run_single(self, data, compute_score_fn, ...):
    """计算单批数据的奖励

    Args:
        data: DataProto 数据
        compute_score_fn: 评分函数(可以是同步或异步的)
    """
    # 解码 prompt 和 response
    prompts = self.tokenizer.batch_decode(data.batch['input_ids'], ...)
    responses = self.tokenizer.batch_decode(data.batch['responses'], ...)

    # 调用评分函数
    scores = compute_score_fn(prompts, responses, ...)

    # 将分数转换为 tensor
    reward_tensor = torch.tensor(scores, dtype=torch.float32)
    return reward_tensor

同步与异步支持

NaiveRewardManager 同时支持同步和异步的 compute_score_fn:

# 同步模式
scores = compute_score_fn(prompts, responses)

# 异步模式(通过 asyncio)
scores = await compute_score_fn(prompts, responses)

这种灵活性使得它既可以用于简单的规则奖励(同步),也可以用于需要 API 调用的奖励(异步)。

核心类/函数列表

名称 类型 说明
NaiveRewardManager 类 基础奖励管理器
run_single 方法 批量计算奖励分数

与其他模块的关系

  • 继承自 RewardManagerBase
  • 通过 @register("naive") 注册到全局注册表
  • 是最常用的奖励管理器,适用于大多数场景

小结

NaiveRewardManager 是"默认选择"。它的实现简洁直观:解码文本 -> 调用评分函数 -> 返回分数张量。如果没有特殊的奖励计算需求(如速率限制或超长惩罚),使用它即可。