Prompt Engineering基础:大模型指令设计与优化的完整指南

目录

Prompt Engineering概述

Prompt Engineering(提示工程)是和大语言模型打交道的核心手艺。你不需要重新训练模型,只要通过调整文字指令,就能让同一个模型完成翻译、写作、分类、推理等等各种各样的任务。

简单来说,Prompt Engineering 可以被总结为:

精心设计的指令 + 相关上下文 + 输出约束 = 高质量的模型输出

通过这三要素的组合,我们可以把模型的能力发挥到极致。

我们可以对比一下差的提示词和好的提示词,感受其中的差别:

质量示例
❌ 差的提示词翻译 (模型压根不知道要翻译什么)
✅ 好的提示词请将下面的英文句子翻译成中文,只输出翻译结果: Hello, how are you today?

好的提示词让任务目标、输入内容、输出格式一目了然,模型几乎没有发挥的“错误空间”,这正是我们追求的效果。

为什么Prompt Engineering如此重要?

  • 成本友好:不需要昂贵的微调和再训练
  • 高度灵活:同一个模型,换个提示词就能从“客服”变成“代码审查员”
  • 可控性强:你可以精确约束输出的语言风格、长度、格式
  • 快速试错:改一行字远比重新训练模型要快得多

常见的提示词类型

本文会重点展开前三类最常用的技术:

  • Zero‑shot Prompting:不给例子,直接下达任务
  • Few‑shot Prompting:给出几个示例,让模型“照猫画虎”
  • Chain‑of‑Thought (CoT):引导模型一步一步推理
  • 角色扮演提示:为模型设定身份和语气
  • 系统提示词 (System Prompt):在对话开始前注入全局规则

Zero-shot Prompting详解

Zero‑shot 是最直白的用法,不给任何示例,直接告诉模型你要它做什么。
它的底气在于:大模型在预训练阶段已经阅读了海量文本,很多知识早已内化其中。你只需要通过清晰的指令把它“激活”出来。

什么时候用 Zero‑shot?

  • 简单的文本分类(情感分析、新闻类别)
  • 常规的翻译任务
  • 基础的摘要和生成
  • 事实性问答

实践示例

情感分析

判断下面评论的情绪是正面、负面还是中性,只输出一个词。

评论:这个产品真好用,物流也快。

输出:正面

文本分类

将下面的新闻分到“体育”“科技”“财经”“娱乐”中的一个类别,只输出类别名称。

新闻:苹果公司发布了新一代自研芯片。

输出:科技

翻译

把下面的话翻译成英文,只输出英文句子。

今天阳光真好。

输出:The sunshine is really nice today.

Zero‑shot 的短板

  • 碰到需要多步推理的问题容易翻车
  • 输出格式不太稳定,有时会附带多余的解释
  • 对措辞比较敏感,同一件事换种说法可能结果就不一样

不过别担心,下面我们要讲的 Few‑shot 和 Chain‑of‑Thought 正好能解决这些问题。

Few-shot Prompting实践

在提示里塞几个“范例”,模型就会像学生模仿例题一样,准确率往往能大幅提升。
重点是:例子不用多,但要典型、清晰、格式一致。

Few‑shot 的工作原理

  1. 准备 2‑5 个有代表性的(输入 → 输出)例子
  2. 所有例子保持统一的排版和分隔符
  3. 模型在读例子时会自动推测任务模式
  4. 然后把这个模式应用到最后一个待解决的输入上

实践示例

成语翻译

请把下面的成语翻译成英文,保持格式为:成语 → 英文解释。

塞翁失马,焉知非福 → A loss may turn out to be a gain.
纸上谈兵 → To talk idly about theoretical matters.
亡羊补牢 → Better late than never.
破镜重圆 → 

情感分析

判断评论的情绪,选项:正面 / 负面 / 中性。

评论:物流快,包装也很用心。
情绪:正面

评论:东西收到了,但质量太差了,失望。
情绪:负面

评论:还行吧,没太大感觉。
情绪:中性

评论:虽然贵了点,但用起来确实舒服。
情绪:

