CodexQA

Industry & PracticeTools & Frameworks

Inspect 评分政策:答错计入分母,出错和未评分不计入

CodexQA 团队7 min read

Inspect 把一道样本分成裁决、评分错误和未评分。一个对、一个错、一次报错、一次无法解析的评判,在运行继续时准确率是 0.5。score_on_error 若把中途失败的部分状态评成错误,分母变成 3,准确率是 1/3。

In this piece

Inspect 评分政策:答错、出错和未评分怎样进入分母

本文说明 Inspect 的评分器在一道样本上可以记下三种结果:给模型一个裁决、抛出错误,或返回未评分。这三种结果进入指标分母的方式不同。Inspect 是英国人工智能安全研究所的评测框架。评分器(scorer)把模型在一道样本上的行为收成一个裁决。本文依据文档《Scoring Policy》,许可证为 MIT。

版权声明按 MIT 许可证保留:Copyright (c) 2024 UK AI Security Institute。

###### 概述

评分器的工作,是把模型在一道样本上做了什么,变成关于模型在该任务上能力的一个裁决。Inspect 再把这些裁决汇总成概括这次评测的指标。被测模型(MUT,model under test,正在接受评测的那个模型)给出一个答案,评分器判断它对或不对,这个裁决计入结果。

模型可以因答错而失败,也可以因输出不符合所要求的格式而失败。运行机器本身也会坏:一次 API 错误、一个死掉的容器、评分代码里的一个缺陷。若用到评判模型或其他测量仪器,仪器本身也可能给不出一个读数。评判模型是测量仪器的一部分;它的输出决定被评测的回答是否得到一个裁决。

这些结果对指标分母的影响不同。下面的例子说明 Inspect 怎样汇总它们。

三种结果

评分器有三种方式记录一道样本上发生了什么,每一种走向不同的后续处理:

  • 返回一个带有对模型之裁决的 Score。它计入所得指标的分母。
  • 评分失败时抛出错误。异常记在 sample.error 里,失败的评分器不产生分数。运行的 retry_on_error 和 fail_on_error 设置控制样本重试和失败阈值。
  • 评分器无法给出裁决时返回 Score.unscored()。这会建立一个值为 NaN 的分数,并保留 reason 和 explanation。该值被排除在指标之外。未评分的计数在轮次归约之后计算。轮次(epoch)是同一道样本重复跑的一次。

评分器也可以返回 None。这样不会留下分数条目,也不会增加 unscored_samples。样本不在评分器范围内时怎么处理,见 Custom Scorers。

以准确率为例:一次运行里有一个正确答案、一个错误答案、一次评分错误,以及一个无法解析的评判裁决。只要运行在错误之后继续,报告的准确率就是 0.5。这个例子用一个评分器,每个样本一个轮次:

样本评分器结果值是否计入分母
1Score(value=CORRECT)1.0是
2Score(value=INCORRECT)0.0是
3raisen/a否(出错)
4Score.unscored()NaN否(未评分)

只有样本 1 和 2 被评分,所以准确率 = 1 / 2 = 0.5,scored_samples = 2,unscored_samples = 1。出错的样本另行记在 sample.error。

有多个评分器时,每个评分器完成时分数都会保留。若一个评分器成功之后另一个抛出错误,较早的分数与 sample.error 并存;若运行继续,它计入自己那个评分器的指标。

运行选项 score_on_error 允许在求解期间抛出的错误之后仍然评分:它在已经到达的部分状态上运行评分器,并计入结果。若样本 3 在求解中途出错,其部分状态被评为 INCORRECT,它就会进入分母,准确率读成 1 / 3。求解器的错误仍记在 sample.error。

怎样读一个结果

分数的值、reason、explanation 和样本错误描述评分期间发生了什么:

记录下的结果含义
已评分的裁决评分器给被评测的回答赋了一个值
评分错误评分遇到执行失败或无效输入
未评分结果评分器没有得到裁决

下面各节分别说明每种结果,以及 Inspect 记录的细节。

对模型的裁决

错误答案留在分母里。这包括不符合所要求格式的输出:当期望的答案模式不存在时,pattern() 和 answer() 返回 INCORRECT,reason="invalid_response_format";当输出里根本没有可读答案时,math() 同样如此;当原始完成是空的时,文本评分器记录 reason="no_response"。抽取规则要和任务里要求的答案格式一致。

Inspect 为错误或缺失的答案提供两个标签。两者默认都映射到 0.0,并且都留在分母里:

  • INCORRECT:模型给出的答案是错的或不能用的,包括格式失败或没有遵循指示。
  • NOANSWER:模型没有给出可以评分的东西,例如空的完成,或被检测到的拒绝。检测和贴标签取决于评分器。

默认的均值轮次归约器在指标运行之前把 NOANSWER 转成 0.0,从而抹掉这个标签。要把 NOANSWER 和 INCORRECT 分开的指标,需要保留这些标签的分数。见 Reducing Epochs。

故障

