一、什么是 Few-shot 学习?

Few-shot Learning(少样本学习)是一种通过提供少量高质量示例来引导大语言模型(LLM)理解并执行特定任务的技术。通常只需要 1-10 个示例,就能让模型快速适应新领域,无需进行模型微调。

其核心思想是利用大语言模型强大的上下文学习能力(In-Context Learning)——模型在预训练阶段已经学习了海量文本中的模式,通过 prompt 中的示例可以激活相关能力,从而“举一反三”。这就像一位精通编程语法的开发者,看到几行代码风格示例后,就能写出符合规范的新代码,而不需要重新学习编程。

与传统机器学习的本质区别:传统方法需要成千上万条标注数据来训练模型参数,而 Few-shot 不更新任何参数,仅通过 prompt 中的示例构建临时任务规范。因此它具有成本低、部署快、即插即用的显著优势。


二、Few-shot 的核心策略与实现方法

1. 示例选择策略

选择合适的示例是 Few-shot 成功的核心,需遵循以下原则:

原则

说明

示例

多样性

覆盖主要类别和边界情况

情感分类中同时包含明确褒奖和委婉称赞的正面评论

代表性

选择最能体现类别特征的典型样本

保险客服场景中,每类意图选 2 个最典型提问

相关性

示例与输入文本语义相近

动态选择时使用向量相似度匹配最相关样本

2. 示例排序优化

示例的排列顺序会影响模型学习效果,常用策略包括:

  • 相关性排序:按与输入内容的语义相似度从高到低排列
  • 难度递增排序:从简单示例到复杂示例逐步引导

3. 固定示例 vs 动态示例

固定示例(Fixed Examples):每次推理使用相同的示例集,简单易用,适合模式固定的任务。

动态示例(Dynamic Few-shot):根据当前输入,通过向量相似度算法从训练集中动态选取最相关的示例。这种方法能显著提升模型在多样化输入场景下的表现。例如使用 SemanticSimilarityExampleSelector 配合嵌入模型和向量数据库实现。


三、代码实现示例(基于 LangChain)

3.1 固定示例实现

以自定义数学运算符“🦜”代表加法为例:

from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate
from langchain_openai import ChatOpenAI

# 定义示例
examples = [
    {"input": "2 🦜 2", "output": "4"},
    {"input": "2 🦜 3", "output": "5"},
]

# 创建示例格式化器
example_prompt = ChatPromptTemplate.from_messages([
    ("human", "{input}"),
    ("ai", "{output}"),
])

few_shot_prompt = FewShotChatMessagePromptTemplate(
    example_prompt=example_prompt,
    examples=examples,
)

# 构建最终提示
final_prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a wondrous wizard of math."),
    few_shot_prompt,
    ("human", "{input}"),
])

model = ChatOpenAI(model="gpt-4o-mini", temperature=0.0)
chain = final_prompt | model
response = chain.invoke({"input": "What's 3 🦜 3?"})
print(response.content)  # 输出:3 🦜 3 = 6

3.2 动态示例实现(向量相似度选择)

对于复杂问答任务,可以构建示例池,并基于语义相似度动态选择最相关示例:

from langchain_chroma import Chroma
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_openai import OpenAIEmbeddings

# 示例池(训练集)
qa_examples = [
    {"question": "Who lived longer, Muhammad Ali or Alan Turing?",
     "answer": "Follow up: How old was Muhammad Ali... So final answer: Muhammad Ali"},
    {"question": "Who was the maternal grandfather of George Washington?",
     "answer": "Follow up: Who was the mother... So final answer: Joseph Ball"},
    # 更多示例...
]

# 创建基于语义相似度的选择器
example_selector = SemanticSimilarityExampleSelector.from_examples(
    qa_examples,
    OpenAIEmbeddings(),
    Chroma,
    k=1  # 每次选择最相似的1个示例
)

# 构建动态提示
prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    suffix="Question: {input}",
    input_variables=["input"],
)

chain = prompt | model
result = chain.invoke({"input": "Who was the father of Mary Ball Washington?"})
print(result.content)  # 自动匹配最相关示例,输出正确回答

四、实战案例:文本纠错与情感分类

案例1:错别字纠正

通过一个示例即可让大模型学会纠错格式:

任务描述:找出错别字并按格式输出

输出示例:
熊猫眼,黑白分名(名→明)

待纠错文本:
熊猫打滚,可爱又玩皮
熊猫血,珍贵无敝

输出结果:
熊猫打滚,可爱又玩皮(玩→顽)
熊猫血,珍贵无敝(敝→比)

案例2:情感分类(含推理过程)

复杂推理任务可结合Chain of Thought(思维链),在示例中展示中间步骤:

示例:
The odd numbers in this group add up to an even number: 4, 8, 9, 15, 12, 2, 1.
A: Adding all the odd numbers (9, 15, 1) gives 25. The answer is False.

新输入:
The odd numbers in this group add up to an even number: 15, 32, 5, 13, 82, 7, 1.
A: Adding all the odd numbers (15, 5, 13, 7, 1) gives 41. The answer is False.

思维链技术能显著提升数学推理、逻辑判断等复杂任务的准确率,但仅对参数量超过 1000亿 的大模型有效。


五、Few-shot 最佳实践与注意事项

5.1 示例数量选择

  • 通常 3-5 个示例 足够,过多可能导致模型混淆或超出 token 限制
  • 从 3 个开始测试,效果不稳定则逐步增加,不超过 10 个

5.2 示例质量要求

  • 每个类别至少提供 2 个示例,让模型看到类内差异
  • 格式必须严格统一(包括分隔符、标记符号等)
  • 即使标签有少量错误,只要整体模式一致,模型仍能学习正确响应模式

5.3 常见问题与解决方案

问题

解决方案

输出格式不稳定

在指令中明确“仅输出分类结果,不要解释”;使用正则后处理

模型对措辞敏感

准备多个 prompt 版本,用小规模测试集择优

复杂任务效果差

结合 Chain of Thought 展示推理过程;考虑 Fine-tuning

5.4 技术选型建议

  • Few-shot 首选场景:数据量少(几十条)、临时性需求、长尾任务
  • Fine-tuning 场景:核心高频任务、有几千条以上高质量数据、准确率要求极高
  • RAG 结合 Few-shot:先检索知识库相关案例,再作为 Few-shot 示例传给模型,适合客服问答等场景

六、总结

Few-shot Learning 是大语言模型提示工程中的核心技巧,通过精心设计的少量示例就能显著提升模型在特定任务上的表现。其本质是利用模型预训练阶段积累的通用知识,通过上下文注意力机制进行模式匹配。合理运用固定示例动态示例策略,结合思维链等进阶技术,可以在医疗、法律、电商等数据稀缺领域发挥巨大价值。开发者应根据任务复杂度、数据量和性能要求,在 Few-shot、Fine-tuning 和 RAG 之间做出合适的技术选型。

如需进一步学习,推荐参考 LangChain 官方文档和 OpenAI API 参考,关注向量存储和嵌入模型的最新研究进展

Logo

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

更多推荐