第 3 章 · 提示工程与推理增强 章节摘要:不是所有问题都要靠微调。提示工程是成本最低的优化手段——不动一个参数,靠精心设计的提示词就能显著提升模型表现。这一章从零样本、少样本的上下文学习讲起,到思维链(CoT)如何让模型"想清楚再答",再到自洽采样、思维树等推理增强技术的适用边界。读完你能判断什么场景该用哪种提示策略,以及它们各自的上限和代价。 阅读收获 阅读完本章,你应当能够: 区分零样本、少样本、上下文学习三种提示范式,说清各自的适用场景 解释思维链(CoT)为什么能提升复杂推理,以及它对简单任务为何反而多余 描述自洽采样、思维树等推理增强技术的原理和代价 根据任务复杂度选择合适的提示策略组合 写出结构清晰、可复用的提示模板,并知道怎么迭代优化 核心概念速览
章节摘要:不是所有问题都要靠微调。提示工程是成本最低的优化手段——不动一个参数,靠精心设计的提示词就能显著提升模型表现。这一章从零样本、少样本的上下文学习讲起,到思维链(CoT)如何让模型"想清楚再答",再到自洽采样、思维树等推理增强技术的适用边界。读完你能判断什么场景该用哪种提示策略,以及它们各自的上限和代价。
阅读完本章,你应当能够:
提示工程的几条路线可以按"要不要给例子"和"要不要让模型分步想"两个维度来分。零样本就是直接把任务抛给模型,不举例,适合格式明确、模型本来就会的简单任务(比如摘要、翻译、改写)。少样本是在提示里塞几个输入-输出示范,靠这些例子"教"模型你要的格式和风格,本质上是利用模型在上下文里做模式归纳的能力——这叫上下文学习(in-context learning),它的特点是权重不变,示范只在这一次推理里生效。
思维链(Chain-of-Thought, CoT)是另一条线:让模型把推理过程一步步写出来再给答案,而不是直接蹦结论。它的起效机理学界还在争论,但工程上确实有效——尤其对数学、逻辑、多步问答这类需要中间推导的任务。一个朴素但重要的观察是:模型直接生成最终答案时,中间的隐式计算容易出错;显式展开成文字后,每一步都成为后续生成的上下文,等于把长程推理拆成了一串短程生成,每步的准确率更高。
提示工程的本质不是"哄模型",而是"把任务约束讲清楚"——模型能力往往够,缺的是清晰的指令和恰当的思考路径。它最大的优势是零成本试错:改个提示几秒钟就能验证,不像微调要重训。
自洽采样和思维树是 CoT 的增强版。自洽采样的直觉是:同一道题让模型独立采样多条推理链,对最终答案做多数表决,能抵消单次采样的随机抖动,代价是推理算力翻几倍。思维树更进一步,允许在推理中途分支、评估、回溯,适合搜索空间大的规划类问题,但工程复杂度和延迟都显著上升——这些都不是免费的午餐,要用在刀刃上。
从零样本、少样本讲起,说清上下文学习的机理,以及写好一个提示的几个基本原则(清晰、具体、给示范、定格式)。一个常被忽视的点:示范的顺序和分布会影响输出,模型对靠后的例子更敏感,所以摆例子不是随便丢几个就行。
重点讲 CoT 如何让模型显式展开推理过程,自洽采样如何用多次采样投票提升稳定性,以及它们在数学、逻辑、多步问答上的效果和代价。注意 CoT 不是万能药——对模型本来就能一步答对的简单任务,强行加思维链反而引入噪声、增加延迟和 token 成本。
把零样本 CoT、少样本 CoT、自洽采样、思维树等放一起横向对比,给出"什么任务复杂度用什么策略"的决策框架。核心权衡是效果对延迟和成本——越靠后的技术效果上限越高,但算力开销也成倍增长,得看你的任务值不值得这份投入。
3.1 建立基础——先掌握提示的基本范式和写法原则,才能理解 3.2 里 CoT 为什么是"在提示里加一句让模型分步想"这么简单的改动却能大幅提升推理。3.3 是综合应用,把前两节的方法放在一起做选型决策。
3.1 提示基础与上下文学习 ──► 3.2 思维链与自洽推理 ──► 3.3 推理增强对比选型 (范式与原则) (让模型分步想) (按复杂度选策略)
| 任务复杂度 | 推荐策略 | 代价 |
|---|---|---|
| 简单分类、抽取 | 直接指令,不加推理链 | 几乎无额外开销 |
| 多步推理、数学 | 少样本思维链 | token 变多,延迟上升 |
| 结果不稳定、可多次采样 | 自洽采样投票 | 生成次数翻倍,成本翻倍 |
| 需要探索多种解题路径 | 思维树搜索 | 树展开成本最高,慎用于线上 |
⚠️ 常见坑:给本来一步能答对的任务强行加思维链,既费钱又引入跑偏的中间步骤。
💡 关键直觉:提示工程的本质是"把任务说清楚"——说不清楚的指令,任何推理技巧都救不回来。
还有一个容易被忽略的维度:提示的鲁棒性。同一个提示换一个稍微不同的输入表述,效果可能天差地别——这就是为什么严肃的提示工程要做批量评测,而不是凭几次手测下结论。建议维护一个评测集,每次改提示都跑一遍,用数据说话。提示越复杂越脆弱,能用结构化模板(角色、任务、约束、输出格式分块)拆清楚的,就别堆成一大段自然语言,后者的可维护性和稳定性都更差。