RAC:检索增强分类

RAC Nov 3, 2024

分类问题无处不在。从识别垃圾邮件到推荐下一个 YouTube 视频,我们不断依赖对数据进行分类的系统来让我们的生活更轻松,而我们往往没有意识到这一点。

传统的机器学习擅长这类事情。用足够的示例数据训练模型,它将学会有效地分类。

然而,根据我自己的经验,有一组现实世界的问题,拥有一个分类模型是理想的,但训练一个分类模型并不切实际。无论是你缺乏足够的数据还是复杂性不值得付出努力,训练自定义模型并不总是有意义的。

这就是 GPT、Claude 等大型语言模型 (LLM) 发挥作用的地方。这些强大的通用模型可以使用提示适应广泛的任务,而无需重新训练。LLM 非常适合构建传统分类模型不切实际的情况,原因如下:

  • 常识:LLM 是在大量多样化的数据上进行训练的,允许它们对各个领域的文本进行分类,而无需进行特定领域的训练。这使得它们非常适合您缺乏足够的标记数据或需要广泛的上下文理解的用例。
  • 灵活性:与僵化的传统模型不同,当出现新的类别或标准时,LLM 不需要重新训练。您可以简单地修改提示来处理更改,这使它们非常适合分类需要随时间演变的动态环境。

1、LLM 作为分类器

如何让 LLM 对你的数据进行分类?—使用提示。提示大致类似于以下内容:

# Instruction

Hey LLM, you are a classifier.
Choose the most appropriate class and output only your classification.

There are these classes:
{classes}

# Solve

This is the input to be classified:
{input}

给出这样的提示,LLM 将作为分类模型运行。这称为零样本提示。这里的结果将根据你的用例而有所不同,用例通常分为两类:

训练分布(类别 1):

  • LLM 可以很好地执行您的任务:类别和输入在 LLM 的训练数据集中都足够常见,因此概念通常可以被理解
  • 示例:将客户评论分为“正面”、“中立”、“负面”等类别。这些类别之间的界限在训练数据中得到了很好的反映。

训练外分布(类别 2):

  • LLM 无法很好地执行你的任务:类别或输入太独特或专有,这意味着概念不会反映在 LLM 的训练数据中。
  • 示例:将费用分为个性化类别,如“需求”、“想要”、“旅行”。这种区别是个人的,不会反映在 LLM 的训练数据中。

如果你的用例是类别 1,那么很可能会看到最先进的 LLM 具有零样本提示的出色表现。

如果你的用例属于第 2 类,那么坏消息是,即使是最先进的 LLM 也难以使用零样本提示准确地对你的输入进行分类。好消息是,我们可以改善结果。

2、通过检索实现更好的分类

为了解决性能问题,尤其是当任务超出 LLM 的训练分布时,我们可以通过使用检索增强提示来改进分类。这种方法称为检索增强分类 (RAC),它是一种将检索与分类相结合以改进 LLM 决策的方法。

将检索纳入你的分类管道可将 LLM 从简单的零样本分类器转变为更具上下文信息的分类器。这通过从预索引数据集中检索相关信息并将其输入到提示中来实现。这些额外的数据可以缩小问题的范围,使 LLM 更容易正确地对输入进行分类。

2.1 RAC 如何改进分类

使用类似示例增强上下文:

通过从数据集中检索类似示例,你可以为 LLM 提供有关特定输入的更多上下文。这种上下文信息至关重要,尤其是当分类涉及细微差别或特定领域的区别时。

例如,如果你将交易分类为“需求”、“想要”和“旅行”等类别,则检索以前被类似标记的交易可以通过向 LLM 展示过去如何对类似数据点进行分类来引导 LLM 进行正确的分类。

使用检索到的数据更改提示:

在检索增强设置中,提示包括相关的检索示例,这有助于 LLM 更好地理解类别之间的决策边界。检索增强提示可能如下所示:

# Instruction

Hey LLM, you are a classifier.
Consider the previously labeled examples when making your classification.
Choose the most appropriate class and output only your classification.

There are these classes:
{classes}

Here are some examples of previously labeled data:
{retrieved_examples}

# Solve

This is the input to be classified:
{input}

