📌 内容摘要

  • Zero-shot 是不给例子直接提问,Few-shot 是先给示例再让模型仿照输出——理解这两种策略的本质差异是写好 Prompt 的基础。
  • Claude 4 系列的 Zero-shot 能力极强,很多场景不需要 Few-shot——但有几类任务 Few-shot 的提升效果显著。
  • 本文通过8类真实任务的对比测试,给出清晰的”什么时候用哪种”决策框架。
  • 附 Few-shot 示例设计的5个核心原则和3种高级变体(One-shot、Chain-of-thought Shot、Negative Shot)。

一、什么是 Zero-shot 和 Few-shot?

Zero-shot:不给例子,直接提问

Zero-shot(零样本)是最常见的使用方式——你直接告诉 Claude 要做什么,不提供任何示例,完全依赖模型从训练中获得的知识来完成任务。

【Zero-shot 示例】
判断以下评论的情感倾向(正面/负面/中性):
"产品质量还不错,但客服响应太慢了,等了三天才回复。"

Few-shot:先给例子,再让模型仿照

Few-shot(少样本)是在提问前提供1到几个示例,让模型理解你期望的输出模式、格式或风格,然后仿照示例处理新的输入。

【Few-shot 示例】
判断评论情感,输出格式参考以下示例:

示例1:
输入:物流很快,包装完好,东西和图片一样。
输出:正面 | 亮点:物流速度、包装质量、图实相符

示例2:
输入:假货!和描述完全不符,骗人的。
输出:负面 | 问题:商品与描述不符

示例3:
输入:还行,比预期便宜一点,但质感一般。
输出:中性偏负 | 亮点:价格;问题:质感

现在请处理:
输入:产品质量还不错,但客服响应太慢了,等了三天才回复。

二、Claude 对两种策略的响应特点

Claude 4 系列(Sonnet 4.6 / Opus 4.6)的训练数据规模和质量远超早期模型,这让它的 Zero-shot 能力极强——很多早期需要 Few-shot 才能完成的任务,Claude 现在直接 Zero-shot 就能高质量完成。

但 Few-shot 仍然在特定场景有不可替代的价值,主要体现在三类情况:

  • 输出格式高度定制化:你需要完全按照特定的格式、风格或结构输出,而这个格式是非标准的
  • 领域专属分类体系:你的分类标签或判断维度是你公司内部定义的,不是通用概念
  • 风格精确模仿:你需要 Claude 模仿特定人物或品牌的写作风格,而这种风格有很多细微特征

三、8类任务实战对比

任务一:情感分析

Zero-shot(够用)

分析以下评论的情感倾向,说明是正面、负面还是混合,以及主要的情感原因。

Few-shot(更好)——当你需要结构化输出供程序处理时

示例输入:快递超快,东西不错,还会回购。
示例输出:{"sentiment":"positive","score":0.85,"tags":["物流","品质","复购意向"]}

示例输入:包装破损,内容物有刮痕,要求退款。
示例输出:{"sentiment":"negative","score":0.92,"tags":["包装","商品损坏","售后"]}

处理:[你的评论]

结论:普通情感分析用 Zero-shot 就够;需要固定 JSON 格式供下游程序处理时,用 Few-shot 确保格式一致性。

任务二:文本分类(自定义标签体系)

Zero-shot(容易出错)

把以下客服工单分类为:账号问题/订单问题/产品问题/退款问题/其他

⚠️ 问题:Claude 可能对”账号问题”和”订单问题”的边界理解与你不同,导致分类标准不一致

Few-shot(显著更好)

分类规则示例:

工单:我的优惠券不能用了
类别:账号问题(优惠券绑定账号)

工单:我下了订单但不想要了,怎么取消?
类别:订单问题(订单操作)

工单:收到的颜色和网页图片不一样
类别:产品问题(商品与描述不符)

工单:已经退货了,钱什么时候到账?
类别:退款问题(退款进度查询)

请分类:[工单内容]

结论:使用公司内部定义的分类体系时,Few-shot 是必须的——它能对齐你对每个类别的定义边界,大幅减少边界情况的误分类。

任务三:信息提取

Zero-shot(通常够用)

