Appearance
章节2:Prompt工程体系
学习目标
- 掌握提示词设计的三大核心原则(清晰 / 具体 / 可执行)
- 理解少样本学习(Few-Shot)与思维链(Chain-of-Thought)的原理与用法
- 学会使用 System Prompt 和结构化输出(JSON格式)
- 了解自我一致性(Self-Consistency)与思维树(ToT)高级策略
- 掌握 Prompt 调试优化方法论(A/B 测试 / 迭代优化)
核心知识点
2.1 提示词设计原则
定义
高质量 Prompt 的三大黄金原则:
| 原则 | 说明 | ❌ 反例 | ✅ 正例 |
|---|---|---|---|
| 清晰(Clear) | 无歧义,明确任务 | "帮我写点东西" | "写一篇300字的产品介绍文案" |
| 具体(Specific) | 给出约束条件 | "分析这篇文章" | "分析这篇文章的论证结构,指出3个逻辑漏洞" |
| 可执行(Actionable) | 给出明确的输出指令 | "关于AI你说说" | "用表格对比CNN和Transformer的架构差异" |
代码示例:Prompt 质量对比
python
from openai import OpenAI
client = OpenAI()
def ask_with_prompt(prompt_text):
"""通用问答函数,用于对比不同Prompt效果"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt_text}]
)
return response.choices[0].message.content
# ❌ 模糊 Prompt
vague_prompt = "帮我优化这段代码:"
# ✅ 清晰 Prompt
clear_prompt = """
请帮我优化以下Python代码,要求:
1. 提高执行效率(时间复杂度从O(n²)降到O(n log n)以下)
2. 增加类型注解
3. 添加异常处理
4. 用中英文双语注释
代码:
def find_dup(arr):
res = []
for i in range(len(arr)):
for j in range(i+1, len(arr)):
if arr[i] == arr[j] and arr[i] not in res:
res.append(arr[i])
return res
"""
print("===== 清晰 Prompt 的效果 =====")
print(ask_with_prompt(clear_prompt))2.2 少样本学习与思维链 CoT
定义
Few-Shot(少样本学习):在 Prompt 中提供若干个输入-输出示例,引导模型理解任务模式。
Chain-of-Thought(思维链,CoT):引导模型逐步推理,显式输出中间思考步骤,显著提升复杂推理任务的准确性。
代码示例:Few-Shot
python
# Zero-Shot(零样本)
zero_shot_prompt = "将以下句子翻译为英文:今天天气真好"
# Few-Shot(少样本)
few_shot_prompt = """
请将以下中文句子翻译为英文。
示例1:
中文:这本书非常有趣
英文:This book is very interesting.
示例2:
中文:她是一位优秀的工程师
英文:She is an excellent engineer.
现在请翻译:
中文:今天天气真好
英文:
"""
# 可以看到 Few-Shot 对输出格式有更强的约束效果代码示例:Chain-of-Thought
python
# ❌ 直接提问(无 CoT)
direct_prompt = """
Roger 有 5 个网球。他又买了 2 罐网球,每罐有 3 个。
他现在有多少个网球?
"""
# ✅ 思维链提示(CoT)
cot_prompt = """
Roger 有 5 个网球。他又买了 2 罐网球,每罐有 3 个。
他现在有多少个网球?
让我们一步一步思考:
1. Roger 最初有 5 个网球。
2. 他买了 2 罐网球,每罐有 3 个。
3. 所以他又买了 2 × 3 = 6 个网球。
4. 他现在总共有 5 + 6 = 11 个网球。
因此答案是:11
"""
# CoT 在数学推理任务上通常比直接提问准确率高 20-40%python
# 自动思维链 Auto-CoT:让模型自己生成推理步骤
auto_cot_prompt = """
一个水池有一个进水管和一个出水管。单开进水管6小时可以注满水,单开出水管8小时可以排空水。如果两个管子同时打开,多少小时可以注满水池?
请逐步推理,最后给出答案。
"""2.3 角色设定与结构化输出
定义
System Prompt(系统提示):设置在对话开始时,定义 AI 的角色、行为准则和输出约束,贯穿整个对话。
结构化输出:要求模型以特定格式(JSON、Markdown、表格等)返回结果,便于程序化处理。
代码示例:System Prompt 与 JSON 输出
python
from openai import OpenAI
client = OpenAI()
# 带 System Prompt 的结构化输出
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "system",
"content": """你是一个专业的数据分析师助手。你的回答必须:
1. 严格使用JSON格式输出
2. 包含reasoning(推理过程)和result(最终结论)两个字段
3. 数值保留2位小数
4. 语气专业、客观"""
},
{
"role": "user",
"content": "分析以下销售数据:1月100万,2月120万,3月90万,4月150万。给出趋势判断。"
}
],
response_format={"type": "json_object"} # OpenAI 原生 JSON 模式
)
import json
data = json.loads(response.choices[0].message.content)
print(json.dumps(data, indent=2, ensure_ascii=False))更多结构化输出示例
python
# 表格输出
table_prompt = """
请以Markdown表格形式对比以下三个Python Web框架:Flask、FastAPI、Django。
对比维度:性能、学习曲线、社区生态、适用项目类型。
"""
# JSON 列表输出
json_prompt = """
列出5个常用的机器学习评估指标,以JSON数组格式输出,每个元素包含:
{
"name": "指标名称",
"category": "分类(回归/分类/聚类)",
"formula": "计算公式",
"best_value": "最优值"
}
"""2.4 自我一致性与思维树 ToT
定义
Self-Consistency(自我一致性):对同一个问题多次采样生成多个推理路径,取出现频率最高的答案。相比单次 CoT,准确率可提升 10-20%。
Tree of Thoughts(思维树,ToT):将推理过程建模为树状搜索——在每一步生成多个可能的思维分支,评估各分支的可行性,剪枝后继续探索。
代码示例:模拟 Self-Consistency
python
import re
from openai import OpenAI
client = OpenAI()
def self_consistency_answer(prompt, n_samples=5):
"""
自我一致性:多次采样取多数答案
"""
answers = []
for i in range(n_samples):
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt + "\n请逐步推理,最后在【答案】后给出最终结果。"}],
temperature=0.7 # 较高温度增加多样性
)
text = resp.choices[0].message.content
# 提取答案
match = re.search(r'【答案】[::]\s*(\d+)', text)
if match:
answers.append(match.group(1))
print(f"采样 {i+1}: {match.group(1) if match else '未提取到答案'}")
# 选择出现次数最多的答案
from collections import Counter
final_answer = Counter(answers).most_common(1)[0][0]
print(f"\n最终一致答案: {final_answer}")
return final_answer
# 使用示例(需要API密钥)
# self_consistency_answer("小明比小红大3岁,小红比小刚大2岁,三人年龄之和是41岁,小明多少岁?")2.5 Prompt 调试优化方法论
定义
系统化的 Prompt 优化流程:定义指标 → 建立基线 → 迭代实验 → 验证效果。
| 步骤 | 方法 | 工具 |
|---|---|---|
| 建立基线 | 用初始 Prompt 跑 N 个测试用例 | 手动构造测试集 |
| A/B 测试 | 同时测试两个 Prompt 变体 | 对比输出质量 |
| 迭代优化 | 基于失败分析调整措辞/结构 | Prompt 版本管理 |
| 自动化评估 | 用 LLM 做为评估器打分 | GPT-4 as Judge |
代码示例:A/B 测试框架
python
import json
from openai import OpenAI
client = OpenAI()
# 两个 Prompt 版本
PROMPT_A = "给这个产品起个名字:一款专注效率的AI笔记应用"
PROMPT_B = """
你是一个品牌命名专家。请为一个产品起名。
产品定位:AI笔记应用
核心卖点:极致效率、智能分类、语音输入
目标用户:职场人士、知识工作者
输出要求:提供5个候选名字,每个附带寓意解释(20字以内)
"""
def ab_test(prompt_a, prompt_b, test_cases, evaluator_prompt):
"""
简单 A/B 测试框架
"""
for case in test_cases:
resp_a = client.chat.completions.create(
model="gpt-4o", messages=[{"role": "user", "content": prompt_a + "\n" + case}]
)
resp_b = client.chat.completions.create(
model="gpt-4o", messages=[{"role": "user", "content": prompt_b + "\n" + case}]
)
print(f"\n===== 测试用例: {case} =====")
print(f"[版本A] {resp_a.choices[0].message.content[:200]}")
print(f"[版本B] {resp_b.choices[0].message.content[:200]}")
# 用 LLM 评估
eval_resp = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": evaluator_prompt},
{"role": "user", "content": f"版本A的输出:\n{resp_a.choices[0].message.content}\n\n版本B的输出:\n{resp_b.choices[0].message.content}"}
]
)
print(f"[评估] {eval_resp.choices[0].message.content}")
# evaluator_prompt = "你是一个Prompt质量评估专家。请从完整性、可执行性、输出质量三个维度评分(1-10分),并说明哪个版本更好。"
# ab_test(PROMPT_A, PROMPT_B, ["我的AI笔记应用", "QuickMind"], evaluator_prompt)小结与练习
小结
- 好的 Prompt = 清晰 + 具体 + 可执行,三个原则缺一不可
- Few-Shot 通过示例约束输出格式,CoT 通过逐步推理提升复杂任务准确率
- System Prompt 设定角色和行为准则,结构化输出便于程序化消费
- Self-Consistency 和 ToT 是提升推理准确率的高级策略
- Prompt 优化需要系统化方法:基线 → A/B 测试 → 迭代 → 评估
练习题
- 基础题:编写一个 System Prompt,让模型扮演"Python面试官",要求输出格式为 Markdown,包含问题、提示、参考答案。
- 实践题:使用 CoT 提示解决一道中学物理题(如"一个物体从20米高处自由落体,忽略空气阻力,求落地速度"),并对比有 CoT 和无 CoT 的输出差异。
- 分析题:选取 ChatGPT 的一次失败回答,分析失败原因并提出 Prompt 改进方案。
- 拓展题:实现一个简单的 Self-Consistency 函数,对同一个 Prompt 采样 5 次,输出多数投票结果,并比较单次 CoT 与 Self-Consistency 的准确率差异。