news 2026/9/29 3:27:06

OpenCompass 评估 General365:级联数学验证与 LLM 判题完整实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenCompass 评估 General365:级联数学验证与 LLM 判题完整实战指南
  • 模型评测
  • 人工智能
  • 大模型
  • AI 评测

【免费下载链接】opencompass

OpenCompass 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
点击查看免费下载

General365 是由美团长光(meituan-longcat)发布的高难度通用问答评测集,用于考察大模型在数学、文本推理与选择题等场景下的真实能力。本文以 OpenCompass 仓库中 General365 配置目录 的官方文档为核心,结合 数据加载实现、级联评估器源码 与 测试用例,完整讲解如何在 OpenCompass 中一键复现 General365 官方评测:数学题走「规则验证 + LLM 判题」级联链路,文本题直接走 LLM 判题链路,并复现论文中基于 GPT-4.1 判题官的结果。

一、General365 评测配置概述

1.1 数据集来源与配置骨架

General365 配置直接通过 HuggingFace 的datasets.load_dataset加载官方公开数据集meituan-longcat/General365_Public,无需本地预处理,入口配置文件为 general365_rawprompt_cascade_llmjudge_gen.py。

配置文件的核心结构:

DATASET_PATH = 'meituan-longcat/General365_Public' reader_cfg = dict( input_columns=['question', 'answer_type', 'float_round', 'id'], output_column='answer', ) infer_cfg = dict( prompt_template=dict( type=RawPromptTemplate, messages=[dict(role='user', content='{question}')], ), retriever=dict(type=ZeroRetriever), inferencer=dict(type=GenInferencer), )

配置将原始问题(question)原样送入模型生成答案,采用RawPromptTemplate保留官方原始 prompt、ZeroRetriever不做示例检索、GenInferencer执行生成式推理。

1.2 两条评测子任务

该配置把数据集按answer_type划分为两个子任务,分别注册为General365-mathverify与General365-text:

子任务覆盖答案类型评测方式
General365-mathverifynumber(数值)、interval(区间)先MATHVerifyEvaluator规则校验,失败样本再交GenericLLMEvaluator判题(级联)
General365-texttext(文本)、single_choice(单选)、multiple_choice(多选)直接由GenericLLMEvaluator判题

对应配置如下:

math_dataset_cfg = dict( type=General365Dataset, path=DATASET_PATH, answer_types=['number', 'interval'], reader_cfg=reader_cfg, ) text_dataset_cfg = dict( type=General365Dataset, path=DATASET_PATH, answer_types=['text', 'single_choice', 'multiple_choice'], reader_cfg=reader_cfg, )

两份数据集配置共用同一份reader_cfg,仅通过answer_types参数从原始数据中筛选各自负责的样本。

二、数据加载与答案类型过滤的实现原理

数据集加载由 General365Dataset 实现,它通过@LOAD_DATASET.register_module()注册为 OpenCompass 的可用数据集模块:

@LOAD_DATASET.register_module() class General365Dataset(BaseDataset): @staticmethod def load(path: str = 'meituan-longcat/General365_Public', split: str = 'test', answer_types: Optional[Iterable[str]] = None, **kwargs) -> Dataset: dataset = load_dataset(path=path, split=split, **kwargs) if answer_types is not None: answer_types = set(answer_types) dataset = dataset.filter( lambda item: item['answer_type'] in answer_types) return dataset

关键行为:

  • 默认加载testsplit,即meituan-longcat/General365_Public的test划分;
  • answer_types传入后,会按样本的answer_type字段做集合过滤,只保留需要的答案类型;
  • 测试用例 test_general365_loads_huggingface_and_filters_answer_types 验证了「先调用load_dataset(path, split='test'),再按answer_type过滤」的完整加载路径。

三、级联评测:规则优先、LLM 兜底的完整链路

General365-mathverify是本文配置中最核心的设计,采用 CascadeEvaluator 实现「先规则、后 LLM」的级联打分。

3.1 配置写法

eval_cfg=dict( evaluator=dict( type=CascadeEvaluator, rule_evaluator=dict(type=MATHVerifyEvaluator), llm_evaluator=_llm_evaluator(math_dataset_cfg), parallel=False, )),

其中parallel=False表示严格级联模式:只有被规则评估器判为错误(correct=False)的样本才会送进 LLM 判题,从而大幅节省 LLM 判题调用量。

3.2 级联评估流程(源码视角)

