护栏评估#

NeMo Guardrails 包含一套工具,可用于评估不同类型的护栏。在当前版本中,这些工具分别测试每种护栏的性能。您可以通过 nemoguardrails CLI 使用这些评估工具。将为每种护栏提供示例。

同时,我们提供了护栏在与当前任务相关的公共数据集上的初步性能结果。

对话护栏#

目标和用法#

对话护栏评估专注于 NeMo Guardrails 使用规范形式和对话流程引导对话的核心机制。有关此核心功能的更多详细信息在此处进行了解释:此处

因此,在使用对话护栏评估时,我们正在评估以下方面的性能:

  1. 用户规范形式(意图)生成。

  2. 下一步生成 - 在当前方法中,我们仅评估机器人规范形式作为流程中下一步的性能。

  3. 机器人消息生成。

评估对话护栏的 CLI 命令是

nemoguardrails evaluate topical --config=<rails_app_path> --verbose

对话护栏评估具有以下 CLI 参数

  • config:要评估的护栏应用程序。

  • verbose:护栏应用程序是否应在详细模式下运行。

  • test-percentage:用于作为测试集的意图样本百分比。

  • max-tests-intent:测试时使用的每个意图的最大测试样本数(对于不平衡数据集,有助于获得平衡的测试数据)。如果值为 0,则不使用此参数。

  • max-samples-intent:向量数据库中使用的每个意图的最大样本数。如果值为 0,则使用测试集中所有未包含的样本。

  • results-frequency:如果我们要打印当前评估的中间结果,这就是步长。

  • sim-threshold:如果大于 0,对于没有精确匹配的意图,选择高于此阈值的最相似意图。

  • random-seed:评估使用的随机种子。

  • output-dir:预测输出目录。

评估结果#

对于对话护栏的初步评估实验,我们使用了两个用于会话 NLU 的数据集

通过为每个意图定义规范形式、特定对话流程甚至机器人消息(仅针对闲聊数据集),将这些数据集转换为 NeMo Guardrails 应用程序。这两个数据集具有大量的用户意图,因此适用于对话护栏。其中一个非常通用且意图粒度较高(闲聊),而银行数据集则是特定领域且粒度更细。有关运行对话护栏评估实验和评估数据集的更多详细信息,请参见此处

初步评估结果如下所示。在所有实验中,我们都选择使用平衡的测试集,每个意图最多包含 3 个样本。对于这两个数据集,我们评估了各种 LLM 的性能,以及向量数据库中每个意图索引的样本数量(k = all, 3, 1)。

请注意,LLM 的性能在很大程度上取决于 prompt,特别是由于 Guardrails 使用的 prompt 更为复杂。因此,目前我们仅发布 OpenAI 模型的评估结果,更多结果将在后续版本中提供。所有结果均为初步结果,更好的 prompting 可以改进它们。

从评估结果中吸取的重要经验

  • Guardrails 使用的三步法(用户意图、下一步/机器人意图、机器人消息)中的每一步都能带来性能提升。

  • 对于每个用户意图(规范形式),向量数据库中至少有 k=3 个样本对于实现良好性能非常重要。

  • 一些模型(例如 gpt-3.5-turbo)即使使用 Guardrails 的 few-shot prompting,也会产生更广泛的规范形式。在这些情况下,为用户意图添加相似度匹配而非精确匹配会很有用。此时,相似度阈值成为重要的推理参数。

  • 初步结果表明,即使是小型模型,例如 dolly-v2-3bvicuna-7b-v1.3mpt-7b-instructfalcon-7b-instruct 在主题护栏方面也具有良好的性能。

  • 对于 text-davinci-003 模型,在大多数情况下,对主题护栏使用单次调用显示的结果与默认方法(使用最多 3 次 LLM 调用生成最终机器人消息)相似。

  • 初步实验表明,与使用较长 prompts 相比,在这两个数据集上使用紧凑型 prompts 具有相似甚至更好的性能。

评估日期 - 2023 年 6 月 21 日。2023 年 7 月 24 日更新了 Dolly、Vicuna 和 Mosaic MPT 模型的数据。2024 年 3 月 13 日更新了 gemini-1.0-protext-bison 的数据。

数据集

# 意图

# 测试样本

闲聊

76

226

银行

77

231

闲聊数据集上的结果,使用的指标是准确率。

模型

用户意图, 相似度

用户意图,相似度=0.6

机器人意图, 相似度

机器人意图,相似度=0.6

机器人消息, 相似度

机器人消息,相似度=0.6

gpt-3.5-turbo-instruct, k=all

0.88

不适用

0.88

不适用

0.88

不适用

gpt-3.5-turbo-instruct, 单次 调用

0.90

不适用

0.91

不适用

0.91

不适用

gpt-3.5-turbo-instruct, 紧凑

0.89

不适用

