Few-Shot vs Zero-Shot Prompting:如何选择?
难度:基础 分类:Prompt Engineering
简短回答
Zero-shot Prompting 不提供任何示例,直接描述任务让 LLM 执行——依赖模型从预训练中学到的通用能力。Few-shot Prompting 在 Prompt 中提供 2-5 个输入输出示例,让模型通过"模仿"理解任务格式和期望。选择原则:任务简单且模型理解充分 → Zero-shot(更省 token、更灵活);任务有特定格式/逻辑或模型表现不稳定 → Few-shot(更准确、更一致)。研究表明 Few-shot 在分类和格式化任务上优势显著,但在复杂推理任务上,Few-shot 的优势被 CoT 等推理增强技术压缩。随着模型能力提升(GPT-4、Claude Opus 等),Zero-shot 的能力边界在不断扩大——很多过去需要 Few-shot 的任务现在 Zero-shot 就能做好。
详细解析
核心区别
代码块
Python
# Zero-shot:直接描述任务,无示例
zero_shot_prompt = """
将以下客户评价分类为"正面"、"负面"或"中性"。
评价:这个产品用了一周就坏了,太失望了。
分类:
"""
# 模型需要自己理解"分类"的含义和格式
# Few-shot:提供示例,模型模仿模式
few_shot_prompt = """
将客户评价分类为"正面"、"负面"或"中性"。
评价:非常好用,超出预期!
分类:正面
评价:还行吧,没什么特别的。
分类:中性
评价:快递太慢了,包装也破损了。
分类:负面
评价:这个产品用了一周就坏了,太失望了。
分类:
"""
# 模型通过示例理解输出格式和分类标准
何时选择 Zero-shot
代码块
Python
use_zero_shot_when = [
"任务在模型预训练中常见(翻译、摘要、问答)",
"使用足够强的模型(GPT-4、Claude Opus)",
"任务描述本身足够清晰明确",
"需要灵活处理多样化的输入",
何时选择 Few-shot
代码块
Python
use_few_shot_when = [
"任务有特定的输出格式(JSON、表格、特殊结构)",
"分类标签有领域特定含义(不是通用的正面/负面)",
"模型在 Zero-shot 下表现不稳定",
"需要教模型一个它不熟悉的模式",
Few-shot 的最佳实践
代码块
JSON
few_shot_best_practices = {
"示例数量": {
"建议": "2-5 个示例最佳",
"原因": "太少不够学习模式,太多浪费 token 且可能引入噪声",
"例外": "复杂任务可以用 5-10 个示例",
},
"示例质量": {
"多样性": "覆盖不同的输入类型和边界情况",
"代表性": "包含典型案例,不只是简单案例",
"平衡性": "每个分类标签的示例数量大致相等",
},
动态 Few-shot:结合两者优势
代码块
Python
class DynamicFewShot:
"""根据输入动态选择最相关的示例"""
def __init__(self, example_bank, embedding_model):
self.examples = example_bank # 预存的示例库
self.embedder = embedding_model
性能对比数据(示意,请以最新公开评测为准)
情感分类(SST-2,示意值):
#vfkGDiQbscTS text{white-space:pre}.fb0{stroke:var(--N900-FG, 0.15)}.fx0{stroke-miterlimit:10}.fa1{fill:#bbbfc4}.fx1{font:normal 400 12px MonospacedNumber,LarkHackSafariFont,LarkEmojiFont,LarkChineseQuote,-apple-system,BlinkMacSystemFont,Helvetica Neue,Tahoma,PingFang SC,Microsoft Yahei,Arial,Hiragino Sans GB,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.fx2{text-anchor:middle}.fx3{dominant-baseline:central}.fx4{stroke:none}.fc0{fill:var(--text-caption)}.fa2{fill:var(--text-link-disabled)}.fx5{font:400 normal 13px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}.fx6{text-anchor:start}.fx7{dominant-baseline:alphabetic}.fc1{fill:rgb(0, 0, 0)}.fb1{fill:var(--N900-FG, 0.15)}.fb2{fill:rgb(209, 217, 224)}.fa3{fill:var(--bg-body)}ABC1234方法Zero-shotFew-shot (3)Few-shot (5)GPT-3.5~88%~93%94%GPT-495%~96%~96%
观察:
Few-shot 对弱模型帮助更大(+6pp vs +1pp)
强模型 Zero-shot 已经很好
数学推理(GSM8K,示意值):
3 个示例就已获得大部分提升
#guQURosZAUxJ text { white-space: pre; }#guQURosZAUxJ .fb0 { stroke: var(--N900-FG, 0.15); }#guQURosZAUxJ .fb0 {stroke: rgba(31,35,41, 0.15)}#guQURosZAUxJ .fx0 { stroke-miterlimit: 10; }#guQURosZAUxJ .fx0 {stroke-miterlimit: 10}#guQURosZAUxJ .fa1 { fill: rgb(187, 191, 196); }#guQURosZAUxJ .fa1 {fill: rgb(187, 191, 196)}#guQURosZAUxJ .fx1 { font: 400 12px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#guQURosZAUxJ .fx1 {font-style: normal}#guQURosZAUxJ .fx2 { text-anchor: middle; }#guQURosZAUxJ .fx2 {text-anchor: middle}#guQURosZAUxJ .fx3 { dominant-baseline: central; }#guQURosZAUxJ .fx3 {dominant-baseline: central}#guQURosZAUxJ .fx4 { stroke: none; }#guQURosZAUxJ .fx4 {stroke: none}#guQURosZAUxJ .fc0 { fill: var(--text-caption); }#guQURosZAUxJ .fc0 {fill: #646a73}#guQURosZAUxJ .fa2 { fill: var(--text-link-disabled); }#guQURosZAUxJ .fa2 {fill: rgb(187, 191, 196)}#guQURosZAUxJ .fx5 { font: 400 13px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#guQURosZAUxJ .fx5 {font-style: normal}#guQURosZAUxJ .fx6 { text-anchor: start; }#guQURosZAUxJ .fx6 {text-anchor: start}#guQURosZAUxJ .fx7 { dominant-baseline: alphabetic; }#guQURosZAUxJ .fx7 {dominant-baseline: alphabetic}#guQURosZAUxJ .fc1 { fill: rgb(0, 0, 0); }#guQURosZAUxJ .fc1 {fill: rgb(0, 0, 0)}#guQURosZAUxJ .fb1 { fill: var(--N900-FG, 0.15); }#guQURosZAUxJ .fb1 {fill: rgba(31,35,41, 0.15)}#guQURosZAUxJ .fb2 { fill: rgb(209, 217, 224); }#guQURosZAUxJ .fb2 {fill: rgb(209, 217, 224)}#guQURosZAUxJ .fa3 { fill: var(--bg-body); }#guQURosZAUxJ .fa3 {fill: #fff}AB12345方法Zero-shotFew-shot (8)Zero-shot CoTFew-shot CoTGPT-4~80%~82%~90%~92%
观察:CoT 的提升 > Few-shot 的提升,对于推理任务,推理方式比示例数量更重要
说明:上述数字为不同公开报告整理后的趋势值(GPT-3.5/4 SST-2、GSM8K), 具体数字会因评测脚本、解析方式、提示版本而有 ±2pp 抖动。 建议在自己业务数据上用 lm-eval-harness / Inspect AI 现场跑,作为权威基准。 原始引用可见 OpenAI GPT-4 Technical Report (2023)、PromptArena leaderboard、HELM。
决策流程图
选型决策:任务简单模型强走 Zero-shot,要格式或稳定性走 Few-shot,要推理上 CoT,不确定先试 Zero-shot。
常见误区 / 面试追问
误区:"Few-shot 总是比 Zero-shot 好" — 不一定。(1) 在推理任务上,CoT 的提升远大于示例的提升;(2) 不好的示例可能误导模型(示例质量比数量更重要);(3) 强模型的 Zero-shot 已经接近人类水平。
误区:"示例越多越好" — 超过 5-10 个示例后,边际收益递减且成本急增。更多示例 = 更多 input token = 更高成本 + 更少剩余空间给模型思考。
追问:"如何选择 Few-shot 的示例?" — 三个原则:(1) 多样性——覆盖不同类型的输入;(2) 代表性——选典型案例而非极端案例;(3) 相关性——最好与待处理的输入相关。动态 Few-shot(检索最相关的示例)是生产中的最佳实践。
追问:"One-shot(只给一个示例)有用吗?" — 有用,尤其在教模型特定输出格式时。一个精心选择的示例可能比三个普通示例更有效。但对于分类任务,一个示例可能引入偏差(模型倾向于输出示例中的标签)。