Skip to content

章节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 测试 → 迭代 → 评估

练习题

  1. 基础题:编写一个 System Prompt,让模型扮演"Python面试官",要求输出格式为 Markdown,包含问题、提示、参考答案。
  2. 实践题:使用 CoT 提示解决一道中学物理题(如"一个物体从20米高处自由落体,忽略空气阻力,求落地速度"),并对比有 CoT 和无 CoT 的输出差异。
  3. 分析题:选取 ChatGPT 的一次失败回答,分析失败原因并提出 Prompt 改进方案。
  4. 拓展题:实现一个简单的 Self-Consistency 函数,对同一个 Prompt 采样 5 次,输出多数投票结果,并比较单次 CoT 与 Self-Consistency 的准确率差异。

Python 学习资料