Prompt 工程实战:写出好提示词的艺术

什么是 Prompt Engineering

Prompt Engineering(提示词工程)是指设计和优化与 LLM 交互的提示词,以获得更准确、更有用的输出。它不是简单地提问,而是是一门结合了理解模型行为、设计有效沟通的实践艺术。

Prompt 的基本结构

一个完整的 Prompt 通常包含以下部分:

1
2
3
4
5
6
7
8
prompt = """
[角色定义] # 让模型扮演特定角色
[任务描述] # 清晰说明要做什么
[上下文信息] # 提供必要的背景知识
[输出格式] # 指定期望的输出形式
[约束条件] # 明确限制和要求
[示例] # Few-shot 示例
"""

各部分作用

部分 作用 重要性
角色定义 激活模型的相关知识 ⭐⭐⭐
任务描述 明确目标和动作 ⭐⭐⭐
上下文 提供必要信息 ⭐⭐⭐
输出格式 控制输出结构 ⭐⭐
约束条件 限制输出范围 ⭐⭐
示例 展示期望格式 ⭐⭐

核心原则

1. 清晰具体(Be Specific)

1
2
3
4
5
6
7
8
9
10
11
12
# ❌ 模糊的提示词
prompt1 = "帮我写点东西"

# ✅ 清晰具体的提示词
prompt2 = """
帮我写一封求职邮件:
- 职位:Python 后端工程师
- 公司:字节跳动
- 我的优势:3年 FastAPI 经验,熟悉微服务架构
- 语气:专业、自信但不傲慢
- 字数:200字左右
"""

2. 结构化输出(Structure Output)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 使用 XML 标签或 Markdown 格式化
prompt = """
请提取以下文本中的关键信息,用 JSON 格式输出:

文本:苹果公司成立于1976年,总部位于加州库比蒂诺,是全球市值最高的科技公司之一。

输出格式:
```json
{
"公司名称": "",
"成立年份": "",
"总部": "",
"简介": ""
}

“””

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

### 3. 分解复杂任务(Decompose)

```python
# ❌ 一次性要求太多
prompt1 = """
分析这100条用户评论,给出:
1. 情感分类
2. 主要问题归纳
3. 产品改进建议
4. 营销策略优化
"""

# ✅ 分解步骤
prompts = [
"将这100条评论按情感分为正面/负面/中性三类",
"负面评论中归纳出TOP5投诉问题",
"针对这些问题,给出产品改进建议",
"基于分析结果,提出营销优化策略"
]

高级技巧

1. Few-shot Learning

通过示例让模型理解任务模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 示例1
prompt = """
任务:判断文本情感是正面还是负面

示例:
文本:"这家餐厅的服务太差了,等了1小时才上菜"
情感:负面

文本:"物流很快,两天就到了,好评!"
情感:正面

文本:"耳机音质一般,没有描述的那么好"
情感:

请判断:
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 更复杂的示例:推理过程
prompt = """
任务:判断一句话是否符合逻辑

示例:
句子:"他是个医生,所以能给人看病"
推理:医生的工作就是给人看病,所以这个推断是符合逻辑的
结论:符合逻辑

句子:"天下雨了,所以太阳很亮"
推理:下雨和太阳亮度没有因果关系
结论:不符合逻辑

句子:"他每天都跑步,所以身体很健康"
推理:

请判断:
"""

2. 思维链提示(Chain of Thought)

引导模型逐步推理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 直接提问
prompt1 = """
甲买了3本书,每本20元,又买了1支笔5元,总共花了多少?
"""

# 思维链提示
prompt2 = """
请一步步推理,最后给出答案。

甲买了3本书,每本20元 → 3 × 20 = 60元
又买了1支笔5元
总共:60 + 5 = 65元

答案:65元
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 自动思维链
prompt3 = """
在回答问题时,请先写出你的推理过程,再给出最终答案。

问题:某个数先加5,再乘以2,得到30,这个数是多少?

推理过程:
1. 最终结果是30
2. 逆向思考:30 ÷ 2 = 15
3. 15 - 5 = 10
4. 所以原数是10

最终答案:10

问题:小明有50元,买了2个笔记本,每个15元,还剩多少元?
"""

3. 角色扮演(Role Prompting)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
prompt = """
# 角色设定
你是一位资深技术面试官,具有10年互联网面试经验。

