什么是提示工程?
提示工程(Prompt Engineering)的核心定义是:设计自然语言输入来引导大语言模型输出特定结果。
这个概念看似简单,但背后隐藏着一个深刻的假设:同一个模型,不同的提示 → 完全不同的输出结果。
想象一下你有一个非常聪明但完全没有任何背景知识的助手。这个助手能够完美地理解和执行任何指令,但它缺乏先验知识,也没有记忆能力。提示工程就是学习如何与这样的助手对话的艺术。
核心假设
提示工程建立在几个关键假设之上:
- 模型能力固定:LLM 的核心能力是相对固定的,不会因为提示而改变其根本能力
- 提示决定输出:输出的质量很大程度上取决于提示的设计质量
- 迭代优化:没有完美的提示,只有更适合当前任务的提示
- 上下文敏感:同样的提示在不同的对话上下文中可能产生不同结果
为什么提示工程如此重要?
在 AI 工程的早期阶段,提示工程几乎是唯一可控的因素。模型的选择、训练数据、参数设置都是固定的,只有提示是可以自由调整的变量。
就像一个优秀的厨师必须了解如何使用调味品一样,AI 工程师必须掌握提示工程。这是与 AI 系统对话的基础,也是后续所有高级技术的前提。
起源与发展
提示工程的发展轨迹反映了整个 AI 领域的进步:
前提示工程时代(2022年前)
- 2017年:Transformer 架构的提出,奠定了现代 LLM 的基础
- 2020年:GPT-3 的发布,展示了大规模语言模型的潜力
- OpenAI Playground(约2020年):提供了早期的模型交互和提示实验平台
提示工程诞生(2022年)
- 2022年1月:ChatGPT 发布,让提示工程进入大众视野
- 2022年3月:InstructGPT 论文,首次系统化地研究了指令跟随
- 2022年10月:LangChain 框架发布,提供了结构化提示模板
技术爆发(2023年)
- 2023年1月:DSPy v1 发布,提出了程序化提示设计
- 2023年3月:Chain-of-Thought 思维链技术成为主流
- 2023年6月:自我一致性方法(Self-Consistency)被提出
- 2023年8月:Tree-of-Thought 树思维扩展了推理能力
这个时间线展示了提示工程从无到有、从简单到复杂的演进过程。
核心技术
基础技巧
角色提示(Role Prompting)
角色提示是最基础也是最重要的技术。通过给 AI 设定一个角色,可以显著影响其回答风格和内容深度。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # 基础角色提示
prompt = "你是一位经验丰富的 Python 开发工程师,请解释什么是装饰器..."
# 具体化的角色提示
prompt = """
你是一位有10年工作经验的Python后端工程师,曾在Google和Facebook工作。
你的专长包括:
- 高性能Web架构设计
- 分布式系统优化
- 代码重构和性能调优
现在请向初学者解释Python装饰器的概念,要求:
1. 使用生活化比喻
2. 给出3个实际应用场景
3. 包含代码示例和性能对比
"""
|
为什么角色提示有效:
- 提供回答的框架和边界
- 激活模型相关的知识网络
- 确保回答的专业性和一致性
指令清晰化
清晰、具体的指令是获得高质量回答的关键。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| # 差的提示
"写一个关于狗的文章"
# 好的提示
"""
请写一篇800字的关于边境牧羊犬的科普文章。要求包含:
1. 原产地和历史背景
2. 外貌特征和性格特点
3. 训练难度和饲养建议
4. 适合的家庭类型
语言风格:科学严谨但通俗易懂
读者群体:考虑养狗的潜在狗主人
"""
# 极致的清晰提示
"""
角色:宠物犬行为训练专家
读者水平:有基本养狗知识的普通人
任务:对比边境牧羊犬和贵宾犬的饲养要求
结构:
- 开头:引言,为什么选择这两种犬类
- 中间:
* 生活空间需求对比
* 运动量要求对比
* 智力训练方法对比
* 常见行为问题及解决方案
- 结尾:总结,根据不同家庭给出选择建议
字数:1000字左右
语气:专业但友好,避免过于学术化
"""
|
格式化输出
指定输出格式可以显著提升实用性:
1
2
3
4
5
6
7
8
9
10
| prompt = """
请分析以下代码的性能问题:
```python
def process_data(data):
result = []
for item in data:
if item > 10:
result.append(item * 2)
return result
|
请按照以下格式输出分析结果:
性能分析
时间复杂度
空间复杂度
优化建议
- 建议1:…
理由:…
- 建议2:…
理由:…
优化后的代码
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
### 高级推理技术
#### 思维链(Chain-of-Thought, CoT)
思维链技术由 Google 在 2022 年 NeurIPS 会议上提出,彻底改变了 LLM 的推理能力。
```python
# 传统提示
"计算:234 + 567 + 891 = ?"
# 思维链提示
"""
让我们一步步计算这个加法问题:
第一步:234 + 567
- 200 + 500 = 700
- 30 + 60 = 90
- 4 + 7 = 11
- 总和:700 + 90 + 11 = 801
第二步:801 + 891
- 800 + 800 = 1600
- 1 + 900 = 901
- 总和:1600 + 901 = 2501
所以:234 + 567 + 891 = 2501
"""
|
思维链的核心思想:让模型像人类一样分步推理,而不是直接给出答案。
少样本学习(Few-shot Learning)
少样本学习通过提供几个示例来指导模型理解任务模式:
1
2
3
4
5
6
7
8
9
10
11
12
| # 少样本提示
"""
请完成以下情感分析任务,判断句子的情感倾向为积极、消极或中性。
示例:
- 这部电影太精彩了,我反复看了三遍。 积极
- 手机电池续航太差,半天就没电了。 消极
- 今天天气不错,阳光明媚。 中性
现在请分析:
- 这款软件界面设计简洁,功能也很实用。
"""
|
最佳实践:
- 示例要多样化,覆盖各种可能情况
- 示例格式要一致
- 提供足够的上下文信息
树思维(Tree-of-Thought, ToT)
树思维扩展了思维链,允许模型探索多个推理路径:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| # 树思维提示示例
"""
你需要解决一个数学问题,但可能有多种解决方法。
对于每个方法,请评估其可行性,并选择最优路径。
问题:如何找到 1 到 100 之间的所有质数?
解决路径1:试除法
- 步骤:检查每个数是否能被2到sqrt(n)之间的数整除
- 优点:简单易懂
- 缺点:对于大数效率较低
解决路径2:埃拉托斯特尼筛法
- 步骤:创建一个布尔数组,逐步标记非质数
- 优点:时间复杂度O(n log log n),效率高
- 缺点:需要额外空间存储筛子
解决路径3:概率性算法
- 步骤:使用概率性测试方法
- 优点:对于极大数更有效
- 缺点:可能有误判
请选择最优方法并给出具体实现。
"""
|
自一致性(Self-Consistency)
自一致性方法通过生成多个推理路径并选择最一致的结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 自一致性提示
"""
请解决以下数学问题:一个笼子里有鸡和兔共35只,脚共94只,问鸡兔各多少只?
请提供至少3种不同的解决方法,并验证结果的一致性。
方法1:
方程法...
验证结果:鸡23只,兔12只
方法2:
假设法...
验证结果:鸡23只,兔12只
方法3:
枚举法...
验证结果:鸡23只,兔12只
综合分析:三种方法都得到相同结果,确认答案正确。
"""
|
优化方法
温度调节(Temperature Tuning)
温度是控制 LLM 输出随机性的参数:
- 低温度(0.1-0.3):输出更确定、更保守
- 中等温度(0.5-0.7):平衡确定性和创造性
- 高温度(0.8-1.0):输出更多样化、更有创造性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 温度调节示例
creative_prompt = """
想象一个未来城市的景象,包含以下元素:
- 空中交通系统
- 生态建筑
- AI服务助手
用充满想象力的语言描述这座城市的日常生活。
temperature=0.8
"""
technical_prompt = """
分析未来城市可能面临的10个主要挑战,每个挑战包含:
1. 问题描述
2. 影响程度评估
3. 可能的解决方案
要求:基于现有技术发展趋势进行合理推测。
temperature=0.3
"""
|
迭代优化
提示工程是一个迭代过程:
- 初始提示:基于需求创建基础提示
- 测试反馈:运行模型,观察输出结果
- 问题识别:找出输出中的不足之处
- 提示调整:针对性地修改提示
- 效果验证:再次测试,验证改进效果
A/B 测试
通过对比不同提示的效果来优化:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # 对比实验
prompt_A = """
作为数据科学家,请解释机器学习中的过拟合现象。
要求包含定义、原因、检测方法和解决方案。
"""
prompt_B = """
你需要向非技术人员解释什么是过拟合。请使用:
1. 生活化的比喻(比如穿鞋)
2. 具体的代码示例
3. 直观的图表描述
4. 避免专业术语,用简单语言
"""
# 比较两种提示的:
# - 回答的准确性
# - 可读性
# - 用户满意度
|
提示工程评估框架(APE)
Zhou 等人在 2022 年提出了 APE (Automatic Prompt Evaluation) 框架,用于系统化评估提示质量:
- 相关性:回答是否与问题相关
- 准确性:信息是否正确
- 完整性:是否涵盖了所有重要方面
- 一致性:回答内部是否逻辑一致
- 安全性:是否包含有害或偏见内容
动手练习
让我们通过一个实际练习来掌握提示工程。目标是创建一个能够自动分析代码质量的助手。
第一步:定义需求
我们需要一个能够:
- 分析代码的可读性
- 检查性能问题
- 提供改进建议
- 生成优化后的代码
第二步:创建基础提示
1
2
3
4
5
6
7
8
9
10
11
| basic_prompt = """
请分析以下Python代码:
```python
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
print(factorial(5))
|
请分析代码质量并提供改进建议。
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
### 第三步:迭代优化
让我们一步步优化这个提示:
```python
# 第一轮改进:增加具体要求
improved_prompt = """
请分析以下Python代码,重点关注以下几个方面:
1. **代码可读性**
- 变量命名是否清晰
- 代码结构是否清晰
- 注释是否充分
2. **性能分析**
- 时间复杂度分析
- 空间复杂度分析
- 潜在的性能瓶颈
3. **代码质量**
- 是否符合Python最佳实践
- 是否有边界情况处理
- 错误处理是否完善
4. **改进建议**
- 具体的改进措施
- 优化后的代码示例
代码:
```python
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
print(factorial(5))
|
请按照以上结构提供详细分析。
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
```python
# 第二轮改进:增加格式要求
final_prompt = """
请按照以下格式分析以下Python代码:
## 代码分析报告
### 1. 可读性分析
- 变量命名评估:
- 现状分析...
- 改进建议...
- 代码结构评估:
- 现状分析...
- 改进建议...
- 注释质量评估:
- 现状分析...
- 改进建议...
### 2. 性能分析
- 时间复杂度:
- 分析:递归调用导致O(n)时间复杂度
- 评估:对于小规模输入可以接受,大规模输入可能栈溢出
- 空间复杂度:
- 分析:O(n)由于递归调用栈
- 评估:需要额外的栈空间存储调用信息
- 性能优化建议:
1. 使用迭代而非递归,避免栈溢出
2. 添加输入验证,处理负数输入
3. 考虑记忆化,避免重复计算
### 3. 代码质量评估
- 遵循PEP8规范:基本符合,建议改进
- 边界情况处理:缺少输入验证
- 错误处理:缺乏异常处理机制
### 4. 改进后的代码
```python
def factorial(n):
"""
计算n的阶乘
Args:
n: 非负整数
Returns:
n的阶乘结果
Raises:
ValueError: 如果n为负数
"""
if not isinstance(n, int) or n < 0:
raise ValueError("输入必须是非负整数")
result = 1
for i in range(1, n + 1):
result *= i
return result
# 测试代码
if __name__ == "__main__":
try:
print(factorial(5))
print(factorial(0)) # 应该输出1
print(factorial(3)) # 应该输出6
# print(factorial(-1)) # 应该抛出异常
except ValueError as e:
print(f"错误:{e}")
|
5. 总结建议
- 主要改进点:输入验证、异常处理、迭代实现
- 预期效果:提高代码健壮性和性能
- 适用场景:需要稳定可靠的阶乘计算功能
代码:
1
2
3
4
5
6
7
| def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
print(factorial(5))
|
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
### 第四步:测试和验证
运行不同版本的提示,比较输出质量:
1. **基础版本**:简单的分析
2. **改进版本**:结构化分析,但不够详细
3. **最终版本**:完整详细的分析报告
通过这个过程,你可以看到提示优化的显著效果。
## 为什么提示工程不够?
虽然提示工程是重要的基础,但它存在几个根本性的限制:
### 1. 无记忆能力
每次对话都是独立的,AI 无法记住之前的交互内容:
```python
# 第一轮对话
user: "我是一个Python开发者"
assistant: "很好,Python是一种强大的编程语言..."
# 第二轮对话(AI不记得"我是Python开发者")
user: "我应该学习哪些Python框架?"
assistant: "作为Python开发者,你可以学习..."
|
2. 知识时效性问题
AI 的知识有截止日期,无法获取最新信息:
1
2
3
| # AI不知道最新版本的信息
user: "Python 3.13有什么新特性?"
assistant: "Python 3.13在2024年发布,包含以下新特性..." # 可能给出错误信息
|
3. 无外部知识访问
AI 无法访问私有文档、数据库或最新网络信息:
1
2
| user: "根据我们公司的API文档,如何实现用户认证?"
assistant: "对不起,我无法访问您公司的私有文档..." # 无法提供具体帮助
|
4. 工具使用限制
AI 无法直接调用外部工具或执行代码:
1
2
| user: "请帮我运行数据分析脚本并生成图表"
assistant: "我无法直接运行您的代码,但可以为您提供代码建议..." # 无法实际执行
|
5. 单次交互局限
每次对话都是独立的,无法构建复杂的工作流:
1
2
3
4
5
| user: "帮我分析销售数据"
assistant: "我可以帮您分析,但需要您提供数据..." # 无法自动获取数据
user: "这是销售数据文件..." # 需要用户重复提供信息
assistant: "现在我收到数据了,让我分析..." # AI不记得之前的要求
|
小结:提示工程的价值
基础地位
提示工程是 AI 工程的基石,就像编程中的基础语法一样。无论技术如何发展,与 AI 的有效沟通始终是必要的。
持久价值
在以下场景中,提示工程仍然是最优选择:
- 快速原型验证:不需要复杂系统,只需要快速获取答案
- 创意激发:头脑风暴和创意生成
- 学习辅助:概念解释和知识梳理
- 内容创作:文章、代码、诗歌等各种内容生成
过渡的桥梁
提示工程的价值不在于它能解决什么问题,而在于它帮助我们理解 AI 的能力和局限性。通过提示工程,我们学会了:
- 如何清晰地表达需求
- 如何引导 AI 产生高质量的输出
- 识别 AI 的知识边界
- 理解 prompt 的局限性
就像从汇编语言到高级语言的演进,提示工程代表了 AI 交互的第一步。真正的突破在于认识到:问题不在于如何说得更清楚,而在于如何让 AI 获得更多的信息和能力。
这自然引导我们进入下一阶段:上下文工程(Context Engineering)。
在接下来的文章中,我们将探讨如何突破提示的局限,通过提供外部信息来大幅提升 AI 的能力。