提示工程:学会和 AI 对话是第一课

什么是提示工程?

提示工程(Prompt Engineering)的核心定义是:设计自然语言输入来引导大语言模型输出特定结果

这个概念看似简单,但背后隐藏着一个深刻的假设:同一个模型,不同的提示 → 完全不同的输出结果

想象一下你有一个非常聪明但完全没有任何背景知识的助手。这个助手能够完美地理解和执行任何指令,但它缺乏先验知识,也没有记忆能力。提示工程就是学习如何与这样的助手对话的艺术。

核心假设

提示工程建立在几个关键假设之上:

  1. 模型能力固定:LLM 的核心能力是相对固定的,不会因为提示而改变其根本能力
  2. 提示决定输出:输出的质量很大程度上取决于提示的设计质量
  3. 迭代优化:没有完美的提示,只有更适合当前任务的提示
  4. 上下文敏感:同样的提示在不同的对话上下文中可能产生不同结果

为什么提示工程如此重要?

在 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 设定一个角色,可以显著影响其回答风格和内容深度。

python
 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. 包含代码示例和性能对比
"""

为什么角色提示有效

  • 提供回答的框架和边界
  • 激活模型相关的知识网络
  • 确保回答的专业性和一致性

指令清晰化

清晰、具体的指令是获得高质量回答的关键。

python
 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字左右
语气:专业但友好,避免过于学术化
"""

格式化输出

指定输出格式可以显著提升实用性:

python
 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

请按照以下格式输出分析结果:

性能分析

时间复杂度

  • 分析:…
  • 大O表示法:O(??)

空间复杂度

  • 分析:…
  • 大O表示法:O(??)

优化建议

  1. 建议1:… 理由:…
  2. 建议2:… 理由:…

优化后的代码

python
1
# 优化后的代码

"""

 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)

少样本学习通过提供几个示例来指导模型理解任务模式:

python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 少样本提示
"""
请完成以下情感分析任务,判断句子的情感倾向为积极、消极或中性。

示例:
- 这部电影太精彩了,我反复看了三遍。 积极
- 手机电池续航太差,半天就没电了。 消极  
- 今天天气不错,阳光明媚。 中性

现在请分析:
- 这款软件界面设计简洁,功能也很实用。
"""

最佳实践

  • 示例要多样化,覆盖各种可能情况
  • 示例格式要一致
  • 提供足够的上下文信息

树思维(Tree-of-Thought, ToT)

树思维扩展了思维链,允许模型探索多个推理路径:

python
 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)

自一致性方法通过生成多个推理路径并选择最一致的结果:

python
 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):输出更多样化、更有创造性
python
 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
"""

迭代优化

提示工程是一个迭代过程:

  1. 初始提示:基于需求创建基础提示
  2. 测试反馈:运行模型,观察输出结果
  3. 问题识别:找出输出中的不足之处
  4. 提示调整:针对性地修改提示
  5. 效果验证:再次测试,验证改进效果

A/B 测试

通过对比不同提示的效果来优化:

python
 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. 安全性:是否包含有害或偏见内容

动手练习

让我们通过一个实际练习来掌握提示工程。目标是创建一个能够自动分析代码质量的助手。

第一步:定义需求

我们需要一个能够:

  1. 分析代码的可读性
  2. 检查性能问题
  3. 提供改进建议
  4. 生成优化后的代码

第二步:创建基础提示

python
 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. 总结建议

  • 主要改进点:输入验证、异常处理、迭代实现
  • 预期效果:提高代码健壮性和性能
  • 适用场景:需要稳定可靠的阶乘计算功能

代码:

python
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 的知识有截止日期,无法获取最新信息:

python
1
2
3
# AI不知道最新版本的信息
user: "Python 3.13有什么新特性?"
assistant: "Python 3.13在2024年发布,包含以下新特性..."  # 可能给出错误信息

3. 无外部知识访问

AI 无法访问私有文档、数据库或最新网络信息:

python
1
2
user: "根据我们公司的API文档,如何实现用户认证?"
assistant: "对不起,我无法访问您公司的私有文档..."  # 无法提供具体帮助

4. 工具使用限制

AI 无法直接调用外部工具或执行代码:

python
1
2
user: "请帮我运行数据分析脚本并生成图表"
assistant: "我无法直接运行您的代码,但可以为您提供代码建议..."  # 无法实际执行

5. 单次交互局限

每次对话都是独立的,无法构建复杂的工作流:

python
1
2
3
4
5
user: "帮我分析销售数据"
assistant: "我可以帮您分析,但需要您提供数据..."  # 无法自动获取数据

user: "这是销售数据文件..."  # 需要用户重复提供信息
assistant: "现在我收到数据了,让我分析..."  # AI不记得之前的要求

小结:提示工程的价值

基础地位

提示工程是 AI 工程的基石,就像编程中的基础语法一样。无论技术如何发展,与 AI 的有效沟通始终是必要的。

持久价值

在以下场景中,提示工程仍然是最优选择:

  1. 快速原型验证:不需要复杂系统,只需要快速获取答案
  2. 创意激发:头脑风暴和创意生成
  3. 学习辅助:概念解释和知识梳理
  4. 内容创作:文章、代码、诗歌等各种内容生成

过渡的桥梁

提示工程的价值不在于它能解决什么问题,而在于它帮助我们理解 AI 的能力和局限性。通过提示工程,我们学会了:

  1. 如何清晰地表达需求
  2. 如何引导 AI 产生高质量的输出
  3. 识别 AI 的知识边界
  4. 理解 prompt 的局限性

就像从汇编语言到高级语言的演进,提示工程代表了 AI 交互的第一步。真正的突破在于认识到:问题不在于如何说得更清楚,而在于如何让 AI 获得更多的信息和能力

这自然引导我们进入下一阶段:上下文工程(Context Engineering)。

在接下来的文章中,我们将探讨如何突破提示的局限,通过提供外部信息来大幅提升 AI 的能力。