5 节 / 共 14

2.2 少样本提示

📌 本节目标

学完本节,你将理解“少样本提示”的核心思想:通过给模型提供少量高质量示例,显著提升其在具体任务上的表现。你将能够独立设计有效的示例格式,并掌握如何通过示例“教”模型完成翻译、分类、总结等任务,而无需训练模型。

1. 核心概念讲解

什么是少样本提示?

简单来说,少样本提示就是在你的提问中,附上几个输入和输出的例子,让模型“照猫画虎”。你不需要告诉模型规则,而是通过例子让它自己领悟模式。

  • 零样本提示:直接提问,不给例子。例如:“把这句话翻译成英文:今天天气真好。”
  • 少样本提示:先给 2-3 个例子,再提问。例如:“下面是一些翻译例子。请把最后一句翻译成英文。”

为什么有效?

大型语言模型在训练时读过海量数据,它们天生具备“模式匹配”能力。当你提供几个高质量的例子时,模型会将这些例子视为一种“上下文约束”,从而更准确地理解你期望的输出格式、风格和细节。

比如:

假设你想让模型将中文句子翻译成优雅的、书面化的英文

  • 零样本:模型可能翻译成“The weather is really good today.”(口语化)
  • 少样本:你提供 2 个例子,展示你想要的风格:
示例1:
中文:夕阳染红了半边天。
英文:The setting sun painted the sky a brilliant crimson.

示例2:
中文:他的演讲深深打动了在场的每一个人。
英文:His speech profoundly moved everyone present.

现在请翻译:
中文:这本书改变了我对世界的看法。

模型看到例子后,大概率会输出类似风格的译文,例如:“This book transformed my perspective on the world.”

核心公式:

少样本提示 = 任务描述 + 示例列表 (输入-输出对) + 新的输入

其中,“示例列表”通常包含 2 到 5 个例子。太少可能不够,太多可能超出上下文窗口或引入噪音。

技术实现(伪代码):

# 伪代码:构建少样本提示
def build_few_shot_prompt(task_description, examples, new_input):
    prompt = task_description + "\n\n"
    for i, (input_text, output_text) in enumerate(examples, 1):
        prompt += f"示例{i}:\n输入: {input_text}\n输出: {output_text}\n\n"
    prompt += f"现在请完成:\n输入: {new_input}\n输出:"
    return prompt

# 使用示例
examples = [
    ("今天天气真好。", "The weather is lovely today."),
    ("他跑得很快。", "He runs very fast.")
]
prompt = build_few_shot_prompt(
    "请将以下中文翻译成自然的英文。",
    examples,
    "这本书很有趣。"
)
print(prompt)
# 输出:
# 请将以下中文翻译成自然的英文。
#
# 示例1:
# 输入: 今天天气真好。
# 输出: The weather is lovely today.
#
# 示例2:
# 输入: 他跑得很快。
# 输出: He runs very fast.
#
# 现在请完成:
# 输入: 这本书很有趣。
# 输出:

2. 深入理解

原理:为什么少样本提示能“教”会模型?

模型本身并没有“学会”新规则,它只是利用上下文中的模式进行模式补全。你可以把模型看作一个极其强大的“续写引擎”。当你给了一组输入-输出对,模型会认为你需要它延续这种“映射关系”。因此,示例的质量直接决定了输出的质量。

初学者常见误区:

| 误区 | 正确做法 | 错误示例 | |------|----------|----------| | 示例太少或太随意 | 至少提供 2 个精心挑选的例子,覆盖常见情况 | 只给 1 个例子,且例子非常特殊 | | 示例格式不统一 | 保持每个示例的输入和输出格式完全一致 | 第一个示例输出是句子,第二个示例输出是短语 | | 示例与目标任务不匹配 | 示例的难度、风格、领域应与最终输入一致 | 示例都是简单句子,最终输入是复杂长文 | | 忘记加任务描述 | 在示例前加一句明确的任务说明 | 直接扔例子,模型不确定你要做什么 |

何时使用少样本提示?

  • 任务有明确的输入输出格式(翻译、分类、格式化、改写)
  • 你对输出风格有特定要求(正式、幽默、简洁)
  • 零样本效果不佳,且你无法或不想微调模型

何时不适合?

  • 任务极其简单且零样本已经完美(没必要增加 token 消耗)
  • 示例数量超过 10 个仍无改善(考虑换方法或微调)
  • 示例本身可能包含错误或偏见

3. 实战演示

场景: 将中文句子翻译成正式、礼貌的英文邮件用语

步骤 1:确定任务描述

