提示词工程,或称prompt Engineering,是一种专门针对语言模型进行优化的方法。它的目标是通过设计和调整输入的提示词(prompt),来引导这些模型生成更准确、更有针对性的输出文本。
在与大型预训练语言模型如GPT-3、BERT等交互时,给定的提示词会极大地影响模型的响应内容和质量。提示词工程关注于如何创建最有效的提示词,以便让模型能够理解和满足用户的需求。这可能涉及到对不同场景的理解、使用正确的词汇和语法结构,以及尝试不同的提示策略以观察哪种效果最佳。
你应该通过提供尽可能清晰和具体的指令来表达您希望模型执行的操作。 这将引导模型给出正确的输出,并减少你得到无关或不正确响应的可能。
编写清晰的指令不意味着简短的指令,因为在许多情况下,更长的提示实际上更清晰且提供了更多上下文,这实际上可能导致更详细更相关的输出。
比如说以下指令:
请描述一下风。
请描述一下西北风。
请描述一下春天的风。
什么是CSP?
什么是计算机网络中的CSP(内容安全策略)?
什么是计算机网络中的CSP(内容安全策略)?并详细描述其原理。
为指令添加一些详细的背景信息,输出的结果会更加符合我们的预期。
(1)策略一:使用分隔符清晰地表示输入的不同部分
分隔符可以是:```,“”,<>,,< ag>等。
可以使用任何明显的标点符号将特定的文本部分与提示的其余部分分开。 这可以是任何可以使模型明确知道这是一个单独部分的标记。使用分隔符是一种可以避免提示注入的有用技术。 提示注入是指如果用户将某些输入添加到提示中,则可能会向模型提供与您想要执行的操作相冲突的指令,从而使其遵循冲突的指令而不是执行您想要的操作。 即:输入里面可能包含其他指令,会覆盖掉你的指令,对此,使用分隔符是一个不错的策略。
以下是一个例子,我们给出一段话并要求 GPT 进行总结,在该示例中我们使用 ```来作为分隔符:
正例1:
- 提示:请生成一个HTML文档,包括标题、正文和页脚,使用,和标签分隔不同部分。
- 此提示清晰地指定了使用HTML标签作为分隔符,以便生成不同部分的内容。
正例2:
- 提示:使用逗号分隔以下单词并将其排序:apple, banana, cherry, date。
- 分隔符“逗号”明确指定了单词之间的分割方式。
正例3:
- 提示:生成一个JSON对象,包括姓名、年龄和地址字段,使用作为字段分隔符。
- 此提示使用了分隔符来指导生成JSON对象。
反例1:
- 提示:创建一个包含标题和正文的HTML文档。
- 这个提示没有明确指定使用什么分隔符来区分标题和正文,导致不够清晰。
反例2:
- 提示:列出以下水果:苹果,香蕉,樱桃,枣。
- 缺乏明确的分隔符,难以确定应如何分隔水果名称。
反例3:
- 提示:生成一个包含学生姓名、学号和成绩的CSV文件。
- 缺少分隔符的明确指定,CSV文件应该使用什么分隔符。
(2)策略二:要求一个结构化的输出,可以是 Json、HTML 等格式
要求生成一个结构化的输出,这可以使模型的输出更容易被我们解析,例如,你可以在 Python 中将其读入字典或列表中。
在以下示例中,我们要求 GPT 生成三本书的标题、作者和类别,并要求 GPT 以 Json 的格式返回给我们,为便于解析,我们指定了 Json 的键。
举例:
正例1:
- 提示:请生成一个JSON格式的联系人列表,每个联系人包括姓名、电子邮件和电话号码。
- 这个提示明确要求生成结构化的JSON格式输出。
正例2:
- 提示:创建一个HTML表格,包含产品名称、价格和库存数量。
- HTML表格是结构化输出,可以清晰地呈现产品信息。
正例3:
- 提示:生成一个XML文档,包括书籍的标题、作者和出版日期。
- 这个提示要求生成结构化的XML格式输出。
反例1:
- 提示:列出五种你喜欢的电影。
- 缺少结构化输出的要求,难以确定应该以何种形式列出电影。
反例2:
- 提示:描述你最喜欢的度假胜地。
- 这个提示没有要求特定的结构化输出,可能导致不一致的回答。
反例3:
- 提示:生成一个包含产品名称、价格和库存数量的列表。
- 虽然提到了数据项,但缺乏结构化输出的具体要求。
(3)策略三:要求模型检查是否满足条件
如果任务做出的假设不一定满足,我们可以告诉模型先检查这些假设,如果不满足,指示并停止执行。
你还可以考虑潜在的边缘情况以及模型应该如何处理它们,以避免意外的错误或结果。 在如下示例中,我们将分别给模型两段文本,分别是制作茶的步骤以及一段没有明确步骤的文本。 我们将要求模型判断其是否包含一系列指令,如果包含则按照给定格式重新编写指令,不包含则回答未提供步骤。
正例1:
- 提示:请生成一个HTML文档,确保它包含,和标签。
- 此提示要求模型检查生成的HTML文档是否包含指定的标签。
正例2:
- 提示:生成一个包含至少三个联系人的JSON列表,每个联系人必须包括姓名、电子邮件和电话号码。
- 这个提示明确要求模型生成满足特定条件的JSON列表。
正例3:
- 提示:创建一个XML文档,其中书籍的标题必须包含不超过50个字符。
- 此提示要求模型确保生成的XML文档中的标题不超过指定字符数。
反例1:
- 提示:生成一个HTML文档,但不提供任何进一步的条件。
- 缺少明确的条件,模型不知道生成的HTML文档应该包含什么。
反例2:
- 提示:列出至少三个联系人的JSON列表。
- 缺少对联系人数据的具体要求,难以检查是否满足条件。
反例3:
- 提示:创建一个XML文档,包括书籍的作者。
- 缺乏明确的条件来指导生成的XML文档应该如何包括作者信息。
(4)策略四:提供少量示例
在要求模型执行实际任务之前,提供给它少量成功执行任务的示例。 例如,在以下的示例中,我们告诉模型其任务是以一致的风格回答问题,并先给它一个孩子和一个祖父之间的对话的例子。 孩子说,“教我耐心”,祖父用这些隐喻回答。 因此,由于我们已经告诉模型要以一致的语气回答,现在我们说“教我韧性”,由于模型已经有了这个少样本示例,它将以类似的语气回答下一个任务。
正例1:
- 提示:生成一个包含以下数字的列表:1, 3, 5, 7, 9。
- 提供了一组具体的数字示例,以指导模型生成相似的列表。
正例2:
- 提示:创建一个包含以下颜色的CSS样式表:红色,蓝色,绿色,黄色。
- 提供了一组颜色示例,以帮助模型生成相应的CSS样式表。
正例3:
- 提示:请生成一个HTML表格,其中包括产品名称、价格和库存数量,示例产品为:iPhone 12,Samsung Galaxy S21,Google Pixel 5。
- 提供了一些示例产品,以指导模型在表格中包含相似的信息。
反例1:
- 提示:生成一个包含数字的列表。
- 缺少具体示例,难以确定应该包含哪些数字。
反例2:
- 提示:创建一个CSS样式表。
- 没有提供任何示例,模糊了模型应该生成何种样式。
反例3:
- 提示:请生成一个HTML表格,包含产品信息。
- 缺少示例产品,模型不知道应该在表格中包括什么信息。
如果模型匆忙地得出了错误的结论,您应该尝试重新构思查询,请求模型在提供最终答案之前进行一系列相关的推理。 换句话说,如果您给模型一个在短时间或用少量文字无法完成的任务,它可能会猜测错误,这种情况对人来说也是一样的。 如果您让某人在没有时间计算出答案的情况下完成复杂的数学问题,他们也可能会犯错误。 因此,在这些情况下,您可以指示模型花更多时间思考问题,这意味着它在任务上花费了更多的计算资源。
(1)策略一:指定完成任务所需的步骤
接下来我们将通过给定一个复杂任务,给出完成该任务的一系列步骤,来展示这一策略的效果。 首先我们描述了杰克和吉尔的故事,并给出一个指令。该指令是执行以下操作。
第一,用一句话概括三个反引号限定的文本; 第二,将摘要翻译成法语; 第三,在法语摘要中列出每个名称; 第四,输出包含以下键的 JSON 对象:法语摘要和名称数。然后我们要用换行符分隔答案;
上述输出仍然存在一定问题,例如,键“姓名”会被替换为法语,因此,我们给出一个更好的 prompt,该 prompt 指定了输出的格式:
再举例:可以反问大语言模型,让我们给它一些它需要的信息,来生成回答。
万能prompt:
(2)策略二:指导模型在下结论之前找出一个自己的解法
有时候,在明确指导模型在做决策之前要思考解决方案时,我们会得到更好的结果,接下来我们会给出一个问题和一个学生的解答,要求模型判断解答是否正确。
但是注意,学生的解决方案实际上是错误的,我们可以通过指导模型先自行找出一个解法来解决这个问题,在接下来这个 prompt 中,我们要求模型先自行解决这个问题,再根据自己的解法与学生的解法进行对比,从而判断学生的解法是否正确,同时,我们给定了输出的格式要求,通过明确步骤,让模型有更多时间思考,有时可以获得更准确的结果。 在这个例子中,学生的答案是错误的,但如果我们没有先让模型自己计算,那么可能会被误导以为学生是正确的。
虚假知识:模型偶尔会生成一些看似真实实则编造的知识。
如果模型在训练过程中接触了大量的知识,它并没有完全记住所见的信息,因此它并不很清楚自己知识的边界,这意味着它可能会尝试回答有关晦涩主题的问题,并编造听起来合理但实际上并不正确的答案,我们称这些编造的想法为幻觉。 例如在如下示例中,我们要求告诉我们 Boie 公司生产的 AeroGlide UltraSlim Smart Toothbrush 产品的信息,事实上,这个公司是真实存在的,但产品是编造的,模型则会一本正经地告诉我们编造的知识。
模型会输出看上去非常真实的编造知识,这有时会很危险,因此,请确保使用我们在本节中介绍的一些技巧,以尝试在构建自己的应用程序时避免这种情况,这是模型已知的一个弱点,也是我们正在积极努力解决的问题。 在你希望模型根据文本生成答案的情况下,另一种减少幻觉的策略是,这种追溯源文档的方法通常对减少幻觉非常有帮助。
1、明确具体:加入场景要求、具体任务
2、提供上下文:正确的区分不同的部分的内容(指令与背景信息使用符号区分)
3、正确的语法:使用正确的语法和拼写,避免使用过于技术性或不常见的术语
4、分步询问:复杂任务分步进行,提供引导或者示例
5、输出要求:提供输出要求,比如,结构化的输出
指令 + 输入数据 + 背景 + 输出要求
(1)文案/文档类
【背景:产品/项目介绍】+【指令:撰写/修改 + 文案/文档类型】+【输入数据:模仿对象内容/修改内容(可选)】+【输出指示:关于主题/产品的要点 + 结构/字数等】
示例:我是一名教育科技创业者,计划开发一个在线教育平台(背景),请写一篇产品说明文档(指令),需要包括平台的介绍、核心功能以及我们的竞争优势。文档的结构应该分为三个部分:介绍、功能、优势。(输出指示)。
(2)竞品分析
【背景:竞品领域/行业】+【指令:进行竞品分析/提供竞品列表/分析报告】+【输入数据:提供参考大纲结构/产品内容(可选)】+【输出指示:分析类型/关注点 + 格式要求(表格/列表/段落)等】
示例:
- 我们计划进入视频创作领域(背景),请列出当前视频创作市场上的主要产品(指令),提供这些产品的名称和简要介绍的列表(输出指示)。
- 我正在研究在线教育行业中的竞争对手(背景),(指令)请对Coursera、Udemy、edX、Khan Academy进行竞品分析,分析各竞品的竞品定位与核心价值、产品特点与功能、用户评价与反馈(输出指示)。
(3)检查优化方案
【背景:产品类型/现状】+【指令:获取设计建议/优化方案】+【输入数据:参考案例辅助说明等(可选)】+【输出指示:设计元素/参考案例 + 格式要求(图文/列表/段落)等】
示例:
我们正在开发一个副业创作平台(背景),为了提高用户参与度和活跃度,(指令)请为这个平台设计一个用户积分体系,包括关键要素和激励措施(输出指示)。
(4)协助数据分析
【背景:数据类型/业务场景】+【指令:发现原因/趋势/优化建议】+【输入数据:要分析的数据】+【输出指示:问题/现象描述 + 格式要求(图表/列表/段落)等】
示例:
我正在开发一款互联网产品(背景),最近注意到产品的日活数据出现下降趋势,(指令)请帮我对这些数据进行分析,以确定是否存在问题,并提供可能的原因和优化建议(输出指示);(输入数据)以下是具体的日活数据,时间范围从2022年到2023年的20组数据:
在使用 ChatGPT 时,我们应结合自己的知识和经验对其提供的建议进行判断、交叉验证和完善,以确保最终的工作成果的准确性和实用性。
示例:
我需要一份减肥餐,请帮我制作一份一周的食谱,使用表格的方式进行输出。
使用以上指令时,大模型可能并不知道你想要的减肥餐是什么,你是食用者还是食物的制作者?
优化:
我希望你能充当我的私人健康教练,作为一个健身30年的老教练,为我的个人健康与减肥设计专业的建议,我是一个未参加过专业训练的初级健身人员,身高1。65m,女性,体重60kg(体脂率是36偏高),平时我的工作是早9晚6一天8小时,周末可能会加一天的班,平时的时间集中在晚上早上7点半以前和周末,我目前身体健康,并无健身器材方向的锻炼要求,我想减重到50kg,你应该利用你的运动科学知识、营养建议和其他相关因素来为我创建适合我的计划。在今后对话中,不再需要我额外的说明。
我的第一个请求是“我需要一个减肥的一周的食谱”。
示例:
我作为一名小学生,请解释一下天体物理学。
我作为一名大学物理学科的学生,请解释一下天体物理学。
我希望你能扮演大学博士生导师的角色,我作为一名大学物理学科的学生,请解释一下天体物理学,以激发我对研究生涯的渴望。
示例:
示例:
如果大语言模型支持的token比较少,如何处理长文章?
示例:将文章拆开几部分,发送给大模型
如果是需要响应的token比较多,可以让大语言模型接着输出:
如果有一些领域我们并不是很熟悉,可以将问题由浅入深,一步一步拆解,来问大语言模型。
示例:
请为我提供一个不使用牛奶和鸡蛋的巧克力蛋糕的食谱。
请描述互联网的发展历程。
请描述互联网的发展历程,从互联网的发展开始进行描述,其中对移动互联网进行详细的描述,同时,对近些年来新媒体的发展做一个未来的预估。
作为互联网的专业方向上的资深专家,请“描述互联网的发展历程”写一个大纲。
如果对一个行业没有清晰的认识,可以反问大模型:
假设你是一个互联网方向上的资深专家,我是向你来咨询互联网发展历史的小白客户,需要详细而确切的信息,但我不太懂如何提问。请逐步引导我,让我的需求更具体。完成后回复“已完成背景收集,开始进行回复‘互联网发展历史’”。提问我问题的时候,请一个问题一个问题的进行询问,同时,我如果回答不知道,可以考虑问下一个问题。
可以给大语言模型设置统一的画像,也可以让他给你定制:
如果是想接下来的对话都适用,可以:
可以考虑使用:
长文本可以借助LangChan、ASK-Pdf等工具。
提示词工程指南:
提示词网站: