零样本与少样本学习 | 大模型开发核心技术系列 1.3

在这里插入图片描述

一、引言

你是否想过,为什么有时候只需要简单地告诉模型“把这个句子翻译成法语”,它就能准确完成,而有的时候却需要给出好几个例子才能理解你的意图?这背后的关键技术就是零样本学习(Zero-shot Learning)和少样本学习(Few-shot Learning)。理解并灵活运用这两种学习范式,是提升 AI 应用效率的关键技能。本文将深入解析它们的原理、实现方法和最佳实践。

二、基本概念

2.1 什么是零样本学习

零样本学习(Zero-shot Learning)是指模型在没有任何特定任务训练样本的情况下,仅凭对任务描述的理解来完成新任务的能力。这是大型语言模型最神奇的特性之一——模型通过预训练已经具备了广泛的知识和推理能力,可以泛化到从未见过的任务上。

# 零样本示例
# 任务:情感分类
# 没有提供任何训练示例

prompt = """
判断以下评论的情感是正面、负面还是中性:

"这个产品太棒了,超出预期!"
"""

# 模型直接输出:正面

零样本学习的本质是语言模型的推理能力。模型不需要针对每个任务进行专门的训练,而是理解了任务的语义和目标后,利用预训练过程中学到的知识来完成推理。这种能力随着模型规模的增大而显著增强,这也是为什么 GPT-4 等大型模型在零样本任务上表现优异的原因。

2.2 什么是有样本学习

有样本学习(In-context Learning)是指在提示词中提供少量任务示例,让模型通过这些示例理解任务要求和期望的输入输出模式。少样本学习(Few-shot Learning)是有样本学习的一种,特指提供 1-10 个示例的情况。

# 少样本示例
# 提供 3 个示例

prompt = """
把以下中文翻译成英文:

你好吗? -> How are you?
今天天气很好。 -> The weather is nice today.
我想吃饭。 -> I want to eat.

我爱你。 ->
"""

# 模型输出:I love you.

少样本学习利用了大型语言模型强大的模式识别能力。通过观察输入-输出对,模型能够推断出任务的规则,并将其应用到新的输入上。这种学习方式不需要模型参数的更新,是一种高效的即时学习范式。

2.3 零样本与少样本对比

特性 零样本 少样本
示例数量 0 1-10
任务理解 纯语义理解 语义+示例模式
适用场景 简单明确的任务 复杂或特殊格式任务
模型依赖
提示词长度 较长

三、零样本提示技术

3.1 指令提示

最简单的零样本方法就是直接给出任务指令。

# 基础指令
prompt = "把下面这句话翻译成法语:我爱你"

# 详细指令
prompt = """
作为翻译专家,请把用户提供的句子翻译成法语。
要求:
- 保持原文的语气
- 使用自然的表达
- 翻译:你好,很高兴认识你
"""

3.2 思维链提示

思维链(Chain of Thought,CoT)是一种零样本提示技术,它要求模型展示推理过程。

# 零样本 CoT 提示
prompt = """
一个水池有进水管和出水管。进水管8小时可以注满,
出水管12小时可以放完。
如果两管同时打开,需要多少小时才能注满?

请分步骤思考,最后给出答案。
"""

# 模型会展示:
# 1. 进水管每小时注入 1/8
# 2. 出水管每小时放出 1/12
# 3. 净注入 = 1/8 - 1/12 = 1/24
# 4. 需要 24 小时

3.3 角色设定

通过设定角色可以引导模型以特定方式完成任务。

# 角色设定示例
prompt = """
你是一位经验丰富的数学老师,擅长用简单易懂的方式解释数学概念。
请解释什么是导数,要求:
- 用生活中的例子引入
- 给出数学定义
- 举一个实际应用的例子
"""

四、少样本提示技术

4.1 标准少样本

提供几个完整的输入-输出示例,让模型理解任务模式。

# 标准少样本示例
prompt = """
将以下词语分类为食物、动物或交通工具:

苹果 -> 食物
狗 -> 动物
汽车 -> 交通工具
猫 ->
"""

# 输出:动物

4.2 格式规范化

使用统一的示例格式,让模型更容易识别输入输出模式。

# 规范化格式
prompt = """
按指定格式分类:

输入:苹果,分类:食物
输入:老虎,分类:动物
输入:飞机,分类:交通工具
输入:香蕉,分类:
"""

4.3 逐步引导

如果任务复杂,可以提供逐步引导的示例。

# 逐步引导示例
prompt = """
分步骤解决问题:

问题:5 个朋友去旅游,每人费用是 800 元,另外租车花费 300 元,请问人均多少钱?

步骤:
1. 计算总费用:5 × 800 + 300 = 4300
2. 计算人均:4300 ÷ 5 = 860
3. 答案:860 元

问题:小明有 50 元,买了 3 本书每本 12 元,还剩多少?
步骤:
"""

4.4 反面示例

有时候展示“什么不该做”也很有效。

# 包含反面示例
prompt = """
判断句子是否有礼貌,用"礼貌"或"不礼貌"标记:

大声说"这是我的!"-> 不礼貌
轻声说"请帮帮我"-> 礼貌
直接说"滚开"->
"""

