想象你是批改作业的老师,面前放着8500份数学卷子。每份卷子上,学生都写满了推导过程:先算什么、再算什么、中间结果是多少,最后在卷子末尾画了一个方框,把最终答案圈在里面。你的工作不是重算每一步,而是快速找到那个方框,读出里面的数字,跟答案本比对,然后公平地打上勾或叉。现在把“学生”换成大语言模型,把“卷子”换成模型生成的长篇回复——这份“圈出最终答案”的工作,就是GSM8K答案抽取。GSM8K是评估大模型数学推理能力的经典基准,而答案抽取就是它的“判卷笔”。如果这支笔不公平,模型分数再高也失去意义。本文就用“老师批卷”这条故事线,带你完整理解答案抽取的原理、规则与价值。

岗位关联

答案抽取是LLM评测的“公平判卷笔”——掌握它,你才能读懂模型分数背后的真实推理水平,也能搭建出可信赖的自动化评测管线。

目录
  1. 可视化演示
  2. 基准概述:一份8500道题的数学试卷
  3. 答案标注:试卷底部的“方框”
  4. 抽取目标:只找方框里的最终答案
  5. 解析规则:老师的三种查找习惯
  6. 格式归一:把“96个”看成96
  7. 结果比对:全对或全错,没有步骤分
  8. 错误分类:批错卷子的三种情况
  9. 评测价值:一张有意义的成绩单
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示从模型回复中定位####标记、提取数值答案并与标准答案比对的完整流程,切换模式查看误差分析与多策略融合。

本节配有交互动效(进入视口后自动加载,约 3KB)。

