用合成数据构建LLM护栏

随着大型语言模型 (LLM) 越来越受欢迎,一个挑战是确保当用户使用超出其预期目的的查询或请求提示这些模型时,由 LLM 驱动的应用程序不会偏离主题。虽然此类提示可能无害或不违法,但它们可能导致效率低下和错误,从而削弱模型的有效性。例如,如果电信公司为客户服务设计的聊天机器人被要求提供医疗建议,则构成离题滥用。这可能导致糟糕的用户体验和合规风险。

一个真实的例子是,用户要求汽车经销商聊天机器人创作一首歌曲,这远远超出了其预期范围 

此外,在调查了护栏框架的概况后,我们发现采用护栏的另一个挑战是,我们在预生产中通常几乎没有或根本没有真实数据来训练或配置此类护栏。有些方法需要正面或负面的例子,或者需要为每个用例训练自定义分类器

在 GovTech,我们已经找到了一种使用 LLM 本身提供合成数据来训练 LLM 护栏的方法。我们将在接下来的两篇文章中深入探讨这种方法以及我们如何将其应用于离题提示检测问题。在第一部分中,我们将探讨在预生产阶段开发此类护栏所面临的挑战,因为通常我们几乎没有或根本没有真实数据来训练或配置它们。然后,我们将解释如何使用合成数据来创建真实而多样化的数据集。在第二部分中,我们将深入探讨如何训练我们的模型并分享我们的工作成果。这两篇文章基于我们的论文

1、离题提示检测问题

我们的目标是构建一个输入护栏,可以根据系统的预期用途确定用户提示是主题内还是主题外。我们决定使用系统提示作为此分类的参考点。系统提示是预定义的指令,指导 LLM 应如何响应用户的查询。它们通常指定任务、提供上下文并定义所需的响应样式。这成为一个二元分类问题:0 = 主题内,1 = 主题外。

实施此类输入过滤器可确保只有相关的主题提示才能通过,从而保护系统免受意外滥用。

2、预生产中的挑战

构建有效的护栏非常复杂,尤其是在早期开发阶段使用有限的真实数据时。由于应用程序尚未部署,因此通常无法获得可用于训练分类器的用户数据。此外,依靠精选示例进行训练可能会受到限制,因为这些示例可能无法捕捉到实践中可能出现的各种潜在的离题提示。

在现有解决方案中,通常需要示例来训练护栏。这些示例通过教导模型应避免哪些类型的查询来帮助模型识别离题提示。然而,一个主要的挑战是不可能预测用户可能生成的每个离题提示。尝试创建离题主题列表是有问题的,因为可能的离题提示数量可能是无穷无尽的。这种方法还存在过度阻止的风险——系统错误地将有效提示标记为离题,从而导致用户误报。

3、使用合成数据

鉴于这些挑战,我们决定使用合成数据来构建我们的护栏。合成数据是由模型生成的人工数据,而不是从真实用户那里收集的数据。当现实世界数据稀缺或不可用时,这是一种理想的解决方案,因为它使我们能够快速生成大量相关的训练数据,同时确保隐私。合成数据可以定制以包含我们想要涵盖的特定场景,使其成为训练系统检测离题提示的重要资源。

使用合成数据还使我们能够模拟各种各样的提示,包括我们在现实世界数据中可能没有遇到过的边缘情况和不寻常的场景。

4、护栏开发方法

我们的护栏开发方法

总体而言,我们的方法避免了对现实世界滥用示例的需求。相反,我们:

  • 定性地定义问题空间
  • 使用 LLM 生成合成误用提示
  • 在此数据集上训练和测试护栏
主题内和主题外用户提示的示例:目标是正确分类提示是否脱离主题‌‌

5、数据集创建步骤

我们首先分析模型的预期功能并识别潜在的误用场景。例如,电信公司的客户服务聊天机器人应该处理有关产品的查询,但拒绝与医疗或法律建议相关的提示。定义什么是可接受的提示,什么是离题的提示,对于在系统应该处理的内容和应该阻止的内容之间划清界限至关重要。

接下来,我们整理了一份现实世界系统提示示例列表,以指导 LLM 在我们的合成数据集中生成现实有效的系统提示。这种方法可确保我们的合成数据与现实世界的应用程序紧密结合,从而增强模型在各种场景中生成准确且与上下文相关的响应的能力。

5.1 使用 LLM 生成合成数据

考虑到这些场景,我们使用了 LLM,特别是 GPT-4o,来生成各种合成提示。这个想法是生成多样化和现实的示例,包括主题和非主题查询。

为了引入可变性并增加生成的提示的多样性,我们为生成过程设置了高温度值(温度=1)。这种高温鼓励 LLM 生成更多不可预测、多样化和创造性的提示,以更好地反映现实世界的用户行为。

此外,我们使用 Python Faker 库随机化单词长度并生成 10 个随机种子词。随机单词长度有助于改变输出的长度,而随机生成的单词被注入到系统提示中。这进一步增加了提示的随机性和多样性,允许在合成数据集中涵盖更广泛的场景。

