Skip to content

Prompt Engineering 提示工程

五层读懂一个词。这次拆的是:Prompt Engineering--与 LLM 对话的系统方法论。不只是「写得好一点」,而是用 Few-shot(示例教学)、Chain-of-Thought(思维链)、Self-Consistency(多重验证)、角色 System Prompt(身份设定)等技巧,系统性地激发 LLM 的隐藏能力。一个 prompt 能差 30% 准确率——这不是玄学,是工程。


L1 · 一句话点破

Prompt Engineering = 设计 LLM 输入以最大化输出质量的系统工程。核心技巧:Few-shot(给示例教模型怎么做)、Chain-of-Thought(让模型一步步推理)、Self-Consistency(采多个答案投票)、System Prompt(设定角色和能力边界)、格式约束(强制结构化输出)。从「跟模型聊天」到「把模型当可编程推理引擎」——差一个 prompt 的距离。


L2 · 通俗类比

LLM 像一个极其聪明但「缺心眼」的实习生

  • 能力超强(能做推理、翻译、编程)
  • 但不会「读心」——你需要说清楚要什么
  • 也不会「自我纠正」——需要引导它检查
  • 更不会「主动问」——给了模糊指令就蒙

Prompt Engineering = 带实习生的一套方法论

1. Few-shot = 给示例

❌ "把这句话翻译成英文"
✅ "翻译成英文:
   Q: 今天天气很好 → A: The weather is great today.
   Q: 我喜欢编程 → A: I like programming.
   Q: 我们明天开会 → A:"

给了 2 个示例后,模型学会了你的翻译风格。

2. Chain-of-Thought = 要求写步骤

❌ "354 + 287 = ?"
✅ "354 + 287 = ?
   一步步算:
   354 + 200 = 554
   554 + 80 = 634
   634 + 7 = 641
   所以答案是 641"

模型被引导着算,比直接猜准确率高 30%+。

3. Self-Consistency = 多算几遍投票

同样的题跑 5 次 (temperature > 0)
  Run 1: 641
  Run 2: 641
  Run 3: 641
  Run 4: 642
  Run 5: 641
→ 投票: 641

4. System Prompt = 给角色

❌ "帮我写代码"
✅ System: "你是资深 Python 工程师,代码要加类型标注、docstring、错误处理"
User: "写一个快速排序"

核心洞察

LLM 推理分两步:理解意图 + 执行能力。Prompt Engineering 负责「理解意图」这一步——意图越清晰,执行越好。


L3 · 正经定义

Prompt Engineering:系统性设计和优化 LLM 输入(prompt)以提升输出质量的工程实践。包括:

  • Few-shot Prompting:在 prompt 中提供 k 个输入-输出示例
  • Chain-of-Thought (CoT):通过示例或指令引导模型分步推理
  • Self-Consistency:对同一问题采样多个答案,多数投票
  • Role Prompting:用 System Prompt 设定模型角色和能力边界
  • Format Constraints:约束模型输出格式(JSON/Markdown/代码块)
  • Prompt Templates:可复用的参数化 prompt 模板

参考资料


L4 · 原理深挖

4.1 Few-shot Prompting

核心:在 prompt 中提供 k 个 (输入, 输出) 示例,模型通过 in-context learning 学会模式。

为什么有效

  • 模型不需要梯度更新,从示例中「临时学会」格式和模式
  • 注意力机制从示例中提取 pattern(归纳头)
  • 示例纠正了模型的先验偏向

示例设计原则

✅ 格式一致: 所有示例用相同格式
✅ 覆盖边界: 包含简单和复杂 case
✅ 多样化: 示例覆盖不同输入类型
✅ 顺序重要: 典型 case 放最后(近因效应)
✅ 标注准确: 示例答案必须正确(错了反而误导)

k 的选择

k效果开销
0 (zero-shot)基线最小
1-3显著提升
4-8继续提升
8+收益递减

GPT-4 时代:zero-shot 已经很强,few-shot 对格式/风格约束仍有效。

4.2 Chain-of-Thought (CoT)

核心:引导模型在给出最终答案前,先输出推理步骤。

