Prompt Engineering Guide
很好的学习网站:Prompt Engineering Guide | Prompt Engineering Guide
随着大语言模型如 ChatGPT 等的兴起,人们看到了其在自动生成各种文本方面的超强能力和广泛应用。然而,由于模型可能生成不准确或不当的文本,提示工程(Prompt engineering)应运而生。提示工程通过设计和构建输入提示来控制大语言模型的输出,从而提高生成文本的准确性和可靠性,为各种应用场景提供更好的效果和体验。因此,提示工程的背景和意义在于优化输入提示,引导大语言模型生成更加准确、可靠、符合预期的输出文本,从而更好地发挥其优势和价值。
随着大语言模型如 ChatGPT 等的兴起,人们看到了其在自动生成各种文本方面的超强能力和广泛应用。然而,由于模型可能生成不准确或不当的文本,提示工程(Prompt engineering)应运而生。提示工程通过设计和构建输入提示来控制大语言模型的输出,从而提高生成文本的准确性和可靠性,为各种应用场景提供更好的效果和体验。因此,提示工程的背景和意义在于优化输入提示,引导大语言模型生成更加准确、可靠、符合预期的输出文本,从而更好地发挥其优势和价值。
提示简介
提示工程(Prompt engineering)是一门相对较新的学科,旨在为各种应用和研究主题开发和优化提示,以有效地利用语言模型(LMs:language models )。提示工程技能有助于更好地了解大型语言模型(LLMs:large language models )的能力和局限性。研究人员使用提示工程来提高 LLMs 在各种常见和复杂任务(如问答和算术推理)上的能力。开发人员使用提示工程来设计稳健且有效的提示技术,与 LLMs 和其他工具进行交互。
基本提示(Basic Prompts)
可以通过提示实现很多功能,但结果的质量取决于您提供的信息量。提示(Prompt)可以包含指令(instruction )或问题(question),以及其他详细信息,例如背景信息输入(input)或示例(examples)。
例如:为了让模型生成描述今天上海天空的语句,我们可以通过逐步优化输入提示信息来帮助模型完成任务。
Prompt:
完成这个句子:
天空是
Output:
天空是指大气层上方的空间,通常是指人们在地面上所看到的天空,它的颜色和形态会随着时间、地点、季节和气象条件的不同而变化。
正如上面这个例子,语言模型输出了一系列与“天空是”这个上下文相关(只有指令和问题,没有背景信息)的字符串。输出结果是通用的知识,与我们想要实现的任务相差甚远。
这个简单的例子也突显了我们需要提供更多上下文或指令来明确我们想要实现的具体目标。
让我们试着稍微改进一下:
Prompt:
根据今天天气情况,完成描述今天天气的句子:
天空是
Output:
天空是阴沉的,乌云密布,目前正在下雨。
进一步细化地点(没有今天天气信息):
Prompt:
根据上海今天天气情况,完成描述今天天气的句子:
天空是
Output:
天空是阴沉的,目前有雨,气温较为寒冷。
告诉 LLMs 模型今天是晴天:
Prompt:
根据上海今天晴天,完成描述今天天气的句子:
天空是
Output:
天空是湛蓝色的,阳光明媚,没有云彩。
我们告诉模型去完成这个句子的上下文背景信息,所以结果看起来更好,因为它严格按照我们告诉它要做什么(“完成句子”)来进行。这种通过设计最佳提示语来指导模型执行任务的方法被称为提示工程。
现在的ChatGPT(也称为LLM,即大型语言模型)已经成为了执行各种先进任务的重要工具。无论是对于文本摘要、问答系统、对话机器人,还是数学推理、代码生成等领域,ChatGPT都展现出了其强大的能力和潜力。
参数调整(LLM Settings)
在使用提示语(Prompt )可以通过 API 或直接与 LLM 进行交互。可以配置一些参数来调整输出不同的结果。
-
Temperature:
Temperature是一个用于控制文本生成随机性的参数;
Temperature值越低,生成的文本就越接近于模型已有的知识和样本,可能会更加保守和可预测,当Temperature值接近于0时,生成的文本就会越来越接近于模型最有可能的输出;
而当Temperature值较高时,生成的文本就会更加多样化、新颖和出人意料。
这是因为高温下,生成过程更加随机,模型更容易从多个可能的单词和短语中进行选择和组合,从而创造出更加多样化的文本。
在应用方面,对于基于事实的问答,我们可能希望使用较低的温度,以鼓励更具事实性和简洁的回答。
对于诗歌生成或其他创意任务,增加温度可能会更有益。
-
Top_p:
用于控制生成文本多样性的参数,它可以理解为一个概率阈值。在生成文本时,模型首先计算出所有可能的词的概率分布,然后根据Top-p的设定值,只保留概率累加值最高的一部分词汇。具体来说,模型会将所有词的概率按照从大到小的顺序排列,然后不断累加这些词的概率值,直到累加概率值超过了Top-p设定的概率阈值。此时,模型只保留累加概率值最高的词汇,其他的词汇被丢弃。这样可以有效控制生成文本的多样性,防止生成文本重复和过于生硬。Top-p值越大,生成的文本就越多样化,但同时也可能导致生成文本的准确性降低,因为模型在选择词汇时可能会考虑一些低概率的词汇。
标准的提示(Standard Prompts)
标准提示具有以下格式:
<Question>?
也可以格式化为 QA 格式,这是许多 QA 数据集的标准格式,如下所示:
Q: <Question>?
A:
鉴于上述标准格式,一种广受欢迎且有效的提示技术被称为“few-shot prompting”,其中我们提供样本。Few-shot 提示可以按以下方式格式化:
<Question>?
<Answer>
<Question>?
<Answer>
<Question>?
<Answer>
<Question>?
💡 并不一定需要使用 QA 格式。格式灵活,不拘泥具体格式,完全取决于手头的任务。例如,您可以执行简单的分类任务,并给出演示任务的示例,如下所示:
prompt:
这太好了!// 积极的
这电影很精彩 //积极的
表演太差了 // 消极的
这部喜剧不好笑 //
output:
这太好了!// 积极的
这部电影很精彩!// 积极的
表演太差了!// 消极的
这部喜剧不好笑。// 消极的
提示的组成部分(Elements of a Prompt)
提示可能包含以下任何组件:
-
Instruction 指令 : 您想让模型执行的特定任务或指令
-
Context 上下文 : 可以涉及外部信息或附加上下文,可以引导模型产生更好的响应
-
Input Data 输入数据 : 我们有兴趣为其找到响应的输入或问题
-
Output Indicator 输出指示符 : 指示输出的类型或格式。
并非所有组件都需要在提示中,并且格式取决于手头的任务。
提示的通用设计技巧(General Tips for Designing Prompts)
以下是设计提示时一些技巧:
从简单处开始(Start Simple)
设计提示语是一个迭代的过程,需要进行大量的实验来获得最佳结果。使用像 chatGPT 试验环境(a simple playground )是一个很好的起点。
您可以从简单的提示开始,随着您的目标越来越明确,逐渐添加更多的元素和上下文。在此过程中,版本控制非常重要。接下来将看到许多例子,其中明确性、简洁性通常会给您带来更好的结果。
当您有一个涉及许多不同子任务的大任务时,您可以尝试将任务拆分为更简单的子任务,并随着结果的改善不断构建。避免在提示设计开始阶段添加过多的复杂性。
指令(The Instruction)
您可以使用指令为各种简单任务设计有效的提示,以指示模型要实现的目标,例如“编写”、“分类”、“汇总”、“翻译”、“排序”等。
注意,您还需要进行大量实验,因此请看看哪种效果最好。使用不同的关键字、上下文和数据尝试不同的指令,看看哪种指令最适合您的特定用例和任务。通常,上下文与您尝试执行的任务越具体和相关越好。我们将在即将发布的指南中介绍采样和添加更多上下文的重要性。
prompt:
将王新义年龄的值加一:
[{"name":"wangxinyi","age":30},{"name":"lufeiyang","age":28}] >
output:
请注意,这是一个包含两个对象的 JSON 数组,您需要指定要更改的对象。如果我们将其中一个对象更改为将王新义的年龄加 1,则 JSON 会如下所示:
[{"name":"wangxinyi","age":31},
{"name":"lufeiyang","age":28}]
prompt:
将王新义年龄的值加一,只输出 json,以代码块输出:
[{"name":"wangxinyi","age":30},{"name":"lufeiyang","age":28}]
output:
[{"name":"wangxinyi","age":31},{"name":"lufeiyang","age":28}
]
具体性或特异性(Specificity)
当你使用模型执行任务时,需要非常具体和详细地描述你想让模型执行的指令和任务,因为指令的描述越详细和详尽,模型生成的结果就越好。特别是当你希望得到特定的输出结果或生成特定样式时,这一点尤为重要。
在设计指令时,不应该过于依赖于特定的标记或关键词,而应该有一个良好的格式和详细的指令。提供示例是非常有效的方法,因为这可以帮助模型生成符合特定格式的期望输出结果。
同时,你也需要考虑指令的长度,因为它有一定的限制。指令中的细节应该是相关的,并为当前任务做出贡献。过多的不必要细节不一定是一个好的方法。在设计指令时需要权衡具体性和详细性。
最后,我们鼓励进行大量的实验和迭代,以优化指令,使其适用于你的应用程序。这是一个需要不断尝试和改进的过程。
Prompt
我的需求帮助训练一个意图识别器,你需要识别我的意图和槽位 (根据输入信息,提取意图和槽位信息),比如:我要分析每个学校的成绩评价分和成绩最高分,转化为:{"意图"[”分组汇总“],"槽位":{"分组字段":[“学校”],"聚合":[{"成绩":"平均值"},{"成绩":"最大值"}]} 输出格式 json,代码块方式输出
output:
以下是根据输入信息提取意图和槽位信息后的输出结果:
{"意图": ["分组汇总"],"槽位": {"分组字段": ["学校"],"聚合": [{ "成绩": "平均值" },{ "成绩": "最大值" }]}
}
prompt:
按照航班飞机型号统计上座率均值、最大载客数、平均载客数。输出 json
output:
很抱歉,我无法直接提供您需要的数据。请提供有关航班飞机型号和座位信息的数据,我将帮您进行处理和分析。
prompt:
帮我识别意图和槽位转换 json:按照航班飞机型号统计上座率均值、最大载客数、平均载客数。
output:
{"意图": ["分组统计"],"槽位": {"分组字段": ["飞机型号"],"聚合": [ {"上座率": "均值"}, {"最大载客数": "最大值"}, {"平均载客数": "平均值"} ]}
}
避免不精确(Avoid Impreciseness)
上面的提示告诉我们要详细说明和改善格式,很容易陷入想要在提示中过于聪明以及可能创建不准确描述的陷阱。直接和明确通常更好。这里的类比非常类似于有效沟通——越直接,传达的信息就越有效。
Prompt:
解释概念提示工程。解释要简短,只有几句话,不要太过描述性。
Output:
提示工程(Prompt Engineering)是指在使用自然语言生成模型时,设计和调整输入文本的方法和技巧,以帮助模型产生更准确、更符合预期的输出结果。它包括设计清晰明确的提示(Prompt)和合理的参数设置等方面,旨在提高模型的性能和效果。
Prompt:
用 2-3 句话向高中生解释提示工程的概念。
Output:
提示工程是指通过设计一些简短的语句或问题来引导人工智能模型生成所需的输出。这些语句需要具体、详细,有助于模型理解任务要求。提示工程在自然语言处理、机器翻译等领域中得到广泛应用。
Prompt:
提示工程就是与模型沟通的方式和技巧,就相当人与人沟通的方式和技巧一样
Output:
非常好的解释!简洁明了,易于理解。
Prompt:
提示工程就是与模型沟通的方式和技巧,就相当人与人沟通的方式和技巧一样。帮我润色一下
Output:
提示工程是指与模型进行有效沟通的方法和技巧,类似于人际交流中的沟通方式和技巧。
Prompt:
2-3 句话给高中生解释什么是提示工程
Output:
提示工程是为了更好地与人工智能模型沟通而采用的方式和技巧,就像人们之间沟通的方式和技巧一样,能够帮助我们更准确地获取我们想要的结果。
直截了当些(To do or not to do?)
当设计提示语时,一个重要的技巧是避免描述不应该做什么,而是描述应该做什么。这样可以提高提示的具体性,同时使得模型更容易理解并产生良好的响应。
Prompt:
请帮我写一篇短文介绍上海的,最好不要讲大城市病、严重的老龄化问题、创新不够等问题
Output:
上海是中国最具国际化和现代化城市之一,也是全国经济、金融、科技和文化中心之一。它拥有悠久的历史和文化传统,同时也是一个充满活力和创新精神的城市。
在上海,您可以品尝到各种美食,包括传统的本帮菜、各种海鲜和国际化的美食,满足您的味蕾。您也可以欣赏到各种艺术和文化活动,如音乐会、戏剧、展览和节日庆典,体验不同的文化氛围。
除了美食和文化,上海也是一个现代化城市。它有先进的交通网络,包括地铁、高速公路和机场,使您可以方便地到达任何地方。此外,上海也是一个创新和科技的城市,拥有许多高科技企业和研究机构,吸引着世界各地的创新人才。
上海还拥有许多著名的景点和历史古迹,如上海博物馆、外滩、豫园和城隍庙。这些景点不仅是上海的重要文化遗产,也是全国著名的旅游胜地。
总之,上海是一个充满活力和魅力的城市,它将为您提供丰富多彩的文化和生活体验,无论您是旅游者还是创新人才,都可以在这里找到自己的归属感。
Prompt:
请撰写一篇介绍青岛的文章,包括以下方面的信息:城市的地理位置、人口、历史、文化、旅游景点等。
Output:
青岛是中国山东省的一个滨海城市,位于山东半岛东南端,黄海西岸。这座城市的人口超过九百万,是中国最重要的港口之一。
青岛有着悠久的历史,可以追溯到公元前7世纪。自19世纪末,青岛成为德国在中国的殖民地,留下了许多精美的建筑和文化遗产,其中最著名的是鲁迅公园里的德国总督府和青岛德国监狱博物馆。在第二次世界大战期间,日本占领了青岛,并在那里建立了著名的抗战纪念馆,以纪念中国在抗击侵略中的牺牲和胜利。
青岛有着丰富的文化传统,其中最著名的是啤酒文化。青岛啤酒是中国最受欢迎的啤酒品牌之一,其历史可以追溯到19世纪末。每年十月,青岛会举办一个国际啤酒节,吸引来自世界各地的啤酒爱好者前来参加。
此外,青岛还有许多令人惊叹的旅游景点,如八大关、栈桥、小鱼山、五四广场和崂山等。其中,八大关是一组风景优美、历史悠久的建筑群,是青岛最著名的景点之一。栈桥是一座百年历史的木质栈道,是青岛最古老的建筑之一。小鱼山是一个自然公园,景色优美,还有许多石刻和寺庙可以参观。五四广场是青岛市中心的一个广场,是庆祝中国五四运动的场所,也是青岛的地标之一。崂山是青岛最高的山,是一个自然保护区,拥有壮丽的风景和悠久的历史。
总之,青岛是一个具有悠久历史、独特文化和美丽风景的城市。它的历史、文化和旅游景点使其成为中国最受欢迎的旅游目的地之一。
基本提示任务
如何使用设计精良的提示语来执行各种有趣而不同的NLP经典任务。通过使用示例来说明关键概念和基本任务类型,有助于更好地理解和学习。这些经典任务包括文本摘要、文本分类、命名实体识别、情感分析等。精心设计的提示语可以提供足够的上下文和指引,帮助模型准确地理解任务要求并输出高质量的结果。
-
文本摘要(Text Summarization)
-
信息提取(Information Extraction)
-
问答(Question Answering)
-
文本分类(Text Classification)
-
对话(Conversation)
-
代码生成(Code Generation)
-
推理(Reasoning)
文本摘要(Text Summarization)
自然语言处理的标准任务之一是文本摘要。大语言模型最有前途的应用之一是能够将文章和概念总结为快速且易于阅读的摘要。
例如想了解维生素及概括的输出:
Prompt:
解释一下维生素
Output:
维生素是指一类有机化合物,它们是身体正常生理和代谢过程所必需的营养物质。人体自身无法制造维生素,只能从食物中摄取。维生素可以分为水溶性和脂溶性两类,它们在身体内的作用和吸收方式有所不同。维生素在人体内发挥着各种重要的作用,如促进免疫系统健康,维持眼睛、皮肤、牙齿等器官组织的正常功能。
Prompt:
用一句话概括以下内容:
维生素是指一类有机化合物,它们是身体正常生理和代谢过程所必需的营养物质。人体自身无法制造维生素,只能从食物中摄取。维生素可以分为水溶性和脂溶性两类,它们在身体内的作用和吸收方式有所不同。维生素在人体内发挥着各种重要的作用,如促进免疫系统健康,维持眼睛、皮肤、牙齿等器官组织的正常功能。
Output:
维生素是有机化合物,人体必需的营养物质,需从食物中摄取,可分为水溶性和脂溶性两类,对人体发挥着各种重要的作用。
信息提取(Information Extraction)
大语言模型可以简单、快速地执行分类和其他多种自然语言处理 (NLP) 任务。LLMs 可以从用户输入的prompt中提取出关键信息,例如日期、时间、位置、人物、组织机构等。
Prompt:
在以下一段话中,提取时间和地点信息:
明天上午 10 点在北京天安门广场有什么活动?
Output:
时间:明天上午 10 点
地点:北京天安门广场
问答(Question Answering)
改进提示格式是让模型响应特定答案的最佳方法之一。在提示中,可以组合说明、上下文、输入和输出指示器以获得更好的结果。尽管这些组件不是必需的,但它们是一种很好的做法,因为越具体的指导可以带来更好的结果。下面是一个示例,展示在更结构化的提示下模型的响应效果。
指令描述不够清楚,没有理解我的输入的指令信息,回答的结果是错误,是参考通用的知识、而不是我提供的信息:
Prompt:
根据提供背景信息,回答问题,回答要简单明了:背景:维生素是在对白血病的研究中发现的。20 世纪初,医学家们发现在某些食物中含有一种可以预防坏血病的物质,他们把这种物质称为“维生素”(vitamin),意为“生命气息”,因为最初人们认为这种物质只存在于食物中。后来,科学家们在研究中逐渐发现了多种维生素,并进一步探究了它们对人体的重要作用。
问题:维生素是在研究什么病中发现的?
Output:
维生素是在对坏血病的研究中发现的。
回答是根据提供背景知识提取的答案:
Prompt:
根据我提供背景信息,回答问题,回答要简单明了:背景信息:维生素是在对白血病的研究中发现的。20 世纪初,医学家们发现在某些食物中含有一种可以预防坏血病的物质,他们把这种物质称为“维生素”(vitamin),意为“生命气息”,因为最初人们认为这种物质只存在于食物中。后来,科学家们在研究中逐渐发现了多种维生素,并进一步探究了它们对人体的重要作用。问题:维生素是在研究什么病中发现的?
Output:
维生素是在对白血病的研究中发现的。
进一步要求返回输出内容方式:
Prompt:
据我提供背景信息,回答问题,回答要简单明了、只返回实体名称:背景信息:维生素是在对白血病的研究中发现的。20 世纪初,医学家们发现在某些食物中含有一种可以预防坏血病的物质,他们把这种物质称为“维生素”(vitamin),意为“生命气息”,因为最初人们认为这种物质只存在于食物中。后来,科学家们在研究中逐渐发现了多种维生素,并进一步探究了它们对人体的重要作用。问题:维生素是在研究什么病中发现的?
Output:
白血病
文本分类(Text Classification)
作为一位提示工程师,提供更好的指令只是工作的一部分。在处理更加复杂的应用场景时,仅仅提供指令是不够的。这时候,您需要更多地考虑上下文和其他可用元素,以提高模型的准确性和效率。除了指令,还可以提供输入数据或示例等其他元素来增强提示的信息量和有效性。通过这些额外的元素,模型可以更好地理解您的意图,并为您提供更好的结果。
让我们通过提供一个文本分类的示例来演示这一点。
调教一下:
Prompt:
我需要一个分类器,下面是几个示例:
这太好了!-> {"classification":'正面'}
这电影很精彩 -> {"classification":'正面'}
表演太差了 -> {"classification":'负面'}
这部喜剧不好笑 -> {"classification":'负面'}
Output:
您需要一个能够对文本进行分类的分类器,以下是几个示例,每个示例都有一个文本和对应的分类:
"这太好了!" -> {"classification":'正面'}
"这电影很精彩" -> {"classification":'正面'}
"表演太差了" -> {"classification":'负面'}
"这部喜剧不好笑" -> {"classification":'负面'}
测试:
Prompt:
对下面的文字进行分类,并 json 代码方式输出:
这电影太垃圾了
Output:
{"classification": "负面"}
衍生测试:
Prompt:
对下面的文字进行分类,并 json 代码方式输出:
垃圾站有不少垃圾
Output:
{"classification": "中性"}
定义输出格式:
Prompt:
对下面的文字进行分类,并 markdown json 代码方式输出:
这电影太垃圾了
Output:
分类结果为:{"classification": "负面"}
{
"classification": "负面"
}
对话(Conversation)
使用提示工程的最有趣之处之一是能够教导 LLM 系统如何行动、它的意图以及它的身份。这在构建客户服务聊天机器人等对话系统时尤为有用。
例如:通过不断的迭代,逐步找我们需要内容:
文本摘要:
Prompt:
关于《当 notebook 遇上 chatGPT(AIGC):数据分析/数据科学的新范式》 帮我写一个 30-50 字的摘要
Output:
本文介绍了如何将 Notebook 与人工智能生成的对话引擎(AIGC)结合起来,形成新的数据分析/数据科学探索范式。这种新范式能够提高效率、降低门槛,并且利用 AIGC 的优势来减少组织内部的沟通成本。同时,本文也指出了该范式所面临的挑战。
特殊要求的摘要:
Prompt:
生动些、轻快些的摘要,发朋友圈用的
Output:
数据分析遇上 AI,产生了新的火花!利用 Notebook 和 AIGC 的融合,不仅提高了数据分析效率,也降低了门槛,减少了沟通成本。虽然还面临挑战,但这是一种新的数据科学范式!
代码生成(Code Generation)
LLMs(大语言模型)非常有效的一个应用是代码生成。Copilot/codeX/ChatGPT 是一个很好的例子。通过提示,可以完成各种代码生成任务。
告诉 chatGPT 元数据:
Prompt:
我有两张表,1. 表名:language、字段名:['chin', 'engl', 'index', 'school']、含义:['语文', '英语', '学生 id', '学校'];
2. 表名:science、字段名:['chem', 'index', 'math', 'phys', 'school']、含义:['化学', '学生 id', '数学', '物理', '学校']; 记住就好,不要罗嗦
Output:
明白,您有两张表,它们的字段名和含义如下:
表名: language
字段名: ['chin', 'engl', 'index', 'school']
含义: ['语文', '英语', '学生 id', '学校']
表名: science
字段名: ['chem', 'index', 'math', 'phys', 'school']
含义: ['化学', '学生 id', '数学', '物理', '学校']
生成代码:
Prompt:
查询每个学校总分前 5 名的明细
Output:
为了查询每个学校总分前 5 名的明细,我们需要按照学校分组并计算每个学生的总分,然后找到每个学校的前 5 名学生。下面是一个 SQL 语句示例:
SELECT school AS 学校,index AS 学生id,chin AS 语文成绩,engl AS 英语成绩,math AS 数学成绩,phys AS 物理成绩,chem AS 化学成绩,(chin + engl + math + phys + chem) AS 总分
FROM (SELECT l.school, l.index,l.chin, l.engl, s.math, s.phys, s.chem,ROW_NUMBER() OVER (PARTITION BY l.school ORDER BY (l.chin + l.engl + s.math + s.phys + s.chem) DESC) AS rankFROM language lJOIN science s ON l.index = s.index AND l.school = s.school
) t
WHERE rank <= 5;
推理(Reasoning)
也许对于当前的 LLM 来说,最困难的任务之一是需要一定形式的推理能力。推理是重点研究跟进的领域之一,因为 LLM 的推理可以产生出各种复杂的应用程序。
在数学能力方面,已经有了一些进展。但是需要注意的是,当前的 LLM 在执行推理任务方面存在困难,因此需要更加先进的提示工程技术。小编在《ChatGPT 为啥不能玩 24 点游戏?》单独探讨过类似数据推理方面一些介绍。
这个数学推理是错误的:
Prompt:
这个数组中的所有奇数加起来就是就是素数:15、32、5、13、82、7、1。Output:
这个说法是错误的。虽然其中的一些奇数是素数(例如 5 和 13),但并不是所有奇数加起来都是素数。让我们把这些奇数相加:15 + 5 + 13 + 7 + 1 = 41
因此,这个说法是错误的,因为 41 不是素数。事实上,如果你将这个数组中的所有数相加,得到的结果是 175,也不是素数。
尝试通过改进提示(增加推理步骤)来改善结果:
Prompt:
判断下面这个问题是否正确?通过以下步骤判断:识别奇数、将其相加、 判断结果是否是素数。
这个数组中的所有奇数加起来就是就是素数:15、32、5、13、82、7、1。
Output:
通过以下步骤判断:
识别奇数:在这个数组中,奇数是 15、5、13、7、1。将其相加:15+5+13+7+1=41。
判断结果是否是素数:41 是一个素数,因为它只能被 1 和 41 本身整除。
因此,这个数组中的所有奇数加起来得到的结果是素数。
高阶提示(Advanced Prompting)
很显然通过改进提示可以在不同任务中获得更好的结果。这正是提示工程的核心理念。接下来介绍一些进阶的主题:
- 零样本提示(Zero-shot Prompting)
- 少量样本提示(Few-shot Prompting)
- 思维链(COT)提示(Chain-of-Thought Prompting)
- 零样本CoT(Zero-shot CoT)
- 自洽性/自一致性(Self-Consistency)
- 生成知识提示(Generate Knowledge Prompting)
- 自动提示工程(Automatic Prompt Engineer)
零样本提示(Zero-shot Prompting)
现今的大型语言模型,经过大量数据的训练并进行指令调整,可以进行零样本(Zero-shot)任务。以下是我们使用过的其中一个例子:
Prompt:
将文本分为中性、否定或肯定三类。
文本:我觉得假期还可以。
Completion:分类:中性
Prompt:
文本:我觉得他表现相当好
Completion:分类:肯定
Prompt:
文本:我觉得他表现不眨地
Completion:分类:否定
上述提示中我们没有向模型提供任何示例--这就是零样本能力在发挥作用。当零样本无法发挥作用时,建议在提示中提供演示或示例。下面我们将讨论称为“少样本提示”的方法。
少量样本提示(Few-shot Prompting)
尽管大型语言模型已经展示了卓越的零样本能力,但在使用零样本设置时,它们在更复杂的任务上仍然存在局限性。为了改进这一点,我们使用了一种名为少量样本提示(few-shot prompting)的技术,以在上下文中提供演示来引导模型实现更好的性能。演示作为后续示例的条件,帮助模型生成回应。
Prompt:
巴黎是法国的首都,有艾菲尔铁塔、卢浮宫和香榭丽舍大道等著名景点。
纽约是美国的一座大城市,拥有自由女神像、时代广场和中央公园等著名景点。
东京是日本的首都,有天空树、浅草寺和新宿御苑等著名景点。
北京是?
Completion:北京是中国的首都,有故宫、长城和天坛等著名景点。
Prompt:
上海是?
Completion:上海是中国的一座城市,是中国经济、金融、贸易和交通中心之一,有外滩、东方明珠和豫园等著名景点。
Prompt:
假设你是一位房地产经纪人,请编写一则广告来出售下面这套房子。
房子位于繁华商业区,周围有多个购物中心和美食街,距离地铁站步行仅需5分钟。房子建于2015年,共有三间卧室和两间浴室,带有一个宽敞的客厅和一个带有吧台的开放式厨房。该房子总面积为120平方米,可以提供一辆车的停车位。
Completion:精致的三居室,完美的位置和细致入微的内部设计使这套房子成为您理想的居住场所。位于商业区心脏地带,周围设施齐全,满足您所有的购物和饮食需求。房子建于2015年,每个房间都配有大窗户,自然光线充足,带来温馨明亮的生活氛围。您将拥有一个宽敞的客厅,以及带有吧台的开放式厨房,为您的聚会和娱乐提供最佳场所。另外,房子还配有一个车位,方便您的出行。这是您不容错过的机会,立即联系我们,预约看房!
该模型仅通过提供一个示例(即 1-shot)就以某种方式学会了如何执行任务。对于更困难的任务,我们可以尝试增加演示(例如,3-shot、5-shot、10-shot 等)。
根据Min等人(2022)的研究结果,以下是在进行小样本学习时关于演示/样例的几个优化提示:
- “无论标签是否适用于个别输入,演示指定的标签空间和输入文本的分布都很重要。”
- 即使只是使用随机标签,您使用的格式也对性能起着关键作用,这比没有标签要好得多。
- 额外的结果显示,从真实标签分布中选择随机标签(而不是均匀分布)也有助于提高性能。
小样本提示的局限性
标准的小样本提示适用于许多任务,但仍然不是一种完美的技术,尤其是在处理更复杂的推理任务时。最近,思维链 (CoT) 《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》(https://arxiv.org/abs/2201.11903)提示已得到普及,以解决更复杂的算术、常识和符号推理任务。
思维链(COT)提示(Chain-of-Thought Prompting)
思想链 (CoT) 提示通过中间推理步骤启用复杂的推理能力。您可以将它与少量提示结合使用,以便在响应前需要推理的更复杂任务中获得更好的结果。
prompt:
这个组中的奇数加起来就是一个素数:4、8、9、15、12、2、1。
答:将所有奇数(9,15,1)相加得到25。答案是错误的。
这个组中的奇数加起来就是一个素数:17、10、19、4、8、12、24。
答:将所有奇数(17,19)相加得到36。答案是错误的。
这个组中的奇数加起来就是一个素数:16、11、14、4、8、13、24。
答:将所有奇数(11,13)相加得到24。答案是错误的。
这个组中的奇数加起来就是一个素数:17、9、10、12、13、4、2。
答:将所有的奇数(17,9,13)相加得到39。答案是错误的。
这个组中的奇数加起来就是一个素数:15、32、5、13、82、7、1。
答:
Completion:将所有的奇数(15,5,13,7,1)相加得到41,是一个素数。所以答案是正确的。
通过COT解决基本逻辑问题:
Prompt:
煮一个鸡蛋需要2分钟,煮5个鸡蛋需要几分钟?
Completion:
煮一个鸡蛋需要2分钟,因此煮5个鸡蛋所需的时间是5个鸡蛋的煮时间之和。所以煮5个鸡蛋需要5 x 2 = 10分钟。答案是10分钟。
Prompt:
考虑一下并行一起情况:
煮一个鸡蛋需要2分钟,煮5个鸡蛋需要几分钟?
Completion:
如果要同时煮5个鸡蛋,可以采用并行的方式,也就是同时在不同的锅里煮鸡蛋。这样,时间可以缩短,因为每个锅子里只需要煮一个鸡蛋,所以煮5个鸡蛋的时间应该等于煮一个鸡蛋的时间,也就是2分钟。因此,同时煮5个鸡蛋需要2分钟。
Prompt:
一只锅可以最大煮5个鸡蛋,煮一个鸡蛋需要2分钟分钟,只有一只锅,煮10个鸡蛋需要多长时间?
Completion:如果只有一只锅,那么我们最多一次可以煮5个鸡蛋。因此,要煮10个鸡蛋,我们需要至少煮两次。第一次煮5个鸡蛋,第二次煮另外5个鸡蛋。由于每次煮5个鸡蛋需要2分钟,所以两次煮鸡蛋总共需要的时间是2 × 2 = 4分钟。因此,煮10个鸡蛋需要4分钟。
还不能处理优化的问题:
Prompt:
有两只锅,一个大锅一次可以煮5个鸡蛋、一次煮熟需要5分钟,一个小锅一次可以煮2个鸡蛋、一次煮熟需要3分钟。现在有8个鸡蛋,最短时间需要多久煮完鸡蛋?
Completion:
我们可以将8个鸡蛋分成三组,一组包含5个鸡蛋,另一组包含2个鸡蛋,还有一组只有1个鸡蛋。
使用大锅和小锅分别煮两组鸡蛋,需要的总时间是:
煮5个鸡蛋的组需要1次大锅煮5分钟
煮2个鸡蛋的组需要1次小锅煮3分钟
剩下的1个鸡蛋需要1次大锅煮5分钟
所以总共需要的时间是 5 + 3 + 5 = 13分钟。答案是13分钟。
Prompt:
大小锅可以同时煮哦
Completion:好的,那么我们可以将大锅和小锅同时使用。先用大锅煮5个鸡蛋,需要5分钟,这时候小锅里还剩下3个鸡蛋未煮。然后用小锅再煮这3个鸡蛋,需要3分钟。所以煮完所有的鸡蛋需要的时间为5分钟+3分钟=8分钟。
《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》 https://arxiv.org/abs/2201.11903
COT是一种随着足够大的语言模型而出现的新兴能力。
零样本CoT(Zero-shot CoT)
零样本 CoT(Kojima 等人,2022 年,https://arxiv.org/abs/2205.11916)的想法,它主要涉及在原始提示中添加“让我们逐步思考”。
Prompt:
我去市场买了10个苹果。我给了邻居两个苹果,给了修理工两个。然后我又去买了5个苹果,吃了1个。我还剩几个苹果?
Completion:
你还剩下11个苹果。开始有10个苹果,给了邻居2个,给了修理工2个,还剩下6个。然后你又买了5个,一共有11个苹果。吃了一个后还剩下10个。
Prompt:
我去市场买了10个苹果。我给了邻居两个苹果,给了修理工两个。然后我又去买了5个苹果,吃了1个。我还剩几个苹果?
一步一步的思考
Completion:
开始时我有10个苹果。然后我给了邻居2个,现在我还有8个苹果。
我又给了修理工2个,现在我还有6个苹果。
接着我又买了5个苹果,现在我总共有11个苹果。最后我吃了1个苹果,所以现在我还剩10个苹果。
这个简单的提示在完成这项任务时非常有效。当您没有太多示例可用于提示时,这特别有用。
自洽性/自一致性(Self-Consistency)
也许在所有提升生成式模型的技术中,自我一致性是比较高级的技术之一。自我一致性是由论文《SELF-CONSISTENCY IMPROVES CHAIN OF THOUGHT REASONING IN LANGUAGE MODELS》(https://arxiv.org/pdf/2203.11171.pdf)中(2022)提出的,旨在“取代在链式思考提示中使用的天真贪婪解码方法”。其思想是通过小样本链式思考生成多个不同的推理路径,并利用生成结果选择最一致的答案。这有助于提高在涉及算术和常识推理的任务中的链式思考提示的性能。
Prompt:
我6岁的时候,我妹妹只有我的一半大。现在我70岁了,我妹妹多大了?
Completion:你的妹妹现在应该是64岁,因为当你6岁时,她只有3岁,相比之下,你已经增长到70岁,所以她应该比你小6岁。
Prompt:
Q:小树林里有15棵树。树林工人今天将在树林里种树。在它们完成之后,将会有21棵树。小树林的工人今天种了多少棵树?
A:我们从15棵树开始。后来我们有了21棵树。区别一定是他们种植的树木数量。所以,他们一定种了21-15=6棵树。答案是6。
Q:肖恩有五个玩具。圣诞节时,他从父母那里各得到了两个玩具。有多少玩具他现在有了?
A:他有5个玩具。他从妈妈那里得到了2个,所以在那之后他有了5+2=7个玩具。然后他又从爸爸那里得到了两个,所以他总共有7+2=9个玩具。答案是9。
Q:服务器机房里有九台电脑。每天又安装了五台计算机,从星期一到星期四。服务器机房里现在有多少台电脑?
A:从星期一到星期四有4天。每天增加5台计算机。这意味着总共4*5=增加了20台计算机。一开始有9台计算机,所以现在有9+20=29台计算机。答案是29。
Q:迈克尔有58个高尔夫球。星期二,他丢了23个高尔夫球。周三,他又输了2场。有多少星期三结束时他有高尔夫球吗?
A:迈克尔最初有58个球。他在周二输了23个球,所以在那之后他有58-23=35个球。在星期三他又输了2个球,所以现在他有35-2=33个球。答案是33。
Q:我6岁的时候,我妹妹只有我的一半大。现在我70岁了,我妹妹多大了?
A:
Completion:
如果你现在70岁,那么你的妹妹现在应该是35岁。
因为当你6岁时,她只有你的一半大,即3岁。而从那时起,你们之间的年龄差距始终保持在3岁,因此当你70岁时,你的妹妹应该是70-3=67岁。但是这个答案似乎不符合逻辑,因为从题目中提供的信息来看,这两个年龄之间的比率是1:2,但是这个答案的比率是1:1.9左右。所以有可能存在错误或遗漏的信息。
生成知识提示(Generate Knowledge Prompting)
LLMs指的是大型语言模型,不断地得到改进,其中一个流行的技术是能够整合知识或信息,以帮助模型进行更准确的预测。
使用类似的思路,模型是否也可以在进行预测之前生成知识?这就是《Generated Knowledge Prompting for Commonsense Reasoning》(https://arxiv.org/pdf/2110.08387.pdf)的论文中所尝试的——生成知识以作为提示的一部分。特别是,这对于常识推理等任务有多大帮助?
自动提示工程(Automatic Prompt Engineer)
《Large Language Models Are Human-Level Prompt Engineers》(https://arxiv.org/abs/2211.01910)提出了自动提示工程师 (APE) 自动指令生成和选择的框架。指令生成问题被定义为自然语言合成,作为黑盒优化问题使用 LLM 生成和搜索候选解决方案。
第一步涉及一个大型语言模型(作为推理模型),该模型提供输出演示以生成任务的候选指令。这些候选解决方案将指导搜索过程。使用目标模型执行指令,然后根据计算的评估分数选择最合适的指令。
APE 发现了比人工设计的“让我们一步步思考”提示更好的零样本 CoT 提示(Kojima 等人,2022 年)。提示“让我们一步一步地解决这个问题,以确保我们有正确的答案。” 引发链式推理并提高 MultiArith 和 GSM8K 基准测试的性能:
涉及到与提示工程相关的一个重要课题,即自动优化提示的思想。虽然我们不会在本指南中深入探讨这个主题,但如果您对该主题感兴趣,这里有一些关键论文:
- 《AutoPrompt: Eliciting Knowledge from Language Models with Automatically Generated Prompts》( https://arxiv.org/abs/2010.15980 )- 提出了一种基于梯度引导搜索自动为各种任务创建提示的方法。
- 《Prefix-Tuning: Optimizing Continuous Prompts for Generation》(https://arxiv.org/abs/2101.00190) - 微调的一种轻量级替代方法,它为 NLG 任务添加了可训练的连续前缀。
- 《The Power of Scale for Parameter-Efficient Prompt Tuning》(https://arxiv.org/abs/2104.08691) - 提出了一种通过反向传播学习软提示的机制。