分类任务无处不在。从过滤垃圾邮件到推荐下一个 YouTube 视频,我们常常依赖于能够分类数据的系统,让我们的生活更轻松,往往甚至都没意识到。
传统机器学习在这方面很在行。只要用足够多的例子数据训练模型,就能很好地完成归类任务。
然而,就我个人的经验而言,存在一系列现实问题,如果能有一个分类模型会非常理想,但训练一个模型却并不实际。不论是数据不足还是复杂度太高,训练起来不划算。因此,训练一个定制的模型并不总是有意义的。
这就像是 大型语言模型 (LLM) 如 GPT、Claude 等大显身手的时候。这些强大的通用模型可以通过提示来完成各种任务,无需重新训练模型。在构建传统分类模型不切实际的情况下,LLM 就显得特别理想。
- 通用知识:大型语言模型是在海量且多样化的数据上进行训练的,因此能够在不同领域对文本进行分类处理,而无需特定领域的训练。这使得它们非常适合于这些场景,在你缺乏足够标注数据或者需要广泛背景理解的地方。
- 灵活性:与传统的僵化模型不同,大型语言模型在出现新的类别或标准时不需要重新训练。您只需调整提示即可应对变化,因此非常适合动态环境。
你是如何让LLM分类你的数据的?——通过一个提示词。大致如下所示:
# 指令
嘿,LLM,你是个分类器。
选择最合适的类别,然后只输出你的分类。
有以下类别:
{classes}
# 解决
这是需要分类的输入:
{input}
给定这样的提示,LLM将执行一个分类任务。这被称为零样本推理。这些结果会因您的用例而异,通常可以分为两类:
在第一类训练中的分布:
- LLM 可以开箱即用,很好地完成任务:类和输入在 LLM 的训练数据集中都很常见,所以这些概念通常都能被理解。
- 示例:将客户评论分类成“正面”、“中立”、“负面”等类别。这些类别的界限在训练数据中都有很好的体现。
训练数据以外的分布(类别2)
- LLM 默认可能无法很好地完成你的任务: 这可能是因为类或输入太独特或专有,以至于这些概念在 LLM 的训练数据中没有涵盖。
- 例如: 将支出分类为“必需品”、“想要”、“旅行”等个性化类别。这些分类是个人的,可能不会在 LLM 的训练数据中出现。
如果你的应用场景属于第一类,那么你将发现最先进的LLM在没有提供任何示例的情况下表现也会很好。
如果你的用例属于类别2,那么但是,即使是最先进的LLM也很难在没有额外提示的情况下准确分类你的输入。好消息是,我们可以改进这些结果。
基于检索实现更好的分类效果为了解决性能问题,尤其是在任务超出LLM训练范围的情况下,我们可以通过增强提示来提高分类的准确性,方法是在提示中加入检索。这种方法称为 检索增强分类 (RAC),它将检索与分类相结合,以增强LLM的决策能力。
将大型语言模型从简单的零样本分类器转变为一个更具上下文信息的分类器。这通过从预先索引的数据集中检索相关信息,并将其输入提示来实现。这些额外的数据可以缩小问题的范围,从而让大型语言模型更轻松地正确分类输入。这使得大型语言模型更轻松地正确分类输入。
RAC 如何改进分类用类似的例子来增强上下文理解:
通过从数据集中检索类似例子,你可以为大型语言模型提供关于特定输入的更多背景信息。这种背景信息尤为重要,尤其是在需要区分细微或特定领域的差异时。
比如说,如果你将交易分类为“生活必需”、“想要”和“旅行”等类别,找到之前被标记为类似的交易记录可以让LLM通过看过去相似数据点是如何分类的,从而帮助LLM做出正确的分类。
使用检索到的数据来修改提示文本:
在检索增强的环境中,提示包含了相关的检索示例,这些示例有助于大型语言模型更好地理解不同类别之间的决策边界。这样的增强提示可能如下所示:
# 指令
嘿,LLM,你是个分类器。
在分类时,参考之前标记的例子。
只需输出你的分类。
有这些类别:
{classes}
这里有一些之前标记的数据示例:
{retrieved_examples}
# 解决
这是需要分类的输入:
{input}
核心思想是,当LLM有相似的例子可以参考时,分类会变得更加容易和准确。
如何进行检索要实现RAC,你需要建立一个检索系统。检索可以根据实际情况采用不同的方式。一些选项包括:
- 基于嵌入的向量搜索:这涉及将您的数据转换为嵌入,并使用向量数据库来找到最相似的样本,这些样本是基于它们的语义意义。这对于像文本这样的非结构化数据特别强大,因为它可以捕捉到语义意义。
- 关键字搜索:如果您的数据缺乏语义意义,并且不需要嵌入的强大功能,简单的关键字搜索就可以完成任务。
- 混合搜索:可以结合两者的优势,利用混合方法结合向量和关键字搜索。
尽管有多种选择,向量搜索可能是将检索集成到你的流程中最简单的方式,特别是在使用像 Pinecone 这样的全托管服务时,它们会为你处理所有的基础设施问题。使用 Pinecone,这个过程只需几行 API 调用即可完成。
不管采用什么检索策略,检索系统都必须能够做两件事:
- 为您的数据建立索引
- 查找相似的数据
为了将所有部分整合起来,一个完整的 RAC 流程如下所示:
- 数据索引:你对标注过的样本进行索引。
- 输入:你将输入数据发送到检索系统。
- 检索:系统从预索引的数据中检索相关样本。
- 增强:这些样本被传递给LLM以增强提示。
- 分类:LLM利用输入数据及检索到的样本对数据进行更准确的分类。
就这么简单。一旦检索功能就位,你的大语言模型就不再是盲人摸象——它现在有了相关的上下文,这意味着会有更好的表现。
一个案例研究:个人交易分类案例研究:一个案例 交易数据简介信息我使用了一组自己的交易数据,这些数据被分类为以下标签:
- 资产:发现:基本需求:月需
- 资产:发现:基本需求:食品杂货
- 资产:发现:基本需求:汽油费
- 资产:发现:基本需求:其他
- 资产:发现:非必需品:月需
- 资产:发现:非必需品:其他
- 资产:发现:家具
- 资产:发现:未来的非必需品
- 资产:发现:旅行
这个任务属于训练数据之外的类别。这些类别是我个人设定的预算分类,这意味着这个数据与大型语言模型在训练过程中看到的数据有很大的不同。
每次交易代表了一个实际花费,我想要自动归类它们到这些类别中,用来预算。示例有4个字段,比如:
{
"vendor": "服务商",
"day": "04",
"amount": "16.04",
"from_account": "资产:发现:主:需求:月度"
}
测试数据缺少 from_account
这个字段,例如:
以下是Spotify的一笔交易详情:
{
"vendor": "SPOTIFY",
"日期": "09",
"金额": "11.76元",
}
我有130笔带标签的交易和57笔未标记的交易。
为了评估不同方法在这个分类任务中的效果,我进行了几个实验,使用零样本提示法、K近邻向量检索以及RAC来评估from_account
在57个未标注交易中的分类准确率。
对于我的检索系统,我上传了130个标注的交易到Pinecone的无服务器向量存储,用余弦相似度来衡量嵌入的距离。
评估:零样本零样本我首先测试了两个模型的零样本学习能力:GPT 4o-mini 和 GPT 4o 模型。
- GPT 4o-mini :准确率如预期一样低,为 38%,因为在没有额外背景信息或示例学习的情况下,GPT 4o-mini 将我的个性化类别进行映射显得困难。
- GPT 4o :表现更好,准确率达到 63%,这归功于GPT 4o更高级的语言理解和更广泛的知识。
这些结果表明零样本学习在特定领域分类任务上的局限性:虽然GPT 4o在处理一般类别上表现出色,但在处理个性化类别时,表现明显下降。
评价:基于向量检索的KNN在这次实验中,我使用检索系统从向量数据库中找到了找到的K个最相似的交易,并根据from_account
字段对未标记的交易进行了分类。换句话说,就是在检索到的相似交易集中,哪个from_account
最常见?这种方法纯粹依赖于检索系统,没有使用任何LLM调用。
- KNN:这种方法将准确率提升至64%。虽然与GPT 4o的零样本效果相比,这个提升并不明显,但它表明,仅通过检索相似的交易记录而不使用任何分类模型,就能比不带上下文信息的LLM取得更好的结果。
这种方法在更常见类别的交易中表现良好,因为类似的历史交易能提供有效的分类指导。然而,对于更个性化的类别,或是数据较少的类别,这种方法则显得不够有效,因为最近的相似案例往往不够明显,难以准确分类。
RAC审评然后,我实现了将RAC的结合,结合了向量检索和LLM分类。在这个设置中,我使用向量来检索类似的历史交易记录,然后并将检索到的内容输入LLM,以帮助做出更准确的分类。
- 带有RAC的迷你GPT 4o:准确率跃升到了85%。这一显著提升展示了上下文检索方法的强大之处。通过在让模型分类交易之前提供相关示例,LLM 在处理如“必需品”和“想要品”这类类别之间的细微差别时,比在零样本设置中表现得更好。
- 带有RAC的GPT 4o:有趣的是,这里达到了76%的准确率,低于迷你GPT 4o在同一设置中的表现。虽然GPT 4o从检索中受益,但它并没有像迷你GPT 4o那样表现出显著的进步。这令人意外。这可能是因为GPT 4o倾向于更多地依赖其内置知识库,在这种情况下导致了某些预测上的过度自信。
RAC 展现了其实力,尤其是在零样本LLM难以准确分类的情形下。通过向量检索提供的额外信息,成功区分了那些仅凭交易描述难以明确分类的交易。
RAC展示了一种低数据量和高度个性化的分类任务的实用解决方案,提供了比传统定制模型训练更加灵活和有效的替代方案。
未来,我们可以通过提高数据质量、优化检索技术和改进提示,进一步改进,从而更好地提高分类的准确度。
需要知道的几点成本效益:
RAC的一个主要优点是它的价格实惠。LLM API调用只需几分之一美分(几乎是零成本),而像Pinecone这样的服务还提供慷慨的免费层级,这让RAC的运行成本几乎可以忽略不计。你不需要花费时间和金钱来训练自定义模型或管理复杂的基础设施,这使得RAC非常适合个人项目或小规模部署。
精确性 vs. 人类监督:
在这份案例研究中,我使用GPT 4o-mini模型带有RAC功能达到了85%的准确率,这确实非常有用,但还不够完美。实际上,这意味着虽然RAC可以自动化大量的分类工作,但对于一些边缘情况或关键决策点,可能仍需要人工审核。
为了解决这个问题,我建议纳入一种机制,允许模型在不确定时“拒绝”提供分类。一种实际的方法是增加一个额外的类别:UNKNOWN
。
通过让大型语言模型在不自信于其分类时返回一个 UNKNOWN
标签,你可以建立一个更坚固的系统。这样可以将人力只用在模型拿不准的交易上。同时,大部分流程会自动完成。
如讨论过的,对于那些不适合训练自己的分类模型的场景,LLM是一个可行的选择。RAC增强了LLM的分类能力,在零样本LLM效果不理想的任务中表现出色。通过结合LLM的广泛知识和语言理解能力以及检索到的具体示例,RAC弥合了通用模型与特定任务之间的差距。
在这份案例研究中,RAC 显著提升了分类的准确度,特别是在零样本LLM难以处理的个性化类别问题上。检索提供的额外信息使LLM能够做出更明智的决定,有效地解决了训练数据之外的新问题。
使用如Pinecone这样的工具来实施RAC的简便性以及调用LLM API的经济性,使即使是较小的项目也能容易地访问。虽然没有完美的系统存在,但RAC在自动化和准确性之间找到了一个实用的平衡点。
我写了这篇文章来分享我的实验经历,并激发其他人也在他们的项目中探索RAC的巨大潜力。RAC的潜力是巨大的,我很想听听你们如何在项目中使用RAC的例子。
共同学习,写下你的评论
评论加载中...
作者其他优质文章