# 面试规则
1. 考察候选人的算法能力和系统设计思维
2. 问题由浅入深,逐步增加难度
3. 每次回答后给予简短反馈
4. 友好但专业的态度

# 面试流程
1. 先让候选人自我介绍
2. 根据简历定制问题
3. 每道题给候选人思考时间
4. 最后给出评价和建议

现在开始面试,请候选人自我介绍。
"""

4. 上下文学习(In-Context Learning)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
prompt = """
# 背景知识
在本公司,用户等级分为:
- VIP会员:年消费10万以上,享受专属客服
- 银卡会员:年消费3万-10万,9折优惠
- 普通会员:年消费3万以下,无折扣

# 任务
判断以下用户的会员等级和可享受的优惠:

用户A:年消费15万
用户B:年消费8万
用户C:年消费2万

请按以下格式输出:
| 用户 | 会员等级 | 优惠内容 |
|------|---------|---------|
"""

5. 约束条件(Constraints)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
prompt = """
# 任务
解释"回调函数"的概念

# 约束条件
1. 用初学者能理解的语言解释
2. 必须包含代码示例
3. 代码必须使用 Python
4. 字数控制在200字以内
5. 最后用一句话总结

# 禁止
- 使用过于专业的术语而不解释
- 输出与编程无关的内容
"""

常见模式

1. 问答模式

1
2
3
4
5
6
7
8
9
10
11
prompt = """
请基于以下背景信息回答问题。如果信息不足以回答,请说明"根据提供的信息无法回答"。

背景:
我们的产品是一款面向中小企业的CRM系统,主要功能包括客户管理、销售跟踪、数据分析。

问题:
1. 这个产品的主要目标用户是谁?
2. 产品的核心功能有哪些?
3. 适合大型企业使用吗?
"""

2. 翻译模式

1
2
3
4
5
6
7
8
9
10
11
prompt = """
你是一位中英翻译专家。请将以下中文翻译成英文,注意:
1. 保持专业商务语气
2. 符合英文表达习惯
3. 专业术语使用标准翻译

原文:
"在过去的季度中,我们的营收同比增长了25%,其中新客户贡献了40%的增长,老客户复购率达到了60%。"

译文:
"""

3. 总结模式

1
2
3
4
5
6
7
8
9
10
11
prompt = """
请将以下文章压缩成100字以内的摘要,要求:
1. 包含文章的核心观点
2. 使用简洁的语言
3. 保留关键数据

原文:
[长篇文章内容...]

摘要:
"""

4. 分类模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
prompt = """
请将以下新闻标题按类别分类。

类别选项:科技、娱乐、体育、财经、国际

标题列表:
1. "苹果发布新款iPhone"
2. "皇马夺得欧冠冠军"
3. "A股今日大涨2%"
4. "Netflix新剧收视破纪录"
5. "中美贸易谈判进展"

请输出JSON格式:
{
"科技": ["..."],
"体育": ["..."],
"财经": ["..."],
"娱乐": ["..."],
"国际": ["..."]
}
"""

5. 改写模式

1
2
3
4
5
6
7
8
9
10
11
12
13
prompt = """
# 原始文本
产品质量非常好,物流也很快,就是客服态度有点差。

# 改写要求
请将以上文本改写成4种不同风格:
1. 正式商务风格
2. 口语化轻松风格
3. 投诉反馈风格
4. 朋友圈推荐风格

