Tracks
当您需要将文本归入一个全新的类别,但手头连一个带标签的训练样本都没有时,会发生什么?
传统分类器这条路走不通。它们期望您为每个要预测的类别提供带标签的示例,这意味着在开始训练前,您要花上数周时间做标注。一旦出现新类别,您又得回去做标注。
零样本分类正是您该关注的方向。它跳过了整个标注步骤,让模型能够分配训练期间从未见过的标签。实际中,这意味着您可以将客户反馈分拣为“账单投诉”或“功能请求”等类别,而无需为任一类别准备任何训练示例。
本文将带您了解零样本分类的工作原理、它与传统及小样本方法的对比,以及如何使用 Hugging Face Transformers 将其应用到实际 NLP 任务中。
Hugging Face 究竟是什么?报名我们的 Hugging Face Fundamentals 学习路径,构建 AI 代理并微调 LLM。
什么是零样本分类?
零样本分类是一种机器学习方法,模型无需针对特定标签进行训练,也能为数据分配标签。
关键在于“零样本”。这意味着模型对于您要预测的类别,看到的训练示例是零。您给出一段文本和一个可能的标签列表,模型基于其已有的知识选出最匹配的标签。
这些知识都来自预训练。大型模型通过海量语料获得对语言与概念的广泛理解,当您让它对新事物进行分类时,它就依赖这些通用知识。
零样本分类如何工作
将流程拆解后就很简单,您只需四步:
-
输入文本或数据: 即您要分类的任何内容——客户评价、工单、新闻标题、文档片段。
-
提供候选标签: 给模型一份可能的类别清单。它们只是普通词语或短语,如
"product question"、"refund request"、"technical issue"或"general inquiry"。 -
模型评估输入与标签的关系: 模型逐个查看标签,并基于其对语言的预训练理解为匹配度打分。
-
选出最可能的标签: 返回得分最高的标签作为预测,通常也会给出每个候选的置信度分数。
核心在于您可以随时更换候选标签而无需重新训练。明天想增加新类别?把它加到列表里就行。如果您只做过监督学习,这会让人眼前一亮。
零样本分类 vs 传统分类
两种方法都解决同一问题(为数据分配标签),但路径不同。
传统分类
传统分类器通过带标签的示例来学习。您收集一个每条样本都标注了正确类别的数据集,在其上训练模型,模型据此学习区分各类别的模式。
这套方法行之有效已数十年,但有两大约束:
- 需要带标签的训练数据: 往往需要很多。数据收集与标注既费时又费钱,这两者都是最宝贵且有限的资源。
- 标签集合是固定的: 一旦模型训练完成,它只能预测训练中见过的类别。新增类别意味着回炉重训。
零样本分类
零样本则反其道而行。完全没有特定任务的训练步骤。模型利用预训练所学来评估您抛出的任意标签。
这带来两大优势:
- 无需特定任务训练: 完全跳过数据收集、标注与训练。
- 标签集合灵活: 可随时更改类别。新增、移除、重命名——模型都无需重训即可处理。
权衡取舍
这种灵活性并非无代价。若有扎实的带标签数据集,针对该任务训练的传统分类器通常会优于零样本模型。它见过您关心的确切样本,并已为之优化。
零样本模型是“通才”。它们面面俱到,但很少在某一项上称王。因此选择取决于您的需求。
如果您有带标签的数据,并且在一组固定类别上追求最高准确率,请训练传统分类器。如果您没有带标签数据,或类别经常变动,零样本是更快的可用方案。
基础模型与大语言模型(LLM)的作用
零样本分类之所以流行,是因为大型预训练模型的能力已足以胜任。
在基础模型出现之前,您无法仅提供一串从未见过的标签就期待模型给出合理预测。模型对语言了解不够深,无法建立关联。对海量语料的预训练改变了这一点。一款“读过”大量互联网文本的模型,早已在无数语境中遇到过“refund”或“complaint”等词,因此能将它们与新输入进行匹配。
如今大多数零样本流程主要依赖以下几类模型:
- BERT 及其变体: BERT 风格的模型在预训练中学习深层文本表示。RoBERTa、DeBERTa 等变体通过更好的训练方法与更大的数据集进一步提升。
- 基于 NLI 的模型: 这些模型在自然语言推理任务上进行微调。它们支撑着多数开箱即用的零样本流程,下一节我会解释原因。
- 现代 LLM: 如 GPT 系列或 Claude 等大型语言模型可通过提示实现零样本分类。您用自然语言描述任务,列出类别,模型从中选取。
共同点在于规模与通用性。为窄任务训练的模型只能做那一件事。在广泛文本上训练的模型则可被重定向到许多任务,而无需见过这些任务的带标签示例。
自然语言推理(NLI)与零样本分类
实际中您看到的大多数零样本分类器都是建立在 NLI 模型之上。这一点常让人惊讶,值得放慢脚步说明。
自然语言推理是一个独立任务。给定两句话(前提与假设),模型判断它们之间的关系。输出有三类:
- 蕴含(Entailment): 假设可由前提推导。
- 矛盾(Contradiction): 假设与前提矛盾。
- 中立(Neutral): 两句话无关,或信息不足以判断。
例如,若前提为 "The team finished the project two weeks early",假设为 "The team delivered on time",NLI 模型应预测为蕴含;若假设为 "The team missed the deadline",则应预测为矛盾。
事实证明,这个设置非常适配零样本分类。若将您的输入视为前提,就能把每个候选标签转化为一个假设。
假设您要将句子 "My package never arrived" 归入“物流问题”“账单问题”或“产品问题”三类之一。模型并不将它们视作标签,而是作为假设,通常包在一个简单模板中,如 "This text is about {label}":
-
前提:
"My package never arrived"| 假设:"This text is about a shipping issue" -
前提:
"My package never arrived"| 假设:"This text is about a billing issue" -
前提:
"My package never arrived"| 假设:"This text is about a product question"
NLI 模型会为每一对打分。蕴含分最高的假设胜出,该标签即为预测结果。
模型从未需要学习“物流问题”或“账单问题”作为标签的含义。它只需掌握一般性的“蕴含”长什么样,这在 NLI 微调过程中已学会。
这也是基于 NLI 的零样本为何表现出色的原因。模型在做自己训练的任务(判断蕴含),而您只是把分类问题表述为一系列蕴含判断。
零样本 vs 小样本 vs 微调模型
要让模型在不进行完整训练的前提下完成分类任务,零样本并非唯一方法。下面与替代方案做个对比。
零样本
零样本意味着完全没有示例。您向模型提供一个输入和一组候选标签,模型基于预训练所得作出预测。
模型从未见过与您任务相关的带标签数据。它完全依赖通用知识工作。
小样本
小样本会在提示中给模型几个示例。您展示 2、5、也许 10 个输入与正确标签的配对,然后请它以同样方式为新输入分类。
这里并未对模型进行再训练。它仍在使用预训练权重。这些示例只是参考——在请求预测前快速传达“这些类别我指的就是这个意思”。
微调
微调是一种专门的训练过程。您拿一个预训练模型,喂入与任务相关的带标签数据集,并更新其权重,直到它擅长预测您的特定类别。
在三者中这最重。您需要带标签数据、训练基础设施和时间。回报是模型将专门化于您的任务。
三者对比
三种方法在实践中关心的三点上有所不同:准确率、灵活性与成本。
| 准确率 | 灵活性 | 成本 | |
|---|---|---|---|
| 零样本 | 三者中最低,但对通用场景仍有不错表现 | 最高,可随时更改标签 | 最低,无需数据与训练 |
| 小样本 | 优于零样本,尤其在示例选择得当时 | 高,可在提示中更改示例与标签 | 低,只需少量示例 |
| 微调 | 在其训练任务上最高 | 最低,新类别需重训 | 最高,包含数据收集、标注与训练 |
零样本学习与替代方案对比
这张表里有几点值得重点指出。
准确率并非简单排序。当您拥有足够的带标签数据且任务稳定时,微调会胜出。但在一个全新且无示例可学的任务上,微调根本无从下手,零样本便成为唯一现实选择。
灵活性则方向相反。零样本允许您随时更改类别;微调模型则锁定在训练时的标签集合上。
成本最直观。零样本几乎不花搭建成本;小样本增加少量标注;微调本身就是一个项目,需要专门的基础设施。
多数团队的常见流程是先用零样本验证任务是否可行;若准确率不够,再转向小样本;若仍不理想且任务重要,则进行微调。
零样本分类在 NLP 中的应用
零样本分类广泛出现在 NLP 流程中,尤其是在难以获得带标签数据或类别不断变化的场景。以下是最常见的应用。
情感分析
情感分析是教科书式的起点。您向模型输入一段文本,让它在 "positive"、"negative" 与 "neutral" 等标签中选择。
更有意思的是,它很容易突破这三个标准类别。传统情感分类器受限于训练所用的标签集合。用零样本,您可以用更细的标签,如 "frustrated"、"satisfied"、"confused" 或 "excited",模型无需重训即可处理。这对产品反馈或社媒监测很有帮助,因为您关心的情绪类别取决于具体语境。
主题分类
主题分类将文档按主题领域分拣。比如新闻按 "politics"、"sports"、"technology"、"finance";工单按 "billing"、"shipping"、"account access"、"feature request"。
零样本让这件事的搭建变得轻而易举。您不必为每个新主题准备带标签数据集。若产品上线新功能,想追踪相关工单,只需把 "new feature feedback" 加入候选标签列表即可。
意图识别
意图识别用于判断用户想做什么。它是多数聊天机器人和语音助手的引擎。当有人输入 "I need to change my password",模型需要识别其意图为 "password reset",而不是 "general security question"。
这正是零样本大显身手的地方。真实产品会不断新增用户意图,若每次产品团队加个功能就重训一次意图分类器,工作量很大。零样本让您无需改动模型就能保持意图列表的时效。
内容审核
内容审核用于标记有问题的文本——例如 "hate speech"、"spam"、"harassment" 或 "misinformation"。平台必须不断更新政策,随着新型滥用出现,类别也会变化。
零样本在此非常契合。审核团队可在政策演进时调整标签定义或新增类别,而无需再麻烦工程团队重训。通常它会与传统分类器搭配使用:传统方法覆盖高频场景,零样本处理那些样本稀缺、无法训练的长尾类别。
使用 Hugging Face Transformers 进行零样本分类
Hugging Face 的 transformers 库是在 Python 中体验零样本分类的最简便方式。pipeline API 几乎屏蔽了所有模型加载工作,让您用几行代码就从零到预测。
第一次运行下面的代码片段时会下载模型,因此会花些时间。
以下是可直接运行的完整示例:
from transformers import pipeline
from pprint import pprint
# Load a zero-shot classification pipeline
classifier = pipeline(
"zero-shot-classification",
model="facebook/bart-large-mnli"
)
# The text you want to classify
text = "My package never arrived and customer support hasn't responded in three days."
# The labels you want the model to choose from
candidate_labels = [
"shipping issue",
"billing issue",
"product question",
"general inquiry"
]
# Run the classification
result = classifier(text, candidate_labels)
pprint(result)
输出是一个包含三项的字典:原始输入、按可能性从高到低排序的候选标签,以及每个标签的置信度分数。

