__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 参数用于限制并发请求数,防止压垮沙箱服务。