核心思想是,当 LLM 有类似的示例来指导其决策时,分类会变得更容易、更准确。

2.2 如何实现检索

要实现 RAC,你需要设置一个检索系统。检索可以通过不同的方式实现,具体取决于最适合你的用例的方式。一些选项包括:

  • 使用嵌入的向量搜索:这涉及将你的数据转换为嵌入,并使用向量数据库根据其语义含义查找最相似的示例。这对于文本等非结构化数据尤其有用,因为它可以捕获语义含义。
  • 关键字搜索:如果你的数据缺乏语义含义并且不需要嵌入的功能,那么简单的关键字搜索就可以完成这项工作。
  • 混合搜索:你可以使用混合方法结合向量和关键字搜索的优势。

虽然有多种选择,但向量搜索可能是将检索集成到管道中的最简单方法,尤其是使用 Pinecone 等完全托管的服务来为你处理基础设施。使用 Pinecone,此过程就像进行几次 API 调用一样简单。

无论检索策略如何,检索系统都必须能够执行 2 件事:

  • 索引数据
  • 检索类似数据

为了将所有内容结合在一起,完整的 RAC 管道如下所示:

  • 数据索引:索引标记的示例。
  • 输入:将输入数据发送到检索系统。
  • 检索:系统从预先索引的数据中获取相关示例。
  • 增强:这些示例在提示中传递给 LLM。
  • 分类:LLM 使用输入和检索到的示例来更准确地对数据进行分类。

就这么简单。一旦检索到位,你的 LLM 就不再盲目飞行 - 现在它获得了相关背景信息,这意味着更好的结果。

3、案例研究:个人交易分类

首先看一下交易数据。

我处理了一组我自己的个人交易数据,这些数据被归类为以下标签:

- Assets:Discover:Main:Needs:Monthly
- Assets:Discover:Main:Needs:Groceries
- Assets:Discover:Main:Needs:Gas
- Assets:Discover:Main:Needs:Other
- Assets:Discover:Main:Wants:Monthly
- Assets:Discover:Main:Wants:Other
- Assets:Discover:Furniture
- Assets:Discover:FutureWants
- Assets:Discover:Travel

此任务属于训练外分布类别。这些类别是我自己的个人预算类别,这意味着这些数据可能与 LLM 在训练中看到的任何数据都不同。

每笔交易都代表了现实世界中的一项支出,我希望出于预算目的将其自动归类到这些类别中。带标签的示例是 JSON 对象,由 4 个字段组成,例如:

{
    "vendor": "AMAZON PRIME",
    "day": "04",
    "amount": "16.04",
    "from_account": "Assets:Discover:Main:Needs:Monthly"
}

未标记的示例(又称测试数据)缺少 from_account,例如:

{
    "vendor": "SPOTIFY",
    "day": "09",
    "amount": "11.76",
}

我有 130 个带标签的交易和 57 个未标记的交易。

为了评估不同方法对这个分类任务的效果,我使用零样本提示、向量检索 K-Nearest Neighbors 和 RAC 进行了几次实验,以评估 from_account 对 57 个未标记交易的分类准确性。

对于我的检索系统,我将 130 个带标签的交易上传到 Pinecone 的无服务器向量数据库,使用 OpenAI 嵌入和余弦相似度作为嵌入距离的度量。

3.1 评估:零样本

我首先测试了两个模型的零样本能力:GPT 4o-mini 和 GPT 4o。

  • GPT 4o-mini:实现了 38% 的准确率。这个数字出乎意料地低,因为 GPT 4o-mini 很难在没有任何额外背景或从示例中学习的情况下映射我的个性化类别。
  • GPT 4o:表现更好,实现了 63% 的准确率。这一改进可以归因于 GPT 4o 对语言的更高级理解和更广泛的知识库。

这些结果突出了零样本提示对于特定领域分类任务的局限性。虽然 GPT 4o 可以相当好地处理通用类别,但个性化类别严重阻碍了它的性能。

3.2 评估:带向量检索的 KNN