从以下合同文本中提取:甲方名称、乙方名称、合同金额、付款方式、交付日期。以 JSON 格式返回。

✅ 提取标准字段,Claude 直接 Zero-shot 就能准确完成

信息提取任务大多数情况下 Zero-shot 就足够——Claude 对”提取”这类任务理解准确,只要你说清楚要提取什么字段。Few-shot 在字段名称有歧义、或者来源格式极不规范时才有明显帮助。

任务四:风格模仿写作

Zero-shot(效果有限)

用鲁迅的风格写一段关于现代社交媒体的讽刺文字。

⚠️ Claude 对”鲁迅风格”有大致印象,但难以精确捕捉具体的语言习惯和句式特征

Few-shot(显著更好)

参考以下鲁迅的原文风格:

【参考段落1】
"我翻开历史一查,这历史没有年代,歪歪斜斜的每叶上都写着'仁义道德'几个字。
我横竖睡不着,仔细看了半夜,才从字缝里看出字来,满本都写着两个字是'吃人'!"

【参考段落2】
"中国人的性情是总喜欢调和折中的,譬如你说,这屋子太暗,须在这里开一个窗,
大家一定不允许的。但如果你主张拆掉屋顶,他们就会来调和,愿意开窗了。"

注意他的风格特征:
- 日记体或随笔体,第一人称叙述
- 看似平静的陈述中藏着辛辣讽刺
- 善用反语和类比
- 句子有力,不拖沓

现在用这种风格写一段关于现代人刷短视频的讽刺文字(200字)。

结论:风格模仿是 Few-shot 效果最显著的任务之一。越是细腻的风格特征,越需要真实的示例文本来引导,语言描述难以精确传达。

任务五:代码生成

Zero-shot(绝大多数情况够用)

用 Python 写一个函数,输入一个字符串列表,返回去重后的列表,保持原始顺序,大小写不敏感。

✅ 代码任务描述清晰的情况下,Zero-shot 效果已经非常好

代码生成任务 Zero-shot 通常就够用。例外是:你有非常特定的代码风格要求(如特定的命名规范、错误处理模式),或者需要生成符合现有代码库习惯的代码时,提供现有代码作为 Few-shot 示例效果更好。

任务六:摘要生成

Zero-shot(够用)

用3句话概括以下文章的核心内容,每句话不超过25字。

Few-shot(当摘要有特殊格式要求时)

内部报告摘要格式示例:

原文主题:Q3 销售数据分析
摘要:
▶ 核心结论:Q3 营收同比增长23%,但净利润下降8%
▶ 关键驱动:华南区表现突出,贡献新增营收的60%
▶ 风险预警:库存周转率下降,需关注Q4压货风险

请用同样格式生成以下报告的摘要:[报告内容]

任务七:数据清洗/格式转换

Few-shot(强烈推荐)

把以下非标准地址格式化为统一格式。参考示例:

输入:北京朝阳区望京soho T2 1001
输出:{"province":"北京","city":"北京","district":"朝阳区","street":"望京SOHO","building":"T2","room":"1001"}

输入:上海市浦东新区陆家嘴环路1000号恒生银行大厦20F
输出:{"province":"上海","city":"上海","district":"浦东新区","street":"陆家嘴环路","building":"恒生银行大厦","room":"20F","extra":"1000号"}

请处理:广州天河区珠江新城华夏路10号富力中心B座3008

结论:格式转换任务中,Few-shot 几乎是必须的——输入格式多变、输出格式严格,示例能精确告诉 Claude 如何处理各种边界情况。

任务八:创意写作

Zero-shot(通常更好)

写一个关于程序员深夜 Debug 的短故事,要有幽默感,结尾要有反转。

✅ 开放性创意任务,给太多约束反而限制了创意空间,Zero-shot 让 Claude 发挥更自由

创意写作任务是 Zero-shot 更有优势的领域——过多的示例约束反而会让输出模式化。除非你需要精确模仿某种特定风格(见任务四),否则给清晰的任务描述后让 Claude 自由发挥效果更好。

四、选择策略决策框架