Few-shot 设计小窍门

  • 先易后难:简单的例子放前面,帮助模型建立信心
  • 错误示例有时也有效:偶尔加一个“错误答案 + 纠正”的例子,能让模型学会避开常见坑
  • 保持格式严谨:分隔符(如箭头、破折号、数字编号)最好一以贯之,别换来换去

Chain-of-Thought思维链技术

有些任务,比如数学题、逻辑谜题,直接问答案效果很差。这时候我们可以用 Chain‑of‑Thought (CoT) 技术,让模型把推理过程一步一步写出来

现在的做法就不再是“问题 → 答案”,而是:

问题 → 推理第一步 → 推理第二步 → … → 最终答案

这样不仅能提高正确率,还能让我们看清楚模型是怎么想的。

两种 CoT 实现方式

  1. Few‑shot CoT
    在提示里给出几个包含推理步骤的例子,模型看完之后会模仿这种“慢思考”风格。
问题:桌上有 8 支笔,收走 3 支,又放了 5 支,现在有几支?
推理:起始 8 支,收走 3 支剩 5 支,再放 5 支得 10 支。
答案:10 支

问题:一包饼干有 12 块,小明吃了 3 块,妹妹吃了 2 块,还剩几块?
推理:
  1. Zero‑shot CoT
    如果你懒得写例子,直接加一句 让我们一步一步思考,很多模型也能奇迹般地切换到推理模式。
一个长方形长 8 米,宽 5 米,它的面积是多少平方米?
让我们一步一步思考。

再多点“保险”——自一致性策略

用同一个问题让模型推理多次(可以稍微调整温度参数),然后选出出现频次最高的答案,可以进一步提升稳定性。虽然这会多消耗几次 API 调用,但在关键任务上非常值得。

高级Prompt设计技巧

角色扮演,让模型“入戏”

给模型一个明确的身份,它产出的内容会立刻带上这个角色的语气和专业度。

角色提示片段示例
资深工程师“你是一名 Python 后端专家,擅长写出清晰、模块化的代码。”
耐心老师“你是一位给小学生讲解数学的老师,请用最浅显的语言解释。”
安全审查员“你是一位代码安全审查员,请找出下面脚本中的潜在风险。”

输出格式一板一眼

靠嘴说“只输出JSON”有时模型会给你加一堆客套话,这时候把格式要求“模板化”就很管用。

强制 JSON 输出

请严格按照下面的 JSON 格式回答,不要多一个字:
{
  "answer": "...",
  "confidence": 0.0-1.0
}

结构化模板

【答案】
(你的答案)

【理由】
(简要说明为什么这么认为)

【置信度】
(高/中/低)

约束条件精确化

  • 长度约束请用不超过 80 个字回答
  • 领域约束请只基于上面提供的材料来判断,不要引入外部知识
  • 语气约束请使用正式、礼貌的商务中文

结构化Prompt设计

在实际开发中,我们常常需要动态拼接提示词,这时候一个清晰的 Prompt 模板可以避免混乱。

推荐模板结构

【任务描述】
你要做什么

【背景信息】
相关的上下文或文档

【输入数据】
待处理的内容

【输出要求】
格式、长度、语气等

【示例】(可选)
输入:… 输出:…

【当前输入】
具体需要处理的新内容

用代码动态构建 Prompt

把每一部分拆分成可复用的模块,会让项目维护轻松很多。

class PromptBuilder:
    def __init__(self):
        self.sections = []

    def add_header(self, title, content):
        self.sections.append(f"【{title}\n{content}\n")
        return self

    def build(self):
        return "\n".join(self.sections)

# 快速搭建一个情感分析 prompt
builder = PromptBuilder()
prompt = (builder
    .add_header("任务", "进行情感分析,输出正面/负面/中性")
    .add_header("当前输入", "这个咖啡味道不错,还会回购")
    .build())
print(prompt)

系统提示词(System Prompt)

System Prompt 就像模型的“人格设定集”,在对话一开始就注入,对整个对话的基调、行为、安全边界起到决定性作用。

