想象你店里来了一位新主厨:他厨艺功底极好,见过世界各地的菜,但今天是第一次来你的店。你不需要给他重新培训三个月,只需端上几道最拿手的示范菜:“这道菜要偏甜、摆盘要整齐、用小葱不要用大葱”。他尝了几口,就能按你的风格做出新菜。这一幕就是 Few-shot 提示学习:大模型就像这位主厨,通过上下文中的少量示例学会当前任务,而不是更新模型参数。示例怎么摆、放几道、顺序如何、格式是否统一,直接决定了这桌客人的体验。本文用一套“试菜菜单”的脑回路,带你理解示例标注格式、数量与顺序、验证集搜索、上下文学习机制、Prompt Tuning 软提示,以及效果评估与迭代优化。
对 Prompt 工程师与 AI 应用开发者,掌握 Few-shot 提示学习意味着用最少的标注数据撬动大模型的最大能力,在真实业务中把少样本场景做成高精度系统。
目录
可视化演示
动态演示Few-shot提示学习与示的核心机制,通过概览/流程/对比/趋势四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Few-shot提示学习与示:Fews Few-shot提示学习的框架 示例标注格式优化策略 核心机制可视化 Few-shot提示学习与示整体架构与关键组件
示例标注格式:菜单排版要工整
新主厨最怕看到一份菜谱,一会儿写“主料:鸡丁,配料:花生”,一会儿又写“花生/鸡丁/辣椒”。每道菜信息再全,排列混乱也会让他抓不住重点。示例标注格式就是给模型的“菜谱版式”。
Few-shot 里每个示例本质是一对“输入→输出”。模型通过上下文中的若干对 input→output 来猜测当前任务。如果每个示例的写法不一致,例如一个用“问题:……答案:……”,另一个用"Q: …… A: ……",模型就需要花更多算力对齐格式,甚至被带偏。
一个通用原则是:模板统一、分隔符清晰、标签命名自然。模板统一指输入和输出顺序固定;分隔符用“→“或”:“等不易混淆的符号;标签命名优先使用自然语义词。例如情感分类用 positive/negative 或”正面/负面”,而不是 1/0。
菜单版式统一后,主厨一眼就能看出每道菜的“做法”是什么,才能把注意力放在口味本身。示例格式优化的价值正是如此:减少模型的阅读成本,把推理能力留给任务本身。
- fmt 格式化函数对所有示例施加同一个模板函数,杜绝“这道菜一个写法、那道菜另一个写法”。
- x_i 与 y_i前者是输入文本,后者是期望输出的标签,二者构成一条“输入→输出”示范。
- sep 与 ⊕sep 表示分隔符,⊕ 表示文本拼接,二者把输入、分隔符、输出连接到同一行。
数量与顺序:菜单长短与上菜次序
菜单太长,主厨记不住;太短,又看不出风味。上菜时最后端上来那道菜往往给他印象最深。Few-shot 示例同理:数量 k 和顺序都会显著影响效果。
经验上 k 并非越大越好。随着示例增加,模型性能通常先快速上升,随后饱和甚至下降;常用 4~8 个示例作为起点。顺序上存在“近期偏好”——放在提示末尾的示例对预测影响更大,因为在生成时末尾 token 离答案更近。
一个实用策略是把与测试样本语义最相似的示例放在末尾,让模型“带着最新印象”回答问题。多样性原则也很重要:尽量覆盖不同标签和难度,而不是全放同类样本。
菜单不是越长越好,上菜顺序更要把“招牌菜”压轴。Few-shot 实践中,少而精、末尾放关键的示例,往往比堆砌大量示例更有效。
- w_i 位置权重表示第 i 个示例在 k 个示例中的重要程度,i 越大通常代表越靠后。
- exp(λi) 指数项指数函数会把位置差异放大,让靠后示例的分数明显更高。
- 分母归一化除以所有位置分数的总和,使所有权重加起来等于 1,变成一种概率式分配。
验证集搜索:让常客评委帮你挑菜
到底哪几道示范菜最能打动客人?与其凭感觉,不如请几位常客来试。每次从候选菜里挑一道让常客评分最高的加入菜单,这就是贪心搜索。
在少样本场景,我们可以准备一个小验证集,把候选示例池中的每个示例单独加入提示,看模型在验证集上的表现提升多少,再挑提升最大的那个。重复此过程直到达到期望的 k 值。
直接用语言模型反复推断成本高,所以可以先做语义相似度粗筛,缩小候选池;再用贪心组合搜索做精筛。评估指标可以用准确率,也可以结合 F1、召回率等一起看。
常客评委虽然只试吃几口,却能让菜单从“凭感觉”变成“有数据支撑”。验证集搜索就是在少样本条件下,把示例选择变成一个可量化、可迭代的优化过程。
- S\* 最优示例集合最终挑出的 k 个示例组合,目标是让验证集上的平均表现最好。
- 验证集平均对验证集中每个样本计算是否预测正确,再取平均,得到 0 到 1 之间的分数。
- 指示函数当模型预测等于真实标签时为 1,否则为 0,本质是一个“答对计数器”。
上下文学习机制:主厨是怎么偷师的
新主厨为什么看几道菜就会做?因为他本来就会做菜;示范菜只是唤醒他“本店口味”的记忆。大模型同样如此:预训练让它掌握海量语言规律,few-shot 示例负责激活任务模式。
上下文学习发生在推理阶段:模型根据上下文中的示例分布,推断当前输入对应的输出。它不修改全部参数,而是重新调整条件概率。研究者认为其中包含模式模仿、任务识别、隐式推理等能力。例如两个示例“A→正,B→负”,模型会识别“这是情感分类”并模仿这种映射关系。
这也解释了为什么示例格式和标签命名那么重要:模型是在“读例子”而不是“记答案”。它从示例中推测任务边界,再对新的输入做类似推理。
示范菜没有改变主厨的肌肉记忆,但让他快速切换到本店模式——这正是上下文学习的优雅之处。少样本提示的本质,不是让模型重新学习,而是帮它“认出”已经会做的菜。
- P(y|x,S)给定输入 x 和示例集合 S,模型认为标签 y 是正确的概率。
- s(x,S,y) 打分函数模型根据上下文对“标签 y 是否契合当前任务”打的分数,分数越高代表越可能。
- softmax 归一化对所有候选标签的指数打分求和,再逐一相除,得到可比较的概率分布。
软提示调优:Prompt Tuning 的秘制酱料
如果示范菜还不够稳,后厨还可以准备一罐“秘制酱料”:它不是自然语言,而是一串可学习的连续向量。把它加到提示开头,模型输出就会跟着改动。这就是 Prompt Tuning。
在少样本场景,我们拿训练集对软提示做梯度下降,同时冻结大模型主体。这样只需更新少量参数,就能把模型“调”到目标任务上。与硬提示(人写的离散文本)相比,软提示可以在连续向量空间找到更细腻的表达;与全量微调相比,它只更新前缀,训练成本低、不易灾难性遗忘。
Prompt Tuning 通常只需要很少的训练数据,因为它不改变模型内部的预训练知识,只调整“入口味道”。
酱料配方很小,却能给整家店定型;不需要大厨改厨艺,只需要调整“本店风味”。Prompt Tuning 给少样本场景提供了一条低成本的调优路径。
- θ 软提示参数一串可学习的连续向量,长度通常远小于模型参数,相当于“秘制酱料配方”。
- 负对数似然模型给真实标签的概率越大,损失越小,所以取负号求最小,让模型更愿意输出正确答案。
- 训练集 D_train少样本下可能只有几十条标注数据,说明 Prompt Tuning 非常适合低资源任务。
效果评估与实践:试菜通过再开张
菜单上新前,厨师长会多次试菜:不只关心平均评价,还要看每桌的评分是否稳定。少样本评估同样要同时看“平均准确率”和“方差”。
因为示例组合和提示模板会引入高方差,一个示例的替换就可能让准确率波动几个点。所以实践中要重复多次采样、计算均值和标准差,再比较不同方案。还要考虑成本:k 越大,每次请求消耗的 token 越多、延迟越高。最佳方案通常是在准确率、稳定性和成本之间做权衡,并通过“评估→调菜单→再评估”的循环持续优化。
只有通过了“稳定、好吃、成本可控”三重检验的菜单,才配得上正式开张。Few-shot 工程化亦是如此:不仅要在离线指标上好看,还要在真实流量中扛得住波动。
- Acc 平均准确率多次实验结果的平均值,代表“通常表现”。
- Std 标准差多次结果的波动程度,标准差越大说明越不稳定。
- β 权衡系数根据业务风险设置,例如对稳定性要求高时把 β 调大。
AI 应用场景
智能客服工单自动分类
阶段:提示设计 / 模型调用
解决的问题:传统规则分类难以覆盖长尾表达,全量微调又成本高。用统一格式的 few-shot 示例让大模型直接输出工单类型。
具体案例:一家电商平台收集 8 个工单示例,统一写成“用户问题→类型”格式,例如“订单迟迟不发货→物流问题”,让模型对新工单分类。用验证集挑选示例后,分类准确率从 68% 提升到 86%。
电商评论情感分析
阶段:示例优化与评估
解决的问题:评论文本口语化,直接零样本效果不稳定。借助近期偏好,把与测试评论语义相似的示例放在提示末尾。
具体案例:开发者从评论池中按 token 重叠或向量相似度选出正负例各 2 个,并按相似度从低到高排列,让模型先看一般例子、最后看最相似例子,减少“标签抄错”现象。
开源模型上的软提示调优
阶段:模型调优 / Prompt Tuning
解决的问题:业务有少量标注数据,但不希望全量微调;Prompt Tuning 只训练软提示,避免过拟合,也降低训练成本。
具体案例:在 7B 开源模型上,用 200 条法律文书抽取标注训练软提示,冻结底座,将 F1 从 74% 提到 81%,单任务训练成本不到全量微调的 1/10。
Python 演示
# Few-shot 示例自动筛选演示# 用验证集评分 + 贪心搜索选择最优示例import math POOL = [ {"tokens": "milk tea is great", "label": "positive"}, {"tokens": "service is terrible", "label": "negative"}, {"tokens": "packaging is solid", "label": "positive"}, {"tokens": "item not as described", "label": "negative"}, {"tokens": "taste good but pricey", "label": "positive"}, {"tokens": "support is rude", "label": "negative"},] VALIDATION = [ {"tokens": "coffee aroma is rich", "label": "positive"}, {"tokens": "return process is slow", "label": "negative"},] def token_overlap(a, b): return len(set(a.split()) & set(b.split())) def example_score(ex, val_set): score = 0 for sample in val_set: overlap = token_overlap(ex["tokens"], sample["tokens"]) score += overlap if ex["label"] == sample["label"] else -overlap return score def greedy_select(pool, val_set, k): chosen = [] chosen_indices = [] step = 0 while step < k: best_index = -1 best_score = -math.inf for i, ex in enumerate(pool): if i in chosen_indices: continue score = example_score(ex, val_set) if score > best_score: best_score = score best_index = i if best_index == -1: break chosen_indices.append(best_index) chosen.append(pool[best_index]) step += 1 return chosen if __name__ == "__main__": selected = greedy_select(POOL, VALIDATION, k=3) for ex in selected: print("{} -> {}".format(ex["tokens"], ex["label"]))
def token_overlap(a, b):计算两个文本的单词交集数量,模拟“语义相似度”。score += overlap if ex["label"] == sample["label"] else -overlap与验证集标签一致则加分,不一致则减分,让示例既相关又有区分度。if score > best_score:每轮都找出当前分数最高的候选示例。chosen.append(pool[best_index])把当前最优示例加入最终集合,再进入下一轮搜索。print("{} -> {}".format(ex["tokens"], ex["label"]))输出被选中的示例。
常见误区
误区“反正我预算够,干脆塞 50 个示例进去,模型一定更聪明。”
正解示例多到一定数量后收益递减,甚至因上下文过长引入噪声和更高成本。新主厨尝太多菜反而会口味混乱。一般从 4~8 个起步,再用验证集搜索最稳妥。
为何常见:人们受“数据越多越好”的监督学习直觉影响,忽略了上下文长度和注意力窗口限制。
误区“我把示例随机打乱,反正模型都能看到,顺序影响不大。”
正解模型存在近期偏好,靠后的示例对输出影响更大。把最关键的示范放在提示末尾往往效果更好。
为何常见:人读文本时通常认为整体信息都可见,不会想到注意力会偏向序列末端。
误区“标签写 0/1 还是 positive/negative 都一样,模型很聪明。”
正解标签词汇会直接影响模型推理。写成 0/1 可能让模型把它当成文本编号;写成自然语义词能让模型更容易对齐预训练时的概念。
为何常见:很多新手把模型当成数据库,忽略了标签在语言上的“可读性”。
误区“验证集选出的示例很强,以后所有测试样本都用这一组。”
正解不同测试样本适合的示例集可能不同。更优做法是按测试输入动态检索相似示例,或在业务分布漂移后重新搜索。
为何常见:贪心搜索得到的结果看似全局最优,实际是验证集上的局部最优,忽略了样本分布变化。
误区“Prompt Tuning 就是反复改写 prompt 的用词,比如把'分类'改成'判断'。”
正解Prompt Tuning 更新的是可学习的连续向量,不是人写文本;它通过梯度下降优化一个嵌入前缀,属于参数高效微调。
为何常见:名字里有 “Prompt“,让人误以为和 Prompt Engineering 一样,忽略了 ”Tuning” 的训练性质。
面试题
Q1. Few-shot 提示学习中,示例的主要作用是?
- A.更新模型内部参数
- B.提供任务示范上下文← 正确答案
- C.扩大离线训练数据集
- D.加快模型预训练速度
答案:B。few-shot 示例不更新权重,而是像示范菜一样给模型展示“输入→输出”的规则。模型靠上下文中的示例识别任务并完成推理,而不是把示例塞进训练集。
Q2. 示例标注格式混乱时,最可能出现?
- A.模型完全无法运行
- B.模型难以识别任务规律← 正确答案
- C.模型推理速度大幅提升
- D.模型显存占用自动减少
答案:B。格式混乱会干扰模型区分输入和输出,就像菜谱排版混乱让主厨抓不住重点。模型通常仍能运行,但效果会下降,更不会提速或省显存。
Q3. 关于示例排列的“近期偏好”是指?
- A.距离开头越近的示例影响越大
- B.距离结尾越近的示例影响越大← 正确答案
- C.所有示例发挥完全相同作用
- D.位于中间位置的示例作用最大
答案:B。模型生成时会更关注靠近末尾的 token,所以越靠后的示例影响越大。这不是均匀加权,也不是中间位置最重要。
Q4. 以下哪些做法有助于优化 Few-shot 示例?
- A.统一输入输出的标注格式← 正确答案
- B.挑选语义相似示例加入提示← 正确答案
- C.随机打乱示例顺序且不验证
- D.基于验证集做贪心示例选择← 正确答案
答案:ABD。统一格式、语义相似示例、验证集贪心搜索都是有效手段。随机打乱且不验证可能加剧近期偏好或噪声,属于高风险操作。
Q5. 基于验证集的贪心示例搜索,核心逻辑是?
- A.穷举所有示例组合找到最优解
- B.每轮挑选当前收益最高的示例← 正确答案
- C.从示例池中完全随机抽取示例
- D.按示例原始顺序依次放入提示
答案:B。贪心搜索不穷举所有组合,而是每轮选择对验证集增益最大的一个示例加入集合,再用新集合继续下一轮选择。
Q6. 以下关于上下文学习机制的说法,错误的是?
- A.模型会模仿示例中的输入输出模式
- B.模型能识别示例所代表的任务类型
- C.模型通过更新权重来记住这些示例← 正确答案
- D.模型可以在上下文中进行隐式推理
答案:C。上下文学习不更新模型权重,它靠示例在推理时激活任务模式。C 所说的“更新权重记住示例”是微调或元学习的描述,不是上下文学习的特征。
Q7. Prompt Tuning 与全量微调的关键区别是?
- A.仅更新可学习的软提示参数← 正确答案
- B.更新模型的全部网络参数
- C.完全不需要任何标注训练数据
- D.必须先做大规模预训练
答案:A。Prompt Tuning 只训练软提示向量,冻结底座;全量微调会更新全部参数。Prompt Tuning 仍需少量标注数据,并不需要重新预训练。
Q8. 设计示例格式时,哪些原则是合理的?
- A.使用清晰统一的分隔符← 正确答案
- B.保证标签写法完全统一← 正确答案
- C.提示模板设计越复杂越好
- D.模板与测试输入保持对齐← 正确答案
答案:ABD。清晰分隔符、统一标签、与测试输入对齐都能帮助模型理解任务。模板不是越复杂越好,过度设计反而引入噪声。
Q9. 软提示(soft prompt)本质上是什么?
- A.一段精心编写的自然语言前缀
- B.在连续向量空间学习的嵌入参数← 正确答案
- C.开发者硬编码的固定规则模板
- D.从随机噪声中生成的固定文本
答案:B。软提示不是自然语言,而是模型嵌入空间中的可学习向量,类似“秘制酱料”;自然语言前缀属于硬提示。
Q10. 在少样本效果评估中,应重点关注哪些指标?
- A.多个提示模板下的平均准确率← 正确答案
- B.不同示例组合带来的结果方差← 正确答案
- C.推理阶段消耗的时间与成本← 正确答案
- D.预训练阶段使用的数据总量
答案:ABC。少样本评估要看均值、方差和成本,避免一次实验结果失真;预训练数据总量在推理阶段不可控,也不是评估项。