Prompt Engineering 提示工程

提示工程(Prompt engineering) 

现在的ChatGPT(也称为LLM,即大型语言模型)已经成为了执行各种先进任务的重要工具。无论是对于文本摘要、问答系统、对话机器人,还是数学推理、代码生成等领域,ChatGPT都展现出了其强大的能力和潜力。 

基本提示(Basic Prompts) 

可以通过提示实现很多功能,但结果的质量取决于您提供的信息量。提示(Prompt)可以包含指令(instruction )问题(question),以及其他详细信息,例如背景信息输入(input)示例(examples)

例如:为了让模型生成描述“今天上海天空”的语句,我们可以通过逐步优化输入提示信息来帮助模型完成任务。 

  • “Prompt: 天空是” ,语言模型输出一系列与“天空是”这个上下文相关(只有指令和问题,没有背景信息)的字符串。输出结果是通用的知识,与我们想要实现的任务相差甚远。
  • 试着稍微改进一下:“根据今天天气情况,完成描述今天天气的句子: 天空是” 
  • 进一步细化地点(没有今天天气信息):“根据上海今天天气情况,完成描述今天天气的句子: 天空是” 
  • 告诉 LLMs 模型今天是晴天:“根据上海今天晴天,完成描述今天天气的句子: 天空是” 

我们告诉模型去完成这个句子的上下文背景信息,所以结果看起来更好,因为它严格按照我们告诉它要做什么(“完成句子”)来进行。这种通过设计最佳提示语来指导模型执行任务的方法被称为提示工程。 

标准的提示(Standard Prompts) 

标准提示具有的格式: 

(question)? 也可以格式化为 QA 格式,这是许多 QA 数据集的标准格式,如下所示:“Q: ?  A:”

并不一定需要使用 QA 格式。格式灵活,不拘泥具体格式,完全取决于手头的任务。

提示的组成部分(Elements of a Prompt) 

提示可能包含以下任何组件:

  • Instruction 指令 : 您想让模型执行的特定任务或指令
  • Context 上下文 : 可以涉及外部信息或附加上下文,可以引导模型产生更好的响应
  • Input Data 输入数据 : 我们有兴趣为其找到响应的输入或问题
  • Output Indicator 输出指示符 : 指示输出的类型或格式。 

并非所有组件都需要在提示中,并且格式取决于手头的任务。

提示的通用设计技巧(General Tips for Designing Prompts) 

