跳转至

__init__.py — 这是 Sandbox Fusion 远程代码评测的入口文件

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

文件概述

这是 Sandbox Fusion 远程代码评测的入口文件。与 prime_code 的本地评测不同,它将代码发送到远程沙箱服务(如字节跳动的 SandboxFusion)执行,提供更安全和可扩展的代码评测方案。

关键代码讲解

评分函数 compute_score

def compute_score(
    sandbox_fusion_url, concurrent_semaphore, memory_limit_mb,
    completion, test_cases, continuous=False, timeout=10
):
    # 从模型输出中提取代码
    solution = completion
    if "```python" in completion:
        solution = completion.split("```python")[-1].split("```")[0]
    elif "```" in completion:
        parts = completion.split("```")
        if len(parts) >= 2:
            solution = parts[1]
    else:
        return 0.0, [{"error": "Invalid completion (missing code block)"}]

    # 解析测试用例(支持 inputs/outputs 和 assert_case 两种格式)
    if "assert_case" in test_cases:
        assert_cases = test_cases.get("assert_case")
        test_cases.setdefault("inputs", ["" for _ in assert_cases])
        test_cases.setdefault("outputs", [None for _ in assert_cases])

    # 调用远程沙箱执行
    res_list, metadata_list = check_correctness(
        sandbox_fusion_url=sandbox_fusion_url,
        in_outs=test_cases,
        generation=solution,
        timeout=timeout,
        concurrent_semaphore=concurrent_semaphore,
        memory_limit_mb=memory_limit_mb,
    )

    # 计算分数
    if continuous:
        num_to_consider = min(len(res_list), 10)
        passed_count = sum(1 for r in res_list[:num_to_consider] if r is True)
        score = passed_count / num_to_consider
    else:
        passed_count = sum(1 for r in res_list if r is True)
        score = passed_count / len(res_list)

    return float(score), final_metadata

与 prime_code 的区别: - 使用远程 API 而非本地执行 - 支持并发信号量控制并发数 - 支持内存限制

核心类/函数列表

函数名 作用
compute_score 提取代码并通过远程沙箱评测

与其他模块的关系

  • 被 reward_score/__init__.py 调用(当提供了 sandbox_fusion_url 时)
  • 使用 sandbox_fusion/utils.py 的 check_correctness 进行远程调用
  • 是 prime_code 的远程替代方案

小结

远程沙箱评测方案的入口。相比本地执行,远程沙箱更安全(完全隔离)、支持更多语言、可以水平扩展。concurrent_semaphore 参数用于限制并发请求数,防止压垮沙箱服务。