我们需要明确告诉模型做什么。这里我们写:“请将以下中文句子翻译成正式、礼貌的英文,适合用于商务邮件。”

步骤 2:准备 3 个高质量示例

示例要体现“正式、礼貌”的风格,且覆盖不同场景。

示例1:
中文:感谢您的及时回复。
英文:Thank you for your prompt reply.

示例2:
中文:请问您方便在下周三之前确认吗?
英文:Would it be possible for you to confirm by next Wednesday?

示例3:
中文:期待您的进一步指导。
英文:I look forward to your further guidance.

步骤 3:构建完整提示并测试

将任务描述、示例和新输入组合起来。

完整提示:

请将以下中文句子翻译成正式、礼貌的英文,适合用于商务邮件。

示例1:
中文:感谢您的及时回复。
英文:Thank you for your prompt reply.

示例2:
中文:请问您方便在下周三之前确认吗?
英文:Would it be possible for you to confirm by next Wednesday?

示例3:
中文:期待您的进一步指导。
英文:I look forward to your further guidance.

现在请翻译:
中文:我们会在收到付款后立即安排发货。

步骤 4:观察输出

模型生成的输出大概率会是:

英文:We will arrange shipment immediately upon receipt of payment.

注意:“立即”被翻译成 “immediately upon”,而不是 “right after”,体现了正式风格。“安排发货”用了 “arrange shipment”,而不是 “send out”,也更符合商务语境。

步骤 5:对比零样本效果

如果只用零样本提示:“翻译成英文:我们会在收到付款后立即安排发货。” 模型可能输出:“We will arrange shipment as soon as we receive payment.” 这句话没错,但稍显口语化,不如少样本版本正式。

完整代码示例(Python + OpenAI API 风格):

import openai  # 假设已配置好 API key

def translate_with_few_shot(text):
    prompt = """请将以下中文句子翻译成正式、礼貌的英文,适合用于商务邮件。

示例1:
中文:感谢您的及时回复。
英文:Thank you for your prompt reply.

示例2:
中文:请问您方便在下周三之前确认吗?
英文:Would it be possible for you to confirm by next Wednesday?

示例3:
中文:期待您的进一步指导。
英文:I look forward to your further guidance.

现在请翻译:
中文:""" + text + "\n英文:"

    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.3  # 低温度确保输出稳定
    )
    return response.choices[0].message.content.strip()

# 测试
result = translate_with_few_shot("我们会在收到付款后立即安排发货。")
print(result)
# 输出: We will arrange shipment immediately upon receipt of payment.

4. 关键要点

  • 示例质量 > 示例数量:3 个精心挑选的例子远好于 10 个随意例子。
  • 格式一致性至关重要:每个示例的输入和输出结构必须完全对齐,模型才能准确识别模式。
  • 任务描述不可省略:即使有示例,也要用一句话明确告诉模型你要它做什么。
  • 示例应覆盖典型场景:避免只选极端或边缘情况,确保示例代表常见输入。
  • 测试并迭代:先测试零样本,再尝试少样本,如果效果仍不佳,调整示例内容或增加数量。

✏️ 练习任务

基础任务:为翻译任务提供 3 个示例并测试效果

  1. 任务:请设计一个少样本提示,用于将中文日常对话翻译成 简洁、口语化的英文(适合短信或聊天)。你需要自己准备 3 个示例,然后测试以下新输入:

    • 新输入:“我马上到,等我一下。”
    • 期望输出风格:简短、自然,例如 “I'm almost there, hold on.”(注意不要翻译成 “I will arrive soon, please wait for me.” 这种正式表达)
  2. 步骤提示

    • 先写任务描述:“请将以下中文翻译成简洁、口语化的英文,适合日常聊天。”
    • 准备 3 个示例,例如:
      • 中文:“你吃饭了吗?” → 英文:“Did you eat?”
      • 中文:“今天好累啊。” → 英文:“I'm so tired today.”
      • 中文:“周末一起看电影?” → 英文:“Wanna catch a movie this weekend?”
    • 然后输入新句子,观察输出是否符合“口语化”风格。

进阶挑战(选做):

  1. 将上述任务改为反向翻译:将英文口语翻译成中文口语。你只需要翻转示例中的输入和输出角色,并调整任务描述。测试新输入:“I'm running late, don't wait for me.” 期望输出应为中文口语,如 “我迟到了,别等我。”

💡 下一节我们将学习链式提示——如何将多个提示步骤串联起来,解决更复杂的任务。你将学会如何像搭积木一样组合提示,让模型一步步思考。


本节由 StudyAI8 AI 课程团队生成并审核。