Prompt 提示词编写指南:如何发挥大语言模型最大潜力
引言
提示工程(Prompt Engineering)是一门相对较新的学科,旨在开发和优化提示(Prompts),以便高效地利用语言模型(LM)进行各种应用和研究。掌握提示工程技能有助于更深入地理解大型语言模型(LLM)的能力边界与限制。研究人员利用提示工程改善 LLM 在问答、算术推理等任务上的表现;开发人员则设计能与 LLM 及其他工具接口交互的强大提示技术。
本文主要介绍标准提示的基础知识,提供指导如何使用提示与大语言模型进行交互的完整框架,涵盖从基础组件到高级技巧的实战内容。
提示的组成要素
一个有效的提示通常包含以下核心组成部分,并非所有部分在所有场景下都是必需的,具体取决于任务类型:
- 指令 (Instruction):明确告诉模型需要执行的具体任务或操作,例如'总结'、'翻译'、'生成代码'。
- 上下文 (Context):提供外部信息或背景资料,帮助模型更好地理解任务环境,减少歧义。
- 输入数据 (Input Data):模型需要处理的具体内容,即问题、文本片段或待分析的数据。
- 输出指示 (Output Indicator):定义期望输出的类型、格式或风格,如 JSON、Markdown 表格或特定长度。
合理组织这些要素能显著提升模型的响应质量。建议将指令放在提示的最开头,并使用清晰的分隔符(如 ### 或 ---)区分不同部分。
提示词的通用设计技巧
1. 明确的指令
使用动词明确的指令来引导模型。常见的指令包括'写入'、'分类'、'总结'、'翻译'、'排序'、'提取'等。尝试不同的指令组合、关键词和上下文,找到最适合特定用例的方案。指令越具体,效果通常越好。
示例:
将下面的文本翻译成西班牙语:
文本:'嗨!'
输出:
Texto: "¡Hola!"
2. 具体性与约束
输入的指示和任务要求应非常具体。提示越详细,结果往往越准确,特别是在要求模型以特定格式或风格返回内容时。但需注意,详细并不意味着冗长,应避免无关细节,因为模型有输入长度限制。
示例:信息提取
提取以下文本中的人物信息。
期望格式:
人物:{"姓名":"","性别":""}
输入:
姚明(Yao Ming),男,汉族,无党派人士,1980 年 9 月 12 日出生于上海市徐汇区,祖籍江苏省苏州市,前中国职业篮球运动员,司职中锋,现任亚洲篮球联合会主席、中国篮球协会主席、中职联公司董事长兼总经理、十三届全国青联副主席,改革先锋奖章获得者,第十四届全国人大代表。
输出:
人物:{"姓名":"姚明","性别":"男"}
3. Few-Shot 提示(少样本学习)
大语言模型经过大量数据训练,具备强大的语义分析能力,但在复杂任务上可能表现不足。Few-Shot Prompting 通过在提示中提供少量示例(演示),引导模型模仿模式,实现上下文学习。
示例:生物分类
示例 1:
生物名:翼火龙
特征:生活在火山地带,拥有火焰吐息能力,翅膀覆盖着耐高温的鳞片。
分类:火元素生物
示例 2:
生物名:水灵狐
特征:居住在深林的溪流旁,能够操控水流,毛发闪耀着水珠般的光泽。
分类:水元素生物
请根据同样的模式,对以下生物进行分类:
生物名:光羽兽
特征:栖息于云之彼端,身体轻盈透明,背上生有能折射阳光形成彩虹的羽毛,以光线为食。
输出:
分类:光元素生物
对于困难任务,可增加演示次数(如 3-shot、5-shot)。这能帮助模型快速适应特定的逻辑模式。
4. CoT 思维链 (Chain of Thought)
当零次提示和少次提示不足以胜任复杂推理任务时,CoT 技术通过将问题分解为中间步骤来增强模型的推理能力。它鼓励模型展示思考过程,而不仅仅是直接给出答案。
示例:数学逻辑
这组数中的奇数加起来是一个偶数:4、8、9、15、12、2、1。
A:将所有奇数相加(9、15、1),得到 25。答案是 False。
这组数中的奇数加起来是一个偶数:15、32、5、13、82、7、1。
A:
输出:
这组数中的奇数加起来是一个偶数:15、32、5、13、82、7、1。
A:答案是 False。因为将所有奇数相加(15、5、13、7、1),得到 41,是一个奇数,不是偶数。
5. Zero-Shot CoT (零样本思维链)
这是一种无需示例即可触发推理的技巧,基本思想是在提示末尾添加'让我们一步步思考'或类似短语。这能显著改善模型在算术或逻辑任务上的准确率。
对比示例:
普通提示:
我去市场买了 10 个苹果。我给了邻居 2 个苹果和给修理工 2 个苹果。然后我又去买了 5 个苹果,并吃了 1 个。我还剩下多少苹果?
普通输出:6 个(错误)
Zero-Shot CoT 提示:
我去市场买了 10 个苹果。我给了邻居 2 个苹果和给修理工 2 个苹果。然后我又去买了 5 个苹果,并吃了 1 个。我还剩下多少苹果?
让我们一步步思考。
改进输出:
好的,让我们逐步解决这个问题。
1. 初始数量:10 个。
2. 给出后剩余:10 - 2 - 2 = 6 个。
3. 又买了 5 个:6 + 5 = 11 个。
4. 吃了 1 个:11 - 1 = 10 个。
所以,最后我还剩下 10 个苹果。
Text2SQL 提示词实战
Text2SQL 是将自然语言转换为 SQL 查询语句的任务。以下是一个结构化的提示模板,结合了系统角色、思维链、表结构和样例数据。
【系统提示词】:你是一个 IT 开发工程师。在这个任务中,你的目标是将自然语言问题转换为有效的 SQL 查询语句。请仔细分析问题,逐步推理出所需的数据库表格、列名,以及必要的 SQL 操作(如 SELECT, FROM, WHERE, JOIN 等),并确保遵循 SQL 语法规范。
【COT 思维链】:当你处理每个问题时,想象你在心中逐步构建 SQL 查询的过程。
1. 首先,确定查询的目标是什么(SELECT 部分);
2. 然后,考虑从哪个表获取这些信息(FROM 部分),以及是否有任何特定条件需要过滤结果(WHERE 部分);
3. 如果涉及到多个表的关联,请明确它们之间的连接条件。
【表结构信息】:
CREATE TABLE Books (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
title VARCHAR(255) NOT NULL COMMENT '图书标题',
author VARCHAR(255) NOT NULL COMMENT '图书作者',
isbn CHAR(13) UNIQUE NOT NULL COMMENT '图书 ISBN 号',
publication_date DATE NOT NULL COMMENT '出版日期',
category VARCHAR(100) NOT NULL COMMENT '图书类别'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='图书记录';
【样例数据】:
{
"title": "示例图书",
"author": "作者名字",
"isbn": "1234567890",
"publication_date": "2023-04-01",
"category": "小说"
}
【Few-Shot 示例】:[
{
"提问": "找出所有在 2023 年出版的书籍。",
"响应": "SELECT title FROM Books WHERE year(publication_date) = '2023'"
},
{
"提问": "找出所有在 2023 年出版的书籍,并按照出版日期排序。",
"响应": "SELECT title FROM Books WHERE year(publication_date) = '2023' ORDER BY publication_date"
}
]
【用户指令】:{question}
【响应格式】:请以 代码的形式提供您的答案,确保它直接回答了上述问题,并且遵循正确的 语法。
进阶最佳实践
1. 角色设定 (Role Prompting)
赋予模型特定的专家角色可以激活其相关领域的知识库。例如,将角色设定为'资深 Python 架构师'或'法律合规专家',模型会倾向于使用更专业、严谨的语气和术语。
2. 分隔符的使用
使用三重引号 """、反引号 ``` 或特殊符号 ### 来隔离指令、数据和参考内容。这有助于模型区分哪些是指令,哪些是待处理的数据,防止指令注入攻击或混淆。
3. 负向约束
明确告诉模型不要做什么同样重要。例如,'不要使用专业术语'、'不要超过 100 字'、'不要编造事实'。这能有效控制输出范围。
4. 迭代优化
很少有提示能一次完美生效。建议采用迭代方式:先测试基础提示,观察输出,然后根据偏差调整指令、增加上下文或修改 Few-Shot 示例。记录每次调整的效果,建立自己的提示库。
常见误区与调试
- 过于模糊:避免使用'写点东西'这类指令,应明确主题、受众和目的。
- 忽略上下文:如果任务依赖特定领域知识,务必提供背景文档或术语表。
- 假设模型已知:不要假设模型知道最新的实时数据或未公开的内部信息,需显式提供。
- 一次性输出过长:对于复杂任务,可分步请求,例如先生成大纲,再生成正文。
结语
Prompt 工程是人与 AI 协作的关键桥梁。通过理解提示的组成要素,掌握指令设计、思维链、少样本学习等核心技术,并结合迭代优化的方法,开发者可以显著提升大语言模型在各类任务中的表现。随着技术的演进,提示策略也在不断更新,保持学习和实践是发挥 LLM 最大潜力的根本途径。