Prompt Engineering 实践总结

2023 年,用了一年的 LLM,从 GPT-3.5 到 GPT-4,从 Claude 到国产模型。

踩过的坑比吃过的盐还多。总结一些经验。

为什么 Prompt 重要

同样的模型,不同的 Prompt,效果天差地别。

好的 Prompt:

  • 回答更准确
  • 幻觉更少
  • 格式更规范

不好的 Prompt:

  • 答非所问
  • 输出不稳定
  • 难以控制

核心原则

1. 明确任务

别让模型猜你要什么。

1
2
3
4
5
# ❌ 模糊
"给我写点代码"

# ✅ 明确
"用 Python 写一个快速排序函数,包含完整的类型注解和单元测试"

2. 给出上下文

模型需要知道背景。

1
2
3
4
5
# ❌ 没背景
"解释一下这个 API"

# ✅ 有背景
"我是一个 Python 后端开发,正在学习 FastAPI。请用通俗易懂的方式解释 RESTful API 的概念,并给出一个简单的 FastAPI 示例"

3. 指定格式

输出格式要明确。

1
2
3
4
5
# ❌ 随意
"给我一些编程语言"

# ✅ 指定格式
"用 JSON 格式列出 5 种主流编程语言,包含:name(名称)、creator(创始人)、year(诞生年份)、paradigm(编程范式)"

4. 分解任务

复杂问题拆成几步。

1
2
3
4
5
6
7
8
# ❌ 太复杂
"给我写一个完整的用户管理系统"

# ✅ 拆开
"第一步:设计数据库表结构
第二步:写用户注册的 API
第三步:写用户登录的 API
第四步:写获取用户信息的 API"

实用技巧

1. Few-shot Learning

给例子,效果更好。

1
2
3
4
5
6
7
8
9
10
判断以下评论的情感(正面/负面/中性):

评论:东西收到了,很满意,好评!
情感:正面

评论:等了一周还没发货,体验太差了
情感:负面

评论:就那样吧,普通水平
情感:

2. 角色设定

让模型进入特定角色。

1
2
3
你是一个资深 Python 工程师,擅长写简洁优雅的代码。
你的代码遵循 PEP 8 规范,注重可读性和性能。
现在,请帮我优化以下代码...

3. 思维链 (Chain of Thought)

让模型分步思考。

1
2
3
4
5
6
7
8
9
解题思路:
1. 理解问题
2. 分析数据
3. 设计算法
4. 实现代码
5. 测试验证

问题:找出数组中出现次数超过一半的数字
请按照以上思路解答...

4. 结构化输出

用 Markdown、JSON 格式。

1
2
3
4
5
6
7
8
9
10
11
12
用 Markdown 格式输出,结构如下:

## 技术名称
- 简介:(一句话介绍)
- 优点:
- 优点1
- 优点2
- 缺点:
- 缺点1

## 技术名称
...

5. 限制条件

明确禁止什么。

1
2
3
4
5
写一段自我介绍,但满足以下条件:
- 不能超过 100 字
- 不能出现真实姓名
- 不能提及具体公司名称
- 语气要积极向上

常见问题与解决

1. 输出太长

1
用一句话概括上面内容,不超过 50 字。

2. 格式不稳定

1
2
始终用以下 JSON 格式输出,不要改变:
{"name": "xxx", "age": xxx, "city": "xxx"}

3. 幻觉

1
2
如果不确定某个信息,请明确说"我不确定",不要编造。
引用你引用的信息来源。

4. 上下文太长

1
保留最后 3 轮对话的要点,用一句话总结。

进阶技巧

1. 系统提示词

1
2
3
4
5
6
7
8
9
10
11
12
13
14
messages = [
{
"role": "system",
"content": """你是一个专业的技术作家。
- 写作风格:简洁、专业、易懂
- 输出格式:Markdown
- 代码示例:必须有注释
- 遇到不确定的术语要解释"""
},
{
"role": "user",
"content": "解释一下什么是 Docker"
}
]

2. 自洽性检查

1
2
3
4
5
6
7
8
# 让模型先给出答案,再验证
prompt = """
1. 给出问题的答案
2. 验证答案是否正确
3. 如果错误,给出修正后的答案

问题:Python 中 list 和 tuple 的区别是什么?
"""

3. 迭代优化

1
2
3
# 第一轮:生成初稿
# 第二轮:让模型自己批评
# 第三轮:根据批评修改

场景示例

代码审查

1
2
3
4
5
6
7
8
9
10
11
12
13
作为代码审查专家,请审查以下 Python 代码:

1. 找出潜在的 bug
2. 指出代码质量问题
3. 提出优化建议

代码:
def process_data(data):
result = []
for item in data:
if item['status'] == 'active':
result.append(item)
return result

写作辅助

1
2
3
4
5
6
7
8
你是一个技术博客作者。
请用以下风格写一篇博客:
- 开头用一个有趣的故事或问题
- 中间用代码示例解释技术
- 结尾总结和展望

主题:Python 异步编程入门
目标读者:有一定 Python 基础的开发者

数据处理

1
2
3
4
5
6
7
我有一份 CSV 数据,包含以下字段:
user_id, username, email, created_at, status

请:
1. 统计每个月的用户增长数
2. 找出活跃用户(有登录记录的)
3. 生成一个 JSON 格式的报告

感悟

Prompt Engineering 和编程差不多,需要不断练习。

没有银弹,只有经验。

多试,多调,多总结。

这就是 AI 时代的新技能吧。