两种方式

1. Few-shot CoT:示例中包含推理链

Q: 小明有 5 个苹果,小红多 3 个,总共几个?
A: 小红有 5 + 3 = 8 个。总共 5 + 8 = 13 个。答案是 13。

Q: 一个长方形长 8 宽 5,周长是多少?
A: [让模型自己生成推理链]

2. Zero-shot CoT:加一句"Let's think step by step"

Q: 354 + 287 = ?
A: Let's think step by step.
   [模型自动输出推理链]

效果(数学推理 GSM8K):

方法GPT-3 175BPaLM 540B
Standard17.7%21.4%
CoT58.1%56.9%

CoT 为什么有效

  • 把复杂问题分解为子问题(问题分解)
  • 中间步骤出错可被后续步骤纠正(自我纠错)
  • 扩展了模型的计算深度(相当于多了几个 forward pass 的思考)

什么时候 CoT 最有效

  • ✅ 数学推理(多步计算)
  • ✅ 逻辑推理(三段论、组合问题)
  • ✅ 常识推理(需要多步推演)
  • ❌ 简单事实问答(单步即可,CoT 浪费)
  • ❌ 情感/创意任务(不需要逻辑链)

4.3 Self-Consistency

核心:对同一问题用 temperature > 0 采样 k 个 CoT 推理路径,多数投票选最终答案。

流程

同一问题 → CoT 推理 × k 次 (temperature > 0)
  Path 1: ... → 答案 A
  Path 2: ... → 答案 A
  Path 3: ... → 答案 B
  Path 4: ... → 答案 A
  Path 5: ... → 答案 A

多数投票: 答案 A (4/5)

为什么有效

  • 单次 CoT 可能因为采样随机性走错路
  • 多路径降低方差
  • 多数正确的路径 > 少数错误的路径

效果

方法GSM8K提升 vs CoT
CoT58%-
CoT + SC (k=5)72%+14%
CoT + SC (k=10)76%+18%
CoT + SC (k=40)78%+20%

k 的选择:5-10 性价比最高,k>20 收益递减。

4.4 Role Prompting (System Prompt 设计)

核心:用 System Prompt 设定模型的身份、能力、行为边界。

System Prompt 设计要素

你是 <角色>,职责是 <职责>。
你具备 <能力>。
你必须遵循 <规则>。
你的回答格式是 <格式>。
你绝对不能 <禁止行为>。

示例(数据分析助手):

System:
你是资深数据分析师。专长:Python、SQL、统计学。

规则:
1. 代码要有详细注释
2. 分析结论要有数据支撑
3. 不确定性要明确标注
4. 不要做没有数据支持的推测

格式:
- 分析思路: 段落说明
- 代码: ```python ... ```
- 结论: bullet points

绝对禁止:
- 编造不存在的数据
- 在不确定的问题上给出确定答案

System Prompt 的位置效应

  • 开头(Primacy):角色和核心规则最重要,放最前面
  • 结尾(Recency):最后一行指令权重高
  • 中间(Lost):容易被忽略

设计原则

✅ 角色明确、具体("资深 Python 后端工程师" > "程序员")
✅ 规则用否定句清晰表达禁止项
✅ 关键约束重复强调(开头+结尾各一遍)
✅ 正面示例 > 负面示例("你应该输出 JSON" > "不要输出纯文本")
❌ 规则太多(>10 条)模型可能忽略中间
❌ 自相矛盾的规则
❌ 放在中间位置不重要

4.5 格式约束

核心:控制 LLM 的输出格式。

方法 1: 自然语言约束

请用 JSON 格式输出:
{"name": "张三", "age": 30}

— 有效但不完美(格式错率 ~5-15%)。

方法 2: 结构化 Prompt(XML/JSON 标记)

<答案>
<名字>张三</名字>
<年龄>30</年龄>
</答案>

— 比自然语言好(格式错率 ~2-5%)。

方法 3: Function Calling / Structured Generation

python
response = llm.gen(json_schema={"name": str, "age": int})

— 100% 格式正确。

4.6 Prompt 模板与变量注入

模板化 Prompt

