Prompt Engineering 实战手册:5 种让大模型输出稳定可控的提示词模式
Prompt Engineering 实战手册:5 种让大模型输出稳定可控的提示词模式

前言
用了半年大模型之后,我发现一个真相:大模型不是不聪明,是我们不会提问。
同样的需求,换一种提示词写法,输出质量能差三个档次。今天把我日常用得最多的 5 种提示词模式整理出来,每一种都附带完整示例和对比效果。
Token 说他也想学,但他只是一只狗。
一、为什么提示词这么重要
1.1 一个对比
同样让 GPT 写一段产品介绍:
普通提示词:
帮我写一段产品介绍
输出:我们的产品是一款创新的解决方案,致力于为用户提供优质的服务和体验...(一堆废话)
精心设计的提示词:
你是一个资深的科技产品文案专家。请为一款 AI 笔记工具写 80 字以内的产品介绍。要求:第一句点明核心价值,第二句讲差异化优势,第三句给出行动号召。语气克制,不要感叹号。
输出:用 AI 帮你把散乱的想法整理成结构化笔记。支持语音输入,自动生成思维导图和待办清单。打开浏览器就能用,不用下载任何东西。
差距一目了然。
1.2 提示词的本质
graph LR
A["模糊的需求"] -->|普通提示词| B["模糊的输出 ❌"]
A -->|结构化提示词| C["精准的输出 ✅"]
D["提示词 = 需求规格说明书"]
style C fill:#10b981,color:#fff
style B fill:#ef4444,color:#fff
提示词本质上就是写给 AI 的需求文档。你的"需求文档"写得越清晰,AI 的"交付物"质量越高。
二、模式一:角色设定法 (Role Prompting)
2.1 原理
给 AI 一个明确的身份。身份越具体,输出越专业。
2.2 模板
# 角色设定法模板
角色设定模板 = """
你是一位{具体身份},拥有{年限}年{领域}经验。
你的风格是{风格描述}。
你的受众是{目标读者}。
请根据以下要求完成任务:
{具体任务}
"""
# 实际示例
prompt = """
你是一位有 10 年经验的后端架构师,擅长分布式系统设计。
你的风格是:用大白话讲复杂原理,喜欢用生活中的比喻。
你的受众是:工作 1-3 年的初中级开发者。
请解释什么是"分布式事务的两阶段提交",字数控制在 200 字以内。
"""
2.3 效果对比
| 提示词 | 输出质量 |
|---|---|
| "解释两阶段提交" | 学术论文风格,初学者看不懂 |
| 加上角色设定 | 大白话 + 比喻,通俗易懂 |
💡 经验:角色描述里加上"风格"和"受众"这两个约束条件,效果会好很多。因为 AI 会根据受众水平自动调整表达的复杂度。
三、模式二:少样本示范法 (Few-Shot Prompting)
3.1 原理
别光说"我要什么",直接给几个"长这样"的例子。AI 会自动学会你的格式和风格。
3.2 模板
# 少样本示范法模板
少样本模板 = """
请按照以下格式生成内容:
【示例 1】
输入:{示例输入1}
输出:{示例输出1}
【示例 2】
输入:{示例输入2}
输出:{示例输出2}
现在请处理:
输入:{实际输入}
输出:
"""
# 实际示例:生成 Git Commit Message
prompt = """
请按照以下格式为代码变更生成 Commit Message:
【示例 1】
变更:在用户注册接口添加了手机号格式校验
输出:feat(auth): 添加用户注册手机号格式校验
【示例 2】
变更:修复了订单列表分页查询在第二页返回空数据的问题
输出:fix(order): 修复订单列表第二页分页查询返回空数据
【示例 3】
变更:将 Redis 连接池最大连接数从 10 调整为 50
输出:perf(cache): 调整 Redis 连接池最大连接数至 50
现在请处理:
变更:在商品搜索接口增加了按价格区间筛选的功能
输出:
"""
# AI 输出:feat(product): 商品搜索接口增加价格区间筛选功能
3.3 关键技巧
⚠️ 示例的数量和质量都很重要:
- 2-3 个示例通常够用。超过 5 个反而会浪费 Token
- 示例要覆盖不同的情况(正常、边界、异常)
- 示例的输出格式必须完全统一
四、模式三:思维链法 (Chain-of-Thought)
4.1 原理
让 AI 先"想一想"再给答案。就像让学生做数学题时"写出解题过程"一样。
4.2 模板
# 思维链法模板
思维链模板 = """
{你的问题}
请按以下步骤思考:
1. 首先分析{分析维度1}
2. 然后考虑{分析维度2}
3. 最后综合以上分析给出结论
请先展示你的思考过程,再给出最终答案。
"""
# 实际示例:技术选型决策
prompt = """
我需要为一个日活 10 万的社交应用选择消息推送方案。
候选方案:WebSocket、SSE、轮询。
请按以下步骤分析:
1. 首先分析每种方案的技术特点和适用场景
2. 然后结合"日活 10 万"这个规模评估资源消耗
3. 接着考虑开发复杂度和维护成本
4. 最后给出推荐方案和理由
请先展示你的完整思考过程,再给出最终结论。
"""
4.3 效果对比
graph TD
A["技术选型问题"] --> B{有没有用思维链?}
B -->|没有| C["AI 直接给结论"]
C --> D["可能遗漏关键因素 ⚠️"]
B -->|有| E["AI 逐步分析"]
E --> F["考虑更全面 ✅"]
F --> G["结论更可靠 ✅"]
💡 关键发现:思维链对推理类任务效果最好(数学、逻辑、决策)。对创作类任务(写文案、写故事)效果提升不明显。
五、模式四:输出格式约束法 (Format Control)
5.1 原理
明确告诉 AI 你要什么格式。JSON、表格、列表、还是特定的模板。
5.2 模板
# 输出格式约束模板
格式约束模板 = """
{你的需求}
请严格按照以下 JSON 格式输出,不要输出任何其他内容:
```json
{
"字段1": "说明",
"字段2": "说明",
"字段3": ["数组元素说明"]
}
"""
实际示例:结构化提取文章信息
prompt = """
请分析以下技术文章,提取关键信息。
文章内容:
"""
Go 1.22 版本引入了 range over function 特性。这个特性允许开发者在 for-range 循环中
使用自定义的迭代器函数。这解决了之前需要通过 channel 或者 callback 实现自定义迭代的
痛点。核心语法是 func(yield func(K, V) bool)。需要 Go 1.22 以上版本。
"""
请严格按照以下 JSON 格式输出:
{
"标题": "一句话概括",
"技术栈": ["涉及的技术"],
"核心观点": "50字以内的核心观点",
"适用人群": "目标读者描述",
"难度等级": "入门/中级/高级"
}
"""
AI 输出:
{
"标题": "Go 1.22 range over function 新特性解析",
"技术栈": ["Go", "迭代器模式"],
"核心观点": "Go 1.22 允许在 for-range 中使用自定义迭代器函数,简化了自定义集合的遍历实现",
"适用人群": "有 Go 基础的后端开发者",
"难度等级": "中级"
}
### 5.3 进阶:嵌套格式 + 校验
```python
# 批量处理时,加上校验规则
批量分析提示 = """
请分析以下 3 条用户反馈,分类并提取情感倾向。
反馈列表:
1. "你们这个搜索功能太难用了,搜什么都搜不到"
2. "新版本的界面挺好看的,但加载速度好像变慢了"
3. "终于支持深色模式了!等了好久"
请输出 JSON 数组,每条反馈对应一个对象:
```json
[
{
"原文": "用户原话",
"分类": "功能缺陷/体验问题/正面反馈 三选一",
"情感": "正面/中性/负面 三选一",
"关键词": ["提取2-3个关键词"],
"优先级": "高/中/低 三选一"
}
]
注意:分类和情感字段必须从给定选项中选择,不要自创分类。
"""
✅ **推荐做法**:在格式模板里明确写出**允许的枚举值**(如"三选一"),能大幅提高输出的一致性。
## 六、模式五:自我纠错法 (Self-Reflection)
### 6.1 原理
让 AI 先生成一个答案,然后让它自己审查并改进。两次调用比一次调用的质量高很多。
### 6.2 模板
```python
# 自我纠错法 — 两步走
# 第一步:生成初稿
第一步提示 = """
请为以下 Python 函数编写单元测试:
```python
def 计算折扣价(原价: float, 折扣率: float) -> float:
if 原价 <= 0:
raise ValueError("原价必须大于0")
if not (0 <= 折扣率 <= 1):
raise ValueError("折扣率必须在0到1之间")
return round(原价 * (1 - 折扣率), 2)
请编写完整的 pytest 测试用例,覆盖正常情况和边界情况。
"""
第二步:自我审查
第二步提示 = """
请审查你刚才生成的测试代码,检查以下方面:
- 是否覆盖了所有边界条件(0、负数、最大值)
- 是否测试了异常抛出的情况
- 浮点数比较是否用了 pytest.approx
- 测试命名是否清晰表达了测试意图
如果发现遗漏或错误,请输出改进后的完整代码。
如果没有问题,请输出"已审查,无需修改"。
"""
### 6.3 实战效果
```python
# AI 第一步输出的测试(可能遗漏浮点精度问题)
import pytest
def test_正常折扣():
assert 计算折扣价(100, 0.2) == 80.0
def test_零折扣():
assert 计算折扣价(100, 0) == 100.0
def test_全额折扣():
assert 计算折扣价(100, 1) == 0.0
def test_原价为负():
with pytest.raises(ValueError):
计算折扣价(-10, 0.2)
# AI 第二步审查后补充的测试
def test_浮点精度():
# 0.1 + 0.2 != 0.3 的经典问题
assert 计算折扣价(99.99, 0.15) == pytest.approx(84.99, abs=0.01)
def test_折扣率边界_略超上限():
with pytest.raises(ValueError):
计算折扣价(100, 1.01)
def test_折扣率边界_略低下限():
with pytest.raises(ValueError):
计算折扣价(100, -0.01)
def test_原价为零():
with pytest.raises(ValueError):
计算折扣价(0, 0.5)
第二步审查后多出了 4 个测试用例,其中浮点精度测试是最容易被忽略的。
七、5 种模式速查表
| 模式 | 适用场景 | 核心要点 | Token 消耗 |
|---|---|---|---|
| 角色设定 | 所有场景(基础) | 身份 + 风格 + 受众 | 低 |
| 少样本示范 | 格式统一、风格模仿 | 2-3 个高质量示例 | 中 |
| 思维链 | 推理、决策、分析 | "先想后答" | 中 |
| 格式约束 | 数据提取、结构化输出 | JSON/表格 + 枚举值 | 低 |
| 自我纠错 | 代码、方案、长文 | 两步调用 | 高(2倍) |
💡 这五种模式可以自由组合。实际工作中我用得最多的组合是:角色设定 + 格式约束。覆盖了 80% 的日常场景。
八、总结
Prompt Engineering 不是玄学,是工程。
核心就一句话:你给 AI 的约束条件越明确,它的输出就越可控。 就像写需求文档一样——PRD 写得模糊,开发出来的东西一定不是你想要的。
这 5 种模式不需要全记住。先把"角色设定 + 格式约束"用熟,就能解决大部分问题了。
技术应该让生活更温柔。提示词也是。
更多推荐
所有评论(0)