System Prompt 主要做什么?

  • 定角色:你是谁,具备什么背景
  • 划界限:该说什么,不该说什么
  • 嵌知识:给模型加载专业领域的基础规则
  • 控风格:正式/随意、简洁/详细、热情/冷静

几个典型的 System Prompt

  • 编程助手:“你是一名资深 Python 开发者。回答问题时直接上代码,附带简短注释,不额外寒暄。”
  • 客服助手:“你是商城的官方客服,语气亲切专业,遇到无法解决的问题请引导用户提交工单。”
  • 学习教练:“你用简单的话解释复杂概念,像给初中生讲课一样,多举生活例子。”

在 API 中使用的样子

System Prompt 通常放在 messages 数组的最前面,角色标记为 "system"

import openai

response = openai.ChatCompletion.create(
    model="gpt-4o-mini",
    messages=[
        {
            "role": "system",
            "content": "你是一个专业的Python编程助手,提供简洁高效的代码解决方案。"
        },
        {
            "role": "user",
            "content": "写一个合并两个有序数组的函数"
        }
    ],
    temperature=0.2
)

Prompt优化策略

写好 Prompt 很少一步到位,大多要经过“实战—分析—调整”的循环。

用 A/B 测试找到最佳版本

  1. 定好评估指标(准确率、格式合规率、相关性等)
  2. 准备一份固定的测试数据集
  3. 针对同一个任务生成 2‑3 个不同措辞的 Prompt
  4. 对比它们在测试集上的表现
  5. 保留最优那个,再考虑进一步微调

每次只改一个变量,效果清晰,方便归因。

迭代四步法

  • 建立基线:记录当前 Prompt 的表现作为“起跑线”
  • 定位问题:找出那些频繁出错的案例,总结错误类型
  • 针对性修改:是格式不对就强调格式,是推理卡壳就加上 CoT 示例
  • 验证效果:用测试集跑一遍,和基线对比后决定是否上线

实际应用案例

下面给出两个可以直接“拎包入住”的 Prompt 模板,大家可以根据实际业务稍作修改。

客户服务场景

【角色】你是一家电商平台的客服代表,需保持友好、专业、高效。
【核心理念】
- 先理解并共情客户的问题
- 给出具体可行的解决方案
- 结尾主动询问是否需要其他帮助

【回复格式】
1. 一句理解/共情的话
2. 清晰的解决步骤
3. 结尾关心语

【客户问题】
{查询内容}

内容生成场景

【任务】写一篇关于 {主题} 的博客文章
【读者】{初级/中级/高级} 技术人员
【文章要求】
- 字数:800~1200 字
- 语言通俗,少用术语,多打比方
- 结构清晰:开头吸引人、中间分点展开、结尾有总结建议

【输出格式】
1. 自然醒目的标题
2. 引言段
3. 3~5 个内容小节
4. 总结与建议
Prompt Engineering 是门手艺活儿,建议从 Zero‑shot 上手,先体会“指令怎么说模型才会怎么动”,再慢慢加入 Few‑shot 和 CoT。多动手、多观察、多总结,慢慢地你就能一眼看出 Prompt 的“调参空间”。

总结

  1. 根基要稳:Zero‑shot、Few‑shot、CoT 是三种最核心的招式
  2. 设计有章法:好的 Prompt = 清楚的任务 + 优质的示例 + 强约束的格式
  3. 高阶技巧:角色扮演、System Prompt、输出强制模板都会让你的产品体验更上一层楼
  4. 优化靠迭代:定好指标、做 A/B 测试、每次只调一个变量
  5. 场景为王:没有银弹 Prompt,贴合实际的场景设计才是王道

💡 核心公式:优秀的 Prompt = 清晰的任务描述 + 合适的上下文 + 明确的格式要求 + 恰当的约束条件


🔗 扩展阅读

📂 所属阶段:第五阶段 — 迈向大模型 (LLM) 的阶梯
🔗 相关章节:GPT系列演进 · 指令微调(Instruction Tuning)