在这个实验中,我使用检索系统从向量数据库中找到 K 个最相似的交易,并根据 from_account 模式对未标记的交易进行分类。换句话说,在检索到的一组类似交易中,最常见的 from_account 是什么?此方法完全依赖于检索系统,不使用任何 LLM 调用。

  • KNN:此方法将准确率提高到 64%。虽然与 GPT 4o 的零样本性能相比,改进并不显著,但它表明,在没有任何分类模型的情况下简单地检索类似交易可以产生比没有上下文的 LLM 更好的结果。

这种方法适用于更频繁出现的类别,其中相似的历史交易提供了强大的分类指导。然而,对于更个性化的类别或数据较少的类别,这种方法就很吃力了,因为最近的邻居往往不够独特,无法捕捉到正确的分类。

3.3 评估:RAC

接下来,我实现了 RAC,将向量检索与 LLM 分类相结合。在这个设置中,我使用向量嵌入来检索相似的历史交易,然后将检索到的上下文输入到 LLM 中,以帮助做出更明智的分类决策。

  • 带有 RAC 的 GPT 4o-mini:准确率跃升至 85%。这一显著的改进表明了上下文检索的强大功能。通过在要求模型对交易进行分类之前为其提供相关示例,LLM 能够比零样本场景更好地处理“需要”与“想要”等类别之间的细微差别。
  • 带有 RAC 的 GPT 4o:有趣的是,这里的准确率达到了 76%,低于 GPT 4o-mini 在此设置下的性能。虽然 GPT 4o 受益于检索,但它并没有像 GPT 4o-mini 那样表现出性能飞跃。这是出乎意料的。这可能是由于 GPT 4o 倾向于更多地依赖其固有知识库,在这种情况下,这导致对某些预测过度自信。

RAC 展示了其实力,特别是在零样本 LLM 难以准确分类的情况下。向量检索提供的额外上下文有助于消除仅基于交易描述难以分类的交易的歧义。

RAC 展示了一种针对低数据和高度个性化分类任务的实用解决方案,为传统自定义模型训练提供了一种灵活有效的替代方案。

展望未来,通过提高数据质量、检索技术和提示来进一步提高分类准确性,还有进一步优化的潜力。

4、需要了解的事情

成本效率:

RAC 的主要优势之一是其价格实惠。由于 LLM API 调用成本仅为几分之一美分,并且 Pinecone 等服务提供慷慨的免费套餐,因此运行 RAC 的成本极低。您无需投入时间或金钱来训练自定义模型或管理复杂的基础架构,从而使 RAC 可用于个人项目或小规模部署。

准确度与人工监督:

在此案例研究中,我使用 GPT 4o-mini 和 RAC 实现了 85% 的准确度,这当然很有用,但并不完美。在实践中,这意味着虽然 RAC 可以自动完成大部分分类工作,但仍可能需要一些人工监督,特别是对于极端情况或关键决策。

为了解决这个问题,我建议采用一种机制,允许模型在不确定分类时“选择退出”。一个实用的解决方案是引入一个额外的类别: UNKNOWN

通过在 LLM 对其分类没有信心时提示其返回 UNKNOWN 标签,你可以创建一个更强大的系统。这样,你就可以将人力集中在模型不确定的交易上,同时自动化大部分流程。

5、结束语

正如所讨论的,LLM 是训练自己的分类模型不切实际的情况下的可行解决方案。RAC 在零样本 LLM 不足的情况下增强了 LLM 的分类能力。通过将 LLM 的广泛知识和语言理解与检索示例的特殊性相结合,RAC 弥合了通用模型和领域特定任务之间的差距。

在本案例研究中,RAC 显著提高了分类准确性,特别是对于零样本 LLM 难以处理的个性化类别。检索提供的额外上下文使 LLM 能够做出更明智的决策,从而有效地解决了训练分布数据的问题。

使用 Pinecone 等工具轻松实现 RAC 以及 LLM API 调用的经济实惠使其即使是较小的项目也可以使用。虽然没有一个系统是完美的,但 RAC 在自动化和准确性之间提供了务实的平衡。

我写这篇文章是为了分享我的实验,并激发其他人在自己的项目中探索 RAC 潜力的灵感。RAC 的可能性非常大,我很想听听你的使用案例!


原文链接:Retrieval Augmented Classification — LLMs as Classifiers

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

Tags