跳转至

__init__.py — 这是 PRIME 代码评测子包的入口文件

模块路径: verl.utils.reward_score.prime_code

文件概述

这是 PRIME 代码评测子包的入口文件,实现了本地代码正确性验证。它从模型输出中提取代码,然后在本地通过运行测试用例来评分。支持二元评分(全对/全错)和连续评分(通过率)两种模式。

关键代码讲解

评分函数 compute_score

def compute_score(completion, test_cases, continuous=False):
    # 从模型输出中提取 Python 代码块
    solution = completion.split("```python")[-1].split("```")[0]
    try:
        if not isinstance(test_cases, dict):
            test_cases = json.loads(test_cases)

        # 先做全量测试,如果全部通过就直接返回
        res, metadata = apps_check_correctness(
            in_outs=test_cases, generation=solution, timeout=5, debug=False
        )
        success = all(map(lambda x: x is True, res))
        if success:
            return success, metadata

        # 如果需要连续评分(continuous),逐个测试前10个用例
        if continuous:
            for test_case_id, test_case in enumerate(test_cases_list):
                res, metadata = apps_check_correctness(
                    in_outs=test_case, generation=solution, timeout=10
                )
                res_list.extend(res)
                if test_case_id >= 9:
                    break
            success = sum(map(lambda x: x is True, res_list)) / res_count
    except Exception:
        success = False
    return success, metadata_list

评分策略: 1. 先尝试全量测试 -- 如果全部通过,直接返回满分 2. 全量未通过且需要连续评分时,逐个测试前 10 个用例,计算通过率 3. 连续评分模式返回的是 0.0~1.0 之间的浮点数,而非布尔值

核心类/函数列表

函数名 作用
compute_score 主评分函数,提取代码并运行测试

与其他模块的关系

  • 被 reward_score/__init__.py 调用,处理 codecontests、apps 等代码数据集
  • 使用 utils.check_correctness 在独立进程中运行测试
  • testing_util.py 提供底层的代码执行和输出比较逻辑
  • 当有 sandbox_fusion_url 时,sandbox_fusion 模块优先使用

小结

本地代码评测方案:从 markdown 代码块中提取代码,在独立进程中运行测试用例。continuous=True 模式提供细粒度的奖励信号(通过率),比二元评分更有利于 RL 训练。限制只测前 10 个用例以控制评测时间。