Prompt Engineering 实战指南

好的 Prompt = 角色 + 背景 + 约束 + 示例 + 输出格式。
不是玄学,是工程。

🧠 什么是 Prompt Engineering

LLM 的本质是"续写机器"——给定前文,预测下一个 Token。Prompt 决定了 LLM "从哪里开始想",因此直接决定了输出的方向、质量、风格。

核心认知:你不是在"命令"LLM,你是在给它设定一个"思考的起点"。起点不同,续写方向完全不同。

五要素总览

🎭
Role 角色
你是谁?
→ 激活特定知识领域
📋
Context 上下文
背景是什么?
→ 限定信息范围
🚫
Constraint 约束
不能做什么?
→ 排除错误输出
📝
Example 示例
怎么做?
→ 示范期望的模式
📐
Schema 格式
输出长什么样?
→ 控制格式和结构

🎭 Role(角色)—— 激活专业领域

LLM 在训练时见过各种领域的文本。不指定角色 → 在所有知识区域取平均 → 泛泛而谈。设定角色 → 戴上专业眼镜 → 精准输出。

❌ 模糊角色✅ 精确角色
"你是一个专家""你是资深 MySQL DBA,10 年 OLAP 优化经验,精通索引诊断和慢查询优化"
"你是一个程序员""你是 Go 后端开发,专做高并发微服务,熟悉 K8s 和 gRPC"
"你是老师""你是幼儿园老师,用最简单的话、比喻和故事解释,每句话不超过 20 字"

💡 原则:角色 = 身份 + 技能标签 + 经验年限。越具体,LLM 输出越专业。

📋 Context(上下文)—— 限定信息范围

LLM 不知道你是谁、在做什么项目、有什么数据。不给 Context,它只能猜。猜错的代价 = 输出完全不可用。

环境层
数据库版本、语言、框架
数据层
表名、字段、数据量级
目标层
你要达成什么、给谁用

🚫 Constraint(约束)—— 排除错误输出

Constraint 是"排除你不想要的"。告诉 LLM"不能做什么"和告诉它"要做什么"同等重要。

❌ 只说"要什么"
写一个高效的查询
✅ 同时说"不要什么"
写一个能走索引的查询
不要用 SELECT *
子查询不超过 2 层
禁止全表扫描

📝 Example(示例)—— 最被低估的要素

LLM 擅长模式匹配。一个例子比 100 行描述更有效。这叫 In-Context Learning——不修改模型参数,仅靠 Prompt 中的例子改变行为。

Zero-shot只给指令 → LLM 自由发挥 → 质量无法控制
Few-shot给 1-3 个例子 → LLM 模仿注释风格/缩进/命名 → 质量稳定可控

📐 Output Schema(输出格式)—— 控制结构

即使输出质量高,格式不对也无法直接用。Schema 精确控制输出结构。

方式适用场景示例
描述式简单任务"- 需求理解:\n- SQL:\n- 索引建议:"
JSON Schema需程序解析{"sql": "...", "index": "...", "explain": "..."}
Markdown 模板给人看的文档## 需求\n## SQL\n## 关键逻辑\n## 注意事项

📋 通用 Prompt 模板

你是 {角色},{经验},擅长 {技能标签}。

## 上下文
- 项目类型:{描述}
- 技术栈:{语言/框架/版本}
- 数据/代码结构:{关键信息}

## 要求
1. {约束1}
2. {约束2}
3. {约束3}

## 参考示例
{一个好的输出示例}

## 输出格式
{结构要求}

🧠 记忆口诀

Role   Context   Constraint   Example   Schema

Role → Context → Constraint → Example → Schema

"Ricky's CES" — 里克的质量检验

🔬 「帮我写一个SQL」—— 4版进化

V1 · 裸提示词

Prompt:"帮我写一个SQL"

无要素

LLM 完全在猜。输出 = 追问需求 + 无意义的通用 SELECT。不可用。

用真实表名
SQL 可直接运行
有索引建议
输出结构固定

V2 · +Role

+ "你是资深数据仓库工程师,精通SQL"

Role

给出数据仓库风格 SQL(CTE + 维度表),但表名是猜的。

用真实表名
SQL 可直接运行
有索引建议
输出结构固定

V3 · +Context+Constraint

+ "MySQL 8.0,表 orders_dw,字段..."

RoleContextConstraint

质变!真实表名 + 索引建议 + 性能解释。基本可用。

用真实表名
SQL 可直接运行
有索引建议
输出结构固定

V4 · +Example+Schema

+ 参考示例 + 输出格式要求

RoleContextConstraintExampleSchema

专业级!结构严整、代码注释、逻辑分层。可直接贴生产环境。

SQL 可直接运行
索引建议
输出结构固定
代码有注释
生产就绪

V1 输出:裸提示词

