title: 少样本提示(Few-shot Prompting):为什么给 AI 几个例子就能让它变聪明?

💡 摘要:Few-shot Prompting 通过给模型提供少量示例,让它快速理解任务格式和映射规则。本文将教你如何选择示例数量、构造高质量示例,以及判断何时该用 Few-shot 而非微调。

引言

你让 AI 帮你从文本中提取信息,结果它输出了正确内容,但格式完全不对——没有 JSON 括号,没有键名,只是一段散乱的文本。

你很困惑:明明指令写得很清楚了,为什么 AI 就是做不对格式?

答案很简单:指令说不清楚的事,示例一句话就能教会。

这就是 Few-shot Prompting(少样本提示) 的核心价值。你不需要重新训练模型,不需要写复杂代码,只需要在 Prompt 里加 2-3 个例子,AI 的输出质量就会发生质的飞跃。

为什么几个简单的例子就能让 AI 突然"开窍"?

什么时候该给例子,什么时候不该给?

给 1 个、3 个还是 5 个例子效果最好?

本文将带你深入理解 Few-shot Prompting 的原理,并提供一套经过验证的示例构造方法论。

核心概念

什么是 Few-shot Prompting?

Few-shot Prompting(少样本提示)是一种通过提供少量示例来指导模型完成任务的技术。

你不需要告诉模型"具体怎么做",只需要给它看几个"输入→输出"的配对,模型就能自己推断出规则,然后应用到新问题上。

一个通俗的类比

想象你在教一个实习生做数据录入:

  • Zero-shot:你说"把客户信息整理成表格",实习生按自己的理解做——结果格式五花八门
  • Few-shot:你先给他看 2 个已经做好的表格样例,再说"按这个格式做"——实习生立刻做对了
  • Fine-tuning:你把实习生送去培训一个月,专门学习数据录入——效果好但成本极高

Few-shot 的核心思想是:与其长篇大论解释规则,不如直接展示几个正确样例。

关键术语

  • Few-shot:提供 1-5 个示例 + 指令
  • One-shot:只提供 1 个示例
  • In-context Learning(上下文学习):模型通过阅读上下文中的示例来学习任务,不需要更新参数
  • Fine-tuning(微调):用训练数据更新模型权重,让模型"内化"任务能力

原理深入

为什么给几个例子就能显著提升效果?

Few-shot 能成功的核心机制有两个:

1. 任务定位——示例告诉模型"切换到哪个模式"

模型在预训练时学习了无数种任务模式。当你给它看几个"输入→输出"配对时,模型会在高维空间中定位到对应的"任务子空间"。

示例告诉模型:
"现在请切换到'数据提取'模式,
不是翻译,不是总结,是提取。"

2. 隐式微调——模型当场推导映射规律

Transformer 的注意力机制在看到示例时,会进行类似于梯度下降的计算(被称为"前向传播中的元学习")。模型利用示例中的输入-输出对,当场推导出映射规律。

简单说:示例让模型在不更新权重的情况下,临时"学会"一个新任务。

示例数量的选择:1 个、3 个、5 个哪个好?

核心权衡是偏差 vs. 方差

示例数量 优点 缺点 适用场景
1 个 节省 token,速度快 模型过度依赖单个示例的偶然模式 任务极简单、上下文紧张
3 个 平衡质量和成本 通用场景默认选择
5 个 覆盖更多边界情况 消耗更多 token,收益递减 多分类、模型较小

快速决策表:

条件 推荐示例数
输入非常长(>2000 tokens) 0 或 1
任务简单,格式固定 1-2
通用场景(默认) 3
多类别分类(>4 类) 每类至少 1 个,总 ≤ 类别数×2
小模型(<1B 参数) 4-6
大模型(>100B),任务不复杂 0-2
需要复杂推理(Few-shot CoT) 2-3(带完整推理步骤)

什么时候用 Few-shot,什么时候用 Fine-tuning?

维度 Few-shot Fine-tuning
数据量 几个到几十个示例 上千条标注数据
成本 仅需一次推理 需要 GPU 训练
灵活性 随时切换任务 一个模型对应一个任务
推理速度 较慢(示例占用 token) 快(prompt 更短)
适用模型 闭源 API、大模型 开源模型、小模型

快速判断:

  • 数据少、任务多变、用 API → Few-shot
  • 数据多、任务固定、推理成本敏感 → Fine-tuning

代码示例

示例 1:Few-shot Prompt 模板

