跳转至

geo3k_tool.py — verl/tools/geo3k_tool.py

文件路径

verl/tools/geo3k_tool.py

文件概述

Geo3kTool 是一个面向 Geometry3K(几何题)数据集的工具,用于在 RL 训练中计算 LLM 解答几何题的奖励分数。它的结构和逻辑与 Gsm8kTool 几乎完全一致,只是评分函数不同。

关键代码讲解

1. 执行工具

@rollout_trace_op
async def execute(self, instance_id, parameters, **kwargs):
    answer = parameters.get("answer", "")
    if not isinstance(answer, str):
        answer = str(answer)
    self._instance_dict[instance_id]["response"] = answer
    reward = await self.calc_reward(instance_id)
    tool_reward = 0.0 if reward > self._instance_dict[instance_id]["reward"] else -0.05
    self._instance_dict[instance_id]["reward"] = reward
    return ToolResponse(text=f"Current parsed {answer=} {reward=}"), tool_reward, {}

与 Gsm8kTool 的区别:不需要添加 "#### " 前缀(几何题的答案格式不同)。其他逻辑完全一致:计算奖励、惩罚未改进的提交。

2. 计算奖励

async def calc_reward(self, instance_id, **kwargs):
    return geo3k.compute_score(
        self._instance_dict[instance_id]["response"],
        self._instance_dict[instance_id]["ground_truth"],
        use_boxed=False,
        format_score=0.0,
    )

使用 geo3k.compute_score 函数: - use_boxed=False:不要求答案用 \boxed{} 包裹。 - format_score=0.0:格式错误时得 0 分。

核心类/函数列表

类/方法 作用
Geo3kTool 几何题奖励计算工具
create 创建实例并设置标准答案
execute 接收答案,计算奖励
calc_reward 调用 geo3k 评分函数
release 释放实例

与其他模块的关系

  • 继承自 BaseTool。
  • 依赖 verl.utils.reward_score.geo3k 模块计算分数。
  • 与 Gsm8kTool 高度相似,主要区别在评分函数和答案格式。

小结

Geo3kTool 是 Gsm8kTool 在几何题场景下的对应实现。它展示了 verl 工具系统的可扩展性——只需替换评分函数,就能支持不同类型的数学题目。