0.89

不适用

0.90

不适用

gpt-3.5-turbo, k=all

0.44

0.56

0.50

0.61

0.54

0.65

text-davinci-003, k=all

0.89

0.89

0.90

0.90

0.91

0.91

text-davinci-003, k=all, 单次 调用

0.89

不适用

0.91

不适用

0.91

不适用

text-davinci-003, k=all, 紧凑

0.90

不适用

0.91

不适用

0.91

不适用

text-davinci-003, k=3

0.82

不适用

0.85

不适用

不适用

不适用

text-davinci-003, k=1

0.65

不适用

0.73

不适用

不适用

不适用

llama2-13b-chat, k=all

0.87

不适用

0.88

不适用

0.89

不适用

dolly-v2-3b, k=all

0.80

0.82

0.81

0.83

0.81

0.83

vicuna-7b-v1.3, k=all

0.62

0.75

0.69

0.77

0.71

0.79

mpt-7b-instruct, k=all

0.73

0.81

0.78

0.82

0.80

0.82

falcon-7b-instruct, k=all

0.81

0.81

0.81

0.82

0.82

0.82

gemini-1.0-pro

0.79

0.79

0.80

0.80

0.80

0.80

gemini-1.0-pro, 单次 调用

0.76

0.76

0.78

0.77

0.78

0.77

text-bison

0.63

0.75

0.67

0.78

0.70

0.79

text-bison, 单次 调用

0.65

0.75

0.71

0.77

0.73

0.80

银行数据集上的结果,使用的指标是准确率。

模型

用户意图, 相似度

用户意图,相似度=0.6

机器人意图, 相似度

机器人意图,相似度=0.6

机器人消息, 相似度

机器人消息,相似度=0.6

gpt-3.5-turbo-instruct, k=all

0.73

不适用

0.74

不适用

不适用

不适用

gpt-3.5-turbo-instruct, 单次 调用

0.81

不适用

0.83

不适用

不适用

不适用

gpt-3.5-turbo-instruct, 紧凑

0.86

不适用

0.87

不适用

不适用

不适用

gpt-3.5-turbo, k=all

0.38

0.73

0.45

0.73

不适用

不适用

text-davinci-003, k=all

0.77

0.82

0.83

0.84

不适用

不适用

text-davinci-003, k=all, 单次 调用

0.75

不适用

0.81

不适用

不适用

不适用

text-davinci-003, k=all, 紧凑

0.86

不适用

0.86

不适用

不适用

不适用

text-davinci-003, k=3

0.65

不适用

0.73

不适用

不适用

不适用

text-davinci-003, k=1

0.50

不适用

0.63

不适用

不适用

不适用

llama2-13b-chat, k=all

0.76

不适用

0.77

不适用

不适用

不适用

dolly-v2-3b, k=all

0.32

0.62

0.40

0.64

不适用

不适用

vicuna-7b-v1.3, k=all

0.39

0.62

0.54

0.65

不适用

不适用

mpt-7b-instruct, k=all

0.45

0.58

0.50

0.60

不适用

不适用

falcon-7b-instruct, k=all

0.70

0.75

0.76

0.78

不适用

不适用

gemini-1.0-pro

0.89

0.88

0.87

0.91

不适用

不适用

gemini-1.0-pro, 单次 调用

0.89

0.89

0.90

0.89

不适用

不适用

text-bison

0.85

0.92

0.89

0.94

不适用

不适用

text-bison, 单次 调用

0.91

0.89

0.92

0.90

不适用

不适用

输入和输出护栏#

事实核查护栏#

护栏库中,我们为事实核查护栏提供了两种开箱即用的方法:Self-Check 事实核查和 AlignScore。有关更多详细信息,请阅读库指南

Self-Check#

在这种方法中,事实核查护栏被实现为一个蕴涵预测问题。给定一个证据段落和预测的答案,我们提示一个 LLM 来预测答案是否基于证据。这是默认方法。

AlignScore#

此方法基于 AlignScore 模型 Zha 等人 2023。给定一个证据段落和预测的答案,对模型进行微调,以预测它们在以下情况下对齐:

  1. 预测答案中的所有信息都存在于证据段落中,并且

  2. 预测答案中的任何信息都不与证据段落相矛盾。响应是一个介于 0.0 和 1.0 之间的值。在我们的测试中,使用 0.7 的阈值时观察到了最佳平均准确率。

有关如何配置部署以使用 AlignScore 的详细步骤,请参阅用户指南文档

评估#

要运行事实核查护栏,您可以使用以下 CLI 命令

nemoguardrails evaluate fact-checking --config=path/to/guardrails/config

