CodexQA

行业与实践工具与框架

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

CodexQA 团队阅读约 7 分钟

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

本文目录

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。

觉得有用,转给同事

微信扫码

用微信扫一扫,在手机上打开后即可转发。

用 RSS 订阅

提交勘误