在 lm-evaluation-harness 中评测 ASDiv 数学应用题:从精确匹配到 Llama 风格 CoT 推理
2026/9/14 21:44:07 网站建设 项目流程

在 lm-evaluation-harness 中评测 ASDiv 数学应用题:从精确匹配到 Llama 风格 CoT 推理

【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness

导读

ASDiv(Academia Sinica Diverse MWP Dataset)是一个面向英语数学单词问题(Math Word Problem,MWP)求解的多样化评测语料。本文基于 lm-evaluation-harness 仓库中的 ASDiv 任务文档,完整讲解该数据集在框架内的两种评测形态:基于loglikelihood的精确答案匹配任务asdiv,以及复刻 Meta Llama-Instruct 评测设置、基于generate_until的思维链任务asdiv_cot_llama。读完本文,你将掌握 ASDiv 两个任务的配置细节、提示词模板、答案抽取过滤链与评分机制,并能直接用命令行完成评测。


一、ASDiv 数据集与论文背景

ASDiv 是论文ASDiv: A Diverse Corpus for Evaluating and Developing English Math Word Problem Solvers(arXiv: 2106.15772)提出的评测语料。根据 任务 README 中的论文摘要:

  • ASDiv 包含2,305 道英文数学单词问题,覆盖小学阶段绝大多数题型,且在语言表达模式问题类型两个维度上都比既有 MWP 语料更具多样性;
  • 每道题都标注了问题类型(problem type)与年级水平(grade level,用于指示难度);
  • 数据集主页为 chaochun/nlu-asdiv-dataset。

一个值得注意的约束写在 README 的 NOTE 中:当前实现忽略公式(formulas)用于答案生成,即评测时只以最终答案为准,不要求模型输出解题公式。

引用信息

使用该数据集进行学术评测时,推荐引用(README 原文 BibTeX):

@misc{miao2021diverse, title={A Diverse Corpus for Evaluating and Developing English Math Word Problem Solvers}, author={Shen-Yun Miao and Chao-Chun Liang and Keh-Yih Su}, year={2021}, eprint={2106.15772}, archivePrefix={arXiv}, primaryClass={cs.AI} }

二、任务总览:asdivasdiv_cot_llama

ASDiv 任务目录(lm_eval/tasks/asdiv/)下包含三个文件:

文件作用
README.md数据集背景、引用与任务说明
default.yaml标准任务asdiv的配置
asdiv-cot-llama.yamlCoT 变体任务asdiv_cot_llama的配置

按 README 的说明,目前提供了两个任务(尚未归入任何 group):

  • asdiv:标准任务,直接对候选答案做loglikelihood打分;
  • asdiv_cot_llama:将提示词格式修改为与 Meta 在 Llama-3.1-8B-Instruct 评测中所用设置一致(参照 gsm8k 的评测细节页),CoT 提示词来自 arXiv: 2201.11903(即 GSM8K-CoT 论文),整体配置与仓库中的gsm8k_cot_llama任务一一对应,只是将数据集换成 ASDiv。

README 特别强调,使用asdiv_cot_llama必须同时指定--fewshot_as_multiturn--apply_chat_template,才能在 Llama Instruct 系列模型上正确运行。


三、标准任务asdiv:loglikelihood 精确匹配

3.1 完整配置解读

default.yaml 的内容如下:

task: asdiv dataset_path: EleutherAI/asdiv output_type: loglikelihood validation_split: validation doc_to_text: "{{body}}\nQuestion:{{question}}\nAnswer:" doc_to_target: "{{answer.split(' (')[0]}}" should_decontaminate: true doc_to_decontamination_query: "{{body}} {{question}}" metric_list: - metric: acc aggregation: mean higher_is_better: true metadata: version: 1.0

逐字段说明:

  • dataset_path: EleutherAI/asdiv:从 HuggingFace 数据集EleutherAI/asdiv加载数据;
  • output_type: loglikelihood:采用"计算给定前缀下目标字符串的条件对数似然"的打分方式。评测时,框架会把doc_to_text生成的上下文与doc_to_target生成的目标拼接,比较模型对目标内容的似然;
  • validation_split: validation:使用数据集的validation划分(ASDiv 本身以验证集形式分发,此处直接将其作为评测集);
  • doc_to_text: "{{body}}\nQuestion:{{question}}\nAnswer:":将数据集中的body(题干背景)与question(问题)组织成提示词,并以Answer:引导答案;
  • doc_to_target: "{{answer.split(' (')[0]}}":答案字段形如"6 (number)",这里取空格加左括号前的部分(即纯数值答案)作为目标;
  • should_decontaminate: truedoc_to_decontamination_query: "{{body}} {{question}}":开启去污染检查,用题干+问题拼接后的文本作为查询串,与预训练语料的 n-gram 进行比对,相关实现见 decontamination 模块;
  • metric_list:使用acc(准确率),聚合方式为mean,数值越高越好;
  • metadata.version: 1.0:任务配置版本号。