以下是设计提示时一些技巧: 

  • 从简单处开始(Start Simple) : 设计提示语是一个迭代的过程,需要进行大量的实验来获得最佳结果。可以从简单的提示开始,随着您的目标越来越明确,逐渐添加更多的元素和上下文。当有一个涉及许多不同子任务的大任务时,可以尝试将任务拆分为更简单的子任务,并随着结果的改善不断构建。避免在提示设计开始阶段添加过多的复杂性。
  • 指令(The Instruction): 可以使用指令为各种简单任务设计有效的提示,以指示模型要实现的目标,例如“编写”、“分类”、“汇总”、“翻译”、“排序”等。 注意,还需要进行大量实验,因此请看看哪种效果最好。使用不同的关键字、上下文和数据尝试不同的指令,看看哪种指令最适合您的特定用例和任务。通常,上下文与尝试执行的任务越具体和相关越好。 
  • 具体性或特异性(Specificity): 指令的描述越详细和详尽,模型生成的结果就越好。特别是当你希望得到特定的输出结果或生成特定样式时,这一点尤为重要。在设计指令时,不应该过于依赖于特定的标记或关键词,而应该有一个良好的格式和详细的指令。提供示例是非常有效的方法,因为这可以帮助模型生成符合特定格式的期望输出结果。同时,你也需要考虑指令的长度,因为它有一定的限制。过多的不必要细节不一定是一个好的方法。在设计指令时需要权衡具体性和详细性。Prompt: 我的需求帮助训练一个意图识别器,你需要识别我的意图和槽位 (根据输入信息,提取意图和槽位信息),比如:我要分析每个学校的成绩评价分和成绩最高分,转化为:{"意图"[”分组汇总“],"槽位":{"分组字段":[“学校”],"聚合":[{"成绩":"平均值"},{"成绩":"最大值"}]} 输出格式 json,代码块方式输出
  • 避免不精确(Avoid Impreciseness):  上面的提示告诉我们要详细说明和改善格式,很容易陷入想要在提示中过于聪明以及可能创建不准确描述的陷阱。直接和明确通常更好。这里的类比非常类似于有效沟通——越直接,传达的信息就越有效。Prompt: 解释概念提示工程。解释要简短,只有几句话,不要太过描述性。Prompt: 用 2-3 句话向高中生解释提示工程的概念(2-3 句话给高中生解释什么是提示工程)。
  • 直截了当些(To do or not to do?): 当设计提示语时,一个重要的技巧是避免描述不应该做什么,而是描述应该做什么。这样可以提高提示的具体性,同时使得模型更容易理解并产生良好的响应。Prompt: 请帮我写一篇短文介绍上海的,最好不要讲大城市病、严重的老龄化问题、创新不够等问题。Prompt: 请撰写一篇介绍青岛的文章,包括以下方面的信息:城市的地理位置、人口、历史、文化、旅游景点等。 

基本提示任务 

如何使用设计精良的提示语来执行各种有趣而不同的NLP经典任务。通过使用示例来说明关键概念和基本任务类型,有助于更好地理解和学习。这些经典任务包括文本摘要、文本分类、命名实体识别、情感分析等。精心设计的提示语可以提供足够的上下文和指引,帮助模型准确地理解任务要求并输出高质量的结果。 

  • 文本摘要(Text Summarization) :自然语言处理的标准任务之一是文本摘要。大语言模型最有前途的应用之一是能够将文章和概念总结为快速且易于阅读的摘要。Prompt: 用一句话概括以下内容:(xxx)。常用的英文提示语:summarize the main content of a full text (总结全文要点); Give me the plot summaries (给我提供情节摘要); Create synopsis paragraphs of this book(写出这本书的概要段落)
  • 信息提取(Information Extraction) : 大语言模型可以简单、快速地执行分类和其他多种自然语言处理 (NLP) 任务。LLMs 可以从用户输入的prompt中提取出关键信息,例如日期、时间、位置、人物、组织机构等。Prompt: 在以下一段话中,提取时间和地点信息: 明天上午 10 点在北京天安门广场有什么活动?
  • 问答(Question Answering) : 进提示格式是让模型响应特定答案的最佳方法之一。在提示中,可以组合说明、上下文、输入和输出指示器以获得更好的结果。尽管这些组件不是必需的,但它们是一种很好的做法,因为越具体的指导可以带来更好的结果。指令描述不够清楚,没有理解我的输入的指令信息,回答的结果是错误,是参考通用的知识、而不是我提供的信息。
  • 文本分类(Text Classification) :在处理更加复杂的应用场景时,仅仅提供指令是不够的。这时候,您需要更多地考虑上下文和其他可用元素,以提高模型的准确性和效率。除了指令,还可以提供输入数据或示例等其他元素来增强提示的信息量和有效性。通过这些额外的元素,模型可以更好地理解您的意图,并为您提供更好的结果。
  • 对话(Conversation) :使用提示工程的最有趣之处之一是能够教导 LLM 系统如何行动、它的意图以及它的身份。这在构建客户服务聊天机器人等对话系统时尤为有用。 例如:通过不断的迭代,逐步找我们需要内容。示例:文本摘要:Prompt: 关于《当 notebook 遇上 chatGPT(AIGC):数据分析/数据科学的新范式》 帮我写一个 30-50 字的摘要。 特殊要求的摘要:Prompt: 生动些、轻快些的摘要,发朋友圈用的
  • 代码生成(Code Generation) :LLMs(大语言模型)非常有效的一个应用是代码生成。Copilot/codeX/ChatGPT 是一个很好的例子。通过提示,可以完成各种代码生成任务。首先告诉 chatGPT 元数据:Prompt: 我有两张表,1. 表名:language、字段名:['chin', 'engl', 'index', 'school']、含义:['语文', '英语', '学生 id', '学校']; 2. 表名:science、字段名:['chem', 'index', 'math', 'phys', 'school']、含义:['化学', '学生 id', '数学', '物理', '学校']; 记住就好,不要罗嗦。然后生成代码:Prompt: 查询每个学校总分前 5 名的明细
  • 推理(Reasoning) :也许对于当前的 LLM 来说,最困难的任务之一是需要一定形式的推理能力。推理是重点研究跟进的领域之一,因为 LLM 的推理可以产生出各种复杂的应用程序。 在数学能力方面,已经有了一些进展。但是需要注意的是,当前的 LLM 在执行推理任务方面存在困难,因此需要更加先进的提示工程技术。示例:这个数学推理是错误的: Prompt: 这个数组中的所有奇数加起来就是就是素数:15、32、5、13、82、7、1。尝试通过改进提示(增加推理步骤)来改善结果:Prompt: 判断下面这个问题是否正确?通过以下步骤判断:识别奇数、将其相加、 判断结果是否是素数。 这个数组中的所有奇数加起来就是就是素数:15、32、5、13、82、7、1。

文章来源:“新语数据故事汇” 

Prompt的一些设计原则 

在使用OpenAI的API时,Prompt是非常重要的,因为它决定了模型的输出。因此,设计一个好的Prompt是非常重要的。 

  • 角色提示(Role Prompting): 角色提示是另外一种Prompt技巧,通过为AI分配角色的方式引导AI给出更准确的输出。通过为 AI 分配一个角色,我们给它提供了一些上下文。这个上下文有助于 AI 更好地理解问题,因此 AI 往往可以给出更好的答案。例如,可以在开始的时候,提示AI"你是一名医生"或"你是一名律师",然后要求AI回答一些相关的医学或法律问题,以此来增强其专业性和准确性。举个例子:提示AI"你是一个能解决世界上任何问题的杰出数学家。试着解决下面的问题:",然后再问AI “1000 * 100 / 400 * 56 是多少?” 
  • 明确指令:  在进行文本生成时,Prompt应该指导模型生成与主题相关的文本内容。一个好的Prompt应该是一个明确的指令,而不是一个问题。
  • 上下文学习(In-Context Learning):语言模型对上下文进行学习,以获得更好的理解和执行能力。它利用上下文信息来提高模型在执行任务时的准确性。在这种学习方法中,模型不仅考虑当前任务所提供的信息,还会考虑上下文环境中的其他信息。例如先前的句子或文本段落。在这种情况下,模型可以更好地理解任务的背景和目的,从而输出更准确的信息。 上下文学习有助于模型更好地理解任务的背景和目的,从而输出更准确的信息。例如,如果要求模型生成一段关于“猫”的文本,那么在Prompt中加入一些关于“猫”的上下文信息,例如“猫是一种宠物,它们很可爱”,可以帮助模型更好地理解任务的背景和目的,从而输出更准确的信息。上下文学习可以根据Prompt中样本的数量,简单分为三种类型:1. 零样本(Zero-shot) 学习:没有样本或者说上下文信息。单样本(One-Shot)学习与少样本学习类似,但不允许使用大量演示数据,而只能通过少量的样本来进行任务描述。2. 少样本(Few-shot) 学习:在Prompt中有少量样本。在少样本学习中,通过提供K个上下文和补全(completion)示例,然后期望模型输出最后一个上下文的completion。3. 单样本(One-shot) 学习:在Prompt只有一个样本。单样本学习与少样本学习类似,只允许一个演示数据,并附带任务的自然语言描述。将单样本学习与少样本学习和零样本学习(下文)区分开来的原因是,它最接近某些任务与人类交流的方式。例如,在要求人类在上生成数据集时,通常会给出一个任务演示。相比之下,如果没有示例,则有时很难传达任务的内容或格式。
  • 思维链(Chainn of Thought):  是一种使用少量示例来指导人工智能模型完成任务的技巧。思维链的目的是让模型能够理解任务的逻辑和步骤,而不仅仅是复制示例。例如,如果您想让模型回答一个问题,您可以在输入中提供一些相关的信息和推理过程,而不只是一个简单的问题。
  • 零样本思维链(Zero-shot Chainn of Thought): 是思维链的另外一种实现,通过在问题的结尾附加让我们一步步思考。 这句话,大语言模型能够生成一个回答问题的思维链。从这个思维链中,他们能够提取更准确的答案。零样本思维链有效地改善一些基本的推理任务。然而,它通常不如思维链提示有效。但是当无法构建思维链示例的时候,零样本思维链可以派上用场。 

资料来源 "AIGC工程师 "