你的任务是否有「非标准的输出格式」?
├── 是 → Few-shot(提供2-3个格式示例)
└── 否
    ├── 分类标准是否有「公司内部定义的边界」?
    │   ├── 是 → Few-shot(提供边界案例示例)
    │   └── 否
    │       ├── 是否需要「精确模仿特定风格」?
    │       │   ├── 是 → Few-shot(提供风格示例文本)
    │       │   └── 否
    │       │       ├── 是否是「数据格式转换」任务?
    │       │       │   ├── 是 → Few-shot(输入输出对示例)
    │       │       │   └── 否 → Zero-shot(先试,效果差再加示例)
    └── ──────────────────

兜底原则:先用 Zero-shot,如果3次优化后效果还不满意,再考虑加 Few-shot 示例

五、Few-shot 示例设计的5个核心原则

原则一:示例要覆盖边界情况

示例不应该只展示”最典型”的情况,更要包含容易混淆的边界案例:

❌ 只有典型案例(效果有限):
示例1:苹果 → 水果
示例2:香蕉 → 水果
示例3:狗 → 动物

✅ 包含边界情况(效果好):
示例1:苹果 → 水果
示例2:番茄 → 蔬菜(注意:虽然植物学上是水果,但按日常用法归蔬菜)
示例3:海带 → 蔬菜(海洋植物按食材类型归类)
示例4:蘑菇 → 蔬菜(菌类按食材归类,不按植物分类)

原则二:示例数量:2-4个通常最优

研究表明,2-4个示例通常能达到 Few-shot 的主要效果。超过5个示例的边际收益快速递减,还会增加 token 消耗。特别简单的格式问题1个示例就够;分类任务建议每个主要类别各1个示例。

原则三:示例和目标任务要分布一致

你的示例应该能代表实际任务中会遇到的各类情况。如果实际任务中80%是正面评论、20%是负面,示例里只有负面评论,会导致模型偏差:

✅ 示例分布要平衡(或与实际任务分布一致):
如果实际任务中正面/负面/中性比例是 5:3:2,
那么5个示例建议包含约2-3个正面、1-2个负面、1个中性。

原则四:示例格式要完全统一

所有示例的格式必须完全一致——字段顺序、分隔符、换行方式都要保持一样。任何格式不一致都会让 Claude 困惑,导致输出格式不稳定。

❌ 格式不一致(容易造成输出混乱):
示例1:输入:xxx → 输出:yyy
示例2:
输入:aaa
输出:bbb

✅ 格式完全统一:
示例1:
[输入] xxx
[输出] yyy

示例2:
[输入] aaa
[输出] bbb

原则五:示例质量比数量更重要

3个精心选择的高质量示例,效果远好于10个随便拼凑的示例。在选择示例时,优先选择能清晰展示关键判断逻辑的案例,而不是最容易的案例。

六、三种 Few-shot 变体

变体一:One-shot(只用一个示例)

当格式非常简单、或者你的 token 预算有限时,一个示例往往就够了:

参考格式:
评论:产品很好,下次还买。
标签:[正面][复购意向][产品满意]

请处理:[新评论]

变体二:Chain-of-thought Shot(带推理过程的示例)

示例中不只展示输入输出,还展示推理过程。对于复杂判断任务效果极好:

判断以下合同条款是否对甲方有利。参考示例:

条款:乙方须在收到货款后30日内发货,逾期每日赔偿合同金额的0.1%。
思考:这条款规定了乙方的发货义务和逾期赔偿,从甲方角度看,30天发货期
     较宽松,但有明确的违约赔偿机制,整体对甲方有一定保护。
结论:基本有利于甲方 ✓

条款:因不可抗力导致的损失,双方各自承担。
思考:这是对等条款,但"不可抗力"定义模糊,如果后续认定标准不一,
     可能导致甲方损失无法追偿。
结论:需谨慎,建议明确不可抗力的定义范围 ⚠️

请判断:[新条款]

变体三:Negative Shot(展示反例)

有时候明确展示”不要这样”比展示正确示例更有效,特别是当你需要避免某种常见错误时:

写一个产品标题,要求简洁有力。

❌ 不好的示例(这类标题请避免):
"全新升级超强性能极致体验多功能一体旗舰手机"
→ 问题:堆砌词汇,没有具体信息,用户无法获取有效信息

