后厨来了个新徒弟,老师傅没有急着灌输一本《烹饪原理5000条》,而是随手端出几道做好的菜摆在案板上:“这是宫保鸡丁,鸡丁要嫩、花生要脆;这是酸菜鱼,鱼片要滑、酸味要正。”徒弟看了两眼,心里马上有了“标准答案”的样子,照葫芦画瓢做出来的菜八九不离十。教大模型,用的也是这套方法。 大模型像极了这个新徒弟。你对它说“帮我给评论分类”,它虽然认识“分类”两个字,却不知道你要的是“好评/差评”二选一,还是“1-5星”打分,更不清楚你希望它先分析再下结论。但只要你往提示词里放两三组“输入→输出”的样例,它立刻心领神会,照着样例的格式、口径和推理习惯作答。这一招,就是Few-shot示例引导(Few-shot示例引导)——提示词工程里性价比最高的技巧之一。 别小看这几条样例。挑什么样例、写成什么格式、放几条、按什么顺序、样例本身对不对,每个细节都在悄悄改变模型的输出。本文就用“老师傅传手艺”这条线,把Few-shot示例引导的六个关键环节串起来讲透,让零基础的你也能成为调教大模型的行家。
这是大模型应用开发中最常用、见效最快的提示词技巧之一,掌握它能显著提升AI输出的可控性与准确性,是所有Prompt工程学习者的第一项核心技能。
目录
可视化演示
展示TCP/IP四层模型中数据的封装与解封装过程,切换模式查看发送端封装、接收端解封装和完整通信流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
TCP/IP 数据封装过程 数据从应用层向下传递,每层添加协议头部 封装数据=原数据+各层头部 发送端自上而下封装,接收端自下而上解封装
基本概念与定义:Few-shot示例引导是什么
新来的徒弟第一次被要求写“菜品说明卡”,完全不知道怎么下笔——他不知道卡片该写食材还是写做法,更不知道写到什么程度算合格。老师傅没多解释,直接翻出三张写好的样品卡摆在他面前。徒弟扫了两眼,模仿着写出一张格式差不多的卡片。教大模型做新任务,用的正是这个动作:在提问前,先往提示词里放几条“输入→输出”的完整样例,让它照着样例的样子回答。这个技巧就是Few-shot示例引导。
所谓Few-shot,英文直译是“少量样本”。在提示词工程里,它指在prompt中嵌入少量输入输出对,让模型把样例当作参照系来回答新问题。与之相对的Zero-shot(零样本)只给文字指令、不给样例,相当于只告诉徒弟“写个卡片”却一张示范都不给;One-shot则只给一条样例。大模型的底层是一个“上下文预测器”:它会从你给出的所有文本里归纳模式,然后顺着这个模式继续生成。因此样例不只是格式示范,更是在悄悄规划“推理路径”——比如先判断情感,再给出标签。
用条件概率的语言来描述会更精确。设示例集为E,新输入为x,模型在“已看过示例”的前提下为每个候选输出y打分并选择最优:
由此可见,Few-shot不是让模型“背答案”,而是让模型在示例的坐标系里寻找与新输入最吻合的作答方式。这就像老师傅“以菜传艺”——不背菜谱、不看理论,只看几道成品,徒弟便心领神会。这条思路,是下面所有细节的总纲。
- 示例集合E模型参考的输入输出对构成的集合,是Few-shot的“示范菜谱”。
- 新输入x当前等待回答的问题,相当于“新点的一道菜”。
- 候选输出y模型可能生成的答案,相当于“出品的菜”。
- 条件概率整个式子表示“看过样例后,面对新输入,模型选择某个答案的概率”,概率越高越可能输出。
案例格式设计:让样例一看就懂
如果老师傅甩给徒弟的样品卡五花八门——第一张写食材,第二张写火候,第三张画了幅图——徒弟不但学不到东西,还会被整懵。示范要生效,前提是每张卡的“栏位”统一。Few-shot示例引导同理:格式混乱的样例,会让模型不知道该模仿什么。
一条合格的Few-shot样例应满足三项要求。第一,输入输出成对出现:每条样例必须完整展示“输入是什么、输出是什么”,缺一不可,模型才看得到映射关系。第二,字段命名清晰:在输入输出前分别加上“输入:”与“输出:”这类显式标记,明确文本边界。第三,分隔符唯一:示例与示例之间用固定分隔符(如单独一行的"---")隔开,且这个分隔符绝不能混进业务文本里,否则模型会把分隔符当成内容。
可用一个三元组来概括一条样例的结构:
现实中,格式的威力常被低估。同一批任务,把示例里的标签从“1/0“改成”正面/负面“,输出准确率就可能明显波动。因为模型在模仿的不仅是答案,还有答案的”长相”。就像徒弟不仅学菜的味道,还会模仿摆盘风格——你示范的卡片长什么样,他交上来的卡就长什么样。
- 输入文本xᵢ第i条示例的输入部分,模拟真实用户输入。
- 格式模板fᵢ这条样例采用的排版模板,如“输入:{x} 输出:{y}”。
- 期望输出yᵢ模型应当模仿的目标答案。
- 三元组结构三者合成一条“有骨有肉”的样例,模型才能看清从输入到输出的完整映射。
示例选择策略:挑出最合适的示范
同样是教川菜,老师傅不会拿“开水白菜”当第一道示范菜——那是国宴功夫菜,徒弟看完只会怀疑人生。他会挑“宫保鸡丁”这类家常经典:用料常见、步骤典型,练完一通百通。给AI选示例,道理一模一样:示例的质量与针对性,决定了模型的模仿上限。
示例选择有三条核心原则。第一,代表性优先:示例要覆盖任务中出现频率最高的输入模式,让模型看几条就能覆盖大多数真实请求。第二,多样性覆盖:常见变体都要有代表,比如长短句、口语化表达、带特殊符号的文本,避免模型只见树木不见森林。第三,相似度匹配:工程实践中,通常先把所有候选示例做向量化(embedding),再计算每条示例与新输入的语义相似度,挑出最接近的几条。“相似”的示例为什么会更好?因为模型在处理新输入时,会优先从上下文中寻找结构相近的模式——相似的句子结构,对应的推理路径也更容易被“唤醒”。
数学上,相似度可以用向量的余弦值来度量:
选好示例,等于给模型配了一位“懂行的师父”。示例贴合任务,模型的模仿就像站在巨人的肩膀上起步;示例牛头不对马嘴,再强的模型也会被带偏到沟里去。
- 查询向量vec(x)把待回答的新输入编码成高维向量,相当于“新菜的特征坐标”。
- 示例向量vec(xᵢ)把候选样例的输入也编码成同一空间中的向量。
- 余弦函数两个向量的点积除以模长的乘积,度量方向上的重合程度。
- 综合得分得分越高,示例与查询越“同频”,越适合放进提示词。
示例数量控制:几条示例最优
示范菜该看几道?看0道,徒弟全靠悟性,十有八九翻车;看1道,方向有了但变化不会;看3到5道,常见套路基本覆盖;看20道,徒弟眼花缭乱,而且菜都放凉了——时间成本和token成本全在涨。Few-shot的k值选择,本质就是在“引导充分”和“成本可控”之间取平衡。
经验规律大致如下:k=0是零样本基线,先把最朴素的指令效果测出来;k=1(One-shot)的跃升往往最大,模型第一次获得了“模板感”;k=2到5是最常用的区间,大多数分类、抽取任务到这个范围已趋于饱和;k超过10后,收益趋近于零,反而可能因为混入不相关样例而引入噪声。另外每一条示例都要占用上下文窗口,挤占模型处理新输入时的注意力预算。所以最佳实践是:从1条开始逐条增加,观察到效果不再变化就停止。
这可以用边际收益来表达。设Acc(n)表示注入n条示例后的准确率,则第n条示例的边际收益为:
教学从来不是菜越多越好。师傅讲透三道菜,徒弟能举一反三;囫囵吞枣看二十道,反而消化不良。给你的prompt配上“够用”的样例数量,既省token,又稳效果。
- 示例数量n提示词中注入的示例总条数,是Few-shot最直接的旋钮。
- 准确率Acc(n)使用n条示例时,模型在评测集上的准确率。
- 边际收益Δ相邻两个数量档位的准确率差,衡量“再加一条值不值”。
- 递减规律第一条示例改变最大,后续增量迅速缩小,说明“够用就好”。
示例顺序影响:排列顺序的讲究
同样三堂示范课,先讲基础再讲技巧,和先讲技巧再补基础,徒弟的吸收效果完全不同——开头定基调,结尾留印象。大模型读提示词也有类似的“位置偏好”:它分配给提示词不同位置的注意力并不均匀。
学界对这种现象通常归纳为两类效应。一是首因效应:位于提示词开头的示例会被模型当作“全局框架”,定义整个任务的输出结构——比如开头样例输出是JSON,模型会倾向认为整个任务都要输出JSON。二是近因效应:离新输入最近的末尾样例,最容易被模型“即时模仿”,尤其影响回答的措辞与细节风格。中间位置的示例影响力相对弱一些。这给我们的设计启示很直接:把格式最规范的样例放在开头,把风格最接近理想答案的样例放在末尾,需要强调的业务约束也放在首尾。
若用简化的权重公式描述位置影响力:
当然,真实注意力机制比这复杂得多,但“位置影响输出”这一点已被反复证实。聪明的师傅会把话术编排成“开场重点、中场过渡、结尾点睛”。排列示例时,也请用同样的心法。
- 位置序号i示例在提示词中出现的位置,i=1是第一条。
- 衰减系数λ控制位置影响力的衰减快慢,λ越大开头的权重越高。
- 指数函数保证权重为正且随位置单调递减。
- 位置权重wᵢ第i条示例对模型输出的综合影响力,开头示例权重最大。
示例质量调试:清扫低质量示例
老师傅最怕的事,是自己教错了。如果示范卡上白纸黑字写着“盐50克”,徒弟照做,整锅菜全废——坏样例的污染力,比好样例的引导力更凶猛。模型对示例几乎是“盲从”的:你给它什么,它就模仿什么,哪怕那条示例本身是错的。
低质量示例主要有三类问题。一是标签错误:输入输出对本身不匹配,比如把“服务太差”标成“好评”;二是一致性缺失:两条相似输入的示例给出的标签互相矛盾,模型会无所适从;三是格式噪声:分隔符混乱、字段缺失或有多余字符,干扰模型对“干净格式”的提取。因此Few-shot调试的第一步不是调参数,而是“查样例”。
正确的调试顺序是:先清空示例测Zero-shot基线,确认要不要用Few-shot;然后逐条替换或删减示例做A/B对比,把“带偏”模型的元凶样例揪出来;最后统一所有示例的格式、术语和标注口径。可以把示例集合的质量理解为“正确率”与“噪声”的加减博弈:
每次调Few-shot效果不佳,先别急着怪模型。回头检查你递给它的每一道“示范菜”——是不是有一道菜里,偷偷放错了盐。
- 正确率C(E)示例集中标注正确的比例,是质量的“压舱石”。
- 噪声度N(E)衡量格式混乱、标签冲突的程度,越高越干扰模型。
- 权重系数λ、μλ放大正确率的作用,μ放大噪声的代价,两者按任务调节。
- 质量分Q(E)综合得分,值越高代表这组示例越值得放进提示词。
AI 应用场景
银行客服工单自动分类
阶段:Prompt设计阶段
解决的问题:传统规则引擎需要人工维护大量关键词和正则表达式,遇到新话术容易漏判,成本高、反应慢。用Few-shot示例引导,只需在提示词中放两三条“工单→类别”的样例,模型就能以极低成本学会分类口径。
具体案例:某银行智能客服每天处理数千张用户工单,按8个类别分流。起初只写指令时,模型常把“为什么我转不了账”归为“其他”;加入两条样例——“转账失败→账户问题”、“卡片被冻结→风控问题”——后,模型稳定分类为“转账类”和“风控类”,人工转接率明显下降。
电商评论结构化提取
阶段:信息抽取与数据入库
解决的问题:模型默认输出自由文本,无法直接写入数据库。用2-3条“评论→JSON”样例,模型就会严格模仿JSON结构输出,结构化提取变成“照葫芦画瓢”。
具体案例:某电商平台想从评论中提取“情感+关键维度”。给模型看两条样例——“价格贵但质量好”→{"sentiment":"positive","aspects":{"price":"negative","quality":"positive"}}——模型对同类评论的解析入库率从57%提升到92%。
跨服务日志统一格式化
阶段:可观测性与运维自动化
解决的问题:不同服务的日志格式五花八门,运维团队需要维护大量解析正则。Few-shot让模型直接完成“原始日志→标准JSON”的转换,减少硬编码解析器。
具体案例:某SRE团队把Java堆栈、Go panic、Nginx error log各选一条样例放入提示词,模型就能对后续日志统一输出标准事件结构,接入告警平台的解析耗时从分钟级降到秒级。
Python 演示
# -*- coding: utf-8 -*-"""Few-shot 示例引导 demo: 用 Jaccard 相似度选示例 + 模拟模型输出"""import re TASK_DESC = "请将下面的用户留言分类为: 好评、差评、中性。" CANDIDATES = [ ("这家餐厅的菜很好吃,服务也热情", "好评"), ("等了四十分钟才上菜,太失望了", "差评"), ("味道还行,价格有点贵", "中性"), ("快递小哥送货速度很快,点赞", "好评"), ("商品质量一般,不推荐", "差评"), ("外观不错,功能中规中矩", "中性"), ("客服解决问题很耐心,满意", "好评"), ("噪音太大,严重影响使用", "差评"), ("性价比还可以,没惊喜也没失望", "中性"),] TEST_EXAMPLES = [ ("外卖包装很用心,味道也好", "好评"), ("屏幕用了几天就花了,质量堪忧", "差评"), ("颜值在线,但续航一般", "中性"),] def jaccard_sim(text_a, text_b): """用字符 bigram 集合的 Jaccard 相似度模拟文本相似度""" def bigrams(s): s = re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9]', '', s) return set(s[i:i+2] for i in range(max(len(s)-1, 1))) a, b = bigrams(text_a), bigrams(text_b) if not a or not b: return 0.0 return len(a & b) / len(a | b) def build_prompt(desc, examples, query): """把示例拼进 prompt, 这是 Few-shot 引导的核心""" lines = [desc] if examples: lines.append("示例:") for i, (inp, out) in enumerate(examples, 1): lines.append(f"输入: {inp}") lines.append(f"输出: {out}") if i < len(examples): lines.append("---") lines.append(f"输入: {query}") lines.append("输出:") return "\n".join(lines) def select_examples(pool, query, k=3): """按相似度选出与 query 最相关的 k 条, 最相似的放在末尾""" scored = [(jaccard_sim(query, inp), inp, out) for inp, out in pool] scored.sort(key=lambda t: t[0], reverse=True) top = scored[:k] top.reverse() return [(inp, out) for _, inp, out in top] def simulate_model(prompt, examples): """模拟模型: 有示例时按最近示例的标签输出, 无示例时猜中性""" if not examples: return "中性" return examples[-1][1] def evaluate(pool, test_set, k): total = len(test_set) hit = 0 for query, truth in test_set: if k == 0: pred = "中性" prompt = build_prompt(TASK_DESC, [], query) else: ex = select_examples(pool, query, k) prompt = build_prompt(TASK_DESC, ex, query) pred = simulate_model(prompt, ex) print("查询:", query) print(prompt) print("预测:", pred, "| 真实:", truth) print("=" * 40) if pred == truth: hit += 1 return hit / total if __name__ == "__main__": print("Zero-shot 效果:") acc0 = evaluate(CANDIDATES, TEST_EXAMPLES, 0) print("Zero-shot 准确率:", acc0) print("Few-shot (k=2) 效果:") acc2 = evaluate(CANDIDATES, TEST_EXAMPLES, 2) print("Few-shot 准确率:", acc2) print("Few-shot (k=4) 效果:") acc4 = evaluate(CANDIDATES, TEST_EXAMPLES, 4) print("Few-shot 准确率:", acc4)
def jaccard_sim(text_a, text_b):用字符对(bigram)集合计算两段中文文本的相似度,作为“语义相近”的简化模拟。def build_prompt(desc, examples, query):把任务描述、若干条输入输出样例和新输入拼成一个完整提示词,这就是Few-shot的核心动作。scored.sort(key=lambda t: t[0], reverse=True)将候选示例按与查询的相似度从高到低排序,模拟向量检索选出最贴近的样例。top.reverse()把最相似的示例挪到数组末尾,让它在提示词中紧挨着新输入,对应“近因效应”的工程实践。return examples[-1][1]模拟模型“照着最末尾一条样例的标签作答”,直观体现示例对输出的引导作用。acc0 = evaluate(CANDIDATES, TEST_EXAMPLES, 0)评估零样本基线,没有示例时模型只能默认猜“中性”。acc2 = evaluate(CANDIDATES, TEST_EXAMPLES, 2)加入两条精选示例后,准确率提升,验证“样例即引导”。
常见误区
误区“给AI示例越多越好,反正它上下文窗口那么大。我干脆把所有可能的样例都塞进去,效果肯定封顶。”
正解示例数量存在边际收益递减。前3-5条示例通常就能让效果饱和,继续增加不仅占用上下文窗口、推高token成本,还可能引入噪声和不相关模式,让模型无所适从。大模型是“吃货”不是“仓储员”——吃太多杂菜,反而品不出主味。正确做法是先测零样本基线,再逐条加示例,效果不再提升就停手。
为何常见:人们习惯性把“大模型上下文长”等同于“可以无限堆料”,忽略了注意力资源有限,且示例噪声会反向污染输出。
误区“反正AI能理解,示例随便从训练数据里挑几条放进去就行,不用花心思挑。”
正解示例质量决定Few-shot效果的“天花板”。低质量示例(标签错、格式乱、与任务无关)会被模型忠实地模仿——它分不清“你给的是对是错”,只知道“照这个来”。这就像给徒弟看了一张写错的配方卡,他做出来的菜也必然是错的。挑示例要像挑师父一样慎重:代表性、多样性、与查询的相似度都要兼顾。
为何常见:人们把大模型想象成“有判断力的思考者”,却忽略了它在Few-shot场景下更像一个“超级模仿者”,模仿对象的好坏直接决定结果。
误区“反正示例内容都在提示词里,顺序打乱一下不影响结果吧?我用随机顺序也行。”
正解大模型对提示词不同位置的注意力分布并不均匀。开头示例奠定输出框架(首因效应),末尾示例决定即时模仿的风格(近因效应),中间示例影响力相对弱。调换顺序导致准确率从90%掉到60%的情况并不罕见。排列示例时,把格式最标准的放开头、风格最贴合的放末尾,是零成本的性能优化。
为何常见:人们知道阅读顺序影响理解,却没意识到神经网络的位置编码会让顺序变成可观测的性能差异。
误区“Few-shot和微调差不多,都是给模型喂几个样本让它学会任务,只是量少一点。”
正解两者本质不同。Few-shot是在推理时把样例写进提示词,模型参数完全不动;微调要更新模型权重,属于训练流程。可以这样区分:Few-shot像给员工看几张优秀范例,他临时模仿;微调像给员工安排培训课程,从根本上改变工作习惯。成本上,Few-shot零训练、按token付费;微调需要GPU资源和数据集。
为何常见:“样本”与“训练”这两个词让初学者想当然,忽略了提示词注入与权重更新这两条完全不同的技术路径。
面试题
Q1. 下面哪一项最符合Few-shot示例引导的核心思想?
- A.给模型提供多轮对话的历史记录
- B.用大量数据对模型进行微调
- C.在提示词中放入少量输入输出样例← 正确答案
- D.让模型通过随机试错自我学习
答案:C。Few-shot的核心是在提示词里放入少量输入输出样例,让模型照猫画虎地模仿。A是对话管理,B是微调,D是强化学习路径,三者都不是Few-shot的机制。
Q2. 关于Zero-shot与Few-shot,以下说法正确的是?
- A.Few-shot会提供少量示例← 正确答案
- B.Zero-shot提供更多示例
- C.Zero-shot需要更新权重
- D.Few-shot训练成本更高
答案:A。Zero-shot只给指令不给示例,Few-shot在指令之外补充少量输入输出对。两者都不更新模型权重,也都不需要训练,因此C、D错误,B把方向说反了。
Q3. 设计Few-shot示例时,下列哪项做法最能保证输出稳定?
- A.让示例数量尽可能多
- B.让示例文本全部使用长句
- C.让示例中不出现任何中文
- D.让所有示例的输入输出格式统一← 正确答案
答案:D。格式统一是Few-shot的“底线工程”:模型会模仿示例的排版与标签风格,格式混乱会直接导致输出漂移。数量多不等于质量高,排除A;长度和语言不是稳定性的关键,排除B、C。
Q4. 与查询文本语义相似的示例效果更好,最可能的原因是?
- A.模型只会复制粘贴示例文本本身
- B.相似示例提供了更接近的推理模式← 正确答案
- C.相似示例让提示词变得明显更短
- D.相似示例可以绕过模型的知识限制
答案:B。相似的句子结构更容易“唤醒”模型匹配的推理路径和词汇风格。A是错误归因,模型不是简单复制;C与相似度无关;D夸大了示例的作用,模型知识边界仍在。
Q5. 以下哪些属于低质量Few-shot示例的表现?
- A.输入输出对彼此不匹配← 正确答案
- B.示例标签与人类常识相违背← 正确答案
- C.示例输出格式与目标不一致← 正确答案
- D.示例数量恰好是三条
答案:ABC。输入输出不匹配、标签反常识、格式与目标不一致,都会让模型学到错误映射,属于低质量表现。三条示例本身是合理的数量,D不是质量问题。
Q6. 边际收益递减在Few-shot中的体现是?
- A.示例越多效果线性提升
- B.示例数量不影响最终准确率
- C.后续增加的示例带来的提升逐渐变小← 正确答案
- D.第一条示例一定会降低模型效果
答案:C。Few-shot的典型曲线是“前陡后平”:最早的几条示例提升最大,之后增量快速缩小。A错误,不是线性;B与实验相反;D把特例当规律,第一条通常提升最明显。
Q7. 同一组示例仅调整排列顺序,模型效果明显变差,最可能的原因是?
- A.模型随机生成了部分答案
- B.示例的数量还远远不够
- C.示例中的中文让模型困惑
- D.模型对首尾位置的注意力不同← 正确答案
答案:D。位置偏置是已反复验证的现象:开头示例定义输出框架,末尾示例影响即时模仿风格,顺序改变会直接影响这两类效应。A、B、C都无法解释“仅顺序变化”带来的剧烈波动。
Q8. 用Few-shot调试“输出格式混乱”时,哪些做法是有效的?
- A.逐条替换示例做A/B对比← 正确答案
- B.统一所有示例的分隔符← 正确答案
- C.保持标签口径完全一致← 正确答案
- D.直接不断增加示例数量
答案:ABC。A能定位到“带偏”格式的坏样例,B消除分隔符歧义,C保证标签命名一致,三者都是对症的调试手段。D盲目堆数量不解决格式问题,还可能引入新噪声。
Q9. 所谓One-shot,指的是给模型提供?
- A.一条输入但没有对应的输出
- B.只向模型提一个完整问题
- C.只让模型输出一句话作为答案
- D.恰好一条完整的输入输出样例← 正确答案
答案:D。One-shot是Few-shot的特例,即只提供一条完整的“输入→输出”样例。A缺输出无法形成映射,B、C描述的是提问方式而非示例注入,均不符合定义。
Q10. 关于Few-shot示例引导,下列哪些说法是正确的?
- A.它不会改动模型的权重← 正确答案
- B.示例质量会影响输出效果← 正确答案
- C.示例顺序会影响模型表现← 正确答案
- D.它不占用模型的上下文空间
答案:ABC。Few-shot只在提示词中注入样例,模型权重保持不变;质量与顺序都会通过模仿机制影响输出。D错误——每条示例都要占据上下文窗口,这正是“够用就好”的原因。