答案抽取流水线 标记关键词(####/答案是)定位最终答案位置 扫描模型回复文本检测答案标记 提取数值并与标准答案比对判定正确性 Acc=(TP+TN)/(TP+FP+FN+TN) 抽取器信任最终标注而非推理过程计算结果

基准概述:一份8500道题的数学试卷

新学期开始,数学老师拿到一沓厚厚的试卷——学校统一的标准化考试,一共8500道小学应用题。题目不长,但每道都需要两三步甚至七八步的思考。老师在批改前,先要搞清楚这份试卷的底细:考什么范围、答案长什么样、怎么计分。不了解试卷,就没有批改的依据。

在AI评测界,这份“试卷”叫GSM8K(Grade School Math 8K),由OpenAI的研究者收集8500道小学水平的数学应用题,每题附有人工写好的标准解答。它被广泛用于衡量大语言模型的数学推理能力:模型不仅要写出正确结果,还要能用自然语言呈现推理步骤。

GSM8K按固定比例划分数据集,其中7473道用于训练,1319道用于测试。所有标准答案都是整数,这是答案抽取能够以“提取一个数”为核心的根基。评测的核心指标就是准确率,即答对的题目占全部题目的比例。

老师要看清试卷全貌才知道怎么批;评测者要理解GSM8K的规模、划分和整数答案特性,才能设计出匹配的判卷规则。这张“试卷”的每一处细节,都直接决定了后续抽取与比对环节的走向。

Acc=NcorrectNtotal\displaystyle \text{Acc} = \frac{N_{\text{correct}}}{N_{\text{total}}}
准确率就是“批对的题数占总题数的比例”:1000道题里判对了900道,准确率就是90%。这是所有模型对比的第一把尺子。
  1. N\_total评测集合的题目总数,GSM8K测试集为1319道
    Ntotal=1319N_{\text{total}} = 1319
  2. N\_correct抽取答案与标准答案一致的题数,逐题累加
    Ncorrect=∑i=1Ntotal1[a^i=ai∗]N_{\text{correct}} = \sum_{i=1}^{N_{\text{total}}} \mathbb{1}[\hat{a}_i = a_i^*]
  3. 相除得比例正确数除以总数,得到0到1之间的准确率
    Acc=NcorrectNtotal\text{Acc} = \displaystyle \frac{N_{\text{correct}}}{N_{\text{total}}}

答案标注:试卷底部的“方框”

为了让批改高效,出卷老师给试卷立了一条规矩:请把最终答案写进卷子末尾的方框里,前面怎么写过程都可以。这样一来,批改老师只需要扫到方框,就能一眼读出答案,不必在草稿海洋里反复打捞。

GSM8K数据集也有一条一模一样的“规矩”:每份标准解答的最后,答案前面都有一个特殊标记"####"。这个标记就是试卷上的方框线,把最终答案与前面的推理过程清晰地隔开。模型的训练样本和标准答案都遵循这个惯例。

具体的数据格式是:先是一段自然语言的逐步推理,然后另起一行写“#### “,行尾跟上唯一的整数答案。例如:”计算5+3=8,所以一共8个。\n#### 8“。抽取器可以充分利用这个稳定结构:先定位”####”,再把其后的内容作为答案候选区,最后从中提取整数。

有方框的卷子好批,有"####"的答案好抽。正是这种标注规律,让基于规则的抽取器有了最可靠的抓手——先找标记,再读答案,简单直接。

r=reasoning⊕####⊕a\displaystyle r = \text{reasoning} \oplus \text{\#\#\#\#} \oplus a
这条公式描述的是回复的结构:整段文本等于“推理过程 + 分隔符'####' + 最终答案”三部分按顺序拼接。知道结构,才知道该从哪里下手截取。
  1. reasoning模型生成的多步推理文本,包含算式与说明
    reasoning=逐步计算与文字解释\text{reasoning} = \text{逐步计算与文字解释}
  2. ####数据集固定的“方框”分隔符,紧挨最终答案
    ####∈r\text{\#\#\#\#} \in r
  3. a最终答案,在GSM8K中一定是整数
    a∈Za \in \mathbb{Z}
  4. 拼接关系⊕ 表示三个部分按顺序相连,位置关系稳定
    r=reasoning⊕####⊕ar = \text{reasoning} \oplus \text{\#\#\#\#} \oplus a

抽取目标:只找方框里的最终答案

经验丰富的老师批卷,不会把学生的每一步计算都验算一遍——那样批完8500份卷子会累垮。他的目标非常纯粹:找到方框里的数字,和答案本核对。至于过程写得潦草还是工整,都不影响这个核心动作。

答案抽取的目标同样纯粹:定位最终答案,而不是理解或验证整个推理过程。GSM8K的评分只关心最终答案是否与标准答案一致。抽取器需要从模型输出的长文本中,准确识别出那个唯一的整数,同时忽略掉所有中间算式和解释性文字。

形式上,抽取器是一个函数 Extract:输入整段回复文本,输出一个候选答案(可能为空)。评测时把候选答案与标准答案比对。设计目标有三个:一是准确,别把中间结果当最终答案;二是鲁棒,面对不同措辞风格都能稳定工作;三是确定,同一回复永远得到同一结果,保证评测可复现。

老师只找方框,抽取器只找最终答案——这个“只”字,正是评测公正性的起点。目标越聚焦,规则越简单,评测就越不容易被无关信息干扰。

a^=Extract(r),score=1[a^=a∗]\displaystyle \hat{a} = \text{Extract}(r), \quad \text{score} = \mathbb{1}[\hat{a} = a^*]
抽取函数把文本变成数字,再用一个“指示函数”比对:相等得1分,不相等得0分。这就是“全对或全错”的评分逻辑。
  1. Extract(r)抽取函数,输入模型回复全文
    a^=Extract(r)\hat{a} = \text{Extract}(r)
  2. a\*数据集给出的标准答案(ground truth)
    a∗=人工标注的正确整数a^* = \text{人工标注的正确整数}
  3. 指示函数方括号内条件成立取1,不成立取0
    1[a^=a∗]∈{0,1}\mathbb{1}[\hat{a} = a^*] \in \{0, 1\}
  4. score每道题只有0分或1分两种可能
    score=1[a^=a∗]\text{score} = \mathbb{1}[\hat{a} = a^*]

解析规则:老师的三种查找习惯

每个老师都有自己的扫卷习惯:先找方框;如果学生忘了画框,就看卷子末尾有没有孤零零的数字;如果卷面太乱,就找“答案是”“最终结果”这类关键词。这些习惯,就是抽取器的“解析规则”。

解析规则决定抽取器如何从文本中定位答案。真实模型的输出五花八门:有的规规矩矩带上“####“,有的说”所以答案是96“,有的直接把答案写在最后一行。因此抽取策略需要分层:首选”####“标记截断,其次用关键词定位,最后用”末尾数字”兜底。

在工程实现上,第一策略是文本截断:在回复中定位“####“,只保留其后的内容再提取数字。若没有该标记,则寻找”答案是”“结果为”等关键词;仍找不到,就提取全文最后一个整数。手写正则 re.findall(r'\d+', tail) 可以抓出所有数字候选,取最后一个作为答案。

查找习惯越清晰,批卷越快越准;解析规则越明确,抽取就越不容易被模型的“花式草稿”带偏。分层设计让抽取器在混乱输出面前依然有章可循。

a^={lastnum(after(r,####)),if ####∈rlastnum(r),otherwise\displaystyle \hat{a} = \begin{cases} \text{lastnum}\big(\text{after}(r, \text{\#\#\#\#})\big), & \text{if } \text{\#\#\#\#} \in r \\[6pt] \text{lastnum}(r), & \text{otherwise} \end{cases}
这是一条“如果……否则……”的分支规则:回复里有"####"就在它后面找答案,没有就用整段文本的末位数字兜底。就像老师先找方框,找不到方框就找末尾数字。
  1. 条件判断检查回复中是否出现"####"标记
    if ####∈r\text{if } \text{\#\#\#\#} \in r
  2. 截取动作取分隔符之后的文本作为候选区
    after(r,####)\text{after}(r, \text{\#\#\#\#})
  3. lastnum 函数从给定文本中提取最靠右的整数
    lastnum(t)=最后一个整数 token\text{lastnum}(t) = \text{最后一个整数 token}
  4. 兜底分支没有标记时,直接从全文取末位数字
    a^=lastnum(r)\hat{a} = \text{lastnum}(r)

格式归一:把“96个”看成96

学生们的答案书写五花八门:有人写“96个”,有人写“$96“,有人写”96.“,还有人写”1,200“这种带千位分隔的。老师心里默念:先剥掉装饰、统成一个标准数字,再对答案本。这层”剥装饰”的功夫,就是格式归一化。

归一化要解决的核心问题是:模型输出与标准答案数值相同,但书写形式不同。如果直接按字符串比对,“96个”和“96“不可能相等。归一化把这些表面差异抹平,确保比较的落脚点是”数值“而不是”字符串长相”。

通常的归一化步骤包括:去除首尾空白、清理标点符号、去除货币符号(如$)、删除千位分隔逗号,最终统一解析成整数。以"$1,200“为例,去掉美元符和逗号后为1200;”$96“去掉货币符号后为96;”96个"去掉量词后仍是96。完成归一化后,所有不同写法都映射到同一个整数。

老师不会因为学生多写一个“个”字就批错,归一化后的抽取器也同样“通情达理”。它只认数值本质,不认书写皮相。

f(x)=ParseInt(Strip(Remove(x)))\displaystyle f(x) = \text{ParseInt}\Big( \text{Strip}\big( \text{Remove}(x) \big) \Big)
归一化函数是一个“先清理、再解析”的管道:先去掉装饰字符,再转成整数。不同写法经过管道后,变成同一个可比的标准形态。
  1. Remove(x)删除货币符号、千位逗号、量词等装饰
    Remove(1,200)=1200\text{Remove}(1{,}200) = 1200
  2. Strip继续去除空白字符与残余标点
    Strip(96 )=96\text{Strip}(96\ ) = 96
  3. ParseInt把清理后的字符串解析为整数类型
    ParseInt("96")=96\text{ParseInt}(\text{"96"}) = 96
  4. f(x) 标准形态所有写法最终统一到同一整数
    f(1,200)=f(1200)=1200f(1{,}200) = f(1200) = 1200

结果比对:全对或全错,没有步骤分

批改对答案的时刻,老师翻开答案本:方框里的数和答案本一致,这道题就得分;不一致,就不得分。不存在“过程对了给半分”的温柔——不管草稿多么工整,最终答案错了就是错了。

GSM8K的评分也是同样的“全对或全错”哲学:把抽取出的答案与标准答案都做归一化,然后做精确匹配。匹配成功得1分,失败得0分。这种二值化评分的好处是:无歧义、可复现、适合大规模自动评测——任何人在任何时间运行同一套代码,都会得到同样的分数。

比较时使用归一化后的整数做相等判断,而不是原始字符串。这里的容错边界必须小心:只能容忍“书写形式不同”,不能容忍“数值不同”。比如96和95,归一化后依然是不相等的整数,必须判错。评测脚本的职责就是保证这一判断的确定性。

答案本不认花里胡哨的书写,只认数值本身——评测的严格性,正是公平性的另一面。全对或全错看似苛刻,却让每一次评分都经得起推敲。

match(g(a),g(a∗))=1[g(a)=g(a∗)]\displaystyle \text{match}\big(g(a), g(a^*)\big) = \mathbb{1}\big[g(a) = g(a^*)\big]
比对函数把两个候选数字分别归一化,再做相等判断:相等得1分,不等得0分。这保证了“比较的对象是数值,而不是字符串长相”。
  1. g(a)对抽取出的答案执行归一化
    g(a)=f(a)g(a) = f(a)
  2. g(a\*)对标准答案执行同样的归一化
    g(a∗)=f(a∗)g(a^*) = f(a^*)
  3. 数值相等判断比较归一化后的两个整数
    g(a)=g(a∗)g(a) = g(a^*)
  4. 计分结果条件成立记1分,不成立记0分
    match∈{0,1}\text{match} \in \{0, 1\}

错误分类:批错卷子的三种情况

再细心的老师也有批错的时候:要么根本没找到方框,要么看花了眼,要么学生真的算错了。老师复盘时,会把“我批错”和“学生做错”严格分开——批错是自己的问题,做错才是学生的水平问题。

评测中,当抽取答案与标准答案不一致,同样需要区分错误来源:抽取器没找到任何数字,属于抽取失败;找到了数字但格式差异没被归一化吞掉,属于格式误判;归一化之后数值依然不同,才是模型真正的计算错误。此外,标准答案本身的标注噪声也是一种不可忽视的特殊错误。

把错误率分解成几部分,有助于定位评测管道的问题。抽取失败率可以通过人工抽查估算;格式误判率可以通过扩展归一化规则来降低;计算错误才是衡量模型能力的真实信号。如果抽取失败和格式误判占比过高,说明是评测管道需要修缮,而不是模型能力差。

老师复盘时发现“看花眼”是自己批改流程的问题,下次就能改;评测者分类错误来源,才能让分数真正反映模型水平,而不是反映抽取器的缺陷。

P(wrong)=P(extract fail)+P(format)+P(calc)\displaystyle P(\text{wrong}) = P(\text{extract fail}) + P(\text{format}) + P(\text{calc})
一道题被判错的概率,可以拆成三部分:抽取器没找到、格式没归一、模型真算错。拆开来看,才知道该修管道还是该怪模型。
  1. P(wrong)单题被判错的概率,等于1减去准确率
    P(wrong)=1−AccP(\text{wrong}) = 1 - \text{Acc}
  2. P(extract fail)抽取器未能定位到任何答案候选
    a^=∅\hat{a} = \varnothing
  3. P(format)数值本相同但格式差异未归一导致的误判
    g(a)≠g(a∗) 但原始数值相等g(a) \ne g(a^*) \ \text{但原始数值相等}
  4. P(calc)归一化后数值依然不同,模型真实计算错误
    a≠a∗a \ne a^*

评测价值:一张有意义的成绩单

只有当批改足够公平时,成绩单才有意义。家长看成绩单,才能知道孩子哪块知识薄弱、该补什么;研究人员看GSM8K分数,才能判断模型的数学推理是进步还是退步。成绩单的公信力,建立在每一次批改的可靠性之上。

GSM8K在LLM评测体系中地位举足轻重:它是验证思维链(Chain-of-Thought)能力的核心基准之一,模型在测试集上的分数直接反映其多步推理与数值计算能力。而答案抽取作为评分管道的最后一环,决定了这些分数的真实性与可比性——抽取器抽错答案,模型再聪明也拿不到应得的分数。

抽取器的质量直接影响评测信号:同一份模型输出,用不同抽取器可能得出不同分数,甚至改变模型的相对排名。因此评测平台在公布分数时,通常会说明使用的抽取与比对规范,确保分数可复现。相比之下,两个模型之间的分数差 Δ 是更有价值的信号。

一份成绩单的价值,藏在每一次公平的批改里;一个模型的排名,建立在每一道题的可靠抽取之上。答案抽取看似只是小小的“圈数字”动作,却是整个LLM评测大厦最不容忽视的地基。

Δ=AccA−AccB\displaystyle \Delta = \text{Acc}_{A} - \text{Acc}_{B}
分数差等于模型A的准确率减去模型B的准确率。差值越大,说明A相对B的推理优势越明显;这个差值,正是评测信号的核心产出。
  1. Acc\_A模型A在GSM8K测试集上的准确率
    AccA=NANtotal\text{Acc}_A = \frac{N_A}{N_{\text{total}}}
  2. Acc\_B模型B在同样测试集上的准确率
    AccB=NBNtotal\text{Acc}_B = \frac{N_B}{N_{\text{total}}}
  3. 相减得到两个模型的能力差距
    Δ=AccA−AccB\Delta = \text{Acc}_A - \text{Acc}_B
  4. 信号解读Δ大于0表示A更强,数值即推理能力差距
    Δ>0⇒模型 A 推理更强\Delta > 0 \Rightarrow \text{模型 A 推理更强}

AI 应用场景

LLM评测平台的批量打分

阶段:模型评测

解决的问题:评测大模型数学推理能力时,人工阅读每条模型回复既耗时又标准不一。答案抽取器把“阅读长文本找答案”自动化:定位最终整数、归一化格式、与标准答案比对,秒级完成成百上千条评测,且评分标准完全一致。

具体案例:一家教育科技公司开发数学解题大模型,每次发版前自动跑GSM8K测试集。评测服务先让模型生成解答,再用抽取器提取最终答案并计分,最后生成报告对比新旧版本准确率,精准定位推理能力是否回退。

提示词工程的效果验证

阶段:模型调优

解决的问题:验证思维链(CoT)提示词是否真的提升了模型推理能力,需要一个稳定、可复现的答案抽取管道来对比前后分数。如果抽取规则变来变去,分数差异就无法归因于提示词本身的改进。

具体案例:研究员对比“直接作答”与“逐步思考”两种提示词策略,用同一套抽取器对同一批GSM8K题目打分,确认CoT带来的提升幅度,并据此优化提示词模板。

自动化回归测试流水线

阶段:模型发布

解决的问题:大模型发版最怕“能力回退”。把GSM8K评测嵌入CI/CD流水线,每次训练或微调后自动跑一遍评测,分数下跌立即告警,阻止劣化版本上线。

具体案例:MLOps团队把答案抽取器封装成评测服务,Git push触发评测任务,流水线自动完成“生成回复→抽取答案→比对计分→输出报告”全流程,准确率低于阈值时自动拦截发布。

Python 演示

python53 行
import re  def extract_answer(response_text):    """从模型回复中抽取最终答案整数"""    # 优先使用GSM8K的####分隔符    if '####' in response_text:        tail = response_text.split('####')[-1]    else:        tail = response_text    # 提取尾部所有整数,取最后一个作为答案    numbers = re.findall(r'\d+', tail)    if not numbers:        return None    return int(numbers[-1])  def normalize_int(raw):    """格式归一化:去掉非数字字符后解析为整数"""    if raw is None:        return None    cleaned = re.sub(r'[^0-9-]', '', str(raw))    if cleaned in ('', '-'):        return None    return int(cleaned)  def score_gsm8k(predictions, gold_answers):    """批量评测:抽取答案并与标准答案比对,返回准确率"""    if len(predictions) != len(gold_answers):        raise ValueError('预测与标准答案数量不一致')    correct = 0    for pred, gold in zip(predictions, gold_answers):        if extract_answer(pred) == normalize_int(gold):            correct += 1    return correct / len(gold_answers)  if __name__ == '__main__':    samples = [        ('小明有5个苹果,又买3个,共有几个?\n5+3=8\n#### 8', 8),        ('蛋糕3元一块,买4块多少钱?\n3×4=12\n答案是12元', 12),        ('队伍有15人,走了7人还剩几人?\n15-7=8,剩8人。', '8'),        ('每分钟走60米,走5分钟多远?\n60×5=300\n300米', 300),    ]    preds = [p for p, _ in samples]    golds = [g for _, g in samples]    acc = score_gsm8k(preds, golds)    print('评测样本数:', len(samples))    print('答案抽取准确率: {:.1%}'.format(acc))    for i, (p, g) in enumerate(samples):        print('样本{} 抽取={} 标准={}'.format(            i + 1, extract_answer(p), normalize_int(g)))
目的:实现一个完整的GSM8K答案抽取与评分管道——先用"####"分隔符和正则提取最终整数,再归一化格式,最后与标准答案比对计算准确率。
  1. if '####' in response_text:优先寻找数据集约定的“方框标记”,这是最可靠的第一策略
  2. tail = response_text.split('####')[-1]取分隔符后面的文本作为答案候选区
  3. numbers = re.findall(r'\d+', tail)用正则抓出候选区里的所有整数
  4. return int(numbers[-1])取最后一个整数作为最终答案,模拟“末尾数字”策略
  5. cleaned = re.sub(r'[^0-9-]', '', str(raw))归一化:删掉货币符号、逗号、量词等所有非数字装饰
  6. if extract_answer(pred) == normalize_int(gold):抽取结果与归一化后的标准答案做数值比对,相等即得分

常见误区

误区“GSM8K的答案都是整数,直接把模型输出里的最后一个数字抠出来不就行了吗?简单省事,还要什么抽取器?”

正解末位数字只是兜底策略,不是首选。模型的推理过程中常有中间结果,比如“先算出8,再算总数96”,如果中间结果恰好写在靠后位置,末位策略就会抓错。可靠的抽取器按优先级使用"####"标记截断、关键词定位,最后才用末位数字兜底。

为何常见:因为GSM8K标准答案确实是整数且常在末尾,简单启发式在不少样本上碰巧正确,容易让人误以为“够用了”。

误区“规则抽取太笨了,遇到千奇百怪的输出就瞎。不如让GPT来抽取和判断,大模型更懂自然语言。”

正解评测信号的首要要求是确定与可复现。规则抽取器是确定性函数:同一输入永远产生同一输出,零成本、无延迟。而用大模型抽取存在采样随机性、推理开销,还可能引入新的错误,会让评测结果不稳定。GSM8K的标准做法依然以规则抽取为主。

为何常见:LLM-as-a-judge在开放式评测中确实有用,容易让人把所有场景都套用这个方法。

误区“抽取出来是'1,200',标准答案是'1200',字符串都不一样,当然算错。”

正解这正是格式归一化要解决的问题:先去除逗号、货币符号、量词、空白等装饰,再解析为整数,之后做数值相等判断。“1,200“和”1200”归一化后是同一个整数1200,应判定正确。只有归一化后数值依然不同,才是真正的计算错误。

为何常见:人眼直接看字符串觉得“长得不一样”,忽略了数值比较需要先经过归一化这一步。

误区“GSM8K的标注格式固定是'#### 答案',那我看到'####'就截取后面内容,完事了。”

正解模型的实际输出可不会规规矩矩带“####“。很多模型直接用自然语言作答:”所以答案是96“,或把答案写在最后一行。只认”####“的抽取器会大面积漏抽。可靠的抽取器需要一条回退链:####标记 → 关键词(”答案是”“最终结果”)→ 末位数字。

为何常见:把数据集的构造格式误当成了模型的输出格式——这是新手最容易犯的认知错位。

误区“反正就一个数字,用什么策略抽都差不多,准确率最多差零点几个百分点。”

正解在困难样本上,策略差异会被放大:末尾出现中间结果、多答案并存、夹杂格式噪声时,不同策略可能抽出完全不同的数。实际评测中,不同抽取器对同一批模型输出的评分可能相差几个百分点,甚至改变模型间的相对排名。

为何常见:简单样本上所有策略都答对,看平均结果时掩盖了边界情况的差异,让人低估了抽取器的重要性。

面试题

Q1. GSM8K答案抽取的核心任务是?

单选题 · easy

  • A.提取回复中的全部数字
  • B.提取唯一整数最终答案← 正确答案
  • C.提取最长的推理算式
  • D.提取模型的语言风格

答案:B。抽取的核心是把模型的整段回复压缩成一个最终整数答案,方便与标准答案比对。提取全部数字会混入中间结果;提取算式或语言风格都偏离了评分目标。就像批卷只认方框里的数,不认草稿上的每一步。

Q2. GSM8K标准答案在数据集中常以什么符号标记?

单选题 · easy

  • A.用冒号标记答案
  • B.用####标记答案← 正确答案
  • C.用等号标记答案
  • D.用斜杠标记答案

答案:B。GSM8K数据集构造时,标准答案前统一放置"####"分隔符,相当于试卷上的方框线。冒号、等号、斜杠都不是数据集约定的标记,据此截取答案会抓错位置。

Q3. 模型输出“结果是12元”而标准答案是12,正确做法是?

单选题 · mid

  • A.先直接丢弃文本
  • B.提取数字并归一化← 正确答案
  • C.统计一下字符长度
  • D.转换成小数再比较

答案:B。“结果是12元”和标准答案12数值相同,只是多了量词。正确流程是先提取数字12再做归一化。直接丢文本拿不到分;数长度和转小数都偏离了题目目标。批卷时要把“12元”读成"12"再对答案本。

Q4. 为什么“末位数字”只能当兜底策略?

单选题 · mid

  • A.末位数字通常不是整数
  • B.可能抓到推理的中间结果← 正确答案
  • C.末位数字无法用正则提取
  • D.标准答案总会在开头

答案:B。推理过程中常有中间数字,比如先算出8再算出96,若中间结果写在靠后位置,末位策略就会抓错。所以末位数字只能兜底。标准答案总在开头、末位不是整数、无法用正则都是错误印象。

Q5. GSM8K格式归一化通常包括哪些处理?

多选题 · mid

  • A.去除文本空白与标点← 正确答案
  • B.去除货币符号与量词← 正确答案
  • C.合并千位分隔的逗号← 正确答案
  • D.统一转换为浮点小数

答案:ABC。归一化就是把不同书写形式映射到同一数值:去空白标点、删货币符号、合并千位逗号都是标准步骤。转换成浮点会改变整数性质,GSM8K答案都是整数,无需转浮点,且可能引入精度噪声。

Q6. 抽取结果为"1,200",标准答案为1200,正确判定是?

单选题 · hard

  • A.直接判定该题错误
  • B.归一化后数值精确匹配← 正确答案
  • C.随机给分避免偏见
  • D.跳过该题不参与计分

答案:B。“1,200“和”1200”数值相同,只是千位分隔写法不同,归一化后精确匹配应判定正确。直接判错、随机给分、跳过题目都会破坏评测的确定性,也无法反映模型的真实能力。

Q7. 以下哪个不是模型被判错的原因?

单选题 · mid

  • A.模型推理计算出错
  • B.抽取器漏抽了答案
  • C.格式差异未做归一
  • D.数据集含有拼音错误← 正确答案

答案:D。模型被判错的原因包括计算错误、抽取失败和格式误判,这些都属于评测链路中的问题。而数据集中的拼音错误不在标准答案的考察范围内,标准答案经人工校验,与抽取逻辑无关。

Q8. 下列哪些属于答案抽取的错误来源?

多选题 · hard

  • A.抽取器抓取了中间结果← 正确答案
  • B.归一化规则覆盖不足← 正确答案
  • C.标准答案本身标注噪声← 正确答案
  • D.模型参数规模过小

答案:ABC。抽取错误来源包括抓取中间结果、归一化规则覆盖不足、标准答案标注噪声。模型参数量太小属于模型能力问题,不是“抽取环节”的错误来源。诊断评测异常时,要先把“评测管道问题”与“模型能力问题”分开。

Q9. GSM8K评测中一道题得1分的条件是?

单选题 · easy

  • A.推理步骤全部写对
  • B.最终整数与标准一致← 正确答案
  • C.输出包含完整算式
  • D.回复长度超过百字

答案:B。GSM8K评分只看最终答案整数是否与标准答案一致,不做步骤分。推理步骤全对但答案写错仍不得分;只输出算式、长度达标都不是评分条件。这就是“全对或全错”的二值评分。

Q10. 在评测流水线中,答案抽取扮演的角色包括?

多选题 · hard

  • A.把模型回复转为可比答案← 正确答案
  • B.保证评分确定且可复现← 正确答案
  • C.消除格式差异的干扰← 正确答案
  • D.直接生成新的标准答案

答案:ABC。抽取器把模型回复转成可比的答案,通过归一化和精确匹配保证评分确定、可复现,并消除格式差异干扰。而生成标准答案是数据标注环节的工作,不是抽取器的职责。