文本分类这件事做了这些年我最大的感受是真正卡住人的往往不是模型本身而是标注数据。一个业务场景刚起来的时候谁手里都没有几千条带标签的样本可需求方明天就要看效果。早几年遇到这种情况基本只能硬着头皮先人工标一批或者退而求其次用规则凑合。大语言模型出来之后情况变了——不训练、直接拿预训练模型做分类也就是常说的 Zero-Shot成了很多人第一反应会去尝试的路子。但我要先把话说在前面Zero-Shot 分类不是银弹它优雅的地方很优雅坑也很深。这篇是用大语言模型做文本分类系列的中篇专门聊 Zero-Shot 这条路。我会把它的原理讲清楚把提示词怎么写、标签怎么设计、结果怎么评估这些实操细节掰开揉碎也会重点讲那些我踩过的、文档里不会写的坑。如果你手上正好有一个没有标注数据的分类任务或者你已经试过 Zero-Shot 但效果忽好忽坏摸不着头脑这篇应该能帮你少走不少弯路。1. 为什么不训练这件事本身就值得认真对待1.1 从有监督到零样本的思维转变传统文本分类的流程大家闭着眼睛都能背出来收集数据、人工标注、划分训练测试集、选模型、调参、上线。这条链路里标注是成本最高、最不可控的一环。我见过一个团队为了做一个工单分类前后标了三轮数据每轮都要跟业务方反复对齐标签口径光沟通成本就拖了两个月。等模型终于上线业务规则又变了标签体系得推倒重来。Zero-Shot 的核心思路是把分类任务重新表述成一个语言理解任务让模型直接根据它对世界的理解来判断一段文本属于哪个类别而不需要看任何标注样本。这里的关键转变在于我们不再问模型你从数据里学到了什么规律而是问模型你本来就知道些什么。预训练阶段模型读过海量文本它已经内化了大量关于语义、常识、领域概念的知识Zero-Shot 就是想办法把这些知识问出来。这个转变听起来简单但它彻底改变了我们对模型能力的评估方式。有监督模型的能力上限取决于标注数据的质量和覆盖度而 Zero-Shot 的能力上限取决于模型预训练时见过多少相关概念以及我们能不能把任务描述得让模型听得懂。所以你会发现同一个模型换个提示词写法效果可能天差地别——这不是模型不稳定而是我们提问的方式在起作用。1.2 Zero-Shot 真正解决的三个现实问题第一个问题是冷启动。新业务、新场景、新标签体系一条标注数据都没有的时候Zero-Shot 能让你在几小时内拿到一个可用的基线。这个基线可能只有 70 分但它能让你先跑通流程、先给业务方看到东西、先验证标签体系合不合理而不是卡在没数据这一步动弹不得。第二个问题是标签体系频繁变动。有些业务场景的标签是动态的今天加一个退款咨询明天拆成退款进度和退款政策。有监督模型每次都要重新标注、重新训练而 Zero-Shot 只需要改提示词里的标签列表几分钟就能适配。这种灵活性在快速迭代的业务里价值极高。第三个问题是长尾类别。有监督模型对样本少的类别往往表现很差因为模型没见过几个例子。但 Zero-Shot 不依赖样本数量只要模型理解这个类别的语义它就能判断。我做过一个实验某个只有个位数样本的稀有类别有监督模型几乎完全识别不出来但 Zero-Shot 靠类别的语义描述反而能抓到一部分。提示Zero-Shot 最适合的场景是快速验证 冷启动基线 动态标签而不是追求极致精度。如果你的任务已经有大量高质量标注数据老老实实做有监督微调别硬上 Zero-Shot。1.3 一个容易被忽略的前提任务本身得可描述不是所有分类任务都适合 Zero-Shot。这里有个隐藏前提你的分类标准必须能用自然语言清楚地描述出来。比如情感分类——正面、负面、中性这个谁都能说清楚Zero-Shot 表现通常不错。但如果是判断这条工单是否属于 A 类故障而 A 类故障的定义是一堆内部规则和阈值的组合那 Zero-Shot 就很难做好因为模型根本不知道你内部的判定逻辑。我踩过这个坑。有一次做一个内部风险等级分类标签是高、中、低我以为很简单结果 Zero-Shot 效果一塌糊涂。后来才发现我们内部对高风险的定义涉及金额、频次、历史行为等一堆规则这些规则模型完全不知道它只能靠字面语义猜自然猜不准。这种情况下要么把规则显式写进提示词要么就别用 Zero-Shot。所以判断一个任务适不适合 Zero-Shot我一般会问自己一句话如果我把这个分类标准讲给一个刚入职的聪明新人听他能不能只靠这段描述就做出判断能那 Zero-Shot 大概率可行不能那说明分类标准本身依赖大量隐性知识Zero-Shot 会很吃力。2. Zero-Shot 分类的底层机制模型到底在做什么2.1 从续写到判断提示词如何改变任务形态大语言模型的本质是根据上文预测下文。它本身不会分类分类是我们通过提示词构造出来的任务形态。理解这一点非常关键因为它解释了为什么提示词写法对结果影响这么大。最朴素的 Zero-Shot 分类提示词长这样请判断下面这段文本的情感倾向只回答正面、负面或中性。 文本这家店的服务态度特别好下次还会来。 情感模型看到情感后面应该接什么它会基于预训练时见过的海量文本 情感标签的模式续写出正面。整个过程本质上是模式补全而不是我们直觉上的逻辑推理。这就带来一个重要推论提示词的措辞越接近模型预训练时见过的模式效果越好。比如情感分析这个词模型见得多情绪极性判定就相对少见正面/负面这种标签词模型见得多积极倾向/消极倾向就相对少见。这不是玄学而是模型对高频模式的记忆更强。2.2 标签词的选择为什么比你想的重要很多人做 Zero-Shot 分类标签词随手一写结果效果不好就怪模型。其实标签词的选择是 Zero-Shot 里最容易被低估的变量。我做过一组对比实验同一个情感分类任务只改标签词标签词方案准确率说明正面 / 负面 / 中性82%最常见模型最熟悉积极 / 消极 / 中立79%略低但差距不大好评 / 差评 / 中评74%偏口语模型理解有偏差满意 / 不满意 / 一般71%语义偏移把中性理解成一般可以看到标签词从正面/负面换成满意/不满意准确率掉了 11 个百分点。原因在于满意和正面的语义边界不一样——这家店还行吧算满意还是不满意模型会犹豫。而正面/负面的边界更清晰。我的经验是标签词要满足三个条件语义边界清晰、模型高频见过、彼此互斥。如果两个标签词在语义上有重叠模型就会在边界样本上反复横跳。比如咨询和投诉很多文本既像咨询又像投诉这时候要么合并标签要么在提示词里给出明确的区分标准。2.3 温度参数与输出稳定性Zero-Shot 分类有个很烦人的问题同样的输入跑两次结果可能不一样。这通常跟温度参数temperature有关。温度越高模型输出越随机温度越低输出越确定。做分类任务我一般把温度设成 0 或接近 0让模型每次都选概率最高的那个标签。但要注意即使温度设成 0由于底层实现的浮点运算和批处理差异结果也不保证 100% 一致。如果你需要完全可复现的结果得固定随机种子并且尽量单条推理而不是批量推理。还有一个更隐蔽的问题模型可能不按你给的标签回答。你让它从正面/负面/中性里选它可能回一句这段文本整体偏正面但也有一些负面因素。这时候你需要做输出解析把自由文本映射回标签。我的做法是在提示词里加一句只输出标签词不要输出其他内容并且在解析时做兜底——如果匹配不到任何标签就标记为待人工确认而不是随便猜一个。3. 提示词工程Zero-Shot 分类的胜负手3.1 三种提示词模板的实战对比做 Zero-Shot 分类提示词模板基本逃不出三种形态我分别说说它们的适用场景和实测效果。第一种直接指令式。请判断以下文本的类别类别只能是[科技, 体育, 财经, 娱乐]之一。 文本xxx 类别这种最简单适合标签少、语义清晰的场景。优点是提示词短、推理快、成本低。缺点是模型容易想太多尤其是标签之间有语义关联时。第二种角色扮演式。你是一名资深新闻编辑擅长给文章分类。请阅读下面的文章从[科技, 体育, 财经, 娱乐]中选出最合适的一个类别。 文章xxx 类别加上角色设定后模型会调用更多编辑视角的知识对领域性强的任务有提升。我实测在新闻分类上角色扮演式比直接指令式高 3 到 5 个百分点。但角色设定不能乱加加一个不相关的角色反而会干扰。第三种思维链式。请判断以下文本的类别。先分析文本的主题和关键信息再给出类别。 类别选项[科技, 体育, 财经, 娱乐] 文本xxx 分析 类别思维链让模型先想再答对复杂文本、边界样本有明显帮助。代价是推理成本翻倍甚至更多因为模型要生成更多 token。我的建议是简单任务别用思维链复杂任务、边界模糊的任务再用。3.2 少样本示例Zero-Shot 和 Few-Shot 的边界严格来说一旦你在提示词里放了示例就不再是 Zero-Shot 了而是 Few-Shot。但实际工作中这个边界很模糊很多人说的Zero-Shot其实偷偷放了一两个示例。我的观点是如果效果不够别死守 Zero-Shot 的教条放几个示例往往能救回来。我做过对比一个四分类任务纯 Zero-Shot 准确率 76%每个类别放 2 个示例后升到 88%。这 12 个百分点的提升成本只是提示词变长了一点。但放示例有讲究。示例要覆盖边界情况而不是只放典型样本。比如情感分类如果你只放太好了和太差了这种极端例子模型对中性样本还是没概念。放一两个还行吧说不上好也说不上坏这种边界样本效果提升更明显。还有一个坑示例的顺序会影响结果。模型对提示词末尾的内容更敏感如果你把某个类别的示例都放在最后模型可能会偏向这个类别。我的做法是打乱示例顺序或者每个类别轮流放。3.3 提示词里的防作弊设计Zero-Shot 分类有个隐蔽的失败模式模型会利用提示词里的捷径来猜答案而不是真的理解文本。比如你给的标签是正面/负面而文本里恰好有不字模型可能就靠这个字判断而不是理解整句话。防范这种问题我一般做两件事。第一在提示词里明确要求模型基于整体语义判断比如加一句请综合考虑文本的整体含义不要只依据个别词语。第二构造对抗性测试集故意放一些字面有正面词但整体是负面的样本看模型会不会被骗。如果被骗得厉害说明模型在走捷径需要调整提示词。还有一个更隐蔽的捷径标签词的顺序。如果你把正面放在第一个模型可能倾向于选第一个。这个偏差在小模型上更明显。我的做法是每次评估都换一下标签顺序看结果是否稳定。如果换个顺序结果就大变说明模型没真正理解任务。4. 标签体系设计Zero-Shot 效果的天花板4.1 标签粒度太粗和太细都是灾难标签体系设计直接决定 Zero-Shot 的效果上限。我见过太多人在这上面翻车。标签太粗模型区分不开。比如把咨询、投诉、建议、表扬四个类别合并成反馈和非反馈那 Zero-Shot 当然容易但业务上没意义。标签太细模型也区分不开。比如把投诉拆成产品质量投诉、服务态度投诉、物流投诉、售后投诉、价格投诉五个细类很多文本同时涉及多个模型根本没法单选。我的经验法则是Zero-Shot 场景下标签数量控制在 3 到 8 个之间且任意两个标签的语义距离要足够大。如果两个标签连人都容易混淆别指望模型能分清楚。判断两个标签是否语义距离足够大我会做个小测试找 10 条文本让一个不了解业务的人只看标签名去分类如果他能分对 8 条以上说明标签设计合格如果他自己都分不清那模型更分不清。4.2 标签描述给模型划重点Zero-Shot 的一个优势是你可以在提示词里给每个标签加描述帮模型理解边界。这在标签名本身不够清晰时特别有用。类别定义 - 咨询用户询问信息、寻求帮助但没有表达不满 - 投诉用户明确表达不满要求解决问题或赔偿 - 建议用户提出改进意见语气平和不涉及具体问题 - 表扬用户对产品或服务表达肯定和感谢加上这段描述后模型对咨询和投诉的区分明显更准了因为描述里点出了关键差异——是否表达不满。但标签描述不能写太长。我试过给每个标签写三四句话的描述结果模型反而糊涂了因为它抓不住重点。每个标签的描述控制在一句话点出最核心的区分特征就够了。描述里最好包含不是什么因为排除法往往比正面定义更有效。4.3 互斥性与完备性两个必须检查的坑标签体系有两个经典问题不互斥和不完备。不互斥是指一条文本可以同时属于多个标签。比如退款咨询既像咨询又像售后。Zero-Shot 默认是单标签分类遇到这种文本模型会纠结。解决办法有两个要么在提示词里明确如果同时符合多个类别选最贴近的一个要么改成多标签分类让模型输出所有符合的标签。不完备是指有些文本不属于任何标签。比如你定义了咨询/投诉/建议/表扬结果来了一条测试消息它哪个都不属于。如果不处理模型会硬塞进某个类别。我的做法是永远加一个其他或无法判断类别给模型一个弃权的出口。这个类别的样本量能反映你的标签体系覆盖度——如果其他占比很高说明标签体系需要调整。注意加其他类别后要定期看其他里都是些什么文本。如果发现某类文本反复出现说明它应该被单独设为一个标签而不是一直丢在其他里。5. 评估与调优怎么知道 Zero-Shot 到底行不行5.1 没有标注数据怎么评估这是 Zero-Shot 最尴尬的地方你之所以用 Zero-Shot就是因为没标注数据但评估又需要标注数据。这是个鸡生蛋的问题。我的解法是分层抽样人工评估。从待分类数据里随机抽 100 到 200 条人工标一遍作为评估集。这个量不大一个人一两个小时能标完但足够看出模型的大致水平。注意抽样要分层——如果某些类别在数据里占比很低要刻意多抽一些否则评估集里全是头部类别看不出长尾表现。评估指标上别只看准确率。准确率在类别不平衡时会骗人。比如 90% 的文本都是咨询模型全猜咨询也有 90% 准确率但毫无价值。我一般看三个指标整体准确率、每个类别的召回率、混淆矩阵。混淆矩阵特别有用它能告诉你模型到底把哪些类别搞混了从而指导你改提示词或调标签。5.2 错误分析从混淆矩阵里找线索拿到混淆矩阵后别急着调参先做错误分析。我会把分错的样本一条条看过去归类成几种错误模式。常见的错误模式有边界模糊文本本身就在两个类别之间、标签理解偏差模型对某个标签的理解和你不一致、提示词歧义提示词表述让模型误解、文本质量差输入本身太短或太乱。这几种模式的解法完全不同。边界模糊要靠调整标签体系或加示例标签理解偏差要在提示词里加描述提示词歧义要改措辞文本质量差要考虑加预处理或直接过滤。如果不做错误分析盲目调提示词很可能改了半天没改到点子上。我印象很深的一次某个类别召回率特别低我以为是提示词问题改了好几版都没用。后来看错误样本才发现这个类别的文本普遍很短只有几个字模型信息不够判断。解决办法是把这个类别的判断逻辑写得更具体并且在提示词里说明短文本也要认真判断。改完之后召回率上来了。5.3 提示词迭代的正确姿势调提示词最忌讳的是凭感觉改。我见过有人一天改十几版提示词改到最后自己都忘了哪版是哪版效果也没提升。我的做法是建立提示词版本管理。每改一版记录改了什么、评估结果如何。这样能看出哪些改动有效、哪些无效。具体来说我会维护一个表格版本改动内容准确率备注v1基础指令式76%基线v2加标签描述81%明显提升v3加角色设定83%小幅提升v4加思维链82%反而降了成本还高v5每类加2示例88%提升最大有了这个表你就能清楚地看到每个改动的边际收益。v4 那种加了反而变差的改动就该果断放弃而不是因为思维链听起来高级就硬留着。还有一点每次只改一个变量。如果你同时改了标签描述和示例效果提升了你也不知道是哪个起的作用。一次改一个才能归因。6. 那些文档里不会写的坑6.1 模型对否定和反讽的天然盲区Zero-Shot 在否定句和反讽句上的表现普遍比有监督模型差。原因还是那个——模型靠模式补全而否定和反讽恰恰是字面意思和真实意思相反的模式训练数据里这类样本相对少。我测试过一组样本这服务真是好得没话说反讽Zero-Shot 大概率判成正面。解决办法是在提示词里明确提醒注意识别反讽和否定表达判断真实情感倾向。加了这句之后反讽样本的准确率能提升一些但别指望完全解决。如果业务里反讽样本很多还是得靠有监督微调。6.2 长文本的信息稀释问题文本越长Zero-Shot 效果越容易下降。因为模型要在长文本里抓关键信息而关键信息可能只占一小部分。我做过测试同样的分类任务短文本50 字以内准确率 85%长文本500 字以上掉到 68%。应对办法有两个。一是先摘要再分类用模型把长文本压缩成几句话再分类。二是在提示词里引导模型关注关键部分比如请重点关注文本中描述问题性质的部分。第一种办法效果更稳但多了一步推理成本更高。6.3 领域术语和黑话的处理通用大模型对垂直领域的术语和黑话理解有限。比如某些行业内部简称、缩写模型可能完全不知道是什么意思。这时候 Zero-Shot 会瞎猜。我的做法是在提示词里加一个术语表把关键术语解释清楚。比如术语说明 - 工单指用户提交的服务请求 - 闭环指问题已解决并确认 - 升级指问题被转交给更高级别处理这个术语表不用很长把最容易造成误解的几个词解释清楚就行。实测下来加了术语表后领域分类任务的准确率能提升 5 到 10 个百分点。6.4 成本与延迟的现实考量Zero-Shot 不是免费的。每次分类都要调用模型token 消耗和延迟都是实打实的成本。如果你的数据量大、实时性要求高Zero-Shot 可能根本不划算。我算过一笔账一个中等长度的提示词加文本大概 500 token如果每天要分类 10 万条那就是 5000 万 token。这个量级的成本可能比训练一个小模型还高。所以我的建议是Zero-Shot 用来做冷启动和验证一旦验证可行、数据量上来了就该考虑蒸馏成小模型或者做有监督微调。别把 Zero-Shot 当成长期方案它更像是过渡期的拐杖。延迟方面Zero-Shot 单条推理通常在几百毫秒到几秒之间取决于模型大小和输出长度。如果业务要求毫秒级响应Zero-Shot 基本没戏得用专门的小模型。7. 从 Zero-Shot 到 Few-Shot 再到微调一条务实的演进路线7.1 什么时候该升级Zero-Shot 用了一段时间后你会面临一个选择继续优化提示词还是升级到 Few-Shot还是干脆做微调。我的判断标准是看边际收益。如果改提示词还能带来明显提升比如每次改动有 3 个百分点以上那就继续优化提示词。如果改了好几版提示词效果卡在某个水平上不去了那就该考虑加示例Few-Shot。如果加了示例还是不够而且你已经有了一批标注数据那就该做微调了。这个演进路线不是线性的而是根据数据量和效果需求动态调整的。我一般会同时维护几个方案用同一套评估集对比选性价比最高的那个。7.2 用 Zero-Shot 辅助标注一个被低估的用法Zero-Shot 除了直接做分类还有一个很实用的用法辅助人工标注。让模型先跑一遍人工只需要审核和修正而不是从零开始标。这样标注效率能提升好几倍。具体做法是模型给出预测标签和置信度人工重点看低置信度的样本高置信度的快速过一遍。我实测下来这种方式比纯人工标注快 3 到 5 倍而且标注质量不差因为人工是在模型判断的基础上做修正有参照物。用这种方式积累一批标注数据后就可以做微调了。所以 Zero-Shot 和微调不是对立的而是可以衔接的——Zero-Shot 帮你冷启动同时帮你攒数据攒够了就微调。7.3 混合策略不同类别用不同方法实际业务里我很少用单一方法。更常见的做法是混合头部类别样本多用微调模型长尾类别样本少用 Zero-Shot边界模糊的样本走人工审核。这种混合策略的关键是路由——怎么决定一条文本走哪条路。我的做法是用置信度做路由模型置信度高就走自动置信度低就走人工或走另一套方法。这样既保证了整体效率又保证了关键样本的准确性。说到底Zero-Shot 是工具箱里的一件工具不是全部。它的价值在于让你在没数据的时候也能动起来而不是让你永远不用数据。真正成熟的分类系统往往是多种方法配合的结果。我在实际项目里的体会是Zero-Shot 最大的价值不是它当下的准确率而是它让你能快速试错、快速验证标签体系、快速攒下第一批标注数据。把它当成一个启动器而不是终点站心态就对了。至于那些提示词技巧、标签设计、错误分析的方法都是在使用过程中一点点磨出来的没有哪本书能一次讲全多跑几轮、多看错误样本自然就有感觉了。