Pipeline 输出
"shipping issue" 以 0.82 的置信度胜出。模型在训练中从未见过“物流投诉”的带标签样本,但它依靠经 NLI 数据微调的预训练模型 bart-large-mnli 做出了判断,正如前文所述。
这个流程有几点值得注意:
-
该模型是 NLI 模型:
bart-large-mnli是在 MultiNLI 数据集上微调的 BART。调用 pipeline 时,它会在幕后把您的标签转换为假设并送入模型。 -
您可随时更改标签: 模型无需任何改动。更换
candidate_labels列表即可按不同类别进行分类。 -
多标签只需一个开关: 调用时设置
multi_label=True,各标签将不再互相竞争。每个标签得到独立概率,因此单个输入可隶属多个类别。
result = classifier(text, candidate_labels, multi_label=True)
pprint(result)

多标签输出
流程就这么简单。加载 pipeline,定义标签,调用分类器。比从零构建一个分类模型快得多,也容易得多。
零样本分类的常见误区
零样本分类很容易上手,也因此很容易被误用。以下是在真实项目中最常见的错误。
选择模糊的标签
标签是您与模型沟通任务的方式。标签越模糊,预测就越模糊。
"good" 与 "bad" 无助于模型理解。"customer is happy with the product" 与 "customer is reporting a problem with the product" 则能提供更多信息。您的标签越像有意义的短语,模型就越能将其与输入匹配。
另请避免重叠标签。若 "complaint" 与 "negative feedback" 同时出现在候选列表中,模型会在两者间分散置信度,导致都难以成为明确赢家。
假设零样本能匹敌微调性能
这是最常见的误区。零样本表现不错,但并非魔法。
在您的特定任务上,使用几千条带标签样本进行微调的模型几乎总能胜过零样本模型。若零样本准确率为 85%,而生产需要 95%,再怎么调整标签也难以抹平差距。此时答案就是微调。
当您没有带标签数据、类别经常变动,或者“够用就好”时,请使用零样本。别仅因它搭建更快就选它,然后在高风险任务上表现不佳时感到意外。
在过于狭窄的数据集上评估
常见情形是:您构建了一个零样本分类器,在自己编的 50 个示例上测试,全部命中。上线后,一到生产环境大家就开始抱怨效果很差。
您写的 50 个示例并不代表真实用户会提交的内容。它们更干净、更直观,也更符合您对类别的理解。请在与模型实际将看到的数据相似的样本上评估——用户生成文本,包含错别字、俚语和边界案例。若暂时没有这些数据,请先抽取几百条真实输入并手工标注再相信指标。
忽视领域特定语言
通用零样本模型懂的是通用语言。它们不了解您行业的行话。
医学术语、法律语言、金融缩写、工程规范,都有狭窄的词汇。预训练模型可能见过,但不够深入。若让通用零样本模型去分类充满 ICD-10 代码或 SQL 错误的句子,结果恐怕参差不齐。
您有两种选择。要么将标签改写成模型更可能理解的通俗语言,要么换用在您领域文本上预训练的模型。面向医学文本的 BioBERT、面向金融文本的 FinBERT 等领域模型往往在专业任务上优于通用模型。
为什么零样本分类在现代 AI 中很重要
零样本分类清晰地展示了基础模型如何改变了 AI 的可能性边界。
十年前,每个分类任务都从同一个问题开始:我们有带标签数据吗?如果没有,如何获得?标注项目耗时数月,需要预算、供应商协作与质控。在数据到位前,模型甚至无从构建。
这个前提已不再成立。
在广泛文本上训练的基础模型已经足够理解语言,一旦您描述清任务,它就能立即处理新的分类任务。您唯一需要定义的是标签列表。
这种转变之所以重要,是因为它与更大的 AI 趋势相呼应:
- 它展示了基础模型的真正用途: 大规模预训练的目的在于构建足够通用的模型,使其无需再训练即可被重定向到多种任务。零样本分类是这一承诺最干净的实证之一。
- 它削弱了对监督数据集的依赖: 带标签数据仍然有用,但不再是打造可用分类器的必需品。没有标注预算的团队也能上线有价值的 AI 功能。
- 它改变了部署速度: 过去要一个季度才能发布的分类功能,如今一个下午就能做出原型。这会影响团队的产品选择,因为尝试的成本几乎降为零。
更广泛的趋势是从特定任务模型向通用模型迁移。微调仍有一席之地,某些任务也仍需从零训练。但默认起点已改变。您会先选择预训练模型,仅在数据支撑时再做专门化。
结语
零样本分类提醒我们:如今并非每个机器学习问题都需要单独训练一遍。一个已经理解语言的模型,只需更换您提供的标签,就能被重定向到一个新任务。无需示例,也无需微调。
这种灵活性正是其价值所在。您今天关心的类别,可能下个月就变了,而零样本模型允许您随时调整。
因此,在启动数据标注项目之前,先跑一个零样本基线。您会在一个下午内知道任务是否已解决、部分解决,还是仍需更重的方法。也就这么简单。
如果您刚接触 LLM,请报名我们的 Large Language Models (LLMs) Concepts 课程。它将带您系统了解 LLM 应用、训练方法及最新研究。
常见问题
用通俗的话讲,什么是零样本分类?
零样本分类是一种无需在特定标签上训练模型也能为文本分配标签的方法。您向模型提供一个输入和一份可能的类别清单,它会基于预训练所学选择最匹配者。“零”指的是每个类别所需的训练示例数量——为零。
什么时候该用零样本分类,而不是自己训练模型?
在试探性探索、缺少带标签数据、类别经常变化或需要快速交付原型时,请使用零样本。它也适合用于探索阶段,当您仍在确定该有哪些类别时。如果您的标签集合稳定且拥有足够的带标签样本,微调传统分类器通常能带来更好的准确率。
零样本分类有多准确?
准确率取决于所用模型、标签是否清晰、以及任务与通用语言理解的契合度。在定义清晰的任务上,零样本模型的表现可能从“稳健”到“可用于生产”,但几乎总会败给在同一任务上使用足量带标签数据微调过的模型。将零样本视为强力基线。
零样本分类与 NLI 有何不同?
自然语言推理(NLI)是一项任务,模型判断一句话是否蕴含、矛盾或与另一句话中立。零样本分类在幕后使用 NLI 模型作为引擎:您的输入成为前提,每个候选标签会被转成一个假设。获得最高蕴含分的假设对应的标签胜出。
零样本分类能用于非英语文本吗?
可以,但需要多语言模型。诸如 xlm-roberta-large-xnli 之类的模型在多语言 NLI 数据上训练,能处理数十种语言的零样本分类。对于英文文本,使用 bart-large-mnli 等仅支持英文的模型;当输入不是英文时,请切换到多语言变体。