本文旨在使用少量提示来激发OpenAI的Davinci大型语言模型(GPT-3/ChatGPT的基础模型)对大型银行的客户服务请求进行意图分类。按照通常的做法,我们从可用的人工标注请求示例数据集中获取少量示例,并将其包含在提示模板中。然而,结果表明LLM的预测结果不可靠——仔细检查后发现这是因为现实世界的数据杂乱无章且容易出错。在手动修改提示模板以减少可能存在的噪声数据的情况下,LLM在此客户服务意图分类任务中的表现仅略有提高。如果我们改用数据中心的人工智能算法(如Confident Learning)来确保仅选择高质量的少量示例包含在提示模板中,LLM的预测结果将显著提高。
确保可靠的少量提示选择对于LLM来说是至关重要的。我们需要考虑如何精选高质量的少量示例来激发LLM生成最可靠的预测结果。需要确保少量提示中的高质量示例可能是显而易见的,但许多工程师不知道有算法/软件可以帮助您更系统地完成这项工作(实际上,这是数据中心人工智能的一个完整科学学科)。这种算法数据整理有许多优点,例如:完全自动化、系统化以及广泛适用于除意图分类之外的通用LLM应用。
本文研究了一种50类别变体的Banking-77数据集,其中包含带有相应意图标注的在线银行查询。我们使用一个包含约500个短语的固定测试数据集评估预测该标签的模型,并拥有约1000个标记短语池,我们将其视为包含在我们的少量示例中的候选短语。
银行意图数据集
本文研究了 Banking-77 数据集的 50 类变体,其中包含用其相应意图注释的在线银行查询(如下所示的标签)。我们使用包含 ~500 个短语的固定测试数据集评估预测此标签的模型,并拥有 ~1000 个标记短语的池,我们认为这些短语可以包含在我们的少数样本中。
您可以在这里和这里下载少量提示候选池和测试集。这是一个笔记本,您可以运行它以重现本文中显示的结果。
少量提示
少量提示(也称为上下文学习)是一种自然语言处理技术,它使预训练的基础模型能够执行复杂任务而无需进行任何明确的训练(即不需要更新模型参数)。在少量提示中,我们向模型提供有限数量的输入-输出对,作为包含在提示中的提示模板的一部分,该提示用于指示模型如何处理特定的输入。提示模板提供的附加上下文有助于模型更好地推断出所需的输出类型。例如,给定输入:“旧金山在加利福尼亚州吗?”,如果将这个提示与一个固定模板相结合,使新提示看起来像这样:
文本:波士顿在马萨诸塞州吗?
标签:是
文本:丹佛在加利福尼亚州吗?
标签:否
文本:旧金山在加利福尼亚州吗?
标签:
在这种情况下,少量提示尤其有用,特别是在文本分类场景中,其中您的类别是特定于领域的(这通常是不同业务中客户服务应用程序的情况)。
在我们的案例中,我们有一个包含50个可能类别(意图)的数据集,以为OpenAI的预训练LLM提供上下文,使其能够学习类别之间的差异。使用LangChain,我们从标记的候选示例池中选择每个类别中的一个随机示例,并构建一个50-shot提示模板。我们还附加了一个字符串,在少量示例之前列出了可能的类别,以确保LLM输出是有效的类别(即意图类别)。
上述50-shot提示作为输入用于LLM,以便它对测试集中的每个示例进行分类(上面的目标文本是此输入在不同测试示例之间变化的唯一部分)。这些预测将与基准标签进行比较,以使用选定的少量提示模板评估生成的LLM准确性。
基准模型的性能
# This method handles:
# - collecting each of the test examples
# - formatting the prompt
# - querying the LLM API
# - parsing the output
def eval_prompt(examples_pool, test, prefix="", use_examples=True):
texts = test.text.values
responses = []
examples = get_examples(examples_pool, seed) if use_examples else []
for i in range(len(texts)):
text = texts[i]
prompt = get_prompt(examples_pool, text, examples, prefix)
resp = get_response(prompt)
responses.append(resp)
return responses
# Evaluate the 50-shot prompt shown above.
preds = eval_prompt(examples_pool, test)
evaluate_preds(preds, test)
>>> Model Accuracy: 59.6%
将测试集中的每个示例都通过使用上述50-shot提示的LLM运行,我们获得了59.6%的准确率,对于一个50类问题来说还不错。但是这对于我们银行的客户服务应用程序来说还不够令人满意,因此让我们仔细查看一下候选示例的数据集(即池)。当机器学习表现不佳时,通常是数据的问题!
我们数据中的问题
我们通过仔细检查我们的候选示例池,找到了一些错误标注的短语和异常值。以下是几个明显标注不正确的示例。
之前的研究观察到,许多流行的数据集包含错误标注的示例,因为数据注释团队并不完美。
客户服务数据集中包含意外包含的超出范围的示例也很常见。在这里,我们看到了一些奇怪的例子,它们并不对应有效的银行客户服务请求。
这些问题为什么很重要?
随着LLM的上下文大小增长,提示包含许多示例变得越来越普遍。因此,可能无法手动验证您的少量示例中的所有示例,特别是在具有大量类别(或者如果您缺乏有关它们的领域知识)的情况下。如果这些少量示例的数据源包含像上面显示的问题(就像许多现实世界的数据集一样),那么错误的示例可能会出现在您的提示中。本文的其余部分将检查此问题的影响以及我们如何缓解此问题。
我们能否告诉LLM这些示例可能是嘈杂的?
如果我们在提示中只包含一个“免责声明”,告诉LLM提供的少量示例中可能存在一些错误的标签,会怎样呢?在这里,我们考虑对我们的提示模板进行以下修改,其中仍然包括与以前相同的50个少量示例。
prefix = 'Beware that some labels in the examples may be noisy and have been incorrectly specified.'
preds = eval_prompt(examples_pool, test, prefix=prefix)
evaluate_preds(preds, test)
>>> Model Accuracy: 62.0%
我们是否可以完全删除嘈杂的示例?
既然我们不能信任少量示例池中的标签,那么如果我们完全将其从提示中删除,并仅依靠强大的LLM,会怎样呢?我们不再使用少量提示,而是使用零量提示,其中提示中仅包含LLM应该分类的示例。零量提示完全依赖于LLM的预训练知识来获取正确的输出。
preds = eval_prompt(examples_pool, test, use_examples=False)
evaluate_preds(preds, test)
>>> Model Accuracy: 67.4%
完全删除质量差的少量示例后,我们获得了67.4%的准确率,这是迄今为止我们做得最好的!
看来嘈杂的少量示例实际上可能会损害模型的性能,而不是像它们应该做的那样提高它的性能。
我们能否确定并纠正嘈杂的示例?
与其修改提示或完全删除示例,改善我们的数据集的更加智能(但更加复杂)的方法是手动查找和修复标签问题。这同时删除了损害模型的嘈杂数据点,并添加了一个准确的数据点,应通过少量提示来提高其性能,但手动进行此类更改很繁琐。在这里,我们可以使用Cleanlab Studio来轻松纠正数据,该平台实现了自信学习算法以自动查找和修复标签问题。
# Source examples with the corrected labels.
clean_pool = pd.read_csv("studio_examples_pool.csv")
clean_examples = get_examples(clean_pool)# Evaluate the original 50-shot prompt using high-quality examples.
preds = eval_prompt(clean_examples, test)
evaluate_preds(preds, test)
>>> Model Accuracy: 72.0%
在使用自信学习的更合适的估计标签替换估计为错误的标签后,我们通过LLM重新运行原始50-shot提示,使用每个测试示例,但这次我们使用自动更正的标签,这确保我们在其少量提示中为LLM提供50个高质量示例。
以数据为中心的 AI 的重要性
本文强调了确保语言模型可靠的少量提示选择的重要性,重点关注银行领域客户服务意图分类。通过探索大型银行的客户服务请求数据集并使用Davinci LLM应用少量提示技术,我们遇到了由嘈杂和错误的少量示例引起的挑战。我们证明,仅通过修改提示或删除示例无法保证最佳模型性能。相反,像Cleanlab Studio中实现的自信学习这样的数据中心人工智能算法被证明更有效地识别和纠正标签问题,从而显着提高了准确性。本研究强调了算法数据筛选在获取可靠的少量提示中的作用,并突出了这些技术在增强各个领域的语言模型性能方面的实用性。