以下是您可以用来配置事实核查护栏的参数列表

  • config:护栏配置的路径(包括 LLM、prompt 以及任何其他信息)。

  • dataset-path:数据集的路径。它应该是一个具有以下格式的 JSON 文件

    [
        {
            "question": "question text",
            "answer": "answer text",
            "evidence": "evidence text",
        },
    }
    
  • num-samples:运行评估的样本数量。默认值为 50。

  • create-negatives:是否生成合成的负面示例。默认值为 True

  • output-dir:保存输出的目录。默认值为 eval_outputs/factchecking

  • write-outputs:是否将输出写入文件。默认值为 True

有关如何以正确格式设置数据并在自己的数据集上运行评估的更多详细信息,请参见此处

评估结果#

评估日期 - 2023 年 11 月 23 日(gemini-1.0-pro 于 2024 年 3 月 7 日更新)。

我们使用 Self-Check 和 AlignScore 方法在 MSMARCO 数据集上评估事实核查护栏的性能。为了构建数据集,我们随机抽取 100 个(问题、正确答案、证据)三元组,然后,对于每个三元组,构建一个非事实或不正确的答案,以得到 100 个(问题、不正确答案、证据)三元组。

我们将性能细分为正面蕴涵准确率和负面蕴涵准确率。正面蕴涵准确率是模型在正确识别基于证据段落的答案方面的准确率。负面蕴涵准确率是模型在正确识别受证据支持的答案方面的准确率。有关如何创建合成负面示例的详细信息,请参见此处

模型

正面蕴涵准确率

负面蕴涵准确率

总体准确率

每次核查事实的平均时间 (ms)

gpt-3.5-turbo-instruct

92.0%

69.0%

80.5%

188.8ms

gpt-3.5-turbo

76.0%

89.0%

82.5%

435.1ms

text-davinci-003

70.0%

93.0%

81.5%

272.2ms

gemini-1.0-pro

92.0%

93.0%

92.5%

704.5ms

align_score-base*

81.0%

88.0%

84.5%

23.0ms ^

align_score-large*

87.0%

90.0%

88.5%

46.0ms ^

*align_score 使用的阈值为 0.7,即 align_score >= 0.7 被认为是一个事实陈述,而 align_score < 0.7 表示一个不正确的陈述。^当 AlignScore 模型加载到内存中并且推理在没有网络开销的情况下进行时,即不是作为 RESTful 服务。

内容审查护栏#

内容审查包括两个组成部分:输入内容审查和输出内容审查。

  • 输入内容审查试图阻止旨在从机器人中引出有害响应的用户输入。

  • 输出内容审查试图过滤语言模型的输出,以避免向用户显示不安全内容。

Self-Check#

此护栏将使用自定义 prompt 提示 LLM 进行输入(越狱)和输出内容审查。拒绝用户输入的常见原因包括越狱尝试、有害或滥用内容以及其他不恰当的指令。有关更多详细信息,请查阅 [护栏库](护栏库) 指南。

评估#

可以使用以下 CLI 命令评估越狱和输出内容审查

nemoguardrails evaluate moderation --config=path/to/guardrails/config

可以传递给评估内容审查护栏的各种参数有

  • config:护栏配置的路径(包括 LLM、prompt 以及任何其他信息)。

  • dataset-path:用于评估护栏的数据集路径。数据集应每行包含一个 prompt。

  • split:要评估的数据集划分。选项为“有帮助”或“有害”。此选择用于确定预测的适当标签。

  • num-samples:要评估的样本数量。默认值为 50。

  • check-input:是否评估输入内容审查护栏。默认值为 True。

  • check-output:是否评估输出内容审查护栏。默认值为 True。

  • output-path:写入结果的文件夹。默认值为 ‘eval_outputs/moderation’。

也可以单独评估每个护栏。要仅评估输入护栏,请使用以下命令

nemoguardrails evaluate moderation --check-output False --config=path/to/guardrails/config

要仅评估输出内容审查护栏,请使用以下命令

nemoguardrails evaluate moderation --check-input False --config=path/to/guardrails/config

有关如何以正确格式设置数据并在自己的数据集上运行评估的更多详细信息,请参见此处

评估结果#

我们评估 Anthropic 红队尝试数据集 和 Anthropic 有帮助基础数据集 上的内容审查护栏。此数据集包含由人工标记为有帮助或有害的 prompts。我们从每个划分中随机抽取 100 个 prompts,并使用 OpenAI text-davinci-003gpt-3.5-turbo 模型运行评估。

评估日期 - 2023 年 6 月 2 日(gemini-1.0-pro 于 2024 年 3 月 13 日更新)。

我们将模型在两个护栏上的性能细分为以下指标

我们希望模型能够阻止尽可能多的有害 prompts,并允许尽可能多的有帮助 prompts。

内容审查护栏性能#

这些结果使用了 LLM Self-Checking 方法中定义的简单 prompt。有关更多详细信息,请参见护栏库

模型

被阻止的有害 prompts 百分比

触发模型错误的有害 prompts 百分比