从 cascade_evaluator.py 的 score 方法 可以看到完整链路:

  1. 规则初评:对每个样本先做预测后处理,调用MATHVerifyEvaluator的score计算规则得分,并将结果标记为evaluation_method='rule';
  2. 失败样本收集:级联模式下,仅将规则判错的样本加入failed_indices列表;
  3. LLM 复评:用test_set.select(failed_indices)抽取失败子集,为子集补上prediction、reference列,交由GenericLLMEvaluator判题;
  4. 结果合并:最终准确率 = 规则正确样本数 + 被 LLM 改判为正确的样本数,并输出cascade_stats(含rule_accuracy、llm_accuracy、final_accuracy等统计),每个样本同时保留rule_evaluation与llm_evaluation明细。

值得一提的是,CascadeEvaluator 会在${out_dir}_llm_judge路径缓存 LLM 判题结果,若缓存样本数与当前需求一致则直接复用,避免重复付费调用(见 缓存加载逻辑)。

3.3 规则评估器 MATHVerifyEvaluator

MATHVerifyEvaluator 依赖math_verify与latex2sympy2_extended两个包,对数值、区间答案做表达式解析与等价性验证。若环境缺少依赖,会抛出如下提示:

pip install math_verify latex2sympy2_extended

对于超时(timed_out)或解析出错(error)的样本,规则评估器直接判为不正确,交由 LLM 兜底。

四、LLM 判题官:官方 Prompt 与 GPT-4.1 复现

General365-text以及级联链路中的失败样本,都由GenericLLMEvaluator完成判题。判题 Prompt 完全沿用官方项目,配置文件内置了系统提示词与用户提示词:

JUDGE_SYSTEM_PROMPT = """You are an expert evaluator for question answering systems. Your task is to determine if a prediction correctly answers a question based on the ground truth. Rules: 1. The prediction is correct if it captures all the key information from the ground truth. 2. The prediction is correct even if phrased differently as long as the meaning is the same. 3. The prediction is incorrect if it contains incorrect information or is missing essential details. 4. Do not challenge the correctness of the standard answer. 5. If the standard answer includes multiple possibilities, the prediction must include all and only those possibilities to be considered correct. Output a JSON object with a single field 'accuracy' whose value is true or false.""" JUDGE_PROMPT = """Question: {question} Ground truth: {answer} Prediction: {prediction}"""

判题官被要求输出形如{"accuracy": true}的 JSON,随后由 parse_general365_judgement 解析:

  • 支持去除```json ... ```代码块包裹后解析 JSON;
  • 仅当accuracy字段为布尔值时返回该值;
  • 解析失败返回None,统计为 parse error。

4.1 配置判题官模型

_llm_evaluator工厂函数统一构造 LLM 判题配置:

def _llm_evaluator(dataset_cfg): return dict( type=GenericLLMEvaluator, prompt_template=dict( type=RawPromptTemplate, messages=[ dict(role='system', content=JUDGE_SYSTEM_PROMPT), dict(role='user', content=JUDGE_PROMPT), ], ), dataset_cfg=dataset_cfg, judge_cfg=dict(), dict_postprocessor=dict(type=general365_llmjudge_postprocess), )

judge_cfg=dict()为空时,GenericLLMEvaluator会回退到默认判题配置(见 default_judge_cfg),该配置从三个环境变量读取判题模型信息:

环境变量作用默认值
OC_JUDGE_MODEL判题模型名称(必填)无
OC_JUDGE_API_KEY判题 API Key(必填)无
OC_JUDGE_API_BASE判题 API 地址(可选)https://api.openai.com/v1/

4.2 复现论文结论的判题设置

官方文档明确指出:LLM 判题 Prompt 完全遵循官方项目;要复现论文结果,请将判题官配置为 GPT-4.1。当前官方仓库默认使用 GPT-4.1-mini,而论文报告的是 GPT-4.1。因此,复现论文时建议按如下方式设置环境变量:

export OC_JUDGE_MODEL=gpt-4.1 export OC_JUDGE_API_KEY=<your-api-key> # 可选:如使用代理或自定义网关 # export OC_JUDGE_API_BASE=https://api.openai.com/v1/

GenericLLMEvaluator的默认判题配置中还包含temperature=0.001、query_per_second=16、batch_size=1024、max_out_len=16384、max_seq_len=49152等参数,以保证判题输出稳定且吞吐足够。

五、判题结果后处理与 OpenCompass 指标对接

判题官输出的是官方格式的{"accuracy": bool}布尔判定,需要通过 general365_llmjudge_postprocess 转换为 OpenCompass 的评分指标。该后处理器注册为DICT_POSTPROCESSORS模块,逐条解析每条样本的prediction字段,并产出:

{ 'accuracy': correct / total * 100 if total else 0.0, # 百分制准确率 'correct_count': correct, 'incorrect_count': total - correct - parse_errors, 'parse_error_count': parse_errors, 'total': total, 'details': output, }

其中每条样本还会额外写入correct(布尔)与judge_parsed(解析出的判定)两个字段,方便在结果文件中排查判题失败样本。测试用例 test_general365_official_judge_postprocessor 验证了「正确样本 +1、错误样本不计、解析失败计入 parse_error」的完整统计逻辑。

六、汇总结果:按样本数加权的官方微平均

两个子任务的结果通过 General365 汇总组配置 合并为总榜分数:

general365_summary_groups = [ dict( name='General365', subsets=['General365-mathverify', 'General365-text'], # General365_Public 包含 484 个数学样本和 236 个文本样本。 # 按样本数加权可复现官方在全部 720 个样本上的微平均, # 而非简单地平均两个子集的准确率。 weights={ 'General365-mathverify': 484, 'General365-text': 236, }, ) ]

要点:

  • General365_Public共720 个样本:数学类 484 个、文本类 236 个;
  • 官方分数为按样本数加权的微平均,即(math_accuracy × 484 + text_accuracy × 236) / 720,而不是两个子集的简单算术平均;
  • 测试用例 test_general365_summary_group_uses_sample_count_weights 以 math=75.0、text=50.0 为例,验证了加权平均公式(75.0 * 484 + 50.0 * 236) / 720的计算结果。

七、端到端运行与验证

7.1 运行评测

在安装好 OpenCompass 依赖的前提下,可通过如下方式运行 General365 评测(示例为单机运行,集群环境请按项目 runner 文档 适配):

# 先配置判题官环境变量 export OC_JUDGE_MODEL=gpt-4.1 export OC_JUDGE_API_KEY=<your-api-key> # 运行评测(实际以 run.py 参数为准) python run.py --config opencompass/configs/datasets/General365/general365_rawprompt_cascade_llmjudge_gen.py

7.2 配置自检

仓库在 test_general365_config_uses_rawprompt_and_requested_evaluators 中对配置做了完整断言,可用来核对你的改动是否偏离了官方链路:

  • infer_cfg.prompt_template.type必须是RawPromptTemplate;
  • math 子任务的 evaluator 必须是CascadeEvaluator,且rule_evaluator为MATHVerifyEvaluator、llm_evaluator为GenericLLMEvaluator、parallel=False;
  • text 子任务的 evaluator 直接为GenericLLMEvaluator;
  • answer_types分别为['number', 'interval']与['text', 'single_choice', 'multiple_choice']。

八、总结:一条链路看懂 General365

环节实现关键参数/文件
数据加载General365Dataset.load按answer_type过滤general365.py
数学题评测规则 + LLM 级联(parallel=False)cascade_evaluator.py
文本/选择题评测直接 LLM 判题generic_llm_evaluator.py
判题官官方 Prompt,输出{"accuracy": bool}环境变量OC_JUDGE_MODEL/OC_JUDGE_API_KEY
结果解析general365_llmjudge_postprocessgeneral365.py
总分汇总484/236 样本数加权微平均General365.py

通过上述配置,你可以在 OpenCompass 中完整复现 General365 官方的「数学规则验证 + LLM 判题」评测流程;若希望对齐论文数据,请务必将判题官设置为 GPT-4.1(而非官方仓库默认的 GPT-4.1-mini),并通过OC_JUDGE_MODEL、OC_JUDGE_API_KEY环境变量完成配置。

  • 模型评测
  • 人工智能
  • 大模型
  • AI 评测

【免费下载链接】opencompass

OpenCompass 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
点击查看免费下载

相关推荐

上一篇:pypdf 与其他 Python PDF 库的全面对比:纯 Python 定位、生态脉络与选型指南
下一篇:CANN Runtime 异步任务并发模型全解析:主机/设备并行、多 Kernel 调度与数据传输重叠

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 3:26:52

悬疑短篇创作法:以“贼手”意象撑起人物与反转

故事开篇那一刻&#xff0c;读者最先记住的往往不是案发现场&#xff0c;不是时间线&#xff0c;也不是那句冷冰冰的台词——而是一双手。题目就叫“那一双贼手”&#xff0c;我在创作同名的短篇悬疑时&#xff0c;心里装的其实不是“贼”这个身份&#xff0c;而是“手”这个器…

作者头像 李华
网站建设 2026/9/29 3:21:27

基于SpringBoot和Vue的共享单车管理系统毕业设计项目源码

联系博主 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 …

作者头像 李华
网站建设 2026/9/29 3:21:16

周末项目推荐:为什么你应该尝试搭建一个MCP服务器?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 3:20:26

MGWR多尺度地理加权回归:Python实战流程与带宽优化指南

空间计量方法这几年越来越常见&#xff0c;做区域经济、城市规划、环境健康、房地产估价的朋友&#xff0c;基本绕不开地理加权回归&#xff08;GWR&#xff09;&#xff0c;但真跑起来很多人会发现一个别扭的前提&#xff1a;传统GWR让所有自变量共享同一个带宽&#xff08;ba…

作者头像 李华