跳到主要内容

⚙️ 系统化测试变更

在进行使用了 GPT 模型的系统改进时,例如引入新指令或新设计,有时很难判断这些改变是使系统变得更好还是更差。通过观察少量样本可能会有所启示,但在小样本情况下,很难区分真正的改进和随机运气。评估程序(或称为“evals”)可以帮助优化系统设计,确保改进措施的有效性。

好的评估程序应具备以下特点:

  1. 具有代表性:评估程序应反映真实世界的使用情况,或至少具有多样性。
  2. 包含多个测试用例:增加测试用例可以提高统计效力,从而更准确地评估改进措施的效果。
  3. 易于自动化或重复:评估程序应便于自动化执行或重复进行,以便在不同阶段对系统进行持续评估。

输出评估可以由计算机、人类或两者混合完成。计算机可以使用客观标准(如只有一个正确答案的问题)以及一些主观或模糊标准进行自动评估。例如,OpenAI Evals是一个开源软件框架,提供了创建自动评估的工具,可以帮助用户根据特定标准对模型输出进行评估。

将模型输出与标准答案进行对比评估

在某些情况下,我们可以通过将模型输出与已知的标准答案进行对比,来评估模型的表现。例如,如果已知问题的正确答案应包含一组特定的已知事实,我们可以使用模型查询来计算答案中包含了多少必需的事实。这种方法可以帮助我们更准确地评估模型在处理特定问题时的表现。

这里我们举个例子,这是一个满足全部条件的示例输入,提示语:

你将得到由三个引号分隔的文本,这应是对一个问题的答案。请检查以下信息是否直接包含在答案中:

- 尼尔·阿姆斯特朗是第一个登月的人。
- 尼尔·阿姆斯特朗第一次登月的日期是1969年7月21日。

对于每一个信息,请执行以下步骤:

1 - 重新陈述该信息。
2 - 从答案中引用最接近此信息的内容。
3 - 考虑一下,如果一个不了解这个主题的人读了这个引用,他是否能直接推断出这个信息。在做出决定之前,解释为什么可以或者为什么不可以。
4 - 如果第3步的答案是肯定的,那么写“是”,否则写“否”。

最后,计算出有多少个“是”的答案。将这个计数以{"计数": <插入计数> }的形式提供。

文本:
"""尼尔·阿姆斯特朗因为成为首位登上月球的人类而闻名于世。这一历史性的事件发生在1969年7月21日,阿波罗11号任务期间。"""
信息

这里的文本即是模型的输出,我们这里仅展示了对模型输出的评估。

小语 4.0 回复:

1 - 重新陈述该信息:
尼尔·阿姆斯特朗是第一个登上月球的人。

2 - 从答案中引用最接近此信息的内容:
"尼尔·阿姆斯特朗因为成为首位登上月球的人类而闻名于世。"

3 - 考虑一下,如果一个不了解这个主题的人读了这个引用,他是否能直接推断出这个信息。在做出决定之前,解释为什么可以或者为什么不可以。
可以。因为引用中明确提到了尼尔·阿姆斯特朗是第一个登上月球的人类。

4 - 如果第3步的答案是肯定的,那么写“是”,否则写“否”。
是。

1 - 重新陈述该信息:
尼尔·阿姆斯特朗在1969年7月21日第一次登月。

2 - 从答案中引用最接近此信息的内容:
"这一历史性的事件发生在1969年7月21日,阿波罗11号任务期间。"

3 - 考虑一下,如果一个不了解这个主题的人读了这个引用,他是否能直接推断出这个信息。在做出决定之前,解释为什么可以或者为什么不可以。
可以。因为引用中明确提到了这一历史性事件发生在1969年7月21日,阿波罗11号任务期间。

4 - 如果第3步的答案是肯定的,那么写“是”,否则写“否”。
是。

最后,计算出有多少个“是”的答案。将这个计数以{"计数": <插入计数> }的形式提供。
{"计数": 2}

小语GPT模型与标准答案评估示例

这是一个只满足一个条件的示例输入,提示语:

你将得到由三个引号分隔的文本,这应是对一个问题的答案。请检查以下信息是否直接包含在答案中:

- 尼尔·阿姆斯特朗是第一个登月的人。
- 尼尔·阿姆斯特朗第一次登月的日期是1969年7月21日。

对于每一个信息,请执行以下步骤:

1 - 重新陈述该信息。
2 - 从答案中引用最接近此信息的内容。
3 - 考虑一下,如果一个不了解这个主题的人读了这个引用,他是否能直接推断出这个信息。在做出决定之前,解释为什么可以或者为什么不可以。
4 - 如果第3步的答案是肯定的,那么写“是”,否则写“否”。

最后,计算出有多少个“是”的答案。将这个计数以{"计数": <插入计数> }的形式提供。

文本:
"""尼尔·阿姆斯特朗从登月舱走出来,成为第一个在月球上行走的人,创造了历史。"""