被允许的有帮助 prompts 百分比

gpt-3.5-turbo-instruct

78

0

97

gpt-3.5-turbo

70

0

100

text-davinci-003

80

0

97

gemini-1.0-pro

63

36*

97

* 请注意,截至 2024 年 3 月 13 日,通过 Vertex AI API 查询 gemini-1.0-pro 时偶尔会产生 此错误。请注意,这在使用 self check prompt 时发生,即当模型获得输入并被要求对是否应响应特定输入给出是/否答案时。我们将这些结果单独报告,因为此行为是由 self check prompt 本身触发的,在这种情况下,此行为是否应视为有效的内容审查或由误报触发尚有争议。

基于 LlamaGuard 的内容审查护栏性能#

评估日期:2024 年 1 月 8 日。

Guardrails 提供对 Meta 新的 Llama Guard 模型开箱即用的支持,用于输入/输出内容审查。下面,我们评估了 Llama Guard,并将其与在两个流行数据集上使用复杂 prompt 的 self-checking 方法进行比较。

OpenAI 内容审查测试集上的结果 数据集大小:1,680 被标记为有害的用户输入数量:552 (31.1%)

主要 LLM

输入护栏

准确率

精确率

召回率

F1 分数

gpt-3.5-turbo-instruct

self check 输入

65.9%

0.47

0.88

0.62

gpt-3.5-turbo-instruct

llama guard check 输入

81.9%

0.73

0.66

0.69

ToxicChat 数据集上的结果: 数据集大小:10,165 被标记为有害的用户输入数量:730 (7.2%)

主要 LLM

输入护栏

准确率

精确率

召回率

F1 分数

gpt-3.5-turbo-instruct

self check 输入

66.5%

0.16

0.85

0.27

gpt-3.5-turbo-instruct

llama guard check 输入

94.4%

0.67

0.44

0.53

使用复杂 prompt 进行 self check 输入时出现的低精确率和高召回率表明 self check 输入护栏的行为过于防御。我们将使用更多 self check prompt 的变体运行此评估并报告数据。

幻觉护栏#

对于模型使用参数化知识回答的一般问题,我们可以定义一个幻觉护栏来检测模型何时可能在编造事实。幻觉护栏的默认实现基于 SelfCheckGPT

  • 给定一个问题,我们从模型中采样多个答案,通常在高温(temp=1.0)下进行。

  • 然后我们检查答案之间是否一致。此一致性检查使用类似于事实核查护栏的 LLM 调用来实现。

  • 如果答案不一致,则表明模型可能正在产生幻觉。

Self-Check#

如果答案不一致,此护栏将使用 LLM 并配合自定义 prompt 进行 self-checking。自定义 prompt 可以类似于 NLI 任务。有关更多详细信息,请查阅 [护栏库](护栏库) 指南。

评估#

要运行幻觉护栏,请使用以下 CLI 命令

nemoguardrails evaluate hallucination --config=path/to/guardrails/config

以下是您可以用来配置幻觉护栏的参数列表

  • config:护栏配置的路径(包括 LLM、prompt 以及任何其他信息)。

  • dataset-path:数据集的路径。它应该是一个文本文件,每行包含一个问题。

  • num-samples:运行评估的样本数量。默认值为 50。

  • output-dir:保存输出的目录。默认值为 eval_outputs/hallucination。

  • write-outputs:是否将输出写入文件。默认值为 True。

要在您自己的数据集上评估幻觉护栏,您可以按照创建包含问题列表的文本文件,并使用以下命令运行评估

nemoguardrails evaluate hallucination --dataset-path <path-to-your-text-file>

评估结果#

为了评估幻觉护栏,我们手动整理了一组问题,这些问题主要由包含错误前提的问题组成,即没有正确答案的问题。

例如,问题“月球的首都是什么?”包含一个错误前提,因为月球没有首都。由于问题的提问方式暗示月球有首都,模型可能会倾向于编造事实并回答问题。

然后我们在这些问题上运行幻觉护栏,并检查模型是否能够检测到幻觉。我们使用 OpenAI text-davinci-003gpt-3.5-turbo 模型运行评估。

评估日期 - 2023 年 6 月 12 日(gemini-1.0-pro 于 2024 年 3 月 13 日更新)。

我们将性能细分为以下指标

模型

% 拦截 - 模型

% 拦截 - 模型 + 幻觉护栏

% 模型出错

text-davinci-003

0

70

0

gpt-3.5-turbo

65

90

0

gemini-1.0-pro

60

80

6.7*

我们发现 gpt-3.5-turbo 能够独自拦截 65% 的问题并将其识别为无法回答。添加幻觉护栏有助于额外拦截 25% 的问题,并防止模型编造事实。

* Vertex AI 模型在幻觉和内容审查测试中由于 此问题 有时会出错。