python
from langchain import PromptTemplate

template = PromptTemplate(
    template="""
    你是{role}
    
    参考文档:
    {context}
    
    问题:{question}
    
    回答要求:
    1. 基于参考文档
    2. 不确定时说不知道
    3. 用中文回答
    """,
    input_variables=["role", "context", "question"],
)

prompt = template.format(
    role="法律顾问",
    context=legal_docs,
    question="合同中第 5 条的违约责任是什么?",
)

变量注入顺序

  • Context 放最前(模型需要先理解)
  • Question 放最后(近因效应)
  • Role 放 system prompt(最高优先级)

4.7 Prompt 调试与 A/B 测试

Prompt 调试方法论

  1. 基线测试:先用最简单的 prompt 跑,记录结果
  2. 单变量修改:一次只改一个变量(如改 system prompt、加 few-shot)
  3. A/B 对比:旧 prompt vs 新 prompt,相同测试集跑分
  4. 边界测试:测试极限输入(超长文本、特殊字符、对抗性输入)
  5. 回归测试:改 prompt 后检查旧 case 是否退化

评估维度

  • 准确率(事实性任务)
  • 格式正确率(结构化输出)
  • 一致性(相同问题重复问)
  • 鲁棒性(输入微小变化是否稳定)
  • Token 效率(输出长度合理吗)

4.8 高级技巧

技巧 1: 思维树(Tree of Thoughts)

把 CoT 扩展为树,探索多条推理路径:

根问题
 ├─ 步骤1-A → 步骤2-A → 结论 A
 ├─ 步骤1-A → 步骤2-B → 结论 B
 ├─ 步骤1-B → 步骤2-C → 结论 C
 └─ 步骤1-C → 步骤2-D → 结论 D

选最优路径

技巧 2: ReAct Prompt

Thought: ... Action: ... Observation: ...
→ 多轮推理+工具调用

技巧 3: 链式提示(Prompt Chaining)

Prompt 1 → 输出 1 → Prompt 2(包含输出 1) → 输出 2 → ...

适合多阶段任务(大纲→撰写→润色→校对)。

技巧 4: 对比提示(Contrastive)

好的回答: [示例]  差的回答: [示例]  问题: [实际]

模型从对比中学习偏好。

技巧 5: 情绪提示(Emotion Prompt)

"这对我的职业生涯很重要" → 模型更认真(论文证实有效)

4.9 Prompt Engineering 的局限

局限 1: Prompt 不能突破模型能力上限。GPT-2 写不出 GPT-4 的质量,prompt 再好也没用。

局限 2: Prompt 的脆弱性。微小改动(加个空格、换个词)可能导致输出显著变化。

局限 3: 模型版本依赖。GPT-4 0806 的 prompt 在 GPT-4 1106 上未必有效——需要回归测试。

局限 4: 不保证一致性。temperature > 0 时相同 prompt 可能不同输出。

局限 5: Prompt 隐私泄漏。prompt 中可能包含敏感数据,注意 API 调用安全。

局限 6: Prompt Injection。用户输入中插入恶意指令绕过限制。需要防御。

局限 7: 长 Prompt 的 token 成本。复杂 prompt 消耗大量 token(system prompt 500+ token 常见)。

局限 8: 不能替代训练。prompt 是「临时记忆」,训练是「长期记忆」。关键能力需要训练。


L5 · 沿革与坑

5.1 沿革

  • 2020-05:GPT-3 论文(Brown et al.),揭示 in-context learning / few-shot
  • 2022-01:Chain-of-Thought(Wei et al.),CoT 革命
  • 2022-05:Zero-shot CoT(Kojima et al.),"Let's think step by step"
  • 2023-03:Self-Consistency(Wang et al.),多路径投票
  • 2023-05:Tree of Thoughts(Yao et al.),思维树
  • 2023-10:ReAct Prompt(Yao et al.),推理+行动
  • 2024:Automatic Prompt Optimization(APO/DSPy),自动化 prompt 优化
  • 2024-2025:System Prompt 设计成为工程标配,Prompt Libraries 兴起

5.2 常见坑

