数学能力评测¶
简介¶
数学推理能力是大语言模型(LLMs)的一项关键能力。为了评估模型的数学能力,我们需要测试其逐步解决数学问题并提供准确最终答案的能力。OpenCompass 通过 CustomDataset 和 MATHVerifyEvaluator 组件提供了一种便捷的数学推理评测方式。
数据集格式¶
数学评测数据集应该是 JSON Lines (.jsonl) 或 CSV 格式。每个问题至少应包含:
问题陈述
解答/答案(通常使用 LaTeX 格式,最终答案需要用 \boxed{} 括起来)
JSONL 格式示例:
{"problem": "求解方程 2x + 3 = 7", "solution": "让我们逐步解决:\n2x + 3 = 7\n2x = 7 - 3\n2x = 4\nx = 2\n因此,\\boxed{2}"}
CSV 格式示例:
problem,solution
"求解方程 2x + 3 = 7","让我们逐步解决:\n2x + 3 = 7\n2x = 7 - 3\n2x = 4\nx = 2\n因此,\\boxed{2}"
配置说明¶
要进行数学推理评测,你需要设置三个主要组件:
数据集读取配置
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),
)
使用 CustomDataset¶
以下是如何设置完整的数学评测配置:
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 具有以下功能:
使用 LaTeX 提取器从预测和参考答案中提取答案
处理各种 LaTeX 格式和环境
验证预测答案和参考答案之间的数学等价性
提供详细的评测结果,包括:
准确率分数
预测和参考答案的详细比较
预测和参考答案的解析结果
评测器支持:
基本算术运算
分数和小数
代数表达式
三角函数
根式和指数
数学符号和运算符
评测输出示例:
{
'accuracy': 85.0, # 正确答案的百分比
'details': [
{
'predictions': 'x = 2', # 解析后的预测答案
'references': 'x = 2', # 解析后的参考答案
'correct': True # 是否匹配
},
# ... 更多结果
]
}
完整示例¶
以下是设置数学评测的完整示例:
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'