温度是一个可以调整以影响 LLM 输出的参数。较高的温度(例如 1)将产生更具创造性的输出,而较低的温度(例如 0)将产生更可预测的输出。

5.2 构建输出

为了确保生成的输出既多样化又结构化,我们使用了受限的生成方法,例如强制执行特定的格式规则,以确保输出符合所需的结构,同时保持真实性。

OpenAI 的结构化输出功能用于确保系统提示及其相应的主题和非主题用户查询从一开始就以正确的格式生成。此功能允许我们设置输出组织方式的特定规则,确保每个示例都遵循一致的结构,例如使用 JSON 模式。通过集成此功能,我们确保了数据集的一致性,从而提高了整体质量和实用性。

​​由于我们需要快速生成大量数据,我们使用 OpenAI 的批处理 API 一次发送多个请求。这使我们能够将多个任务批量处理在一起,使模型能够同时处理许多请求,从而加快数据生成过程。因此,我们能够高效地生成大量数据,同时确保它保持一致并符合我们的目标。

使用上面概述的方法,我们成功生成了超过 200 万对系统提示和用户提示。

下图说明了我们使用 GPT-4 创建合成数据的总体工作流程以及生成超过 200 万个样本所使用的令牌。

我们使用 GPT 4o 创建合成数据的总体工作流程
用于生成超过 200 万个样本的令牌

通过结合问题分析、合成数据生成和结构化输出创建,我们建立了一个可扩展且灵活的框架,用于在 LLM 应用程序中构建离题护栏。这种方法使我们能够通过生成多样化的隐私保护数据并确保护栏能够有效过滤离题提示来克服预生产开发的挑战。你可以在此处阅读论文有关此框架的更多信息。

有关我们如何生成合成数据的更多详细信息,请参阅这篇文章。你也可以在此处找到开源数据集。

接下来我们将深入探讨如何使用这个合成数据集来训练我们的离题检测模型并分享该过程的结果。

6、训练与评估简介

嵌满我们介绍了在没有数据的情况下在预生产中训练护栏的挑战,给出了离题提示检测的示例,以及我们如何通过使用合成数据克服现实世界数据的缺乏。在第二部分中,我们将重点介绍使用合成数据训练和评估模型以检测离题提示的过程。我们还将分享结果并展示我们的模型与现有方法的比较。更多详细信息请参阅我们的论文

随着大型语言模型 (LLM) 在更多应用程序中使用,确保它们仅响应相关的、离题的查询至关重要。离题提示(超出系统预期范围的提示)可能导致错误、效率低下和糟糕的用户体验。通过使用 LLM 生成的合成数据,我们训练了一个分类器,在这些离题输入到达模型之前检测并阻止它们,从而保持系统完整性。

来自 Sentence Transformers 核心维护者 Tom Aarsen 的致辞

7、训练模型

一旦我们有了合成数据集,我们的下一步就是训练一个能够检测离题提示的模型。为了训练一个有效的分类器,我们探索了两种关键方法:微调双编码器分类器和微调交叉编码器分类器。

图 1:我们模型的架构:微调双编码器分类器(左)和微调交叉编码器分类器(右)

7.1 双编码器分类器

该模型使用预先训练的嵌入模型 jinaai/jina-embeddings-v2-small-en,它分别处理系统提示和用户提示。然后,模型通过注意层学习两个提示之间的关系,使系统提示能够“关注”用户提示,反之亦然。经过处理后,嵌入被组合成一个向量,该向量通过分类层来预测提示是主题相关还是主题外。

7.2 交叉编码器分类器

在这种方法中,系统和用户提示被连接成一个序列,并通过微调的 stsb-roberta-base 模型。该模型直接处理两个提示,捕捉两者之间的微妙互动。然后,输出通过分类器,最终决定提示是否相关。

这两种模型和数据都是开源的,可以从这里获得。

8、评估:与基线进行基准测试

一旦我们训练了模型,下一步就是评估它们的性能。我们将微调后的分类器与几种基线方法进行了比较,以了解它们在检测离题提示方面的表现如何。

  • 余弦相似度:一种基于嵌入来测量系统和用户提示之间对齐的简单方法。由于余弦相似度分数的范围从 -1 到 1,因此对于我们的分类任务来说,将这些值映射到 0 到 1 的范围内并不完全简单。为了解决这个问题,我们尝试了两种方法:使用余弦相似度分数的绝对值(其中 -1 和 1 表示主题相关,0 表示离题),或反转分数(分数越高表示提示与系统提示的相关性越低)。在这种情况下,我们使用绝对值报告结果。虽然易于实现,但它无法捕捉提示之间更深层次的交互。
  • K-最近邻 (KNN):此方法通过将提示与一组标记示例进行比较来预测提示的相关性。我们提供三个主题提示和三个离题提示,以模拟我们如何在运行时训练简单的 KNN 分类器。但是,这种方法比微调模型更基础,精度也低得多。
  • 预训练交叉编码器模型:我们还测试了一个未经微调的预训练模型。虽然这种方法速度更快,但其性能不如我们的微调模型,后者专门针对离题检测进行了优化。
  • ColBERT v2 模型:它将查询和文档编码为多个向量,并通过细粒度的 token 级交互计算相关性分数。
  • LLM 提示工程:此方法涉及调整系统的提示,以明确指示模型拒绝离题查询。虽然它不需要训练,但灵活性较差,并且可能导致结果不太准确。
  • LLM 零样本分类:这种方法允许模型对提示进行分类,而无需进行特定于任务的训练。虽然对于比较有用,但它的精度不如我们微调的分类器。