每种风格控制在50字以内。
"""

调试技巧

1. 迭代优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 第一版
prompt_v1 = "写一篇关于AI的文章"

# 分析问题:太宽泛
# 优化为:
prompt_v2 = """
写一篇关于AI在医疗领域应用的文章,要求:
- 包含3个具体应用场景
- 每个场景有实例
- 字数800字
- 结尾有展望
"""

# 如果输出不理想,继续优化...

2. 温度调节

1
2
3
4
5
6
7
8
9
10
11
12
13
# temperature=0.0:确定性输出,适合精确任务
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": "2+3等于几?"}],
temperature=0.0 # 几乎确定的答案
)

# temperature=0.7-1.0:创造性输出,适合写作
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": "写一首关于春天的诗"}],
temperature=0.9 # 更多样化
)

3. 检查输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def validate_output(prompt, output):
"""验证输出是否符合要求"""
checks = []

# 检查字数
if "字数控制在200字" in prompt:
if len(output) > 250: # 留有余地
checks.append("⚠️ 字数可能超标")

# 检查是否包含必要元素
if "必须包含代码示例" in prompt:
if "```" not in output:
checks.append("⚠️ 缺少代码示例")

# 检查格式
if "JSON格式" in prompt:
if not output.strip().startswith("{"):
checks.append("⚠️ 输出格式不符")

return checks

常见错误

1. 信息不足

1
2
3
4
5
6
7
8
9
10
11
# ❌ 缺少关键上下文
prompt1 = "这个功能怎么实现?"

# ✅ 提供足够上下文
prompt2 = """
在 Django 中,如何实现用户登录功能?
要求:
- 使用 Django 内置的认证系统
- 需要 username 和 password
- 登录成功后重定向到首页
"""

2. 指令冲突

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ❌ 自相矛盾的指令
prompt1 = """
写一篇短文,要求:
- 内容积极向上
- 禁止使用任何积极词汇
"""

# ✅ 指令一致
prompt2 = """
写一篇短文,要求:
- 风格客观中立
- 不使用极端化表达
- 字数100字
"""

3. 期望不明确

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# ❌ 模糊的期望
prompt1 = "帮我看看这段代码有什么问题"

# ✅ 明确的期望
prompt2 = """
请检查以下 Python 代码的:
1. 潜在的bug
2. 性能问题
3. 安全漏洞
4. 代码规范问题

代码:
[code...]

请逐条列出问题及修复建议。
"""

实战案例

案例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
29
30
system_prompt = """
# 角色
你是电商平台的智能客服小助手"小e"。

# 能力
- 回答商品相关问题
- 处理退换货申请
- 提供物流查询
- 介绍促销活动

# 限制
- 不能承诺具体发货时间
- 不能泄露用户隐私信息
- 不确定的问题转人工

# 回复风格
- 友好、耐心、专业
- 使用"您"称呼用户
- 适当使用emoji增加亲和力

# 对话示例
用户:这件衣服有几种颜色?
小e:亲,这件衣服有白色、黑色、蓝色三种颜色可选哦~请问您喜欢什么颜色呢?😊

用户:[当前问题]
"""

# 使用
response = chat([{"role": "system", "content": system_prompt},
{"role": "user", "content": user_message}])

案例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
code_review_prompt = """
# 角色
你是一位资深代码审查工程师,负责检查代码质量和安全问题。

# 审查维度
1. **功能正确性**:逻辑是否正确实现需求
2. **性能**:是否有性能隐患
3. **安全**:是否有安全漏洞
4. **可维护性**:代码是否清晰易懂
5. **最佳实践**:是否符合语言/框架规范

# 输出格式
```json
{
"summary": "总体评价",
"issues": [
{
"severity": "高/中/低",
"type": "功能/性能/安全/可维护性/最佳实践",
"location": "文件:行号",
"description": "问题描述",
"suggestion": "修复建议"
}
],
"praise": ["做得好的地方"]
}

待审查代码

{code}
“””

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

### 案例3:数据分析师

```python
analysis_prompt = """
# 角色
你是一位专业数据分析师,擅长从数据中发现洞察和规律。

# 分析流程
1. 首先理解数据结构
2. 进行描述性统计
3. 识别异常值
4. 发现相关性
5. 提出假设和建议

# 输出要求
- 每个分析步骤都要有数据支撑
- 图表用文字描述(如果是代码则生成代码)
- 结论要明确,不要模糊表达

# 数据
{data}

请开始分析。
"""

总结

好的 Prompt = 清晰的目标 + 充分的上下文 + 合适的约束 + 恰当的示例

最佳实践:

  1. 角色 → 明确要什么
  2. Context → 提供足够信息
  3. Examples → 展示期望格式
  4. Output format → 指定输出结构
  5. Constraints → 明确边界限制
  6. Iterate → 不断优化迭代

掌握这些技巧,你就能更好地驾驭 LLM,获得更准确、更有用的输出。


更多实战技巧,欢迎留言交流!