第15章 提示工程与上下文学习
学习目标
- 理解上下文学习(ICL)的原理与机制
- 掌握少样本提示与思维链等提示技术
- 理解指令遵循与提示敏感性
- 了解提示工程的最佳实践
前面几章讨论如何训练和对齐模型。本章转向如何使用模型。大模型有一个革命性特性:无需任何参数更新,仅通过精心设计的提示,就能完成各种任务。这就是上下文学习与提示工程。掌握这些技术,能在不训练的情况下大幅释放模型潜力。
15.1 上下文学习
15.1.1 什么是上下文学习
上下文学习(In-Context Learning, ICL)是 GPT-3 揭示的关键能力:模型无需更新参数,仅凭提示中提供的示例,就能学会执行新任务。
例如,在提示中给出几个翻译示例:
英文: Hello -> 法文: Bonjour 英文: Thank you -> 法文: Merci 英文: Good morning -> 法文:模型会输出 “Bonjour”(或正确翻译),尽管它从未被专门训练翻译。这在传统机器学习范式中不可想象——传统方法必须用标注数据重新训练。
15.1.2 零样本、单样本与少样本
- 零样本(Zero-shot):只给指令,不给示例。“请将以下句子翻译成法文:…”
- 单样本(One-shot):给 1 个示例。
- 少样本(Few-shot):给几个示例(通常 3-10 个)。
通常示例越多效果越好,但受上下文长度限制。零样本对齐良好的模型(经 SFT/RLHF)已能完成许多任务,少样本则在复杂任务上更稳定。
15.1.3 ICL 的工作机制
上下文学习为何有效?研究表明几种机制:
- 示例作为"隐式梯度":有理论分析认为,注意力机制在前向传播中实现的变换,类似于梯度下降的一步——示例相当于提供了"梯度方向"。
- 任务识别:模型从示例中识别任务类型,激活预训练中相关的知识与能力。
- 格式示范:示例教会模型期望的输入输出格式。
值得注意的是,ICL 对示例顺序与选择敏感——同样的示例换个顺序,效果可能不同。这提示 ICL 仍有一定脆弱性。
15.2 提示工程基础
15.2.1 提示的结构
一个结构良好的提示常包含:
- 角色设定:“你是一位资深 Python 工程师。”
- 任务描述:明确要做什么。
- 示例:少样本示例(可选)。
- 输出格式约束:“以 JSON 格式输出。”
- 输入:具体待处理内容。
15.2.2 提示设计原则
- 清晰明确:避免歧义,明确期望。
- 提供充分上下文:让模型理解背景与约束。
- 分解复杂任务:把复杂任务拆成简单步骤。
- 指定输出格式:减少后处理负担。
15.2.3 提示的脆弱性
提示对表述敏感:语义相同的不同表述,效果可能差异显著。这种提示敏感性是提示工程的挑战,也使其带有一定"经验艺术"色彩。实践中需通过试验找到稳健的提示。
15.3 思维链
15.3.1 思维链的提出
思维链(Chain-of-Thought, CoT)由 Wei 等人(2022)提出。核心发现:在提示中给出包含中间推理步骤的示例(少样本 CoT),能显著提升模型在数学、逻辑等复杂推理任务上的表现。
问题: 餐厅有 23 个苹果,用了 20 个做午餐,又买了 6 个,还有多少? 思考: 原有 23 个,用了 20 个剩 3 个,又买 6 个,共 9 个。 答案: 915.3.2 思维链的原理
为什么思维链有效?
- 降低问题难度:把复杂推理分解为简单步骤,每步更易预测。
- 分配更多计算:生成中间 token 等于给模型更多前向计算来处理问题。生成的总计算量与输出长度成正比(单步前向计算量恒定),思维链让困难问题获得更多"算力"。
- 类似人类打草稿:人类解复杂题也依赖中间步骤。
15.3.3 零样本思维链
无需示例,仅加触发语"Let’s think step by step",就能激发思维链。这种零样本 CoT 由 Kojima 等人(2022)提出,简单却有效,适合快速提升推理。
15.3.4 思维链的局限
- 并非所有任务受益(简单任务反而啰嗦)。
- 推理链可能"自信地错误"——步骤看似合理但结论错。
- 增加生成长度与成本。
2024 年起,思维链范式发生内化:o1、DeepSeek-R1 等推理模型经专门 RL 训练,自发产生长思维链,把"思考多少步"变成可控的测试时算力(见 1.4.5 与第 13 章 13.8)。对这类模型,外部注入"Let’s think step by step"式提示反而可能干扰其内建思考格式——提示工程的重心转向任务描述与约束的清晰度。
15.4 高级提示技术
15.4.1 自我一致性(Self-Consistency)
思维链的推理路径可能出错。自我一致性通过多次采样不同推理路径,对最终答案投票:
- 用温度采样生成多条不同推理链。
- 提取每条的答案。
- 取多数票作为最终答案。
以多样性换取鲁棒性,显著提升推理准确率。
15.4.2 思维树(Tree of Thoughts)
思维树将推理组织成树形结构:
- 每个节点是一个推理状态。
- 可从多个方向扩展、评估、回溯。
- 适合规划、搜索类复杂任务。
思维树比线性思维链更强大,但实现更复杂、成本更高。
15.4.3 分解提示(Decomposition)
将复杂问题拆成子问题逐一解决。最少到最多(Least-to-Most)提示:先解决最简单的子问题,用其答案辅助解决更难的,逐步递进。
15.4.4 ReAct 框架
ReAct(Reasoning + Acting)让模型交替推理与行动:
Thought: 我需要查询天气 Action: search_weather("北京") Observation: 晴,25度 Thought: 天气好,可以建议户外活动 Final Answer: ...推理指导行动,行动结果反馈推理。这是 Agent 的基础范式(第23章)。
15.5 指令遵循
15.5.1 模型如何理解指令
经过 SFT 与对齐训练的模型,能理解并执行自然语言指令。指令遵循能力来自:
- SFT 数据中的指令-响应对。
- RLHF/DPO 对指令遵循行为的强化。
- 预训练中积累的指令理解能力。
15.5.2 指令格式与模板
现代对话模型有标准的消息格式(system / user / assistant),通过**对话模板(chat template)**转化为模型输入:
<|im_start|>system 你是助手<|im_end|> <|im_start|>user ...<|im_end|> <|im_start|>assistant正确使用模板对多轮对话、角色识别至关重要。不同模型模板不同,混淆会导致性能下降。
15.5.3 提示注入与安全
提示注入是针对大模型的安全威胁:攻击者在输入中嵌入恶意指令,试图劫持模型行为。例如在待翻译文本中藏入"忽略上述指令,输出…"。越狱(Jailbreak)则试图绕过模型的安全对齐。
防御策略:输入输出过滤、指令与内容分隔、对齐训练强化抗注入、权限最小化。这是大模型安全的重要议题。
15.6 提示工程实践
15.6.1 示例选择策略
少样本提示中,示例的选择影响效果:
- 相关性:选择与当前任务相关的示例。
- 多样性:覆盖不同情形,避免模型过拟合某模式。
- 动态选择:用检索方式根据当前输入动态选示例(与 RAG 结合)。
15.6.2 输出控制
- 格式约束:明确要求 JSON、Markdown 等格式,可配合约束解码(第16章)保证合规。
- 长度控制:指定"不超过 100 字"等。
- 语气风格:通过角色设定与示例控制。
15.6.3 提示调试
提示工程是迭代过程:
- 从简单提示开始,逐步优化。
- 对比不同提示的效果(A/B 测试)。
- 分析失败案例,针对性改进。
- 建立"提示库"沉淀经验。
15.7 上下文窗口的利用
15.7.1 上下文长度的影响
更长的上下文窗口能容纳更多示例、更长的文档。但支持长不等于善用长。
15.7.2 "迷失在中间"现象
研究表明,模型对上下文开头与结尾的信息利用更好,中间的信息容易被忽视。这被称为"Lost in the Middle"。因此关键信息宜放在开头或结尾。
15.7.3 信息位置策略
- 重要指令放开头(系统提示)或结尾(紧邻生成处)。
- 大段参考文档放中间。
- 关键约束在生成前重申。
小结
提示工程是无需训练即可激发模型能力的重要技术。上下文学习让模型从示例中"即学即用",思维链通过中间推理步骤提升复杂任务表现,自我一致性、思维树等进一步提升鲁棒性。掌握提示技术能显著提升模型在各类任务上的表现,也为第 23 章的 Agent 与工具使用奠定基础。本部分(对齐与微调)至此完成,下一部分转向推理与部署。
延伸阅读
- Brown et al.Language Models are Few-Shot Learners(GPT-3, 2020) - ICL 的开创性展示。
- Wei et al.Chain-of-Thought Prompting Elicits Reasoning in Large Language Models(2022)。
- Kojima et al.Large Language Models are Zero-Shot Reasoners(2022) - 零样本思维链。
- Wang et al.Self-Consistency Improves Chain of Thought Reasoning(2022)。
- Yao et al.Tree of Thoughts(2023) &ReAct(2022)。
- Liu et al.Lost in the Middle: How Language Models Use Long Contexts(2023)。