你提供的需求太简略...需要补充:
1. 要执行什么操作?
2. 涉及哪些表?
3. 具体的业务逻辑是什么?
这里给你一个通用示例:
SELECT id, username FROM users WHERE age > 18;

诊断:LLM 完全不知道你要什么。不可用。

V3 输出:+Role +Context +Constraint(质变)

SELECT customer_id, SUM(amount) AS total_amount
FROM orders_dw
WHERE order_date >= CURDATE() - INTERVAL 90 DAY
GROUP BY customer_id
ORDER BY total_amount DESC;

索引建议:(order_date, customer_id, amount) 复合索引
原因:索引第一列 order_date 快速定位,第二列完成分组,
      第三列覆盖查询避免回表。

用了真实表名和字段!有索引建议!可直接使用!

V4 输出:+Example +Schema(生产级)

### 需求理解
统计最近一年每月已完成订单销售额Top 10

### SQL
SELECT month, total_amount, rnk FROM (
    SELECT DATE_FORMAT(order_date, '%Y-%m') AS month,
           SUM(amount) AS total_amount,
           ROW_NUMBER() OVER (ORDER BY SUM(amount) DESC) AS rnk
    FROM orders_dw
    WHERE order_date >= DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR)
      AND status = 'completed'
    GROUP BY DATE_FORMAT(order_date, '%Y-%m')
) t WHERE rnk <= 10 ORDER BY month;

### 思路说明
1. 筛选最近一年已完成订单
2. 按年月分组汇总销售额
3. 窗口函数排名取前10
4. 外层按月份排序输出

### 索引建议
(order_date, status) 复合索引

结构严整、注释清晰、逻辑分层。生产就绪。

📊 V1→V4 效果对比表

维度V1V2V3V4
用真实表名
SQL 可直接运行
有索引建议
逻辑分层解释简要✓ 清晰
输出结构固定
代码有注释
风格一致性一般✓ 优秀
生产就绪基本✓ 完全

🎯 核心发现

Role

决定输出方向。没角色 = 通用回答。
有角色 = 领域专属。

Context + Constraint

质变的关键组合!真实表名 + 明确约束 = 可直接使用的输出。

Example + Schema

从"可用"到"专业"的最后一步。控制风格一致性和结构稳定性。

✏️ 10 道渐进式练习题

覆盖 Role、Context、Constraint、Example、Output Schema 的完整训练。
建议用 llm_playground.py 的实验4来完成。

练习 1:Role 的威力 —— 同一个问题,四个角色

🎭 Role难度:★

用 4 种角色分别问"什么是数据库死锁",比较输出差异。角色:无角色 / 幼儿园老师 / 资深 DBA / 产品经理。

练习 2:Context 的精确度 —— 从模糊到清晰

📋 Context难度:★★

3 个版本逐步添加 Context,写一个查询报表 SQL。从"无上下文"到"完整表结构+业务需求"。

练习 3:Constraint 的取舍 —— 当需求冲突时

🚫 Constraint难度:★★★

设计冲突约束:"逐行详细的 Code Review"+"总输出不超过200字"。测试 3 种写法,观察 LLM 如何处理冲突。

练习 4:Example 的魔力 —— 1个例子 vs 0个例子

📝 Example难度:★★

让 LLM 生成 Git Commit Message。对比 Zero-shot / One-shot / Three-shot 的格式一致性和动词选择。

练习 5:Output Schema —— 自由格式 vs 结构化

📐 Schema难度:★★

从需求描述提取"数据仓库表设计"。对比无 Schema / JSON Schema / Markdown 表格 三种输出。

练习 6:诊断差 Prompt —— 找出问题并优化

🔍 诊断难度:★★★

给定一个充满问题的 Prompt,逐一诊断并改写。训练"看出哪里不对"的能力。

练习 7:渐进式 Prompt 设计 —— 一个需求的 4 次迭代

🏗️ 综合难度:★★★★

需求:用 Python 从 Hive 导出数据到 CSV。设计 V1→V4 四个 Prompt,逐步加要素,记录每版输出变化。

练习 8:跨领域 Prompt —— SQL 到 Python 到文档

🔄 迁移难度:★★★

同一需求场景(计算复购率),分别设计 SQL / Python / 文档 三个 Prompt。共用 Context,定制 Role/Constraint。

练习 9:复杂约束 —— 数据安全场景

🔒 安全难度:★★★★

设计数据库迁移 Prompt。5 条安全约束:回滚脚本、不锁表超 5 秒、幂等检查、NOT NULL、备份命令。

练习 10:组合实战 —— 设计「DWH 助手」System Prompt

🏆 终极难度:★★★★★

综合运用五要素设计生产级 System Prompt。测试:建表 / 慢查询诊断 / 危险操作拒绝。自评五维标准。

✅ 完成清单