- 大模型
- 推理模型
- 微调
- 模型推理服务
【免费下载链接】s1
s1: Simple test-time scaling
导读
本文以 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_cot | 8-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 的完整链路如下:
- 采样阶段:
do_sample: true、temperature: 0.2开启随机采样,repeats: 64让每个题目独立生成 64 条回答;until增加"\n\n"作为额外停止符,避免单条回答内出现多次推理块。 - 三条并行打分管线:
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
相关推荐
OpenCompass 思维链(Chain of Thought)评测指南:从零样本 CoT 到 Tree-of-Thoughts 的完整实战配置
OpenCompass 思维链(Chain of Thought)评测指南:从零样本 CoT 到 Tree of Thoughts 的完整实战配置 思维链(Ch
模型评测人工智能大模型AI 评测N_m3u8DL-RE:一条命令搞定 MPD/M3U8/ISM 流媒体下载,加密流、直播流都支持
N_m3u8DL RE:一条命令搞定 MPD/M3U8/ISM 流媒体下载,加密流、直播流都支持 N_m3u8DL RE 是一款跨平台的流媒体下载工具:MPD、
CLI音视频s1 仓库 C-Eval 中文评测实现指南:基于 lm-evaluation-harness 的 ceval-valid 任务组深度解析
s1 仓库 C Eval 中文评测实现指南:基于 lm evaluation harness 的 ceval valid 任务组深度解析 导读 本文以当前仓库中
大模型推理模型微调模型推理服务
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考