class FewShotPromptTemplate:
    """Few-shot Prompt 模板类——管理示例和指令"""
    
    def __init__(self, instruction: str, examples: list):
        self.instruction = instruction  # 任务指令
        self.examples = examples        # 示例列表
    
    def format(self, user_input: str) -> str:
        """组合指令、示例和用户输入"""
        parts = [self.instruction]
        
        # 添加所有示例
        for example in self.examples:
            parts.append(f"输入:{example['input']}")
            parts.append(f"输出:{example['output']}")
        
        # 添加用户输入
        parts.append(f"\n输入:{user_input}")
        parts.append("输出:")
        
        return "\n".join(parts)

# 使用示例:情感分析
template = FewShotPromptTemplate(
    instruction="请判断以下文本的情感倾向(正面/负面/中性):",
    examples=[
        {"input": "这部电影太棒了!", "output": "正面"},
        {"input": "服务太差,等了两个小时。", "output": "负面"},
        {"input": "今天天气还可以。", "output": "中性"},
    ]
)

prompt = template.format("产品质量一般般,不算好也不算坏。")
print(prompt)

示例 2:示例质量检查器

class ExampleQualityChecker:
    """检查 Few-shot 示例的质量"""
    
    @staticmethod
    def check_format_consistency(examples: list) -> bool:
        """检查所有示例的格式是否一致"""
        keys = [set(ex.keys()) for ex in examples]
        return len(set(frozenset(k) for k in keys)) == 1
    
    @staticmethod
    def check_label_diversity(examples: list, label_key: str = "output") -> bool:
        """检查标签是否具有多样性"""
        labels = {ex[label_key] for ex in examples}
        return len(labels) >= 2

# 检查示例质量
examples = [
    {"input": "今天很开心", "output": "正面"},
    {"input": "心情很糟", "output": "负面"},
    {"input": "无所谓", "output": "中性"},
]

checker = ExampleQualityChecker()
print(f"格式一致:{checker.check_format_consistency(examples)}")
print(f"标签多样:{checker.check_label_diversity(examples)}")

实战应用

什么样的示例算"好"的示例?

好的示例必须同时满足 5 个标准

标准 说明 反例
代表性 覆盖任务典型情况 只用极端案例做示例
多样性 展示不同输入类型和类别 所有示例都是同一类别
无歧义 输入输出严格对应 同一输入对应不同输出
格式一致 统一分隔符、标点、结构 混用"输入/Output/Q:"
顺序合理 简单到复杂,交错排列 同类示例堆在一起

坏示例的具体表现

坏示例特征 示例 后果
标签错误 输入"心情很好"→输出"负面" 模型学到错误分类边界
格式不一致 一个输出"3.5",一个输出"约3.5" 输出不稳定
包含无关细节 输入中带"顺便说我喜欢咖啡" 模型认为无关词是关键特征
太简单或太特殊 示例都≤5词,真实输入50词 模型无法泛化到长输入

构造好示例的 5 步法

  1. 从真实数据中挑选——不要手工编造,从实际数据中选典型样本
  2. 核对输出——确保每个示例的输出绝对正确
  3. 统一格式——使用相同模板,如 输入:{input}\n输出:{output}
  4. 平衡与排序——按 A, B, C, A, B, C 顺序排列,不要 AAA BBB CCC
  5. 测试迭代——用少量验证集评估,效果差就替换误导示例

最佳实践

根据知识库中的最佳实践和深度思考,总结出以下 7 条 Few-shot 实战技巧

1. 默认从 3 个示例开始

3 个示例是质量和成本的最佳平衡点。如果效果不稳定,先检查示例质量,再考虑增加。

2. 示例长度要匹配真实任务

如果真实输入平均 500 字,示例的输入也应该接近这个长度。否则模型可能只关注开头几个词。

3. 统一使用相同的分隔符

✅ 统一:输入:/ 输出:
✅ 统一:Q: / A:
❌ 混用:Q: / 输出:/ Answer:

4. 避免同类示例堆叠

✅ 好:正面 → 负面 → 中性 → 正面
❌ 差:正面 → 正面 → 正面 → 负面

5. 从真实数据选示例,不要编造

手工编造的示例容易无意中引入偏差。从验证集中挑选典型样本更可靠。

6. 检查标签多样性

确保每个类别至少有一个示例。多分类任务中,如果漏掉某个类别的示例,模型可能永远不会输出该类。

7. 示例放在最后会影响输出倾向

研究表明模型倾向于重复靠后示例的格式或答案。如果某一类示例总是出现在最后,模型可能过度预测该类。

总结

Few-shot Prompting 的核心价值在于:与其长篇大论解释规则,不如直接展示几个正确样例。

核心要点回顾

  1. 原理:示例帮助模型定位任务模式,并当场推导映射规律
  2. 数量:默认 3 个,根据任务复杂度调整
  3. 质量:代表性 + 多样性 + 无歧义 + 格式一致 + 顺序合理
  4. 选择:数据少用 Few-shot,数据多用 Fine-tuning

Logo

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

更多推荐