OpenCompass MATH 数学推理基准评估指南:配置、评测流程与源码解析
模型评测人工智能大模型AI 评测【免费下载链接】opencompassOpenCompass is an LLM evaluation platform, supporting a wide range of models from OpenAI, Anthropic, Gemini, Qwen, GLM, DeepSeek, etc, across 100 datasets covering knowledge, reasoning, coding, science, language, long-context, and safety.项目地址https://gitcode.com/gh_mirrors/op/opencompass点击查看免费下载MATH 是 OpenCompass 内置的高难度数学推理基准之一用于评估大语言模型在代数、数论、几何、概率等复杂数学问题上的符号推理能力。本文以 MATH 数据集配置目录 为核心介绍如何在 OpenCompass 中一键运行 MATH 评测、理解 Base/Chat 模型的实测分数表并深入剖析其提示模板、后处理与字符串等价判定等源码级实现细节。读完本文你将掌握 MATH 数据集的完整评测链路能够独立配置并复现官方分数也能基于仓库源码定制自己的数学评测方案。一、MATH 数据集与评测配置总览MATHMathematics Aptitude Test of Heuristics由 OpenAI 提出包含约 12,500 道竞赛级数学题要求模型输出带\boxed{}的最终答案属于生成式generative评测任务。在 OpenCompass 中MATH 的所有评测配置均位于 opencompass/configs/datasets/math 目录下包含通用生成评测math_gen.py、math_gen_a58d9d.py等4-shot Base 模型评测math_4shot_base_gen_db136b.py、math_4shot_base_new_gen.py0-shot Chat 模型评测math_0shot_gen_393424.pyLLM Judge 评测math_0shot_llm_judge_gen_393424.py、math_llm_judge_gen.pyAgent 评测math_agent_gen_0c1b4e.py、math_agent_gen_861b4f.py等MATH-500 变体math_500_gen.py、math_500_cascade_eval_gen_6ff468.py、math_prm800k_500_*系列。每个配置文件最终都会导出一个math_datasets列表供run.py加载。以最常见的两个命令为例来自 README# Base 模型4-shot 提示gen 评测 python3 run.py --models hf_internlm2_7b --datasets math_4shot_base_gen_db136b --debug # Chat 模型0-shot 提示gen 评测 python3 run.py --models hf_internlm2_chat_7b --datasets math_0shot_gen_393424 --debug其中--debug表示快速调试模式仅运行少量样本验证配置与链路是否通畅正式评测时去掉该参数即可跑全量数据。二、配置文件逐段拆解reader / infer / eval 三段式结构OpenCompass 的每个数据集配置都由reader_cfg、infer_cfg、eval_cfg三段组成MATH 亦不例外。以 Base 模型常用的 math_4shot_base_gen_db136b.py 为例from mmengine.config import read_base from opencompass.openicl.icl_prompt_template import PromptTemplate from opencompass.openicl.icl_retriever import ZeroRetriever from opencompass.openicl.icl_inferencer import GenInferencer from opencompass.datasets import MATHDataset, MATHEvaluator, math_postprocess_v2 with read_base(): from .math_4shot_example_from_google_research import prompt math_reader_cfg dict(input_columns[problem], output_columnsolution) math_infer_cfg dict( prompt_templatedict(typePromptTemplate, templateprompt \n\nProblem:\n{problem}\nSolution:), retrieverdict(typeZeroRetriever), inferencerdict(typeGenInferencer, max_out_len1024, stopping_criteria[Problem])) # postprocess v2 math_eval_cfg dict( evaluatordict(typeMATHEvaluator, versionv2), pred_postprocessordict(typemath_postprocess_v2)) math_datasets [ dict( typeMATHDataset, abbrmath, pathopencompass/math, reader_cfgmath_reader_cfg, infer_cfgmath_infer_cfg, eval_cfgmath_eval_cfg) ]各字段含义如下配置段字段说明reader_cfginput_columns输入列problem即模型要解决的数学题reader_cfgoutput_column输出列solution用于与模型预测比对infer_cfg.prompt_templatetemplate拼接好的 4-shot 提示词 {problem}占位符末尾以Solution:引导模型作答infer_cfg.retrieverZeroRetriever零样本检索器不对示例做相似度检索直接使用模板中的固定示例infer_cfg.inferencerGenInferencer生成式推理器max_out_len1024限制最大输出长度infer_cfg.inferencerstopping_criteria遇到Problem时停止生成避免模型连续生成多个题目eval_cfg.evaluatorMATHEvaluator(versionv2)数学字符串等价判定器v2为增强版归一化eval_cfg.pred_postprocessormath_postprocess_v2预测答案后处理优先提取\boxed{}内容2.1 4-shot 提示模板来源math_4shot_base_gen_db136b.py通过read_base()引入了同目录下的 math_4shot_example_from_google_research.py该文件以Solving Quantitative Reasoning Problems with Language Models论文中的 4 个示例作为 few-shot 演示prompt Problem: Find the domain of the expression $\frac{\sqrt{x-2}}{\sqrt{5-x}}$. Solution: The expressions inside each square root must be non-negative. ... Final Answer: The final answer is $[2,5)$. I hope it is correct. ... .strip()每个示例都遵循「Problem → Solution含\boxed{答案}→ Final Answer」的标准格式。配置中再通过prompt \n\nProblem:\n{problem}\nSolution:注入当前待测题目。另一份变体 math_4shot_base_new_gen.py 将stopping_criteria扩展为[Problem, 问题:]可兼容生成中文题目的场景。2.2 Chat 模型专用的 0-shot 配置Chat 模型评测常用 math_0shot_gen_393424.py其提示以对话轮次round形式组织并显式要求分步推理与\boxed{}包裹最终答案math_infer_cfg dict( prompt_templatedict( typePromptTemplate, templatedict( round[ dict(roleHUMAN, prompt{problem}\nPlease reason step by step, and put your final answer within \\boxed{}.), ] ), ), retrieverdict(typeZeroRetriever), inferencerdict(typeGenInferencer, max_out_len1024), )与 Base 配置相比Chat 配置不拼接固定示例而是直接用指令式提示让模型逐步推理并给出\boxed{}答案更贴合对话模型的指令跟随习惯。三、数据加载实现MATHDatasetMATH 数据集的加载逻辑定义在 opencompass/datasets/math.py 的MATHDataset类中LOAD_DATASET.register_module() class MATHDataset(BaseDataset): staticmethod def load(path: str, file_name: str math.json, **kwargs): path get_data_path(path) dataset DatasetDict() raw_data [] if environ.get(DATASET_SOURCE) ModelScope: from modelscope import MsDataset ms_dataset MsDataset.load(path, splittrain) for item in ms_dataset: raw_data.append({ problem: item[problem], solution: extract_boxed_answer(item[solution]) }) else: file_path os.path.join(path, file_name) data json.load(open(file_path)) for i in data.keys(): raw_data.append({ problem: data[i][problem], solution: extract_boxed_answer(data[i][solution]) }) dataset[test] Dataset.from_list(raw_data) dataset[train] Dataset.from_list(raw_data) return dataset从源码可以看到两个关键细节数据源切换默认从本地/ HuggingFace 路径读取math.json当环境变量DATASET_SOURCEModelScope时改为从 ModelScope 加载便于在无法访问境外数据源的环境中使用。答案预处理无论是哪种来源solution都会经过extract_boxed_answer()提取\boxed{}内的内容作为标准答案——也就是说评测比对的是纯答案字符串而非完整解法文本。extract_boxed_answer()的实现依赖last_boxed_only_string()与remove_boxed()见 opencompass/datasets/math.py它从后向前查找最后一个\boxed或\fbox用花括号配对算法截取出完整框体再剥离\boxed{前缀与末尾}得到最终答案。四、答案后处理math_postprocess_v2模型的原始生成文本不能直接与标准答案比对需要先经过后处理。MATH 配置统一使用注册在TEXT_POSTPROCESSORS中的math_postprocess_v2opencompass/datasets/math.pyTEXT_POSTPROCESSORS.register_module(math_postprocess_v2) def math_postprocess_v2(text: str) - str: cand_ans extract_boxed_answer(text, strip_double_curly_braceTrue) if cand_ans: return cand_ans for maybe_ans in text.split(.): if re.search(final answer|answer is, maybe_ans.lower()): return normalize_final_answer(maybe_ans) return normalize_final_answer(text.split(.)[0])处理优先级依次为优先提取\boxed{}若模型输出中包含框体strip_double_curly_braceTrue还会剥掉{{...}}的双层花括号直接返回框内内容次优查找final answer/answer is若没有框体则按句点切分文本找包含final answer或answer is的句子并归一化兜底取第一句两者都失败时取整段文本的第一句归一化作为预测答案。仓库中还保留了旧版math_postprocess仅匹配final answer以及用于 LLM Judge 场景的math_judement_preprocess按ANSWER :正则提取说明该文件在 Math 评测体系中承担了预测提取这一核心职责。五、等价判定核心MATHEvaluator 与字符串归一化MATHEvaluator是 MATH 评测的评分器注册于ICL_EVALUATORSopencompass/datasets/math.py。它的score()逐样本调用is_equiv(pred, answer)统计正确率并输出accuracy百分制ICL_EVALUATORS.register_module() class MATHEvaluator(BaseEvaluator): def __init__(self, versionv1, pred_postprocessorNone): super().__init__(pred_postprocessorpred_postprocessor) assert version in [v1, v2] self.version version def score(self, predictions, references): correct 0 count 0 details [] for i, j in zip(predictions, references): detail {pred: i, answer: j, correct: False} count 1 if self.is_equiv(i, j): correct 1 detail[correct] True details.append(detail) result {accuracy: 100 * correct / count, details: details} return resultis_equiv()opencompass/datasets/math.py依据version选择不同的字符串清洗函数再做多轮等价比较v1 使用_strip_string处理换行、\left/\right、度数符号、百分号、sqrt3 → sqrt{3}、\frac1b → \frac{1}{b}、a/b → \frac{a}{b}等 LaTeX 简写v2 使用_strip_string_v2在 v1 基础上进一步增强——去除单位\text{...}后缀、\cdot、\mathbf、\mbox{...}、百分号把inf归一化为\infty、j → i复数虚部写法统一、1.0 → 1去掉尾零并改用正则实现\sqrt修复清洗后的字符串若直接相等即判对否则两侧再各自经过normalize_final_answer()opencompass/datasets/math.py做第二重归一化剥离\text{}/\textbf{}/\overline{}/\boxed{}包裹、提取$...$内容、修复\frac/\sqrt简写、去掉千分位逗号等再次比较仍不等则做第三重兜底比较最后退化为原始字符串相等判断。正是这套符号级等价判定使得$\frac{1}{2}$、1/2、0.5这类在数学上等价、在文本上不同的答案都能被正确判对从而保证 README 分数表中数字的可靠性。六、从 Base 到 Chat官方实测分数一览以下两表完整摘录自 README反映的是该仓库记录在案的历史评测结果不同 OpenCompass 版本与模型权重版本下数值可能波动仅供横向参考。6.1 Base Models4-shot 生成评测modelmathllama-7b-turbomind2.94llama-13b-turbomind3.84llama-30b-turbomind6.54llama-65b-turbomind10.66llama-2-7b-turbomind3.58llama-2-13b-turbomind5.30llama-2-70b-turbomind13.26llama-3-8b-turbomind16.42llama-3-70b-turbomind39.64internlm2-1.8b-turbomind9.42internlm2-7b-turbomind25.16internlm2-20b-turbomind32.24qwen-1.8b-turbomind6.30qwen-7b-turbomind15.56qwen-14b-turbomind30.38qwen-72b-turbomind44.18qwen1.5-0.5b-hf4.16qwen1.5-1.8b-hf11.32qwen1.5-4b-hf17.50qwen1.5-7b-hf17.34qwen1.5-14b-hf36.18qwen1.5-32b-hf45.74qwen1.5-72b-hf41.56qwen1.5-moe-a2-7b-hf27.96mistral-7b-v0.1-hf13.44mistral-7b-v0.2-hf12.74mixtral-8x7b-v0.1-hf29.46mixtral-8x22b-v0.1-hf41.82yi-6b-hf6.60yi-34b-hf18.80deepseek-7b-base-hf4.66deepseek-67b-base-hf18.766.2 Chat Models0-shot 生成评测modelmathqwen1.5-0.5b-chat-hf0.56qwen1.5-1.8b-chat-hf4.94qwen1.5-4b-chat-hf7.34qwen1.5-7b-chat-hf22.14qwen1.5-14b-chat-hf32.22qwen1.5-32b-chat-hf41.80qwen1.5-72b-chat-hf45.22qwen1.5-110b-chat-hf54.38internlm2-chat-1.8b-hf14.06internlm2-chat-1.8b-sft-hf13.10internlm2-chat-7b-hf28.08internlm2-chat-7b-sft-hf27.60internlm2-chat-20b-hf34.68internlm2-chat-20b-sft-hf32.54llama-3-8b-instruct-hf27.50llama-3-70b-instruct-hf47.52llama-3-8b-instruct-lmdeploy27.42llama-3-70b-instruct-lmdeploy46.90mistral-7b-instruct-v0.1-hf8.48mistral-7b-instruct-v0.2-hf10.82mixtral-8x7b-instruct-v0.1-hf27.02从表中可以观察到参数规模与成绩大致正相关同一模型家族中 Chat 版本普遍优于同规模的 Base 版本得益于指令微调与 0-shot 指令式提示的配合模型后缀-hf表示 HuggingFace 权重-turbomind表示通过 Turbomind 推理引擎部署-lmdeploy表示通过 LMDeploy 部署——同一模型在不同推理引擎下的成绩略有差异如 llama-3-70b-instruct 的 hf 与 lmdeploy 分别为 47.52 与 46.90这是正常现象。七、进阶评测形态MATH-500、LLM Judge 与 Agent除标准生成评测外仓库还提供了多种进阶评测配置7.1 MATH-500 与 Cascade/LLM 验证评测math_500_gen.py 使用opencompass/math下的test_prm800k_500.jsonl即 MATH-500 子集abbrmath-500提示同样要求逐步推理并用\boxed{}给出答案但评分器替换为 math_evaluator.py 中注册的MATHVerifyEvaluator——该评估器会在比对答案前调用数学验证工具如 SymPy对模型答案做符号验证是比纯字符串比对更严格的一类方案。此外还有math_500_cascade_eval_*级联评估器、math_500_llmjudge_gen_6ff468.pyLLM 判分、math_prm800k_500_0shot_cot_gen_*CoT 0-shot与math_prm800k_500_0shot_nocot_*无 CoT 对照等配置可用于研究推理链对数学成绩的影响。7.2 LLM Judge 评测math_0shot_llm_judge_gen_393424.py与math_llm_judge_gen.py走 LLM-as-a-Judge 路线先用math_judement_preprocess从模型输出中提取ANSWER:字段再由判分模型对预测与参考答案进行语义级判定。这一形态适合模型输出格式多样、难以用字符串归一化覆盖的场景。7.3 Agent 评测math_agent_gen_0c1b4e.py、math_agent_gen_861b4f.py、math_agent_gen_af2293.py等配置让模型以 Agent 形式作答可调用 Python 解释器执行代码评分使用MATHAgentEvaluatoropencompass/datasets/math.py。它除了计算最终答案正确率外还按动作执行情况拆分出follow_acc跟随指令执行动作的比例、reasoning_acc、code_acc代码执行正确率、action_pct主动调用动作的比例等多维指标用于细粒度分析 Agent 的推理与工具使用能力。配置中如math_agent_evaluatorv2_gen_0c1b4e.py、math_evaluatorv2_gen_2f4a71.py则保留了各阶段的评估器版本便于对比不同方案。八、如何复现与扩展复现 README 中的成绩只需三步确认模型可用README 中的hf_internlm2_7b、qwen1.5-7b-chat-hf等模型别名需要在 OpenCompass 的模型配置中预先定义HF 权重路径、推理引擎等选择对应配置Base 模型选math_4shot_base_gen_db136bChat 模型选math_0shot_gen_393424MATH-500 选math_500_gen运行并查看结果正式评测去掉--debug后OpenCompass 会输出accuracy指标与 README 表中数值对比即可验证。扩展场景下你可以参照math_4shot_example_from_google_research.py的格式自定义 few-shot 示例调整math_4shot_base_new_gen.py中的stopping_criteria例如追加问题:以适配中文生成在math_0shot_gen_393424.py中修改max_out_len或提示语言观察长输出与提示措辞对成绩的影响替换eval_cfg中的evaluatorMATHEvaluatorv1/v2、MATHVerifyEvaluator、LLM Judge对比不同判分口径参考math_agent_gen_*.py将 MATH 评测扩展到 Agent 场景并用MATHAgentEvaluator的多维指标分析模型行为。九、小结MATH 评测在 OpenCompass 中形成了从数据加载MATHDatasetextract_boxed_answer、提示构造4-shot 模板 / 0-shot 指令、生成推理GenInferencerstopping_criteria、答案提取math_postprocess_v2到符号等价判定MATHEvaluatorv1/v2 normalize_final_answer的完整闭环。理解这条链路你不仅能准确复现 README 中的 Base/Chat 分数表还能基于 math.py 与 math_evaluator.py 中的可复用组件快速搭建面向 MATH 的定制化评测实验。赞分享模型评测人工智能大模型AI 评测【免费下载链接】opencompassOpenCompass is an LLM evaluation platform, supporting a wide range of models from OpenAI, Anthropic, Gemini, Qwen, GLM, DeepSeek, etc, across 100 datasets covering knowledge, reasoning, coding, science, language, long-context, and safety.项目地址https://gitcode.com/gh_mirrors/op/opencompass点击查看免费下载相关推荐Genkit Express Plugin 实战指南将 Genkit Flow 与 Action 快速暴露为 Express REST APIGenkit Express Plugin 实战指南将 Genkit Flow 与 Action 快速暴露为 Express REST API Genkit模型评测人工智能大模型AI 评测OpenCompass医学领域评估MedQA与PubMedQA基准解析OpenCompass医学领域评估MedQA与PubMedQA基准解析 引言医学LLM评估的痛点与解决方案 你是否还在为医学大语言模型Large Lang模型评测人工智能大模型AI 评测OpenCompass 中 GSM8K 评测实战配置解析、源码原理与模型基准成绩OpenCompass 中 GSM8K 评测实战配置解析、源码原理与模型基准成绩 本篇技术指南以 OpenCompass 仓库中的 GSM8K 评测说明 ht模型评测人工智能大模型AI 评测上一篇如何用3个步骤实现非接触式心率监测rPPG-Toolbox开源方案深度解析下一篇BlockSuite终极指南如何构建基于IndexedDB的离线优先协作编辑器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考