五、示例选择策略

5.1 相关性原则

选择的示例应该与当前任务尽可能相关。

# 相关示例
# 当前任务:英文邮件写作
# 好的示例:不同场景的英文邮件
# 不好的示例:中文邮件、诗歌、新闻报道

5.2 多样性原则

示例应该覆盖任务的不同方面。

# 多样性示例
# 任务:情感分类
# 正面示例:积极的评论
# 负面示例:消极的评论
# 中性示例:事实陈述

5.3 数量平衡

示例数量不是越多越好,通常 3-5 个就能达到很好的效果。

# 建议数量
- 简单任务:1-2 个示例
- 中等任务:3-5 个示例
- 复杂任务:5-10 个示例
# 超过 10 个示例通常收益递减

六、实践案例

6.1 文本分类

# 零样本分类
prompt_zero = """
判断以下新闻标题属于哪个类别(科技/娱乐/体育/财经):

"苹果发布新一代 iPhone"
"""

# 少样本分类
prompt_few = """
分类新闻标题:

"科学家发现新粒子" -> 科技
"明星结婚引发关注" -> 娱乐
"C罗进球破纪录" -> 体育
"股市大涨 5%" -> 
"""

6.2 数据提取

# 零样本提取
prompt_zero = """
从以下文本中提取人名和时间:
"2024年1月15日,李明参加了在北京举办的AI大会。"
"""

# 少样本提取
prompt_few = """
提取文本中的信息:

文本:"张三,男,1985年3月生,现任某互联网公司CTO"
提取:{"姓名":"张三","性别":"男","出生年份":"1985"}

文本:"李华2024年毕业于清华大学计算机系"
提取:
"""

6.3 格式转换

# 零样本转换
prompt_zero = """
把以下 JSON 转为 YAML 格式:
{"name": "张三", "age": 30, "city": "北京"}
"""

# 少样本转换
prompt_few = """
把 JSON 转为 YAML:

{"name": "张三", "age": 30} ->
name: 张三
age: 30

{"city": "上海", "score": 95} ->
"""

七、混合策略

7.1 零样本 + 少样本

可以先给出指令(零样本),再提供示例(少样本)作为补充。

# 混合策略
prompt = """
把中文翻译成英文。

示例:
我爱你 -> I love you
他很好 -> He is fine
她是老师 -> 

要求:保持原文的语气
"""

7.2 角色 + 示例 + 格式

组合多种技巧以获得最佳效果。

# 组合策略
prompt = """
你是一位法律助手,帮助理解法律条款。

示例:
条款:"合同一方违约时,另一方有权解除合同并要求赔偿"
解读:这是一条关于违约责任的条款,违约方需要承担赔偿

条款:"债权人有权要求债务人按照约定的方式和时间履行债务"
解读:
"""

八、性能优化

8.1 提示词顺序

最新的研究表明,示例的顺序也可能影响结果。把最典型的示例放在前面可能效果更好。

# 推荐的示例顺序
# 典型 -> 边界/复杂 -> 待完成任务

8.2 示例格式一致性

确保所有示例的格式完全一致,减少模型的理解负担。

# ✅ 一致的格式
输入:xxx -> 输出:yyy
输入:zzz -> 输出:

# ❌ 不一致的格式
输入:xxx,输出:yyy
输入:zzz -> 输出:

8.3 动态选择

对于复杂系统,可以根据任务类型动态选择使用零样本还是少样本。

# 动态选择逻辑
def choose_prompt_strategy(task):
    if task.is_simple():
        return zero_shot_prompt
    elif task.has_examples():
        return few_shot_prompt
    else:
        return hybrid_prompt

九、适用场景分析

9.1 零样本适用场景

零样本适合以下场景:任务简单明确、任务类型常见(翻译、总结等)、无法提供示例、提示词长度受限。

# 零样本最佳场景
- 翻译
- 总结
- 分类(常见类型)
- 基本数学计算
- 常见格式转换

9.2 少样本适用场景

少样本适合以下场景:任务复杂或特殊、有特定输出格式要求、零样本效果不佳、需要排除特定模式。

# 少样本最佳场景
- 特定领域分类
- 结构化数据提取
- 自定义格式转换
- 排除特定回答模式
- 复杂推理任务

9.3 何时使用哪种

因素 零样本 少样本
任务复杂度 简单 复杂
任务常见度 常见 罕见
可用示例
精确度要求 一般
提示词长度 受限 充足

十、总结

零样本学习和少样本学习是大型语言模型的两大核心能力,它们让我们能够灵活地完成各种任务而无需额外训练。零样本学习简洁高效,适合简单直接的任务;少样本学习提供示例引导,适合复杂或特殊格式的任务。

在实际应用中,零样本和少样本并非互斥,而是可以灵活组合使用的。掌握这两种技术的原理和技巧,能够显著提升你与 AI 协作的效率和效果。记住,最好的提示词往往是在实践中不断迭代优化出来的。


参考资料

  • OpenAI Few-shot Learning 指南
  • Language Models are Few-Shot Learners(论文)
  • Prompt Engineering 最佳实践
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