基础
一、为什么 Prompt Engineering 重要?
提示词工程(Prompt Engineering)是与大语言模型(LLM)交互的核心技能。它不涉及修改模型参数或重新训练,而是通过精心设计输入文本来引导模型产生更好的输出。
📈 3-10 倍效果提升
同样的 GPT-4 / Claude / 通义千问等模型,经过精心设计的 Prompt 可以在准确率、完整性和实用性上带来数量级的提升。OpenAI 官方文档和学术论文均表明,Prompt 质量是影响 LLM 输出质量的最关键因素之一。
🔓 不改模型就能获得更好结果
与模型微调(Fine-tuning)不同,Prompt Engineering 零成本、即时生效、可快速迭代。在多数实际应用中,优化 Prompt 的投入产出比远高于微调。
🎯 模型能力的"释放器"
大语言模型拥有大量预训练知识,但默认情况下这些能力并非完全可及。好的 Prompt 就像一个精密的"钥匙",能解锁模型在特定任务上的最佳表现。Prompt Engineering 的本质是人类意图与模型能力之间的桥梁。
关键洞察:Prompt Engineering 不是"投机取巧",而是一项系统性的工程实践。它涉及对语言模型行为模式的理解、对任务需求的精确表达、以及对输出质量的持续评估与迭代。
— 参见:Liu et al. (2023) "Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in NLP"
基础
二、基础技巧(附对比案例)
1
Zero-shot Prompting 零样本提示
直接给出任务指令,不提供任何示例。模型依靠预训练知识完成任务。这是最简单的提示方式,也是评估模型"开箱即用"能力的基准。
💡 原理:LLM 在预训练阶段已见过大量任务模式,直接给出清晰指令即可激活相关能力。
❌ 模糊指令
这篇文本是啥意思?
✅ 清晰指令
请将以下英文评论翻译为中文,并判断情感倾向(正面/负面/中性):
"The product quality is excellent but shipping was too slow."
Brown et al. (2020) "Language Models are Few-Shot Learners" — GPT-3 论文首次系统展示了 zero-shot 和 few-shot 的能力对比
2
Few-shot Prompting 少样本提示
在 Prompt 中提供若干标注好的示例,让模型通过"模仿"来理解任务模式。示例质量比数量更重要。
💡 原理:示例为模型建立了输入→输出的映射关系,降低了任务理解的难度。
Few-shot 情感分析示例
评论:"这个产品太棒了,用起来非常顺手!"
情感:正面
评论:"配送太慢了,等了整整一周,包装也破了。"
情感:负面
评论:"还行吧,中规中矩,没什么特别的。"
情感:中性
评论:"客服态度特别好,耐心解答了我所有的问题,五星好评!"
情感:正面
📊 示例数量 vs 效果关系
* 示例为典型趋势示意,实际效果因任务和模型而异。注意:收益递减点通常在 3-5 个示例左右。
Brown et al. (2020) "Language Models are Few-Shot Learners" — 证明了 few-shot 在 GPT-3 上的显著效果
为模型设定一个专家角色,利用"角色锚定效应"让模型以特定视角和知识深度来回答问题。
💡 原理:角色设定激活了模型在预训练数据中与该角色相关的知识子空间,相当于给模型加了一个"注意力过滤器"。
好的角色 Prompt
你是一个拥有 15 年经验的资深数据分析师。
你擅长从复杂数据中提取洞察,并能用清晰、有说服力的方式呈现分析结果。
你的工作方式:
1. 先理解业务背景和数据结构
2. 提出关键假设
3. 用数据验证假设
4. 给出可执行的建议
请分析以下销售数据,给出你的洞察和建议:
[数据...]
🎯 好角色 Prompt 的要素
- 明确身份 — "你是拥有 15 年经验的资深数据分析师",而非简单的"你是一个分析师"
- 专业领域 — 明确角色的专业方向和能力边界
- 工作方式 — 描述角色的思考框架和工作流程
- 输出风格 — 指定回答的语气、格式和详细程度
- 约束条件 — 比如只基于事实、不编造数据等
❌ 弱角色
你是一个专家,帮我分析一下这个问题。
✅ 强角色
你是一位斯坦福大学计算机科学教授,专攻自然语言处理。请用学术论文的严谨风格,解释 Transformer 架构为什么比 RNN 更适合处理长序列。
4
Chain-of-Thought (CoT) 思维链
让模型展示其推理过程,"一步步思考"。对于数学、逻辑推理等复杂任务,CoT 能显著提高准确率。是当前最重要的 Prompt 技巧之一。
💡 原理:强制模型将复杂推理分解为多个中间步骤,每一步的输出作为下一步的输入,降低了单步推理的难度。
❌ 直接回答(容易出错)
问:一个水池有两个水管,A 管单独注满需要 3 小时,B 管单独注满需要 6 小时。两管同时开,多久能注满?
答:4.5 小时(常见错误:取平均)
✅ Chain-of-Thought
问:一个水池有两个水管...
让我们一步步思考:
1. A 管每小时注满水池的 1/3
2. B 管每小时注满水池的 1/6
3. 两管同时开每小时注满 1/3 + 1/6 = 1/2
4. 所以注满整个水池需要 1 ÷ (1/2) = 2 小时
🪄 Zero-shot CoT 魔法短语
Zero-shot CoT
只需在 Prompt 末尾加上一句:
"Let's think step by step"
(让我们一步步思考)
这简单的 7 个词就能显著提升模型在数学推理、逻辑推理等任务上的表现。
效果数据:在 GSM8K 数学推理数据集上,PaLM 540B 使用 CoT 后准确率从 17.6% 提升至 57.6%(提升 >3 倍)。Google 的研究显示,CoT 在大型模型上的效果远优于小模型,存在"涌现"特性。
Wei et al. (2022) "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models" — Google Research
对同一个问题让模型多次生成推理过程(通过调节 temperature),然后取最终答案中出现最多的结果(多数投票)。
💡 原理:CoT 的推理路径可能不同,但正确答案通常集中在同一个结果。通过多次采样和投票,可以有效过滤掉推理过程中的偶然错误。
Self-Consistency 流程
路径 1: 2 + 3 × 4 → 2 + 12 → 14 ✓
路径 2: 2 + 3 × 4 → 5 × 4 → 20 ✗(先加后乘,错误)
路径 3: 2 + 3 × 4 → 2 + 12 → 14 ✓
路径 4: 2 + 3 × 4 → 2 + 12 → 14 ✓
路径 5: 2 + 3 × 4 → (2+3)×4 → 20 ✗
投票结果:14 获得 3 票,20 获得 2 票 → 最终答案:14
Wang et al. (2022) "Self-Consistency Improves Chain of Thought Reasoning in Language Models"
6
Tree of Thoughts (ToT) 思维树
将推理过程组织为一棵搜索树,每个节点代表一个推理状态,通过"探索"和"评估"来找到最优解。比线性 CoT 更适合需要回溯和全局规划的任务。
💡 原理:模拟人类的"系统二"思考——在复杂问题上,人类不会只走一条路,而是会考虑多种可能性、评估每条路径的价值,必要时回退重来。
ToT 示例:24 点游戏
问题:使用数字 4, 5, 6, 10 和 +, -, ×, ÷ 得到 24。
思考树:
├── 尝试: 10 - 4 = 6 → 剩余 {5, 6, 6}
│ ├── 尝试: 5 × 6 = 30, 30 - 6 = 24 ✓
│ └── 尝试: 6 + 6 = 12, 12 × 5 = 60 ✗
├── 尝试: 6 × 4 = 24 → 剩余 {5, 10}
│ └── 尝试: 10 - 5 = 5, 24 × 5 = 120 ✗
└── 尝试: 10 + 6 = 16 → 剩余 {4, 5}
└── 尝试: 5 × 4 = 20, 16 + 20 = 36 ✗
最优路径:10 - 4 = 6 → 5 × 6 = 30 → 30 - 6 = 24 ✓
| 特性 |
Chain-of-Thought |
Tree of Thoughts |
| 推理路径 |
单条线性路径 |
多条分支路径 |
| 回溯能力 |
❌ 无法回退 |
✅ 可回退重试 |
| 全局规划 |
❌ 局部最优 |
✅ 全局搜索 |
| 计算成本 |
低(1次推理) |
高(多次推理) |
| 适用场景 |
一般推理任务 |
需要规划/搜索的复杂任务 |
Yao et al. (2023) "Tree of Thoughts: Deliberate Problem Solving with Large Language Models"
进阶
三、高级技巧
7
Directional Stimulus Prompting 方向性刺激
通过在 Prompt 中嵌入特定的"刺激"信号(如关键词、情感词、约束条件),定向引导模型的输出方向。与 Few-shot 不同,它不需要完整示例,只需要微妙的暗示。
💡 原理:利用模型对特定词语/模式的注意力偏好,在输入中嵌入"方向锚点",让模型自发地向目标方向偏移。
方向性刺激示例
普通 Prompt:
"请为一家咖啡店起个名字。"
方向性刺激 Prompt:
"请为一家咖啡店起个名字。名字要有创意感,让人过目不忘,最好能体现一种独特的品牌哲学。可以大胆使用隐喻和反直觉的表达方式。"
相关思想可追溯至 Liu et al. (2023) 关于 Prompt 设计中语义刺激的研究
8
ReAct Prompting 推理+行动循环
将推理(Reasoning)和行动(Acting)交替进行,模型先思考下一步该做什么,然后执行一个动作(如搜索、计算、查询),再根据结果继续推理。这是 Agent 的核心交互模式。
💡 原理:将"想"和"做"结合为一个闭环,让模型能够利用外部工具来弥补自身知识的不足。
ReAct 循环示例
问题:2024 年诺贝尔物理学奖获得者是谁?他所属哪个大学?
Thought 1:我需要查找 2024 年诺贝尔物理学奖的信息。
Action 1:Search("2024 Nobel Prize Physics winner")
Observation 1:2024 年诺贝尔物理学奖授予了 John Hopfield 和 Geoffrey Hinton...
Thought 2:找到了获奖者。现在需要查 Geoffrey Hinton 所属的大学。
Action 2:Search("Geoffrey Hinton affiliation university")
Observation 2:Geoffrey Hinton 是多伦多大学的名誉教授...
Thought 3:我已经收集了所有需要的信息。
Final Answer:2024 年诺贝尔物理学奖获得者包括 Geoffrey Hinton(多伦多大学)和 John Hopfield(普林斯顿大学)。
Yao et al. (2022) "ReAct: Synergizing Reasoning and Acting in Language Models"
将复杂任务拆解为多个子任务,每个子任务用独立的 Prompt 处理,前一个步骤的输出作为后一个步骤的输入。像流水线一样逐步完成。
💡 原理:分而治之。每个 Prompt 只负责一个明确的小任务,降低了单次 Prompt 的复杂度,提升了每一步的可靠性。
提示链示例:长文摘要
Prompt 1: "从以下文章中提取所有关键论点和数据支撑..."
→ 输出: 结构化论点列表
Prompt 2: "将以下论点按重要性排序,并归类到 3-5 个主题下..."
→ 输出: 分类后的论点
Prompt 3: "基于以下分类论点,写一篇 200 字的执行摘要..."
→ 输出: 最终摘要
提示链 vs 单次长 Prompt:提示链每步可独立验证和调试,出错时只需修改对应环节。单次长 Prompt 虽然简单,但出错排查困难,且受上下文窗口限制。
10
Meta-Prompting 用 AI 优化 Prompt
让 LLM 自己来优化 Prompt。提供一个初始 Prompt 和期望的输出格式,让模型迭代改进 Prompt 的措辞、结构和约束条件。
💡 原理:LLM 对语言模式有深刻理解,可以用它自身的语言能力来"优化"与它沟通的语言。
Meta-Prompting 示例
"你是一个 Prompt Engineering 专家。请优化以下 Prompt:
原始 Prompt:'帮我写个产品介绍'
优化要求:
1. 明确产品类型和目标受众
2. 指定输出格式和字数
3. 添加风格和语气约束
4. 包含关键信息要素
请输出优化后的 Prompt,并解释每项改进的理由。"
自动化工具:OpenAI 的 Playground 提供了 Prompt 优化功能;开源工具如 promptfoo、dspy 也支持自动 Prompt 优化和评估。
实践
四、Prompt 设计最佳实践
1. 明确指令 vs 模糊指令
❌ 模糊
"写一篇关于 AI 的文章。"
✅ 明确
"写一篇 800 字的 AI 入门科普文章,面向没有任何技术背景的普通读者。要求:1) 用通俗比喻解释什么是 AI 2) 列举 3 个日常生活中的 AI 应用 3) 以对未来的积极展望结尾。语气友好、口语化。"
2. 输出格式控制
格式控制示例
"请以 JSON 格式返回分析结果,包含以下字段:
- sentiment: 字符串,值为 positive/negative/neutral
- confidence: 数字,0-1 之间
- keywords: 字符串数组,最多 5 个关键词"
"请用 Markdown 表格格式输出对比结果,列为:特性 | 模型A | 模型B | 胜出者"
"请按以下结构输出报告:
## 摘要(50字以内)
## 背景分析
## 核心发现(3-5条)
## 建议(可执行的行动项)"
3. 分隔符的使用
使用明确的分隔符来区分指令和内容,避免模型混淆。
分隔符示例
使用三引号、三反引号、XML 标签等:
请总结以下文章的核心观点:
"""
文章内容...
"""
请翻译以下文本:
```
Text to translate...
```
请分析以下数据:
<data>
...数据内容...
</data>
4. 负面提示(告诉模型不要做什么)
负面提示
"请改写以下文章,使其更加简洁。注意:
- 不要改变原文的核心含义
- 不要添加原文没有的信息
- 不要使用过于学术化的术语
- 不要超过原文长度的 70%"
5. 温度和 Top-p 参数的影响
| 参数 |
低值(0-0.3) |
中值(0.3-0.7) |
高值(0.7-1.0) |
| Temperature |
确定性高,输出稳定 适合:事实问答、代码生成 |
平衡创造性和准确性 适合:通用对话、摘要 |
创造性高,输出多样 适合:创意写作、头脑风暴 |
| Top-p |
只选最可能的词 输出高度可预测 |
考虑概率分布的较大部分 输出合理且多样 |
考虑几乎所有可能 输出非常多样但可能不连贯 |
实用建议:对于需要精确答案的任务(数学、编程、数据提取),建议 temperature=0。对于创意任务,temperature=0.7-0.9。通常不需要同时调整 temperature 和 top-p,选择其中一个即可。