原文作者:Lilian Weng | 原文日期:2023年3月15日 | 译者:攀岩者
原文链接:https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/
引言
提示工程(Prompt Engineering),也称为上下文提示(In-Context Prompting),是指在不更新模型权重的前提下,通过设计输入提示来引导大语言模型(LLM)产生期望输出的方法。它本质上是一门实验科学——同样的提示技巧在不同模型上效果可能天差地别,因此需要大量的实验和经验积累。
本文聚焦于自回归语言模型的提示工程,不涉及完形填空、图像生成或多模态模型。提示工程的核心目标是对齐(Alignment)与可控生成(Steerability)。
💡 Lilian 的个人观点:有些提示工程论文写了8页,其实核心技巧一两句话就能说清,剩下的全是跑 benchmark。社区更需要好用的共享评测基础设施。
【阅读总结】提示工程是在不修改模型参数的情况下,通过精心设计输入文本来引导 LLM 输出的一门实验性技术,核心目标是对齐和可控。
一、基础提示方法(Basic Prompting)
1.1 零样本(Zero-Shot)
零样本学习(Zero-shot Learning)最简单——直接把任务文本喂给模型,让它输出结果:
`
Text: i’ll bet the video game is a lot more fun than the film.
Sentiment:
`
模型需要自行理解”Sentiment”意味着情感分类,然后给出答案。
1.2 少样本(Few-Shot)
少样本学习(Few-shot Learning)在提示中给出若干高质量示例,每个示例包含输入和期望输出:
`
Text: (lawrence bounces) all over the stage, dancing, running, sweating…
Sentiment: positive
Text: despite all evidence to the contrary, this clunker has somehow managed to pose as an actual feature movie…
Sentiment: negative
Text: for the first time in years, de niro digs deep emotionally…
Sentiment: positive
Text: i’ll bet the video game is a lot more fun than the film.
Sentiment:
`
少样本通常比零样本效果好,但代价是消耗更多 token,且可能触及上下文长度限制。
研究发现,提示格式、示例选择和示例排序都可能导致性能天壤之别——从近乎随机猜到接近 SOTA。
关键偏差问题(Zhao et al., 2021):
- 多数标签偏差(Majority Label Bias):示例中标签分布不均
- 近因偏差(Recency Bias):模型倾向于重复最后一个标签
- 常见 token 偏差(Common Token Bias):模型偏好生成常见 token
1.3 示例选择技巧
- 使用嵌入空间中的 k-NN 选择语义相似的示例(Liu et al., 2021)
- 基于图的多样性选择:构建有向图,鼓励选择多样化的示例(Su et al., 2022)
- 用对比学习(Contrastive Learning)训练专门的嵌入来选择示例(Rubin et al., 2022)
- 基于不确定性的主动学习策略,选择模型分歧大的样本(Diao et al., 2023)
1.4 示例排序技巧
- 保持示例多样化、与测试样本相关、随机排序以避免偏差
- 增大模型或增加示例数并不能减少排序带来的方差(Lu et al., 2022)
- 验证集有限时,选择使模型预测不过于失衡的排序
【阅读总结】零样本最简单,少样本通过示例引导效果更好,但示例的选择和排序都会显著影响结果,需要注意各种偏差问题。
二、指令提示(Instruction Prompting)
少样本示例的本质是通过”演示”来传达任务指令。但既然如此,为什么不直接写指令呢?
经过指令微调的模型(如 InstructGPT)通过 RLHF(基于人类反馈的强化学习)训练,能更好地理解用户意图。与这类模型交互时,关键原则是:具体、精确、告诉模型”做什么”而不是”不做什么”。
`
Please label the sentiment towards the movie of the given movie review.
The sentiment label should be “positive” or “negative”.
Text: i’ll bet the video game is a lot more fun than the film.
Sentiment:
`
指定受众也是好技巧:
- “用6岁小孩能懂的话解释量子物理”
- “用适合职场的语言来回答”
上下文指令学习(In-Context Instruction Learning)(Ye et al., 2023)将少样本与指令结合,在提示中包含多个不同任务的示例,每个示例包含指令、输入和输出。
【阅读总结】对指令微调模型,直接写清楚任务要求比给示例更高效,关键是具体、精确、正面描述。
三、自一致性采样(Self-Consistency Sampling)
自一致性采样(Wang et al., 2022a)的核心思路:用 temperature > 0 多次采样,然后从候选中选最优。最常用的方法是多数投票(Majority Vote)。对于容易验证的任务(如编程题),可以直接运行单元测试来判断。
【阅读总结】多次采样取多数投票,简单有效提升推理准确率。
四、思维链(Chain-of-Thought, CoT)
4.1 什么是 CoT
思维链提示(Wei et al., 2022)让模型生成一系列短句,逐步描述推理过程(称为推理链),最终得出答案。CoT 在复杂推理任务和大模型(50B+ 参数)上效果显著。
4.2 CoT 的两种类型
少样本 CoT——在示例中手写推理过程:
`
Question: Tom and Elizabeth have a competition to climb a hill.
Elizabeth takes 30 minutes. Tom takes four times as long.
How many hours does it take Tom?
Answer: It takes Tom 30*4 = 120 minutes to climb the hill.
It takes Tom 120/60 = 2 hours to climb the hill.
So the answer is 2.
`
零样本 CoT——只需加一句”Let’s think step by step“:
`
Question: Marty has 100cm of ribbon, cut into 4 equal parts,
each divided into 5. How long is each final cut?
Answer: Let’s think step by step.
`
4.3 CoT 扩展技巧
- 自一致性采样可进一步提升推理准确率(Wang et al., 2022a)
- STaR(自教推理器):让模型生成推理链,保留正确的,微调后迭代(Zelikman et al., 2022)
- 推理步骤越多、复杂度越高,效果越好;换行符
n分隔优于句号或分号(Fu et al., 2023) - 基于复杂度的一致性:只在最复杂的推理链中做多数投票
- Self-Ask:让模型反复追问自己,构建迭代推理过程(Press et al., 2022)
- ReAct:结合推理与行动,交替调用搜索引擎获取信息(Yao et al., 2023)
- 思维树(Tree of Thoughts):在每一步探索多个推理分支,用 BFS/DFS 搜索最优路径(Yao et al., 2023)
【阅读总结】CoT 通过让模型”展示思考过程”大幅提升复杂推理能力,配合自一致性采样、思维树等技术可以进一步增强效果。
五、自动提示设计(Automatic Prompt Design)
提示可以被视为可训练参数,在嵌入空间中通过梯度下降直接优化:
- AutoPrompt(Shin et al., 2020)
- Prefix-Tuning(Li & Liang, 2021)
- P-tuning(Liu et al., 2021)
- Prompt-Tuning(Lester et al., 2021)
趋势是从复杂到简洁。
APE(自动提示工程师)(Zhou et al., 2022)更进一步:
- 让 LLM 根据少量示例生成候选指令
- 用评分函数筛选最优候选
- 通过蒙特卡洛搜索迭代优化
自动构建 CoT 提示(Shum et al., 2023)采用”增强-剪枝-选择”三步法,先生成伪推理链,再根据正确性剪枝,最后用策略梯度选择最优示例。
【阅读总结】提示可以自动化优化,从嵌入空间梯度到 LLM 自己生成指令,趋势是越来越自动化。
六、增强语言模型(Augmented Language Models)
6.1 检索增强(Retrieval)
模型训练数据有时效性,遇到最新信息就会”幻觉”。检索增强生成(RAG)的思路是:先从知识库检索相关内容,再把检索结果放进提示中。
Lazaridou et al. (2022) 的方法:用 Google 搜索获取文档 → 按 TF-IDF 相似度排序段落 → 取最相关的段落放入提示。
更有趣的是”内部检索“(Liu et al., 2022)——让模型先生成关于某话题的知识,再用这些知识回答问题,效果竟然也很好。
6.2 编程语言辅助
PAL 和 PoT 让 LLM 生成 Python 代码来解决数学推理问题,把计算交给解释器,模型只负责”思考”:
`python
# PAL: 让模型生成代码而非直接计算
def solution():
tom_time = 30 * 4 # Elizabeth 30分钟, Tom 4倍
return tom_time / 60 # 转换为小时
`
6.3 外部 API 调用
Toolformer(Schick et al., 2023)让模型自主学习何时调用工具:
- 📐 计算器:弥补精确计算短板
- ❓ Q&A 系统:减少幻觉
- 🔍 搜索引擎:获取最新信息
- 🌍 翻译系统:低资源语言
- 📅 日历:感知时间
Toolformer 的训练采用自监督方式:让模型标注 API 调用,过滤掉无用的调用(即没有帮助模型更好预测后续 token 的),然后微调。整个过程类似强化学习。
目前 Toolformer 不支持链式工具调用(一个工具的输出作为另一个的输入),这是未来的重要方向。
【阅读总结】通过检索、代码执行和外部 API,LLM 可以突破自身知识和能力的边界,RAG 和 Toolformer 是最具代表性的技术。
术语对照表
| 英文术语 | 中文译法 |
|---|---|
| Prompt Engineering | 提示工程 |
| Zero-Shot / Few-Shot | 零样本 / 少样本 |
| In-Context Learning | 上下文学习 |
| Chain-of-Thought (CoT) | 思维链 |
| Self-Consistency | 自一致性采样 |
| Tree of Thought (ToT) | 思想树 |
| Soft Prompt | 软提示 |
| Retrieval-Augmented Generation (RAG) | 检索增强生成 |
| Alignment / Steerability | 对齐 / 可控生成 |
| Instruction Tuning | 指令微调 |
| RLHF | 基于人类反馈的强化学习 |
| Toolformer | 工具增强语言模型 |
译者手记:5 个关键收获
- 提示工程是实验科学:没有万能公式,不同模型、不同任务需要不同的提示策略,大量实验是必经之路。
- 少样本的关键在于质量和排序:不是随便给几个例子就行,示例的选择、多样性和排列顺序都会显著影响效果,需要注意各种偏差。
- 思维链是质变而非量变:”Let’s think step by step” 这简单一句话就能大幅提升推理能力,但 CoT 在大模型上才有效,小模型收益有限。
- 提示可以自动化优化:从手动设计到 APE 自动搜索,再到梯度优化软提示,提示工程正在从手工艺走向自动化。
- 工具增强是 LLM 的下一个战场:RAG 解决知识时效性问题,PAL 把计算外包给代码,Toolformer 让模型自己决定何时调工具——LLM 正在从”能说”走向”能做”。
*作者:攀岩者,技术总监,19年 IT 全栈实战。精通网络、安全、云计算、容器、数据库、超算,持证 PMP、ITIL、CKA、网络工程师、信息安全等级保护、AIX 天工计划。主导过多个千万级政务与智慧城市项目,从售前到交付全流程打通。热衷开源,日拱一卒,每天分享 AI 学习笔记,陪你从零基础到 AI 达人。*
发表回复