3.2 运行方式

标准评测命令与框架通用用法一致:

lm_eval \ --model hf \ --model_args pretrained=<你的模型路径或名称> \ --tasks asdiv \ --batch_size auto

由于该任务无需生成,只做逐 token 似然比较,因此对小规模模型也能快速完成 2,305 道题的评测。


四、思维链变体asdiv_cot_llama:复刻 Llama Instruct 评测设置

4.1 为什么需要这个变体

标准asdiv任务只给模型一个空答案前缀,要求模型"直接输出答案",这种设置无法体现 Instruct 模型在**链式推理(Chain-of-Thought)**下的能力。asdiv_cot_llama的目的,是让 ASDiv 的评测方式与 Meta 官方对 Llama-3.1 系列 Instruct 模型的数学评测完全对齐,从而可以横向对比 Llama 官方公布的 GSM8K 类结果。

4.2 提示词模板与 few-shot 样本

asdiv-cot-llama.yaml 中,doc_to_text被替换为:

Given the following problem, reason and give a final answer to the problem. Problem: {{body if body is defined}} {{question}} Your response should end with "The final answer is [answer]" where [answer] is the response to the problem.

即要求模型先推理、再以The final answer is [answer]的固定格式收尾。doc_to_target也做了兼容处理:

doc_to_target: "{{answer.split(' (')[0] if answer is defined else target}}"

由于 ASDiv 原始答案可能缺失(answer未定义),此时回退到target字段,保证与数据集结构兼容。

few-shot 配置使用sampler: first_n,内置 8 个 GSM8K 风格的手写示例(与gsm8k_cot_llama完全一致的样本集),每个示例都展示了"先列算式、再给出 The final answer is X"的推理格式,例如:

There are 15 trees in the grove. Grove workers will plant trees in the grove today. After they are done, there will be 21 trees. How many trees did the grove workers plant today?

There are 15 trees originally. Then there were 21 trees after some more were planted. So there must have been 21 - 15 = 6. The final answer is 6

同时num_fewshot: 8声明默认注入 8 个样本。这种"少样本 + CoT"的设置正是 GSM8K-CoT(arXiv: 2201.11903)论文所采用的做法,README 中也明确注明 CoT 提示词与此论文完全一致。

4.3 生成参数与停止符

output_type: generate_until generation_kwargs: do_sample: false until: - '<|eot_id|>' - '<|start_header_id|>user<|end_header_id|>' - 'Q:' - </s> - <|im_end|> repeats: 1

要点:

  • output_type: generate_until:模型自回归生成直到命中停止符或达到最大长度;
  • do_sample: false:贪心解码,保证评测可复现;
  • until中的停止符同时覆盖了 Llama 3(<|eot_id|><|start_header_id|>user<|end_header_id|>)、通用Q:以及 ChatML 风格的<|im_end|>,从而适配不同分词器与对话模板;
  • repeats: 1:每个样本只生成一次(如需自洽性采样可调大该值配合多数投票过滤器)。

4.4 标签与评测划分

tag: - chain_of_thought test_split: validation validation_split: validation should_decontaminate: true doc_to_decontamination_query: "{{body}} {{question}}" metadata: version: 1.0
  • tag: [chain_of_thought]:将该任务标记为思维链类,便于按标签批量筛选任务;
  • 由于 ASDiv 没有独立 test 划分,这里将test_splitvalidation_split都指向validation,与标准任务使用同一份数据。

五、答案抽取过滤链:从自由文本到可评分答案

generate_until输出的是自由文本,必须先把数字答案抽取出来才能与参考答案比较。asdiv_cot_llama定义了两级过滤(filter_list),分别对应两种严格程度:

filter_list: - filter: - function: regex group_select: -1 regex_pattern: The final answer is ((-?[$0-9.,]{2,})|(-?[0-9]+)) - function: take_first name: strict-match - filter: - function: regex group_select: -1 regex_pattern: (-?[$0-9.,]{2,})|(-?[0-9]+) - function: take_first name: flexible-extract

5.1regex过滤器(源码层面)

