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 测试用例,覆盖正常情况和边界情况。
"""

第二步:自我审查

第二步提示 = """
请审查你刚才生成的测试代码,检查以下方面:

  1. 是否覆盖了所有边界条件(0、负数、最大值)
  2. 是否测试了异常抛出的情况
  3. 浮点数比较是否用了 pytest.approx
  4. 测试命名是否清晰表达了测试意图

如果发现遗漏或错误,请输出改进后的完整代码。
如果没有问题,请输出"已审查,无需修改"。
"""


### 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 种模式不需要全记住。先把"角色设定 + 格式约束"用熟,就能解决大部分问题了。

技术应该让生活更温柔。提示词也是。

更多推荐