评分期间的异常记成样本错误。失败可以是暂时的,也可以需要改代码、输入或环境:

  • 暂时的:一次 API 错误、一次网络中断、一个死掉的容器。重试可能成功,retry_on_error 会启用样本重试。
  • 缺陷:求解器或评分器里的缺陷、坏掉的环境、缺失或无法使用的参考答案。例如,choice() 对没有选项的样本抛出错误,math() 在没有任何参考答案可以解析时抛出错误。

异常把样本送进 Inspect 的错误处理机器。错误细节记在 sample.error。retry_on_error、fail_on_error 和 score_on_error 见 Handling Errors。

无法评分的样本

评分器可以跑完却得不到裁决。例如,评判模型返回的输出里,评分器抽不出一个等级。内置的模型评判器把这记成 Score.unscored(reason="grader_failed")。

Score.unscored() 产生一个值为 NaN 的 Score,Inspect 把它排除在指标计算之外。分数条目保留 reason 和 explanation,对内置模型评判器还包括评判器的输出。API 细节见 Unscored Samples,轮次归约之后的计数见 Interpreting coverage。

归因:是谁的输出失败了

无法解析的回答来自哪里,决定评分器怎么处理它:

  • 模型的输出:pattern() 和 answer() 这类抽取评分器,在所需答案模式不存在时返回 INCORRECT。
  • 评判器的输出:内置模型评判器在裁决无法解析时返回未评分结果。

分数的 reason 和 explanation 标明这次失败。例如,pattern 分数上的 invalid_response_format 描述的是被评测的回答,而模型评分分数上的 grader_failed 描述的是评分尝试。

由模型评分的评分器

当一个模型给被测模型打分时,评判器就是测量仪器。Inspect 的内置模型评判器对每个评判器做一次评分请求。无法解析的裁决产生 Score.unscored(reason="grader_failed"),不会自动重试裁决。

评分指示规定期望的裁决格式,grade_pattern 控制评分器如何抽取它。自定义指示时,所用的等级模式要和该格式匹配。配置见 Model Grading,生成设置见 Reproducible Grading。

评判器的 API 请求遵循模型的重试策略。传播到评分器的 API 异常变成评分错误。评测的 retry_on_error 设置可以重跑整个样本,包括被评测模型的生成。未评分结果是正常完成评分,不会触发样本重试。

记录原因

分数条目可以包含一段人能读的 explanation,以及一个机器能读的 reason。reason 出现在日志和分析数据框里,列名是 score_<name>_reason。

reason 是 Score 上的专用字段,类型为 ScoreReason | str | None,与 metadata 分开存放。它是可选的:缺少 reason 并不说明评分成功。各轮次的 reason 不同时,轮次归约会丢掉它们;原来的 reason 仍留在各个轮次的分数里。

ScoreReason 是一套标准的、IDE 可以发现的词表,使失败可以跨评测分组。该字段也接受任意自定义字符串:

reason行为者含义
invalid_response_format被测模型输出无法解析,或违反所要求的格式
refusal被测模型检测到拒绝回答
no_response被测模型空的完成
grader_failed评判器评判器给不出可用的裁决
scoring_failed评分器评分器给不出结果

这套词表按行为者区分失败:被测模型的失败用 invalid_response_format、refusal 或 no_response;评判器的失败用 grader_failed;其他评分器失败用 scoring_failed。更细的细节可以放在 explanation 或评分器自己的 metadata 里。

运行设置

样本的结果由评分器决定;Inspect 如何处理样本错误,由运行配置决定。

  • fail_on_error 控制失败阈值。默认(True)在第一个错误时中止运行。数值设定一个容忍度,False 则不论样本错误都让运行继续。
  • retry_on_error 为样本错误启用重试。每次重试可以重跑求解和评分。
  • score_on_error 在求解器出错之后,允许在部分状态上评分。

配置细节见 Handling Errors。

怎样读覆盖

计数记在每个 EvalScore 上,字段是 scored_samples 和 unscored_samples。出错的样本通过 sample.error 按样本可见。这些计数描述的是指标的输入,在适用时是轮次归约之后的输入。

用默认的均值归约器时,一个样本若有一个正确轮次和一个未评分轮次,归约成 1.0,于是 scored_samples=1,unscored_samples=0。其他归约器对未评分值的处理可以不同。见 Reducing Epochs。

各个轮次的分数保留原来的未评分结果。缺少分数条目,包括评分器返回 None,不会增加未评分计数。有多个评分器时,每个评分器的指标结果有自己的计数。

参见

  • Custom Scorers:编写评分器,以及 Score、Value 和 Target 类型。
  • Model Grading:内置的模型评分器,以及如何自定义。
  • Scoring Metrics:指标、轮次归约器和自定义指标。
  • Handling Errors:运行层面的 retry_on_error、fail_on_error 和 score_on_error。

出处:UK AI Security Institute,Scoring Policy,https://inspect.aisi.org.uk/scoring-policy.html,MIT License,Copyright (c) 2024 UK AI Security Institute。

Found it useful? Pass it on

WeChat

Scan with WeChat to open it on your phone and forward it.

Subscribe via RSS

Submit a correction