regex过滤器对应 filters/extraction.py 中的RegexFilter

  • regex_pattern:编译后的正则,用于在模型回复中查找匹配;
  • group_select:选择findall结果的第几个匹配(-1表示取最后一个匹配);当命中多个捕获组返回元组时,会取第一个非空组;
  • fallback:无匹配时返回的占位符(默认"[invalid]"),该占位符不会与任何参考答案相等,从而保证"未抽取到答案"的样本被判错,而不是异常报错。

两条正则的核心差异在于:strict-match强制要求答案紧跟在The final answer is之后;flexible-extract则从整段文本中任意位置抽取数字,容错性更高。

5.2take_first过滤器(源码层面)

take_first对应 filters/selection.py 中的TakeFirstFilter,实现非常简洁:

def apply(self, resps, docs): """Assuming each entry of `resps` is a list of model responses, we discard all but the first response.""" return map(lambda r: r[0], resps)

由于repeats: 1时每个样本只有一条回复,该过滤器主要作用是保证过滤链的输出结构统一(把"每条样本的回复列表"压成"每条样本一个答案")。


六、评分指标:exact_match 与预处理规则

metric_list: - aggregation: mean higher_is_better: true ignore_case: true ignore_punctuation: false metric: exact_match regexes_to_ignore: - ',' - \$ - '(?s).*#### ' - \.$

该配置在exact_match基础上叠加了与 HuggingFaceevaluate库一致的归一化逻辑,实现位于 api/metrics.py 的exact_match_hf_evaluate

  • regexes_to_ignore:比较前先从预测与参考答案中删除匹配这些正则的子串——逗号,、美元符号$####及其之前的所有内容(兼容 GSM8K 答案格式)、结尾句点\.
  • ignore_case: true:统一转小写后比较;
  • ignore_punctuation: false:不做标点剔除;
  • 最终对所有样本的逐条相等判断取平均(np.mean(score_list)),得到整体exact_match分数。

这套预处理保证了"$6.00""6""6.""6"这类等价写法可以被正确判对,减少格式差异对分数的影响。


七、实际运行与注意事项

7.1 命令示例

针对 Llama Instruct 系列模型运行 CoT 变体(README 强调必须带两个参数):

lm_eval \ --model hf \ --model_args pretrained=meta-llama/Meta-Llama-3.1-8B-Instruct \ --tasks asdiv_cot_llama \ --num_fewshot 8 \ --fewshot_as_multiturn \ --apply_chat_template \ --batch_size auto
  • --apply_chat_template:将提示词套用模型自带的对话模板;
  • --fewshot_as_multiturn:把 few-shot 示例组织成多轮对话(每轮一个 user/assistant 问答对),这是复刻 Llama 官方评测格式的关键;
  • 若不加这两个参数,Instruct 模型会收到未包裹的纯文本提示,推理格式与评测结果都会偏离预期。

运行标准asdiv任务则无需任何额外参数:

lm_eval --model hf --model_args pretrained=<模型> --tasks asdiv

7.2 若干注意点

  1. 数据划分:ASDiv 在仓库配置中只使用validation划分(标准任务与 CoT 变体均是),评测时无需额外下载 test 集;
  2. 去污染:两个任务都开启了should_decontaminate,如果不需要该检查可在命令行显式关闭,以避免额外的 n-gram 预处理开销;
  3. 对比基准asdiv_cot_llama与 gsm8k-cot-llama.yaml 的提示词、few-shot 样本、过滤链与停止符几乎完全一致,两者可互为对照组——同一模型在这两个任务上的分数差异,能反映模型在"相近难度、不同语料"上的数学推理稳定性;
  4. 版本信息:两个任务配置的metadata.version均为1.0,改动配置后应递增版本号以便结果追踪。

八、小结

在 lm-evaluation-harness 中,ASDiv 提供了两条互补的评测路径:

  • asdivloglikelihood+acc)——快速、确定性地衡量模型对数值答案的直接预测能力;
  • asdiv_cot_llamagenerate_until+exact_match)——在 Llama Instruct 官方评测协议下衡量模型的链式数学推理能力,答案抽取依赖regextake_first组成的过滤链,评分依赖带归一化预处理的exact_match

两者共享同一份EleutherAI/asdiv数据与去污染配置,均可直接从命令行一键运行。若要深入定制(例如修改提示词、增加自洽性采样轮数、调整答案抽取正则),直接编辑 default.yaml 与 asdiv-cot-llama.yaml,并参考 过滤过滤器实现、take_first 过滤器 与 exact_match 指标实现 即可。

【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询