
在 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导读ASDivAcademia Sinica Diverse MWP Dataset是一个面向英语数学单词问题Math Word ProblemMWP求解的多样化评测语料。本文基于 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 SolversarXiv: 2106.15772提出的评测语料。根据 任务 README 中的论文摘要ASDiv 包含2,305 道英文数学单词问题覆盖小学阶段绝大多数题型且在语言表达模式与问题类型两个维度上都比既有 MWP 语料更具多样性每道题都标注了问题类型problem type与年级水平grade level用于指示难度数据集主页为 chaochun/nlu-asdiv-dataset。一个值得注意的约束写在 README 的 NOTE 中当前实现忽略公式formulas用于答案生成即评测时只以最终答案为准不要求模型输出解题公式。引用信息使用该数据集进行学术评测时推荐引用README 原文 BibTeXmisc{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} }二、任务总览asdiv与asdiv_cot_llamaASDiv 任务目录lm_eval/tasks/asdiv/下包含三个文件文件作用README.md数据集背景、引用与任务说明default.yaml标准任务asdiv的配置asdiv-cot-llama.yamlCoT 变体任务asdiv_cot_llama的配置按 README 的说明目前提供了两个任务尚未归入任何 groupasdiv标准任务直接对候选答案做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 系列模型上正确运行。三、标准任务asdivloglikelihood 精确匹配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: true与doc_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-CoTarXiv: 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.0tag: [chain_of_thought]将该任务标记为思维链类便于按标签批量筛选任务由于 ASDiv 没有独立 test 划分这里将test_split与validation_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-extract5.1regex过滤器源码层面regex过滤器对应 filters/extraction.py 中的RegexFilterregex_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_evaluateregexes_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 pretrainedmeta-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 asdiv7.2 若干注意点数据划分ASDiv 在仓库配置中只使用validation划分标准任务与 CoT 变体均是评测时无需额外下载 test 集去污染两个任务都开启了should_decontaminate如果不需要该检查可在命令行显式关闭以避免额外的 n-gram 预处理开销对比基准asdiv_cot_llama与 gsm8k-cot-llama.yaml 的提示词、few-shot 样本、过滤链与停止符几乎完全一致两者可互为对照组——同一模型在这两个任务上的分数差异能反映模型在相近难度、不同语料上的数学推理稳定性版本信息两个任务配置的metadata.version均为1.0改动配置后应递增版本号以便结果追踪。八、小结在 lm-evaluation-harness 中ASDiv 提供了两条互补的评测路径asdivloglikelihoodacc——快速、确定性地衡量模型对数值答案的直接预测能力asdiv_cot_llamagenerate_untilexact_match——在 Llama Instruct 官方评测协议下衡量模型的链式数学推理能力答案抽取依赖regex与take_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),仅供参考