☰
深入解读 s1 仓库中 GSM8K 评测任务:从 Chain-of-Thought 到 Self-Consistency 的完整实战指南
2026/10/9 5:11:10 网站建设 项目流程
  • 大模型
  • 推理模型
  • 微调
  • 模型推理服务

【免费下载链接】s1

s1: Simple test-time scaling

项目地址:https://gitcode.com/gh_mirrors/s1/s1
点击查看免费下载

导读

本文以 GSM8K 任务说明文档 为主线,系统讲解在 lm-evaluation-harness 中评测 GSM8K 数学应用题的全套方案。GSM8K(Grade School Math 8K)是用于检验语言模型多步数学推理能力的经典基准,本仓库中的gsm8k任务族覆盖了普通生成、Chain-of-Thought(思维链)、Self-Consistency(自洽性投票)与 Llama 对齐格式共 4 种评测变体。读完本文,你将掌握每个 YAML 任务的关键配置、答案抽取与精确匹配的过滤链路,以及如何复现 Meta 官方 Llama-3.1 评测设置。

一、GSM8K 是什么:任务背景与数据集特点

GSM8K 数据集源于论文Training Verifiers to Solve Math Word Problems(Cobbe 等人,2021),其核心论断是:即便最先进的 Transformer 模型在许多任务上可以媲美人类,但在多步数学推理上仍不稳健。为此论文发布了 GSM8K——一个包含8.5K 道高质量、语言多样化的初中数学应用题(grade school math word problems)的评测集,用于诊断模型失败模式并支持相关研究。尽管该问题分布概念上很简单,但论文发现即使是最大的 Transformer 模型也难以取得高测试成绩。

在评测时注意:GSM8K 官方实现提供了每个样本的计算器标注(calculator annotations),若要让你自己的语言模型在采样/生成函数中使用这些标注,可参考官方 grade-school-math 仓库的calculator.py示例(本仓库在 README 中给出了该提示,但目前任务族中尚未内置计算器变体,见文末 Wishlist 说明)。

本仓库的 GS8K 相关任务全部位于 eval/lm-evaluation-harness/lm_eval/tasks/gsm8k/ 目录,共 5 个 YAML 配置文件。该目录对应的引用信息见 README 中的 Citation 块(即上述论文的 BibTeX 条目)。

二、任务族总览:Groups 与 Tasks 的组织结构

在 lm-evaluation-harness 中,任务通过 YAML 的tag字段与 Group 关联,便于按组批量调度。本任务族涉及的三个 Group:

Group含义关联任务
math_word_problems数学文字应用题组gsm8k、gsm8k_cot_zeroshot
chain_of_thought思维链评测组gsm8k_cot及其变体
self_consistency自洽性投票组gsm8k_cot_self_consistency

四个核心 Task 变体:

Task 名说明
gsm8k基础 5-shot 生成式评测,使用 "Question: ... Answer:" 模板
gsm8k_cot8-shot Chain-of-Thought 评测,fewshot 示例内嵌完整推理步骤
gsm8k_cot_self_consistency在 CoT 基础上开启 64 次采样 + 多数投票(Maj@64)
gsm8k_cot_llama提示格式对齐 Meta Llama-3.1 官方评测设置

其中gsm8k_cot_llama是 README 中特别强调的变体:其提示格式依照 Meta 的 Llama-3.1-8B-Instruct 评测设置调整,使用该任务时须配合--fewshot_as_multiturn与--apply_chat_template两个命令行参数,才能复现 Meta 官方报告的成绩。

三、基础任务gsm8k:5-shot 生成评测逐字段拆解

gsm8k.yaml 是任务族的基石,下面逐字段说明其作用:

tag: - math_word_problems task: gsm8k dataset_path: gsm8k dataset_name: main output_type: generate_until training_split: train fewshot_split: train test_split: test doc_to_text: "Question: {{question}}\nAnswer:" doc_to_target: "{{answer}}" metric_list: - metric: exact_match aggregation: mean higher_is_better: true ignore_case: true ignore_punctuation: false regexes_to_ignore: - "," - "\\$" - "(?s).*#### " - "\\.$" generation_kwargs: until: - "Question:" - "</s>" - "<|im_end|>" do_sample: false temperature: 0.0 repeats: 1 num_fewshot: 5 filter_list: - name: "strict-match" filter: - function: "regex" regex_pattern: "#### (\\-?[0-9\\.\\,]+)" - function: "take_first" - name: "flexible-extract" filter: - function: "regex" group_select: -1 regex_pattern: "(-?[$0-9.,]{2,})|(-?[0-9]+)" - function: "take_first" metadata: version: 3.0