8、结果:合成数据上的表现

在评估了不同的方法后,我们发现我们的微调模型明显优于基线方法,尤其是在精度方面。精度对于护栏至关重要,因为它可以减少误报的数量——当有效提示被错误地标记为离题时。这对于确保用户不会被不必要地阻止与系统交互。

图 2:GPT-4o 生成的合成数据集上的性能(2024-08-06)(N=17,201)

9、提示长度的性能

我们还研究了模型在不同长度的用户提示中的表现。正如预期的那样,与更长、更详细的提示(“你能帮我理解 9 月份的账单吗?”)相比,较短的提示(例如简单的“帮帮我”)更难准确分类。随着提示长度的增加,我们模型的性能得到了改善,因为较长的提示提供了更多的背景信息,使模型更容易准确地对它们进行分类。

为了量化这一点,我们根据提示的长度将它们分组到箱子中,并计算了每个组的 ROC-AUC 分数。可视化这些分数的热图(见图 3)证实了它们的性能确实随着提示长度的增加而提高。

图 3:按用户和系统提示长度绘制的 ROC-AUC 分数图

10、校准

校准是了解模型对其预测的信心程度的重要因素。如果模型预测提示有 80% 的置信度与主题相关,我们预计它大约有 80% 的时间是正确的。我们经过微调的交叉编码器模型显示出强大的校准性,这意味着它能够很好地估计其对预测的信心。这很重要,因为它允许我们根据模型的信心做出决策。例如:

  • 高置信度:如果模型非常确信提示偏离主题,我们可以立即阻止它。
  • 中等置信度:我们可能会将其标记为需要审查或要求澄清。
  • 低置信度:提示可以正常处理,但会监控潜在错误。

校准曲线为我们提供了模型与实际结果的置信度对齐的直观表示。对角线表示完美校准。偏离该对角线表示对模型预测的信心不足或过度。

图 4:微调交叉编码器和双编码器分类器的校准曲线

11、推广到外部数据集

我们还在不同 LLM(例如 Gemini Pro 1.5 和 Claude 3.5 Sonnet)生成的合成数据上测试了模型。这有助于我们确保我们的模型不会过度拟合我们用于训练的 GPT-4o 生成的数据的模式。我们发现,我们的微调分类器在这些数据集上表现始终良好,表明它们可以推广到不同 LLM 生成的数据。

此外,我们在旨在用困难提示挑战它们的数据集上测试了我们的模型,例如 JailbreakBenchHarmBench TrustLLM,其中包括试图绕过系统限制或要求提供有害内容的提示。我们的模型在这些对抗性提示上表现良好,表明它们可以在更复杂的场景中处理离题查询。

图 5:Gemini Pro 1.5 和 Claude 3.5 Sonnet 生成的合成数据集上的性能(N=326)
图 6:Llama 3.1 405B 生成的合成数据集上的性能(N=29,635)
图 7:JailbreakBench 上的性能

这些结果验证了我们方法的灵活性,该方法超越了一般的离题检测,可以解决更具体和更具挑战性的用例。

12、推理速度基准测试

除了准确性之外,我们还测量了模型处理提示的速度。经过微调的双编码器分类器速度更快,使其成为高吞吐量场景的更好选择。然而,经过微调的交叉编码器模型虽然速度稍慢,但提供了更好的精度和校准,使其成为准确性比速度更重要的情况的理想选择。

图 9:推理速度基准测试

13、局限性和未来工作

虽然我们的模型表现良好,但也存在一些局限性:

  • 合成数据偏差:合成数据虽然有用,但可能会根据用于生成它的 LLM 引入偏差。这些偏差可能无法完全代表现实世界用户提示的多样性。
  • 系统提示的范围:如果系统提示太宽泛或模糊,护栏就更难准确检测离题提示。
  • 语言和文化背景:我们的模型主要针对英语提示进行训练,这意味着它们可能会难以处理其他语言或不同文化背景的提示。

尽管存在这些局限性,但我们的方法为构建可适应现实世界应用的离题检测系统提供了坚实的基础。我们正在努力通过整合更多不同的数据并扩展其功能来改进模型。

14、结束语

在本文中,我们讨论了如何使用合成数据构建和训练模型来检测离题提示。我们探索了不同的建模方法,并评估了它们在几个关键因素(如精度、提示长度和校准)方面的表现。结果表明,我们的微调模型在准确性和速度方面都优于传统方法,使其成为确保 LLM 仅响应相关查询的可靠工具。


原文链接:BYOG (Build Your Own Guardrails) with Synthetic Data

汇智网翻译整理,转载请标明出处