❌ 不好的示例:
"手机"
→ 问题:太简短,缺乏差异化信息

✅ 好的示例(参考这种风格):
"3天超长待机 + 6000万像素 | 户外摄影师的专属手机"
→ 优点:有具体数字、有目标用户、有核心卖点

现在为以下产品写标题:[产品信息]

七、实用代码:自动切换策略

import anthropic
from typing import Optional

client = anthropic.Anthropic()


def zero_shot(task: str, system: str = "") -> str:
    """Zero-shot 调用"""
    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        system=system,
        messages=[{"role": "user", "content": task}]
    )
    return response.content[0].text


def few_shot(
    task: str,
    examples: list[dict],       # [{"input": "...", "output": "..."}, ...]
    system: str = "",
    example_format: str = "Input: {input}\nOutput: {output}",
) -> str:
    """
    Few-shot 调用

    Args:
        task:          当前要处理的任务
        examples:      示例列表,每个示例包含 input 和 output
        system:        系统提示词
        example_format: 示例的格式模板
    """
    # 构建示例文本
    examples_text = "\n\n".join(
        example_format.format(**ex) for ex in examples
    )

    prompt = f"""参考以下示例:

{examples_text}

现在请处理:
{task}"""

    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        system=system,
        messages=[{"role": "user", "content": prompt}]
    )
    return response.content[0].text


def auto_strategy(
    task: str,
    examples: Optional[list[dict]] = None,
    system: str = "",
) -> tuple[str, str]:
    """
    自动选择策略:有示例用 Few-shot,没有示例用 Zero-shot
    返回:(结果, 使用的策略)
    """
    if examples and len(examples) > 0:
        result = few_shot(task, examples, system)
        return result, "few-shot"
    else:
        result = zero_shot(task, system)
        return result, "zero-shot"


# ── 使用示例 ─────────────────────────────────────

# 情感分析:Zero-shot 够用
result, strategy = auto_strategy(
    task="分析情感:'产品不错但发货慢,差评!'",
    system="你是一名情感分析专家,输出简洁准确。"
)
print(f"[{strategy}] {result}")

# 地址格式化:Few-shot 更好
address_examples = [
    {
        "input": "北京朝阳区望京soho T2 1001",
        "output": '{"city":"北京","district":"朝阳区","building":"望京SOHO T2","room":"1001"}'
    },
    {
        "input": "上海浦东陆家嘴环路1000号恒生大厦20F",
        "output": '{"city":"上海","district":"浦东新区","street":"陆家嘴环路1000号","building":"恒生大厦","room":"20F"}'
    }
]

result, strategy = auto_strategy(
    task="请格式化:广州天河珠江新城华夏路10号富力中心B座3008",
    examples=address_examples
)
print(f"[{strategy}] {result}")

常见问题

Q:Few-shot 示例越多越好吗?
不是。2-4个精心挑选的示例通常是最优区间。超过5个示例后,每增加一个示例的边际收益快速递减,却持续增加 token 消耗(意味着更高费用和更长响应时间)。唯一值得超过4个的情况是你的分类体系有很多类别,需要每个类别各给一个示例。

Q:示例里可以放错误的输出吗(作为反例)?
可以,见本文”Negative Shot”变体。但要明确标注”不好的示例/避免这样做”,而不是直接放错误输出。研究显示,混入无标注的错误示例会降低模型性能。

Q:API 调用中 Few-shot 示例应该放在 system 还是 messages 里?
两种方式都可以,但有微妙差异。放在 system 里的示例优先级更高、更稳定;放在 messages 里更灵活,可以通过对话轮次动态增减。对于固定的格式示例,放 system;对于需要动态调整的示例,用 messages

总结

Zero-shot 和 Few-shot 不是非此即彼的选择,而是根据任务特性灵活运用的两种工具。Claude 4 系列的 Zero-shot 能力已经非常强,大多数任务不需要 Few-shot——先用 Zero-shot 试,效果不满意再考虑加示例。真正需要 Few-shot 的场景主要是四类:非标准输出格式、内部定义的分类体系、精确风格模仿、复杂格式转换。掌握好这个判断框架,能在不增加不必要复杂度的前提下,把 Prompt 的效果最大化。