好的 Prompt = 角色 + 背景 + 约束 + 示例 + 输出格式。
不是玄学,是工程。
LLM 的本质是"续写机器"——给定前文,预测下一个 Token。Prompt 决定了 LLM "从哪里开始想",因此直接决定了输出的方向、质量、风格。
核心认知:你不是在"命令"LLM,你是在给它设定一个"思考的起点"。起点不同,续写方向完全不同。
LLM 在训练时见过各种领域的文本。不指定角色 → 在所有知识区域取平均 → 泛泛而谈。设定角色 → 戴上专业眼镜 → 精准输出。
| ❌ 模糊角色 | ✅ 精确角色 |
|---|---|
| "你是一个专家" | "你是资深 MySQL DBA,10 年 OLAP 优化经验,精通索引诊断和慢查询优化" |
| "你是一个程序员" | "你是 Go 后端开发,专做高并发微服务,熟悉 K8s 和 gRPC" |
| "你是老师" | "你是幼儿园老师,用最简单的话、比喻和故事解释,每句话不超过 20 字" |
💡 原则:角色 = 身份 + 技能标签 + 经验年限。越具体,LLM 输出越专业。
LLM 不知道你是谁、在做什么项目、有什么数据。不给 Context,它只能猜。猜错的代价 = 输出完全不可用。
Constraint 是"排除你不想要的"。告诉 LLM"不能做什么"和告诉它"要做什么"同等重要。
写一个高效的查询
写一个能走索引的查询
不要用 SELECT *
子查询不超过 2 层
禁止全表扫描
LLM 擅长模式匹配。一个例子比 100 行描述更有效。这叫 In-Context Learning——不修改模型参数,仅靠 Prompt 中的例子改变行为。
| Zero-shot | 只给指令 → LLM 自由发挥 → 质量无法控制 |
|---|---|
| Few-shot | 给 1-3 个例子 → LLM 模仿注释风格/缩进/命名 → 质量稳定可控 |
即使输出质量高,格式不对也无法直接用。Schema 精确控制输出结构。
| 方式 | 适用场景 | 示例 |
|---|---|---|
| 描述式 | 简单任务 | "- 需求理解:\n- SQL:\n- 索引建议:" |
| JSON Schema | 需程序解析 | {"sql": "...", "index": "...", "explain": "..."} |
| Markdown 模板 | 给人看的文档 | ## 需求\n## SQL\n## 关键逻辑\n## 注意事项 |
你是 {角色},{经验},擅长 {技能标签}。
## 上下文
- 项目类型:{描述}
- 技术栈:{语言/框架/版本}
- 数据/代码结构:{关键信息}
## 要求
1. {约束1}
2. {约束2}
3. {约束3}
## 参考示例
{一个好的输出示例}
## 输出格式
{结构要求}
Role Context Constraint Example Schema
Role → Context → Constraint → Example → Schema
"Ricky's CES" — 里克的质量检验
Prompt:"帮我写一个SQL"
LLM 完全在猜。输出 = 追问需求 + 无意义的通用 SELECT。不可用。
✗ 用真实表名
✗ SQL 可直接运行
✗ 有索引建议
✗ 输出结构固定
+ "你是资深数据仓库工程师,精通SQL"
给出数据仓库风格 SQL(CTE + 维度表),但表名是猜的。
✗ 用真实表名
✗ SQL 可直接运行
✗ 有索引建议
✗ 输出结构固定
+ "MySQL 8.0,表 orders_dw,字段..."
质变!真实表名 + 索引建议 + 性能解释。基本可用。
✓ 用真实表名
✓ SQL 可直接运行
✓ 有索引建议
✗ 输出结构固定
+ 参考示例 + 输出格式要求
专业级!结构严整、代码注释、逻辑分层。可直接贴生产环境。
✓ SQL 可直接运行
✓ 索引建议
✓ 输出结构固定
✓ 代码有注释
✓ 生产就绪
你提供的需求太简略...需要补充:
1. 要执行什么操作?
2. 涉及哪些表?
3. 具体的业务逻辑是什么?
这里给你一个通用示例:
SELECT id, username FROM users WHERE age > 18;
诊断:LLM 完全不知道你要什么。不可用。
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 快速定位,第二列完成分组,
第三列覆盖查询避免回表。
用了真实表名和字段!有索引建议!可直接使用!
### 需求理解
统计最近一年每月已完成订单销售额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 | V2 | V3 | V4 |
|---|---|---|---|---|
| 用真实表名 | ✗ | ✗ | ✓ | ✓ |
| SQL 可直接运行 | ✗ | ✗ | ✓ | ✓ |
| 有索引建议 | ✗ | ✗ | ✓ | ✓ |
| 逻辑分层解释 | ✗ | ✗ | 简要 | ✓ 清晰 |
| 输出结构固定 | ✗ | ✗ | ✗ | ✓ |
| 代码有注释 | ✗ | ✗ | ✗ | ✓ |
| 风格一致性 | ✗ | ✗ | 一般 | ✓ 优秀 |
| 生产就绪 | ✗ | ✗ | 基本 | ✓ 完全 |
决定输出方向。没角色 = 通用回答。
有角色 = 领域专属。
质变的关键组合!真实表名 + 明确约束 = 可直接使用的输出。
从"可用"到"专业"的最后一步。控制风格一致性和结构稳定性。
覆盖 Role、Context、Constraint、Example、Output Schema 的完整训练。
建议用 llm_playground.py 的实验4来完成。
用 4 种角色分别问"什么是数据库死锁",比较输出差异。角色:无角色 / 幼儿园老师 / 资深 DBA / 产品经理。
3 个版本逐步添加 Context,写一个查询报表 SQL。从"无上下文"到"完整表结构+业务需求"。
设计冲突约束:"逐行详细的 Code Review"+"总输出不超过200字"。测试 3 种写法,观察 LLM 如何处理冲突。
让 LLM 生成 Git Commit Message。对比 Zero-shot / One-shot / Three-shot 的格式一致性和动词选择。
从需求描述提取"数据仓库表设计"。对比无 Schema / JSON Schema / Markdown 表格 三种输出。
给定一个充满问题的 Prompt,逐一诊断并改写。训练"看出哪里不对"的能力。
需求:用 Python 从 Hive 导出数据到 CSV。设计 V1→V4 四个 Prompt,逐步加要素,记录每版输出变化。
同一需求场景(计算复购率),分别设计 SQL / Python / 文档 三个 Prompt。共用 Context,定制 Role/Constraint。
设计数据库迁移 Prompt。5 条安全约束:回滚脚本、不锁表超 5 秒、幂等检查、NOT NULL、备份命令。
综合运用五要素设计生产级 System Prompt。测试:建表 / 慢查询诊断 / 危险操作拒绝。自评五维标准。