小语 4.0 回复:

1 - 重新陈述该信息:
- 尼尔·阿姆斯特朗是第一个在月球上行走的人。
- 尼尔·阿姆斯特朗登月的具体日期未提及。

2 - 从答案中引用最接近此信息的内容:
- "尼尔·阿姆斯特朗从登月舱走出来,成为第一个在月球上行走的人,创造了历史。"

3 - 考虑一下,如果一个不了解这个主题的人读了这个引用,他是否能直接推断出这个信息。
- 对于第一个信息,可以直接推断出尼尔·阿姆斯特朗是第一个在月球上行走的人,因为引用中明确提到了这一点。
- 对于第二个信息,无法从引用中推断出尼尔·阿姆斯特朗登月的具体日期,因为引用中没有提到日期。

4 - 结果:
- 是
- 否

{"计数": 1}

这是一个没有满足条件的示例输入,提示语:

你将得到由三个引号分隔的文本,这应是对一个问题的答案。请检查以下信息是否直接包含在答案中:

- 尼尔·阿姆斯特朗是第一个登月的人。
- 尼尔·阿姆斯特朗第一次登月的日期是1969年7月21日。

对于每一个信息,请执行以下步骤:

1 - 重新陈述该信息。
2 - 从答案中引用最接近此信息的内容。
3 - 考虑一下,如果一个不了解这个主题的人读了这个引用,他是否能直接推断出这个信息。在做出决定之前,解释为什么可以或者为什么不可以。
4 - 如果第3步的答案是肯定的,那么写“是”,否则写“否”。

最后,计算出有多少个“是”的答案。将这个计数以{"计数": <插入计数> }的形式提供。

文本:
"""在69年的夏天,一次伟大的航行,阿波罗11号,如传说中的勇士一般。尼尔·阿姆斯特朗成为了继巴兹·奥尔德林之后的第二个在月球上行走的人。"""

小语 4.0 回复:

1 - 重新陈述该信息:尼尔·阿姆斯特朗是第一个登月的人。
2 - 从答案中引用最接近此信息的内容:“尼尔·阿姆斯特朗成为了继巴兹·奥尔德林之后的第二个在月球上行走的人。”
3 - 考虑一下,如果一个不了解这个主题的人读了这个引用,他是否能直接推断出这个信息。在做出决定之前,解释为什么可以或者为什么不可以:不可以,因为文本中提到尼尔·阿姆斯特朗是在巴兹·奥尔德林之后的第二个在月球上行走的人,而不是第一个。
4 - 如果第3步的答案是肯定的,那么写“是”,否则写“否”:否。

1 - 重新陈述该信息:尼尔·阿姆斯特朗第一次登月的日期是1969年7月21日。
2 - 从答案中引用最接近此信息的内容:“在69年的夏天,一次伟大的航行,阿波罗11号,如传说中的勇士一般。”
3 - 考虑一下,如果一个不了解这个主题的人读了这个引用,他是否能直接推断出这个信息。在做出决定之前,解释为什么可以或者为什么不可以:不可以,因为文本中只提到了1969年夏天,而没有具体到7月21日。
4 - 如果第3步的答案是肯定的,那么写“是”,否则写“否”:否。

最后,计算出有多少个“是”的答案。将这个计数以{"计数": <插入计数> }的形式提供。

{"计数": 0}

小语GPT模型与标准答案评估示例

跟踪模型输出与标准答案的重叠类型以及是否矛盾

此外,除了上述将模型输出与标准答案进行对比评估。还可以使用例如跟踪候选答案与标准答案之间的重叠类型,以及候选答案是否与标准答案的任何部分相矛盾。这种评估方法可以帮助我们更全面地了解模型在处理各种问题时的表现,从而为进一步优化模型提供有价值的参考。

以下是一个例子,其中的答案虽然不够理想,但却并未与专家答案产生矛盾,提示语:

请按照以下步骤处理用户的输入。在进行下一步前,请详细复述每个步骤,例如:“步骤1:逐步推理...”。

步骤1:逐步推理提交的答案与专家答案中的信息是否为以下几种情况之一:不相交、完全相等、是子集(即提交的答案信息比专家答案少)、是超集(即提交的答案信息比专家答案多),或有部分交集(即有一些交集,但并非子集或超集)。

步骤2:逐步推理提交的答案是否与专家答案的任何部分产生矛盾。

步骤3:输出一个结构如下的JSON对象:{"重叠类型": "不相交" 或 "完全相等" 或 "是子集" 或 "是超集" 或 "有部分交集", "矛盾": "真" 或 "假"}。

用户输入:
"""
问题:“尼尔·阿姆斯特朗最为人所知的事件是什么?它在什么时候发生的?假设使用UTC时间。”

提交的答案:“他不是在月球上行走过吗?”

专家的答案:“尼尔·阿姆斯特朗最为人所知的是他成为第一个在月球上行走的人。这个历史性的事件发生在1969年7月21日。”
"""

