3.1 提示工程基础与上下文学习 本节摘要:提示工程是大模型应用里成本最低的优化手段——不改模型、不训数据,靠把指令写清楚就能提升效果。本节讲清三种基础提示范式(零样本、少样本、上下文学习)的机理和适用边界,提炼出"清晰、具体、给示范、定格式"四条写提示的核心原则,并说明上下文学习为什么让大模型具备"看几个例子就会"的临场学习能力。 学习目标 阅读完本节,你应当能够: 区分零样本、少样本、上下文学习三种范式,说清各自适用场景 解释上下文学习的机理,以及它和微调的本质区别 运用清晰、具体、给示范、定格式四条原则写好提示 识别并修复常见的低质量提示 一、问题与直觉 很多人第一次用大模型,提示词就一句话:"帮我写个摘要"。模型给了一段,但风格不对、长度不对、重点也不对。
本节摘要:提示工程是大模型应用里成本最低的优化手段——不改模型、不训数据,靠把指令写清楚就能提升效果。本节讲清三种基础提示范式(零样本、少样本、上下文学习)的机理和适用边界,提炼出"清晰、具体、给示范、定格式"四条写提示的核心原则,并说明上下文学习为什么让大模型具备"看几个例子就会"的临场学习能力。
阅读完本节,你应当能够:
很多人第一次用大模型,提示词就一句话:"帮我写个摘要"。模型给了一段,但风格不对、长度不对、重点也不对。于是反复改提示,加"简短一点""正式一点""重点突出",试了十几版才勉强满意。这个过程里,模型没变、数据没变,变的只是提示——而效果天差地别。
这就是提示工程要解决的事:同样的模型,不同的提示,效果能差出几个量级。大模型不是不会做,很多时候是"没听懂你要什么"。提示工程的核心,就是把你的真实需求用模型能准确理解的方式表达出来。
它和前两章的 RAG、微调是三条不同的优化路径:RAG 解决"模型不知道我的知识",微调解决"模型不懂我的行话",提示工程解决"模型没听懂我的要求"。三者成本递增(提示 < RAG < 微调),所以工程上永远先试成本最低的提示工程,不够再上加 RAG,还不够才考虑微调。
提示有三种最基础的范式,对应不同的信息量。
零样本(zero-shot):直接给任务指令,不给任何例子。"请把下面这段话总结成一句话:……"就是零样本。它依赖模型已有的通用能力,适合简单、定义清晰的任务(格式转换、分类、简单问答)。
少样本(few-shot):在指令里给几个输入-输出示范,让模型照着做。"这里有几个摘要的例子:例1…例2…例3…现在请总结:……"。示范的作用是明确格式、风格、期望行为,对需要特定格式或风格的复杂任务尤其有效。
上下文学习(in-context learning):是少样本背后的机理。大模型在推理时,能从提示里给出的几个示范中"临场学会"任务模式,不需要任何参数更新。这是大模型涌现出的关键能力——小模型做不到,只有规模够大才稳定显现。
上下文学习和微调表面相似(都是给例子学任务),机理完全不同。微调是修改模型权重(把例子的影响固化进参数),上下文学习是激活模型已有的、与示范相关的能力。
一个有用的类比:大模型预训练时见过海量任务模式,这些模式以权重形式"潜伏"着。给几个示范,等于告诉模型"现在激活哪一类模式",示范本身没真的教新东西,只是触发了已经会的能力。这也解释了为什么上下文学习的示范要和目标任务同模式——示范的作用是"定位"而非"教学"。
理解了"激活而非教学",几个现象就好解释了:示范和任务不同类会失效(激活错模式);示范顺序会影响效果(最近的示范权重更大);示范数量到一定后再加收益递减(足够定位就行)。这些都是激活机制的特征。
💡 关键直觉:写少样本示范,核心不是"让模型看更多例子",而是"用最精准的例子把要激活的模式说清楚"。三五个高质量、和目标高度同构的示范,胜过十几个杂乱的。
把大量实践提炼成四条可操作的原则:
第一,清晰。指令要明确无歧义。"总结一下"是模糊的,"用一句话、不超过30字、突出核心结论"是清晰的。模糊指令把解释权交给模型,模型按自己的默认理解来,常常和你想的不一样。
第二,具体。把所有约束讲全——长度、格式、语气、要包含什么、要避免什么。"写封邮件"太宽泛,"写封不超过150字的中文邮件,语气正式,先道歉再给方案,结尾留联系方式"就具体得多。
第三,给示范。对格式或风格要求复杂的任务,与其用文字描述"我想要什么样的输出",不如直接给一两个做好的例子。示范的表意效率远高于文字描述。
第四,定格式。明确告诉模型输出要什么结构——是要一段散文还是结构化列表,要不要带前缀,JSON 还是 Markdown。格式约束写在指令最后,强调"只输出 X,不要其他内容"。
看个具体对比,体会四条原则的差距:
| 低质量提示 | 高质量提示 |
|---|---|
| 帮我分析下这段代码的问题 | 你是一个资深工程师。请分析下面这段代码,从三个维度找问题:1.正确性bug 2.性能问题 3.可读性。每个问题给出:问题描述、严重程度(高/中/低)、修复建议。输出用 Markdown 列表。代码如下:…… |
左边的提示把一切都交给模型自由发挥,结果不可控;右边的提示用四条原则把角色、维度、输出结构、格式全约束死了,结果稳定可预期。提示工程的功夫,就在把"模糊的期望"翻译成"精确的约束"。
少样本不是随便给几个例子,示范的质量直接决定效果。几个选示范的原则:
第一,示范要和目标任务同构。目标是要做摘要,示范就都得是摘要,别混进翻译或分类的例子。示范的作用是定位模式,模式不一致会激活错能力。
第二,示范要覆盖输出的多样性。如果目标输出的答案有长有短、格式有变化,示范也要体现这种多样性,否则模型会过度模仿示范的单一模式。
第三,示范顺序有讲究。研究表明,把最相关的示范放在提示靠后(离目标任务近)的位置,效果通常更好。这和上下文学习的"近期权重更大"机制有关。
⚠️ 常见坑:示范里不要放错误例子当反面教材。模型经常分不清"这是不要学的"还是"这是要学的",容易把错误模式也学进去。要纠正某种错误,直接给正确的示范即可,别用"错误→正确"的对比格式。
提示工程不是一锤子买卖,是反复迭代的。一套有效的迭代流程:
1. 写初版提示,在一批测试问题上跑 2. 收集 bad case(输出不符合预期的) 3. 分析 bad case 的共性——是哪里没约束到? 4. 针对性加约束或改措辞,再跑测试 5. 回归:确认修改没让原来对的变差 6. 重复直到 bad case 率可接受
关键在第三步——分析 bad case 的共性。如果每个 bad case 原因都不一样,说明提示已经接近上限;如果 bad case 集中在某一类问题,说明这一类的约束缺失,针对性补上即可。
这里先埋一个伏笔:上面四条原则对简单任务够用,但对多步推理任务(数学题、逻辑推理、复杂规划),还有一个杀手锏——在提示里加一句"请一步步思考再给答案",效果会发生质变。这就是下一节要讲的思维链(CoT)。
理解为什么这句简单的话这么有效,需要先理解模型生成是"逐 token 接龙"的——它没法在脑子里先想好再写,想到哪儿写到哪儿。让它"一步步思考",等于强迫它把中间推理过程写出来,这些写出来的中间步骤又成为后续生成的上下文,等于给模型扩了"工作内存"。这个机理下一节展开。
💡 关键直觉:提示工程的回报是非线性的。把提示从"模糊"改到"清晰具体",效果往往翻倍;但从"清晰"再精雕细琢到"完美",提升就很有限了。所以先追求"足够清晰",别陷入完美主义。80 分的提示就能拿到大部分收益。
诚实地说,提示工程不是万能的。它的边界在哪?
第一,它不能给模型注入新知识。模型不知道的事实,提示再怎么写它也编(而且会自信地编,即幻觉)。注入知识要用 RAG(第 1 章)。
第二,它不能改变模型的深层行为模式。想让模型稳定地用某种专业术语、某种推理风格,光靠提示约束力有限,这种情况微调(第 2 章)更彻底。
第三,它的效果有天花板。当提示已经足够清晰,再优化提示的边际收益很小,这时该考虑 RAG 或微调。
入门:找一个你常用的提示(比如"帮我写摘要"),按四条原则重写一版(清晰、具体、给示范、定格式),对比两版输出的差距。
进阶:为一个格式复杂的任务(如结构化信息抽取)写一个少样本提示,给 3 个示范,测试模型对未见过的输入的泛化效果。试着调整示范顺序,观察效果变化。
挑战:建立一个 20 条的测试集,迭代优化一个提示,记录每轮 bad case 率的变化,体会"分析 bad case 共性 → 针对性改提示"的迭代流程。
下一节我们深入思维链(CoT),看"让模型一步步思考"这个简单技巧如何让复杂推理任务的准确率大幅提升,以及自洽采样如何进一步稳住推理质量。