关键设计解读:

  • 数据与划分:dataset_path: gsm8k/dataset_name: main对应 HF 上的gsm8k数据集的main子集;fewshot 从train划分采样,最终在test划分上评测。
  • 提示模板:doc_to_text将题目组装成Question: ...\nAnswer:,期望模型续写出答案;doc_to_target直接取数据集的answer字段(数据集内答案形如"答案\n#### 6",####后为最终数值)。
  • 生成设置:generate_until型任务以until中的字符串(Question:、</s>、<|im_end|>)作为停止符;do_sample: false且temperature: 0.0,即贪心解码,保证可复现性。
  • 双路答案过滤:这是 GSM8K 评测的精髓所在。filter_list定义两条独立打分管线(filter),评测时对每条 filter 分别计算指标:
    • strict-match:用正则#### (\-?[0-9\.\,]+)在模型原始输出中寻找####之后的数值(这与数据集答案格式一致),然后take_first取第一个匹配;
    • flexible-extract:用(-?[$0-9.,]{2,})|(-?[0-9]+)且group_select: -1(取最后一组匹配),从答案字段中柔性抽取数值,容忍$、逗号、小数等格式差异。
  • 精确匹配指标:exact_match聚合方式为mean,higher_is_better: true;ignore_case: true忽略大小写,regexes_to_ignore在比较前剔除逗号、美元符号、####之后的内容和末尾句点。

四、Chain-of-Thought 变体:gsm8k_cot与零样本触发词

4.1 gsm8k_cot:8-shot 思维链评测

gsm8k-cot.yaml 将任务升级为显式思维链评测:

  • 提示模板:doc_to_text为'Q: {{question}}\n\nA:',fewshot 示例中每个target都包含完整的逐步推理(如"There are 15 trees originally. Then there were 21 trees after some more were planted. So there must have been 21 - 15 = 6. The answer is 6."),从而引导模型输出中间推理过程。
  • fewshot 来源:使用fewshot_config.sampler: first_n,直接内嵌 8 个精选示例,不依赖外部 fewshot 采样逻辑,保证示例稳定一致。
  • 答案目标:doc_to_target使用表达式{{answer.split('####')[-1].strip() if answer is defined else target}},即优先取####后的数值部分作为参考答案,回退到target字段。
  • 过滤:strict-match 正则变为The answer is (\-?[0-9\.\,]+).,匹配模型输出中The answer is ...后的数字;tag标记为chain_of_thought;num_fewshot: 8。

4.2 gsm8k_cot_zeroshot:零样本思维链触发

gsm8k-cot-zeroshot.yaml 提供零样本评测选项:

  • num_fewshot: 0,不注入任何示例;
  • doc_to_text: "Q: {{question}}\nA: Let's think step by step."——通过追加经典的"Let's think step by step" 触发词,在零样本条件下诱导模型展开推理;
  • 其余配置(生成、过滤、指标)与gsm8k.yaml保持一致。

该变体常用于快速验证模型原生推理能力,或作为 CoT 能力的下限参考。

五、Self-Consistency 变体:Maj@64 多数投票的实现细节

gsm8k-cot-self-consistency.yaml 通过include: gsm8k-cot.yaml继承基座任务,仅做三处关键改动:

generation_kwargs: until: - "Q:" - "\n\n" do_sample: true temperature: 0.2 repeats: 64 filter_list: - name: "score-first" filter: - function: "regex" regex_pattern: "The answer is (\\-?[0-9\\.\\,]*[0-9]+)" - function: "take_first" - name: "maj@64" filter: - function: "regex" regex_pattern: "The answer is (\\-?[0-9\\.\\,]*[0-9]+)" - function: "majority_vote" - function: "take_first" - name: "maj@8" filter: - function: "take_first_k" k: 8 - function: "regex" regex_pattern: "The answer is (\\-?[0-9\\.\\,]*[0-9]+)" - function: "majority_vote" - function: "take_first"

Self-Consistency 的完整链路如下:

  1. 采样阶段:do_sample: true、temperature: 0.2开启随机采样,repeats: 64让每个题目独立生成 64 条回答;until增加"\n\n"作为额外停止符,避免单条回答内出现多次推理块。
  2. 三条并行打分管线:
    • score-first:只取第 1 条回答,作为单样本基线指标;
    • maj@64:对全部 64 条回答的抽取结果做majority_vote,再take_first,得到完整多数投票指标;
    • maj@8:先用take_first_k(k=8)截取前 8 条回答再投票,近似计算 Maj@8(YAML 注释也说明:使用更优的估计器会更理想)。

上述 filter 的底层实现可以在本仓库源码中直接验证:

  • take_first / take_first_k / majority_vote 实现:TakeFirstFilter.apply对每条 doc 的回答列表丢弃除第一个外的所有回答;TakeKFilter会断言len(resps[0]) >= k(否则报错提示增大TaskConfig.repeats),并切片取前 k 条;MajorityVoteFilter用Counter(resp).most_common(1)[0][0]选出出现次数最多的回答。
  • regex 抽取实现:RegexFilter用re.findall对每条回答匹配,group_select指定取第几组匹配(-1 取最后一组),无匹配时返回默认 fallback"[invalid]",随后由take_first收敛为单个答案字符串。

正是这套"先抽取答案、再按答案字符串投票"的管线,让 Self-Consistency 在无需额外奖励模型的前提下显著提升 GSM8K 上的准确率——这是该评测变体在测试时扩展(test-time scaling)类工作中被广泛采用的原因。

六、Llama 对齐变体:复现 Meta 官方评测设置

gsm8k-cot-llama.yaml 专门用于复现 Meta 在其 Llama-3.1-8B-Instruct-evals 数据集中报告的 GSM8K 成绩,与gsm8k_cot的区别在于:

  • 系统提示模板:doc_to_text变为"Given the following problem, reason and give a final answer to the problem.\nProblem: {{question}}\nYour response should end with \"The final answer is [answer]\" where [answer] is the response to the problem.\n",要求输出以The final answer is [answer]结尾;
  • 示例目标格式:fewshot 示例的target均以The final answer is 6这种句式收尾,与抽取正则The final answer is ((-?[$0-9.,]{2,})|(-?[0-9]+))完全对应;
  • 停止符:until加入 Llama 3 的对话标记<|eot_id|>与<|start_header_id|>user<|end_header_id|>,确保生成在对话边界正确截断。

使用前提:如 README 所述,运行该任务必须同时传入--fewshot_as_multiturn(将 fewshot 示例按多轮对话组织)和--apply_chat_template(应用模型的 chat template),否则提示格式与 Meta 官方设置不一致,无法复现其报告的数字。

七、运行方式与验证

7.1 命令行运行示例

在 lm-evaluation-harness 目录下(以本地模型为例):

# 运行基础 5-shot GSM8K python -m lm_eval \ --model hf \ --model_args pretrained=your-model \ --tasks gsm8k # 运行 CoT 变体 python -m lm_eval \ --model hf \ --model_args pretrained=your-model \ --tasks gsm8k_cot # 运行 Self-Consistency(64 次采样 + Maj@64,耗时较长) python -m lm_eval \ --model hf \ --model_args pretrained=your-model \ --tasks gsm8k_cot_self_consistency # 复现 Meta Llama-3.1 官方设置(必须带两个额外参数) python -m lm_eval \ --model hf \ --model_args pretrained=your-model,trust_remote_code=True \ --tasks gsm8k_cot_llama \ --fewshot_as_multiturn \ --apply_chat_template

需要说明的适用前提:以上命令以本仓库配套的 lm-evaluation-harness(lm_eval 主入口)为准,--fewshot_as_multiturn与--apply_chat_template为 v1.0 起支持的参数;运行结果输出中,gsm8k_cot_self_consistency会分别报告 score-first、maj@64、maj@8 三条指标。

7.2 任务在仓库中的落位

  • 任务定义:tasks/gsm8k/(5 个 YAML);
  • 过滤器实现:filters/selection.py(take_first / take_first_k / majority_vote)、filters/extraction.py(regex);
  • 组(Group)元信息:README 中列出了math_word_problems、chain_of_thought、self_consistency三个 Group,同一 Group 机制也复用于 aime 任务族 等推理类任务。

八、维护状态与变体 Wishlist

README 末尾的 Checklist 显示:gsm8k任务族已纳入 Eval-harness v1.0,但"从 v1.0 回归检查""与原论文方法等价性检查"和"主选变体标注"三项尚未完成,引用或复现时需留意。

此外,README 列出了三个尚未实现的变体方向(Variant Wishlist),可作为后续扩展参考:

  • 带计算器(Calculator)的变体:利用数据集的 calculator annotations(官方 grade-school-math 的calculator.py提供了示例实现);
  • Verifier(验证器)变体:对应论文标题Training Verifiers to Solve Math Word Problems的训练-验证范式;
  • 无 CoT 的 Majority voting:不借助思维链直接对答案做多数投票。

这些方向在gsm8k_cot_self_consistency的 maj@8/maj@64 管线上已有雏形(抽答案 + 投票),只是尚未接入计算器与验证器。

结语

在 s1 仓库中,gsm8k任务族是评测语言模型数学推理能力的标准入口:gsm8k提供干净的 5-shot 基线,gsm8k_cot与gsm8k_cot_zeroshot覆盖有/无示例的思维链评测,gsm8k_cot_self_consistency通过 repeats=64 与 majority_vote 过滤器实现测试时扩展,而gsm8k_cot_llama则精确复现 Meta 官方口径。理解这 5 个 YAML 的字段语义与过滤器链路,即可自行定制采样次数、温度与抽取正则,将 GSM8K 评测无缝嵌入自己的推理能力对比实验中。

  • 大模型
  • 推理模型
  • 微调
  • 模型推理服务

【免费下载链接】s1

s1: Simple test-time scaling

项目地址:https://gitcode.com/gh_mirrors/s1/s1
点击查看免费下载

相关推荐

上一篇:零宕机指南:Dgraph多区域部署的健康检查实践
下一篇:3步打造专属编辑界面:wangEditor 5工具栏自定义完全指南

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

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

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

立即咨询