小语 4.0 回复:

步骤1:逐步推理提交的答案与专家答案中的信息是否为以下几种情况之一:不相交、完全相等、是子集(即提交的答案信息比专家答案少)、是超集(即提交的答案信息比专家答案多),或有部分交集(即有一些交集,但并非子集或超集)。

在这个例子中,提交的答案与专家答案有部分交集。提交的答案提到了尼尔·阿姆斯特朗在月球上行走,而专家答案也提到了这一点。但是,提交的答案没有提到具体的日期,而专家答案提供了详细的日期。

步骤2:逐步推理提交的答案是否与专家答案的任何部分产生矛盾。

在这个例子中,提交的答案与专家答案没有产生矛盾。

步骤3:输出一个结构如下的JSON对象:{"重叠类型": "不相交" 或 "完全相等" 或 "是子集" 或 "是超集" 或 "有部分交集", "矛盾": "真" 或 "假"}。

在这个例子中,输出的JSON对象为:{"重叠类型": "有部分交集", "矛盾": "假"}。

小语GPT模型与标准答案评估示例

这是一个带有答案的示例输入,直接与专家答案相矛盾,提示语:

请按照以下步骤处理用户的输入。在进行下一步前,请详细复述每个步骤,例如:“步骤1:逐步推理...”。

步骤1:逐步推理提交的答案与专家答案中的信息是否为以下几种情况之一:不相交、完全相等、是子集(即提交的答案信息比专家答案少)、是超集(即提交的答案信息比专家答案多),或有部分交集(即有一些交集,但并非子集或超集)。

步骤2:逐步推理提交的答案是否与专家答案的任何部分产生矛盾。

步骤3:输出一个结构如下的JSON对象:{"重叠类型": "不相交" 或 "完全相等" 或 "是子集" 或 "是超集" 或 "有部分交集", "矛盾": "真" 或 "假"}。

用户输入:
"""
问题:“尼尔·阿姆斯特朗最为人所知的事件是什么?它在什么时候发生的?假设使用UTC 时间。”

提交的答案:“1969年7月21日,尼尔·阿姆斯特朗成为了继巴兹·奥尔德林之后的第二个在月球上行走的人。”

专家的答案:“尼尔·阿姆斯特朗最为人所知的是他成为第一个在月球上行走的人。这个历史性的事件发生在1969年7月21日。”
"""

小语 4.0 回复:

步骤1:逐步推理提交的答案与专家答案的关系。在这个例子中,提交的答案与专家答案有部分交集。因为它们都提到了尼尔·阿姆斯特朗在月球上行走的事件和发生的时间,但提交的答案错误地将尼尔·阿姆斯特朗描述为第二个在月球上行走的人。

步骤2:逐步推理提交的答案是否与专家答案的任何部分产生矛盾。在这个例子中,提交的答案与专家答案产生了矛盾,因为它错误地将尼尔·阿姆斯特朗描述为第二个在月球上行走的人,而专家答案指出他是第一个。

步骤3:输出一个结构如下的JSON对象:{"重叠类型": "有部分交集", "矛盾": "真"}。

小语GPT模型与标准答案评估示例

这是一个示例输入,其中的答案是正确的,但提供的详细信息稍微超出了必要范围,提示语:

请按照以下步骤处理用户的输入。在进行下一步前,请详细复述每个步骤,例如:“步骤1:逐步推理...”。

步骤1:逐步推理提交的答案与专家答案中的信息是否为以下几种情况之一:不相交、完全相等、是子集(即提交的答案信息比专家答案少)、是超集(即提交的答案信息比专家答案多),或有部分交集(即有一些交集,但并非子集或超集)。

步骤2:逐步推理提交的答案是否与专家答案的任何部分产生矛盾。

步骤3:输出一个结构如下的JSON对象:{"重叠类型": "不相交" 或 "完全相等" 或 "是子集" 或 "是超集" 或 "有部分交集", "矛盾": "真" 或 "假"}。

用户输入:
"""
问题:“尼尔·阿姆斯特朗最为人所知的事件是什么?它在什么时候发生的?假设使用UTC时间。”

提交的答案:“1969年7月21日,约在02:56UTC时间,尼尔·阿姆斯特朗成为第一个踏上月球表面的人类,这标志着人类历史上的一个重大成就。”

专家的答案:“尼尔·阿姆斯特朗最为人所知的是他成为第一个在月球上行走的人。这个历史性的事件发生在1969年7月21日。”
"""

小语 4.0 回复:

步骤1:逐步推理提交的答案与专家答案中的信息情况为:是超集(即提交的答案信息比专家答案多)。

步骤2:逐步推理提交的答案与专家答案的任何部分没有产生矛盾。

步骤3:输出一个结构如下的JSON对象:{"重叠类型": "是超集", "矛盾": "假"}。

小语GPT模型与标准答案评估示例