# 数学能力评测 ## 简介 数学推理能力是大语言模型(LLMs)的一项关键能力。为了评估模型的数学能力,我们需要测试其逐步解决数学问题并提供准确最终答案的能力。OpenCompass 通过 CustomDataset 和 MATHVerifyEvaluator 组件提供了一种便捷的数学推理评测方式。 ## 数据集格式 数学评测数据集应该是 JSON Lines (.jsonl) 或 CSV 格式。每个问题至少应包含: - 问题陈述 - 解答/答案(通常使用 LaTeX 格式,最终答案需要用 \\boxed{} 括起来) JSONL 格式示例: ```json {"problem": "求解方程 2x + 3 = 7", "solution": "让我们逐步解决:\n2x + 3 = 7\n2x = 7 - 3\n2x = 4\nx = 2\n因此,\\boxed{2}"} ``` CSV 格式示例: ```csv problem,solution "求解方程 2x + 3 = 7","让我们逐步解决:\n2x + 3 = 7\n2x = 7 - 3\n2x = 4\nx = 2\n因此,\\boxed{2}" ``` ## 配置说明 要进行数学推理评测,你需要设置三个主要组件: 1. 数据集读取配置 ```python math_reader_cfg = dict( input_columns=['problem'], # 问题列的名称 output_column='solution' # 答案列的名称 ) ``` 2. 推理配置 ```python math_infer_cfg = dict( prompt_template=dict( type=PromptTemplate, template=dict( round=[ dict( role='HUMAN', prompt='{problem}\n请逐步推理,并将最终答案放在 \\boxed{} 中。', ), ] ), ), retriever=dict(type=ZeroRetriever), inferencer=dict(type=GenInferencer), ) ``` 3. 评测配置 ```python math_eval_cfg = dict( evaluator=dict(type=MATHVerifyEvaluator), ) ``` ## 使用 CustomDataset 以下是如何设置完整的数学评测配置: ```python from mmengine.config import read_base from opencompass.models import TurboMindModelwithChatTemplate from opencompass.datasets import CustomDataset math_datasets = [ dict( type=CustomDataset, abbr='my-math-dataset', # 数据集简称 path='path/to/your/dataset', # 数据集文件路径 reader_cfg=math_reader_cfg, infer_cfg=math_infer_cfg, eval_cfg=math_eval_cfg, ) ] ``` ## MATHVerifyEvaluator MATHVerifyEvaluator 是专门设计用于评估数学答案的评测器。它基于 math_verify 库进行开发,该库提供了数学表达式解析和验证功能,支持 LaTeX 和一般表达式的提取与等价性验证。 MATHVerifyEvaluator 具有以下功能: 1. 使用 LaTeX 提取器从预测和参考答案中提取答案 2. 处理各种 LaTeX 格式和环境 3. 验证预测答案和参考答案之间的数学等价性 4. 提供详细的评测结果,包括: - 准确率分数 - 预测和参考答案的详细比较 - 预测和参考答案的解析结果 评测器支持: - 基本算术运算 - 分数和小数 - 代数表达式 - 三角函数 - 根式和指数 - 数学符号和运算符 评测输出示例: ```python { 'accuracy': 85.0, # 正确答案的百分比 'details': [ { 'predictions': 'x = 2', # 解析后的预测答案 'references': 'x = 2', # 解析后的参考答案 'correct': True # 是否匹配 }, # ... 更多结果 ] } ``` ## 完整示例 以下是设置数学评测的完整示例: ```python from mmengine.config import read_base from opencompass.models import TurboMindModelwithChatTemplate from opencompass.datasets import CustomDataset from opencompass.evaluator import MATHVerifyEvaluator from opencompass.openicl.icl_prompt_template import PromptTemplate from opencompass.openicl.icl_retriever import ZeroRetriever from opencompass.openicl.icl_inferencer import GenInferencer # 数据集读取配置 math_reader_cfg = dict(input_columns=['problem'], output_column='solution') # 推理配置 math_infer_cfg = dict( prompt_template=dict( type=PromptTemplate, template=dict( round=[ dict( role='HUMAN', prompt='{problem}\n请逐步推理,并将最终答案放在 \\boxed{} 中。', ), ] ), ), retriever=dict(type=ZeroRetriever), inferencer=dict(type=GenInferencer), ) # 评测配置 math_eval_cfg = dict( evaluator=dict(type=MATHVerifyEvaluator), ) # 数据集配置 math_datasets = [ dict( type=CustomDataset, abbr='my-math-dataset', path='path/to/your/dataset.jsonl', # 或 .csv reader_cfg=math_reader_cfg, infer_cfg=math_infer_cfg, eval_cfg=math_eval_cfg, ) ] # 模型配置 models = [ dict( type=TurboMindModelwithChatTemplate, abbr='your-model-name', path='your/model/path', # ... 其他模型配置 ) ] # 输出目录 work_dir = './outputs/math_eval' ```