零样本学习

Zero-Shot Learning (Zero-Shot)

Zero-Shot 零样本学习指直接让一个通用预训练大模型处理它从未专门训练过的新任务,不给任何示例(Zero-Shot = 0 Examples);这是 2020 年 GPT-3 惊艳世界的核心能力之一。

详细解释

零样本学习(Zero-Shot,简写 0S / ZS)Few-Shot(少样本)是一对兄弟,是大模型最神奇的”In-Context Learning(ICL,上下文学习)“能力的两种展示方式。

概念类比(教模型做电影评论情感分类:正面/负面):

模式你给模型的内容效果与成本
Zero-Shot“下面这句话的情感是正面还是负面?请只回答一个词:“电影太精彩了,我会推荐给朋友。”什么示例都不给,纯靠模型”通用能力”猜;成本最低,但小模型容易翻车。
One-Shot(1 样本)同上,但先给一个例句和正确答案。给一个范例,准确率上升 10–20%。
Few-Shot(3–8 样本)给 3–8 个”例句→情感”的范例。黄金标准,大多数 2025 年的场景 Few-Shot + 好的 prompt 就能做到 90% 左右准确率,不用花 微调 的钱。
微调 Fine-Tuning几千到几万对标注数据,走训练流程。最高,最后 10% 的提升靠它。

Zero-Shot 为什么能”没学过就能做”? 没人 100% 搞清楚(这就是 ICL 之谜,仍是 2025 年学术界热门研究方向)。但主流假说有三个:

  1. 预训练数据的”隐式重复”:GPT 训练时没学过”电影评论三分类”这个 exact 任务,但它在海量网页里见过”这部电影太棒了”→“值得推荐”之类的统计关联——本质是在”任务描述 + 数据点”的形式模式上做泛化。
  2. 指令微调 Instruction Tuning:LLaMA 1 原始版本 Zero-Shot 很烂,之后用几十万条自然语言指令微调后变成 LLaMA 2-Chat,Zero-Shot 能力飙升。现在你用的所有 Chat 版本模型,几乎都做过 Instruction Tuning——等于它在训练阶段已经”做过几万道类似的任务题”了,你现在给的新题只是换了个马甲。
  3. 大模型涌现(Emergent Ability):参数数量超过某个阈值(约 60B)之后,Zero-Shot 准确率突然跳涨(类似量变→质变),所以大模型 Zero-Shot 强、小模型 Zero-Shot 弱。

什么时候 Zero-Shot 够用,什么时候要 Few-Shot / FT?

场景特征推荐方案备注
任务简单(分类类目 3 类以内,描述清晰)Zero-Shot 先试80% 场景够用了
输出格式严格(JSON 结构、特定字段)Zero-Shot + 结构化输出 JSON Mode不要靠 prompt 猜格式,强制 JSON Schema
中等难度、有明确的”典型”例子Few-Shot(3–8 examples)性价比最高花 1 小时标几个例子,收益比 Zero-Shot 大
边缘情况多、准确率要求 95%+Few-Shot → 失败集分析 → 再 DPO / 微调按迭代走,不要一上来就 FT
输出风格必须和你家品牌完全一致微调(SFT + QLoRA风格对齐靠 Few-Shot 很难做到 100%
推理成本敏感、高吞吐场景Zero-Shot 或 1-Shot(token 省)Few-Shot 每个请求要拼 5 个例子,ITPM 涨好几倍

唯元智创 控制台有个”Prompt 调参实验室”:同一个 Prompt,同时跑 Zero-shot / Few-shot(3) / JSON-Mode / 3 个不同模型,一起出结果对比,哪个好用哪个,不用一次次手动切。

Zero-Shot 写 Prompt 的三条黄金建议

  1. 把任务描述写在最前面,用冒号或标题分开: ❌ “请帮我处理以下内容:xxx xxx”(模型不知道怎么处理) ✅ “任务:从下面这段客户对话中提取客服工单的 3 个字段(用 JSON 输出):product_name(产品名)、complaint_type(投诉类型,枚举:质量/物流/售后/其他)、priority(优先级 1-5,5 最高)。现在开始:客服:您好这里是…客户:…”
  2. 用分隔符把”输入数据”包起来,避免边界混淆: ✅ """三引号包裹"""--- 分隔线 ---<content>...</content> XML 标签都行,告诉模型”这一段是输入,不是指令”。
  3. 明确输出格式,不要让它猜: ✅ “只输出 JSON,不要解释、不要额外文字、不要 Markdown 代码块”(模型经常画蛇添足给你加一段解释)。

常见问题

Zero-Shot 效果比 Few-Shot 差很多,为什么大家还爱用?
两个理由:(1)便宜。每个请求少带 5 个例子,输入 token 省 80%,高吞吐 qps 下一年几十万省下来了;(2)工程简单。维护 Few-Shot 示例集是有成本的:任务一改,示例也要一起改,还容易有人改漏了造成线上回归。Zero-Shot 就一个 prompt 文件,改动面小,好维护。建议流程:先上 Zero-Shot,线上跑起来之后把失败 case 收集起来做评测集,再拿评测集去看:给 Few-Shot 的边际收益能不能覆盖示例维护和 token 成本,能就加,不能就维持。
为什么小模型(7B 以下)Zero-Shot 很不稳定?
两个原因叠加:(1)参数规模没到”涌现”的坎,ICL(上下文学习)能力本来就弱;(2)小模型经常没做指令微调就直接发出来,原版 7B Base 是”续写模型”,你给它一个”请对以下文本做摘要”它就会傻傻地续写”对以下文本做摘要。。。“,而不是真的执行这个任务。解决方案:小模型一律用 -Chat/-Instruct 版本,再搭配 Few-Shot 模板,稳定性会好很多。
Zero-Shot / Few-Shot 里的”样本”和微调的”样本”是一回事吗?
不是。Few-Shot 的例子是写在 Context Window 里,每次请求都重新拼一次,模型本身参数完全没动——它只是”看了例子之后临场发挥”。微调的样本是拿去改了模型参数(权重)的,学完之后模型”永久记忆”了这个分布。举个类比:Few-Shot 是考试前翻小抄(开卷),微调是真的复习了三个月把书吃进去了(闭卷)。长期效果微调好,灵活度和成本 Few-Shot 好。