坑 1: few-shot 示例答案错了。模型学到错误模式。要验证每个示例的正确性。

坑 2: 以为 CoT 对所有任务都有用。简单问题 CoT 浪费 token。按任务类型判断。

坑 3: temperature=0 时 Self-Consistency 无意义。多样性来源是 temperature > 0。

坑 4: System Prompt 关键规则放中间。被 Lost in the Middle。要放开头/结尾。

坑 5: prompt 太依赖具体模型版本。GPT-4 6 月的 prompt 12 月可能退化。要持续验证。

坑 6: prompt 缺乏版本管理。改了 prompt 没记录,出问题无法回滚。要 git 管理 prompt。

坑 7: 忽视 token 成本。500 token 的 system prompt + few-shot + CoT,成本是简单 prompt 的 10x。要评估 ROI。

坑 8: Prompt Injection 无防御。用户输入中的指令覆盖 system prompt。要做输入清洗和结构分离。

坑 9: 盲信 prompt engineering 解决一切。prompt 是界面优化,模型本身的能力是上限。

坑 10: 不做 A/B 测试。凭感觉改 prompt,不知道是否真的变好了。要量化评估。

坑 11: 忽略输出长度和质量的关系。CoT 引导模型输出更多 token,但不一定更好。中间 token 可能是废话。

坑 12: 把 prompt 当代码对待。prompt 不是代码,微小变化可能有巨大影响(emergent behavior)。修改要谨慎。

5.3 面试怎么考

  1. Few-shot vs Zero-shot? 答:Few-shot 在 prompt 里放示例,通过 in-context learning 教模型格式/模式;Zero-shot 不放,靠模型自身能力。复杂格式/小众任务 few-shot 效果好。
  2. CoT 为什么有效? 答:分解复杂问题为子问题、增加推理步数(相当于更多计算)、中间错误可被纠正。数学/逻辑推理提升最大。
  3. Self-Consistency 怎么提升效果的? 答:单次 CoT 可能被采样随机性影响走错路。多次采样投票降低方差,多数正确路径胜出。
  4. System Prompt 怎么设计? 答:角色+职责+规则+格式+禁止。关键规则放开头/结尾(避开 Lost in the Middle)。规则具体、可验证。
  5. 怎么评估一个 prompt 好不好? 答:A/B 测试(旧 vs 新、相同测试集)、准确率/格式正确率/一致性/Robustness/Token 效率。持续监控。

速记卡

核心技巧

技巧方法提升
Few-shotk 个示例+10-20%
CoT分步推理+20-40%
Self-Consistencyk 次采样投票+10-20%
System Prompt角色设定+5-15%
Format ConstraintJSON/XMl/Func Call格式 100%

System Prompt 设计模板

你是 <角色> | 职责: <职责> | 规则: <规则> | 格式: <格式> | 禁止: <禁止>

CoT vs Standard

任务StandardCoT
GSM8K 数学18%58%
逻辑推理35%65%
事实问答72%72%(不变)

Self-Consistency 效果

kGSM8K提升
1 (CoT)58%-
572%+14%
1076%+18%
4078%+20%

Prompt 调试流程

基线 → 单变量修改 → A/B 测试 → 边界测试 → 回归测试 → 部署监控

一句话记忆:Prompt Engineering = 系统性地设计 LLM 输入以最大化输出质量。Few-shot(示例教学)+ CoT(分步推理)+ Self-Consistency(多路径投票)+ System Prompt(角色设定)+ Format Constraints(结构化输出)是五大核心技巧。CoT 对数学/推理提升 20-40%,SC 叠加再提 10-20%。局限:不突破模型能力上限、prompt 脆弱性、版本依赖、Injection 攻击。本质是把模型当可编程推理引擎而非黑盒聊天机器人。评估靠 A/B 测试,管理靠版本控制,优化靠量化指标。


上一篇:SGLang -- 推理引擎的选择,Prompt Engineering 决定了你能从引擎中榨出多少能力。下一篇:HuggingFace 生态 -- 从模型到部署的完整开源生态。

内容采用 CC BY-SA 4.0,代码采用 MIT。