Prompt Engineering 学习笔记
—— 基于 DAIR.AI Prompt Engineering Guide 的系统性学习
在上一篇博客中,我记录了学习吴恩达 Agentic AI 课程的心得。在那篇文章里我提到一个核心观点:
Agentic AI 的核心不再是”写 Prompt”,而是”设计系统”。
但这句话有一个隐含的前提——你得先知道怎么写好 Prompt。
带着这个问题,我系统学习了 DAIR.AI 开源的 Prompt Engineering Guide。这个指南由 DAIR.AI 团队维护,是目前社区中最全面、最系统的 Prompt Engineering 教程之一,涵盖了从基础概念到前沿研究的大量内容。
这次学习的最大感受是:
Prompt Engineering 远不止”把问题描述清楚”这么简单。它是一套关于”如何与 LLM 有效沟通”的系统性方法,涉及推理引导、知识注入、工具调用、自我反思等多个层面。
本文将按照从基础到进阶的顺序,梳理我学到的核心内容。
一、什么是 Prompt Engineering
Prompt Engineering 是一门关于开发和优化提示词(prompts) 的学科,目标是高效地利用大语言模型(LLM)完成各种任务。
它不只是”写好一段话”,而是涵盖了一整套技能和方法论:
- 理解 LLM 的能力和局限性
- 设计 robust 的提示策略
- 提升输出的可靠性和准确性
- 接口化地与 LLM 和其他工具协作
本质上,Prompt Engineering 是人机交互的新形态——你写的不是自然语言,而是”给 AI 的指令”。
二、Prompt 的四个基本要素
在设计 Prompt 时,有四个核心要素需要考虑:
| 要素 | 说明 | 示例 |
|---|---|---|
| Instruction(指令) | 你想让模型做什么 | “将以下文本翻译成西班牙语” |
| Context(上下文) | 外部信息或额外背景 | 补充的领域知识、约束条件 |
| Input Data(输入数据) | 具体的输入内容 | “hello!” |
| Output Indicator(输出指示) | 你期望的输出格式 | “Sentiment:” |
一个完整的 Prompt 示例:
1 | Classify the text into neutral, negative, or positive. |
这里:
- Instruction: “Classify the text into neutral, negative, or positive”
- Input Data: “I think the food was okay.”
- Output Indicator: “Sentiment:”
并非每个 Prompt 都需要四个要素同时存在,但理解它们的角色有助于我们更好地组织 Prompt。
三、设计 Prompt 的通用原则
在深入各种技术之前,有几个通用的设计原则值得牢记:
1. 从简单开始,逐步迭代
Prompt 设计是一个迭代过程。从简单的 Prompt 开始,逐步添加更多元素和上下文。当一个复杂任务涉及多个子任务时,先拆解成简单的子任务,逐步构建。
2. 指令要清晰明确
使用明确的动词指令,如 “Write”、”Classify”、”Summarize”、”Translate”、”Order” 等。建议将指令放在 Prompt 开头,使用分隔符(如 ###)区分指令和上下文。
1 | ### Instruction ### |
3. 越具体越好
描述性越强、细节越丰富,输出质量越好。特别是当你对输出有特定风格或格式要求时。
不好的 Prompt:
1 | Explain the concept prompt engineering. Keep it short and don't be too descriptive. |
好的 Prompt:
1 | Use 2-3 sentences to explain the concept of prompt engineering to a high school student. |
4. 说”做什么”,不说”不做什么”
避免告诉模型”不要做什么”,而是明确告诉它”应该做什么”。
不好的:
1 | DO NOT ASK FOR INTERESTS. DO NOT ASK FOR PERSONAL INFORMATION. |
好的:
1 | Recommend a movie from the top global trending movies. Refrain from asking users for preferences and personal information. |
四、基础 Prompting 技术(三大基石)
4.1 Zero-shot Prompting(零样本提示)
这是最基本的方式:直接给模型下达指令,不提供任何示例。
1 | Classify the text into neutral, negative or positive. |
输出:Neutral
现代 LLM(如 GPT-4、Claude 3)经过 Instruction Tuning 和 RLHF 训练,已经具备很强的 zero-shot 能力。对于很多简单任务,直接指令就足够了。
4.2 Few-shot Prompting(少样本提示)
当 zero-shot 效果不够好时,可以在 Prompt 中提供几个示例来引导模型。这被称为 in-context learning。
1 | This is awesome! // Positive |
输出:Negative
一个有趣的发现: 即使示例中的标签是随机打乱的(比如把 Positive 和 Negative 随机分配),模型仍然能给出正确答案。这说明:
- 标签的分布格式比标签本身的对错更重要
- 保持格式一致性有助于模型理解任务结构
但 Few-shot 也有局限: 对于需要多步推理的复杂任务(如数学计算),Few-shot 仍然力不从心。比如:
1 | The odd numbers in this group add up to an even number: 15, 32, 5, 13, 82, 7, 1. |
即使用了多个示例,模型仍然可能出错。这就引出了下一个关键技术。
4.3 Chain-of-Thought Prompting(思维链提示)
CoT 的核心思想是:让模型展示中间推理步骤,而不仅仅是直接给出答案。
标准 CoT(配合 Few-shot):
1 | The odd numbers in this group add up to an even number: 4, 8, 9, 15, 12, 2, 1. |
输出:
1 | Adding all the odd numbers (15, 5, 13, 7, 1) gives 41. The answer is False. |
仅仅加了一行推理过程,答案就从错误变成了正确。
Zero-shot CoT(零样本思维链):
更神奇的是,有时候你甚至不需要提供推理示例,只需要在 Prompt 末尾加上一句:
1 | Let's think step by step. |
不加这句话:
1 | I went to the market and bought 10 apples. I gave 2 apples to the neighbor and 2 to the repairman. I then went and bought 5 more apples and ate 1. How many apples did I remain with? |
输出:11 apples(错误!)
加上 “Let’s think step by step”:
1 | ...How many apples did I remain with? |
输出:
1 | First, you started with 10 apples. |
这一句简单的”魔法咒语”,本质上是在唤醒模型的推理能力,让它不要跳过中间步骤。
Auto-CoT(自动思维链):
Zhang et al. (2022) 提出了 Auto-CoT,自动为不同的任务生成推理链示例,分两步:
- 问题聚类:将数据集的问题分成若干簇
- 示例采样:从每个簇中选代表性问题,用 Zero-shot CoT 生成推理链
五、提升推理可靠性的技术
5.1 Self-Consistency(自洽性)
Wang et al. (2022) 提出了一个直觉性的问题:既然 CoT 的推理路径可以有多条,那为什么只取一次答案?
Self-Consistency 的做法是:
- 对同一个问题,用 Few-shot CoT 进行多次采样
- 得到多条不同的推理路径和答案
- 通过多数投票(majority vote) 选择最终答案
比如经典的”年龄差”问题:
1 | When I was 6 my sister was half my age. Now I'm 70 how old is my sister? |
直接回答会得到 35(错误),因为模型直接算了 70/2。
使用 Self-Consistency 采样三次:
- 输出 1:
When I was 6 my sister was half my age, so she was 3. Now I am 70, so she is 70 - 3 = 67. The answer is 67. - 输出 2:
When the narrator was 6, his sister was half his age, which is 3. Now that the narrator is 70, his sister would be 70 - 3 = 67 years old. The answer is 67. - 输出 3:
When I was 6 my sister was half my age, so she was 3. Now I am 70, so she is 70/2 = 35. The answer is 35.
三次中有两次得到 67,最终答案取 67(正确)。
Self-Consistency 的本质是”用多次采样的多样性来对抗单次推理的不稳定性”。
5.2 Generate Knowledge Prompting(知识生成提示)
有时候模型回答错误不是因为不会推理,而是缺乏必要的背景知识。
这种方法的核心是:先让模型生成相关知识,再基于这些知识进行推理。
比如这个问题:
1 | Part of golf is trying to get a higher point total than others. Yes or No? |
直接回答:Yes(错误)
先让模型生成知识:
1 | Input: Part of golf is trying to get a higher point total than others. |
然后带着知识再回答:
1 | No, the objective of golf is not to get a higher point total than others. Rather, the objective is to play a set of holes in the least number of strokes. |
当模型缺乏特定领域的知识时,”先生成知识,再推理”是一种有效的策略。
5.3 Meta Prompting(元提示)
Meta Prompting 是一种更抽象的提示方式:关注问题的结构和模式,而非具体内容。
核心特点:
- 结构导向:优先考虑问题和解决方案的格式和模式
- 语法聚焦:使用语法作为响应模板
- 抽象示例:使用抽象化示例作为框架
- Token 高效:减少所需 token 数量
- 通用性强:可跨领域应用
与 Few-shot 的区别:Few-shot 是内容驱动的(给你具体例子),Meta Prompting 是结构驱动的(给你解决问题的”模式”)。
六、从推理到行动:让 AI 使用工具
6.1 ReAct(Reasoning + Acting)
ReAct 是 Yao et al. (2022) 提出的框架,核心思想是让 LLM 交替进行推理和行动。
工作流程:
1 | Thought 1: 我需要搜索 Colorado orogeny... |
每一步:
- Thought:思考下一步该做什么
- Action:执行一个操作(搜索、查找等)
- Observation:观察环境返回的结果
CoT 只能”想”,ReAct 能”想 + 做”。 推理帮助决定下一步该检索什么,检索到的信息又反过来支持推理。
6.2 PAL(程序辅助语言模型)
PAL 的思想是:让模型不输出自然语言推理过程,而是直接生成代码。
与 CoT 的区别:
- CoT:输出自然语言的推理链
- PAL:输出可执行的程序代码
1 | # Q: Today is 27 February 2023. I was born exactly 25 years ago. What is the date I was born? |
执行这段代码:02/27/1998
PAL 的优势在于:计算准确性由程序保证,不受 LLM 数学能力的限制。 适合涉及复杂计算、日期处理等任务。
6.3 ART(自动推理和工具使用)
ART(Automatic Reasoning and Tool-use)是一个更自动化的框架:
- 给定新任务,从任务库中选择合适的多步推理和工具使用示例
- 测试时,当需要调用外部工具时暂停生成,集成工具输出后继续生成
- 支持人类修正推理步骤或添加新工具
ART 的核心优势是”可扩展”——不需要重新训练模型,只需更新任务库和工具库就能适应新任务。
七、从线性到树状:复杂问题求解
7.1 Tree of Thoughts(ToT,思维树)
CoT 的问题是:它是一条线性的推理路径,如果中间某一步走错了,就无法回溯。
ToT 将推理扩展为一棵树:
- 每个节点代表一个”思维”(intermediate thought)
- 可以进行分支探索(多种可能的推理方向)
- 可以回溯(发现某条路走不通就回到之前的节点)
- 使用 BFS 或 DFS 等搜索策略
实际使用中,一个简化的 ToT Prompt 可以这样写:
1 | Imagine three different experts are answering this question. |
ToT 的本质是把”单线程推理”升级为”多线程探索 + 回溯”——更像人类的思维方式。
7.2 Prompt Chaining(提示链)
Prompt Chaining 是一种工程化技术:把复杂任务拆分成多个子任务,每个子任务用一个 Prompt 处理,前一个 Prompt 的输出作为下一个 Prompt 的输入。
典型流程:
1 | Prompt 1: 从文档中提取与问题相关的引用 |
优势:
- 提高可靠性:每个步骤更简单,更容易做好
- 可调试:可以定位哪一步出了问题
- 可控制:每个环节都可以单独优化
八、让 AI 学会自我反思
8.1 Reflexion
Reflexion 是 Shinn et al. (2023) 提出的框架,让 AI Agent 能够从自己的错误中学习。
框架包含三个模型:
| 角色 | 职责 |
|---|---|
| Actor | 基于状态观察生成文本和行动(使用 CoT 或 ReAct) |
| Evaluator | 对 Actor 的输出进行评分 |
| Self-Reflection | 生成语言反馈(verbal feedback),帮助 Actor 改进 |
工作流程:
- 定义任务
- 生成执行轨迹(trajectory)
- 评估结果
- 进行自我反思(哪里做错了?为什么?)
- 将反思存入记忆,用于下一次尝试
Reflexion 的核心是”试错学习”——不需要重新训练模型,通过语言反馈实现自我改进。
这让我联想到传统 RL 的 reward 是标量(一个数字),而 Reflexion 的反馈是语言(具体的、可理解的描述),这使得 AI 能更精确地理解自己的问题所在。
适用场景:
- 需要从试错中学习的任务(决策、编程、推理)
- 传统 RL 成本太高或不现实时
- 需要可解释的学习过程时
九、RAG:检索增强生成
9.1 为什么需要 RAG?
LLM 的知识是静态的——它在训练数据截止日期之后就”冻结”了。而现实中:
- 知识在持续更新
- 企业有自己的私有数据
- 需要引用可靠的外部来源
9.2 RAG 的工作原理
RAG(Retrieval Augmented Generation)的核心流程:
1 | 用户问题 → 检索器(从外部知识库中检索相关文档) |
- 用户提出问题
- 检索系统(如基于向量数据库)从知识源(如 Wikipedia、企业文档库)中检索相关文档
- 将检索到的文档与原始问题拼接成新的 Prompt
- LLM 基于这些上下文生成最终答案
9.3 RAG 的优势
| 优势 | 说明 |
|---|---|
| 事实一致性 | 基于外部知识源,减少幻觉 |
| 知识可更新 | 不需要重新训练模型 |
| 可追溯 | 可以引用信息来源 |
| 私有数据 | 可以接入企业内部知识库 |
RAG 解决的是 LLM 最大的痛点之一:幻觉(Hallucination)。 当模型”不确定”的时候,与其让它猜,不如让它去”查”。
十、个人思考与启发
经过这次系统学习,我对 Prompt Engineering 有了全新的认知。以下是我的一些核心思考:
1. 技术演进的一条主线
从技术的演进路径来看,Prompt Engineering 的发展遵循一条清晰的脉络:
1 | Zero-shot → Few-shot → CoT → ReAct → Reflexion |
每一步的演进都在解决前一步的不足:
- Zero-shot 不够准确 → 加示例(Few-shot)
- Few-shot 不会推理 → 加推理链(CoT)
- CoT 缺乏外部信息 → 加工具调用(ReAct)
- ReAct 不会自我改进 → 加自我反思(Reflexion)
2. Prompt Engineering 与 Agentic AI 的关系
结合上一篇 Agentic AI 的学习,我整理了一张对照表:
| Prompt Engineering | Agentic AI |
|---|---|
| 设计 Prompt | 设计系统 |
| CoT 推理链 | Agent 的规划能力 |
| ReAct(推理+行动) | Agent 的工具调用能力 |
| Reflexion(自我反思) | Agent 的自我修正能力 |
| RAG(检索增强) | Agent 的知识获取能力 |
| Prompt Chaining | Agentic Workflow |
| Few-shot / In-context Learning | Agent 的记忆系统 |
Prompt Engineering 是 Agentic AI 的微观基础,Agentic AI 是 Prompt Engineering 的宏观升华。
3. 对实际开发的启示
- **不要满足于”能跑”**:简单的 zero-shot 可能对 80% 的场景够用,但剩下 20% 的复杂场景需要深入理解各种技术
- 推理能力可以通过 Prompt 激发:”Let’s think step by step” 的效果让我意识到,很多时候不是模型”不会”,而是我们”没有引导它去想”
- 工具 > 纯推理:让 LLM 去做它擅长的事(理解意图、规划),把精确计算和知识检索交给工具
- 多样性 > 单次最优:Self-Consistency 的成功告诉我,”多次尝试取最优”比”一次做到完美”更实用
结语
这次学习让我重新理解了 Prompt Engineering 的定位:
它不是”提示词技巧”,而是一门关于”人机协作接口设计”的工程学科。
从 Zero-shot 到 Reflexion,从简单的文本分类到多步推理、工具调用、自我反思——每一项技术的背后,都是对”如何让 AI 更可靠地完成复杂任务”这个核心问题的探索。
而这,也正是 Agentic AI 的基石。
参考资源:Prompt Engineering Guide by DAIR.AI