AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


大模型prompt基本知识小结
发布日期:2024-04-01 19:31:15 浏览次数: 2054


使用大模型的合理方法是为不同的任务设计合理的prompting策略;一种典型的代表方法是in-context learning,它以自然语言文本的方式制定任务描述和例子演示;另外,chain-of-thought prompting是用来加强in-context learning的方法,它在prompt中间加入了一系列中间推理步骤;此外,planning被提出,用于解决复杂的问题,它首先将问题分解成多个小的子任务,然后生成一系列计划工作去一个一个解决这些小的子任务。

下边将会陈述这4种任务的细节;

  • Prompting

一 构建prompt

1.关键要素

通常来说,有四个关键因素描述了提示的功能,并引出了LLM完成任务的能力,包括:任务描述,输入数据、上下文信息和提示风格。

1) 在这里,我们举了三个例子(question answering, meta-review generation和Text-to-SQL)来直观理解我们的讨论;

其中,蓝色的部分表示任务描述,红色的部分表示上下文信息,绿色的部分表示演示的例子,金色的部分表示prompt的风格;

a. question answering

b.meta-review generation

c.Text-to-SQL

2) 任务描述

   任务描述通常是llm预期遵循的特定指令,一般来说,应该清楚地描述自然语言中的任务目标。对于具有特殊输入或者输出格式的任务,通常需要详细的澄清,并可以进一步利用关键字突出特殊设置,以更好地指导LLM完成任务。

3) 输入数据

   在大多数情况下,使用自然语言描述输入数据是很直接简单的。对于特殊的输入数据,例如知识图和表,有必要使用适当的方法来使他们对LLM可读。对于结构化数据,由于简单性,通常使用线性化将原始记录(例如知识三元组)转换为序列。此外,编程语言也被用于制定结构化数据,这些数据也可以支持外部工具(如,程序执行器)来产生精确的结果。

4) 上下文信息

   除了任务描述和输入数据之外,上下文或者背景信息对于特定任务也是很重要的。例如,检索到的文档对于开放域问答作为支持证据是非常有用的。检索到的文档的质量,以及它和问题的相关性,都对生成的答案有影响。因此,它需要以适当的提示模式或者表达式格式包含此类信息。此外,上下文任务示例也有助于引出LLM来完成复杂的任务,该任务可以更好地描述任务目标,特殊输出格式以及输入和输出之间的映射关系。

5) prompt style

   对于不同的llm,设计一个合适的提示风格来引出它们解决特定任务的能力是很重要的。总体而言,你们应该将提示表达为清晰问题或详细的指令,可以很好地理解和回答。在某些情况下,添加前缀或后缀以更好地指导LLM也很有用。例如,使用前缀"让我们逐步推理",可以帮助LLM执行逐步推理,并使用前缀"You是该任务的专家"可以提高LLM在某些特定任务中的性能。此外,对于基于聊天的LLM(例如Chatgpt),不是直接提供长而复杂的任务提示,而是建议将其分解为多个子任务提示,然后通过多轮对话将它们输入LLM。

2.设计原则

基于提示的关键成分,我们总结了几个关键设计原则,可以帮助创建更有效的提示来解决各种任务。

1)清楚地表达任务目标

利用模型的时候需要有详细的明确的指令,例如:a. 给定一个长文档,我想生成一个简洁的摘要;b. 摘要的长度不能超过50;通过提供明确的任务描述,LLM可以更有效地理解目标任务,并且生成所需的输出。

2) 分解为简单、详细的子任务

通过将目标任务分解为子任务,LLM 可以专注于解决更容易的子任务,最后为复杂任务获得更准确的结果。

3) 提供few-shot演示

 如6.2所示,LLM可以从上下文中受益,以解决复杂任务,其中提示包含所需输入输出对的少量任务提示,即少样本演示。少样本演示可以帮助llm在没有参数调整的情况下,学习输入和输出之间的语义映射。在实践中,建议应该为目标任务生成几个高质量的演示,这将极大地有利于最终效果。

4) 使用模型友好的格式

 由于llm是在专门构建的数据集上预先训练的,有一些提示格式可以使llm更好地理解指令。

3.有用的tips

 除了设计原则以外,我们还提供了一组有用的prompt tips,基于现有工作或者在表12中陈列的经验。请注意,这些提示通常以一般方式提出,它并不表明它们是相应任务的最佳提示。

4.经验分析

 我们进一步进行了实证研究,以展示提示对任务性能的影响。为了进行实验,我们选择了各种任务,包括语言生成,知识利用、复杂推理、结构数据生成和信息检索。对于每个任务,我们手动编写了一个遵循上面介绍的一般指南的提示。请注意,测试的提示可能部署这些任务的最佳选择,因为它们主要旨在帮助读者理解如何编写有效的提示来解决不同的任务。   此外,我们还添加了一个简化的提示,作为大多数任务的比较。

1)精心设计的prompt提示可以提高chatgpt的zero-shot或者few-shot性能。

 通过比较在同一任务上使用不同提示的结果,我们可以看到使用精心设计的提示,可以比更简单的提示获得更好的性能。例如,对于WIKIFact的例子,更详细的任务描述能让性能从29.25提升到31.21。

2) 更复杂的任务可以从prompt工程中受益更多

在wikifact和Colored Objtects任务中,设计的提示大大提高了chatgpt的性能,即这在color object熵从53.20提高到66.75;这表明LLM的提示工程在复杂任务中表现出良好的必要性。

3) 对于数学推理任务,基于编程语言的格式设计特定的提示更有效

 对于GSM8k,设计的提示使用代码格式的few-shot样本演示,将此数学推理任务转换为代码生成任务,可以利用chatgpt强大的代码合成能力来解决数学问题。另外,在外部程序执行器的帮助下,我们能够获得更精确的结果,而不是使用llm进行算术运算。

4) 在知识利用和复杂的推理任务中,具有适当提示的chatgpt实现了持平甚至优于supervised baseline的方法;

 在知识利用和复杂的推理任务中,具有适当zero-shot或者few-shot提示的chatgpt可以实现和supervised持平甚至更优的效果。尽管如此,chatgpt在某些特定任务上的表现仍然不如监督baseline模型,因为这些监督more已通过特定于任务的数据进行优化。

5) 通过合适的提示工程

 LLM可以处理一些非传统的NLP任务。借助特定的提示,chatgpt还可以完成非传统的NLP任务,即一般推荐和会话推荐。一个关键点是这些任务可以很好地表达或者用自然语言描述。然而,chatgpt的性能仍然远远超出这些任务的参考性能,因此,LLM不能直接拟合这些任务,这需要特定的领域知识和任务适应。

二 Prompt优化

 虽然手动创建任务提示很直观,但它很耗时。另外,模型对prompt很敏感,不好的prompt会导致较低的任务性能。所以大量研究提出了离散提示和连续提示的自动优化方法,以实现最佳性能。下面从两个角度详细介绍:离散提示和连续提示这两类研究;

a. 离散提示优化

 离散提示通常由一系列自然语言标记组成。尽管这种形式简单而灵活,但由于组合巨大的搜索空间,在离散空间中优化提示是一个具有挑战性的问题。为了自动搜索下游任务的有效提示,现有研究提出了广泛的离散提示方法,具体如下:a. gradient-based approaches;b. RL-based approaches;c.Edit-based approaches; d. LLM-based approaches;

b. 连续提示优化

 与离散提示不同,连续提示由一组连续嵌入组成,可以通过基于下游任务的损失梯度更新直接优化;请注意,连续提示优化主要在PLM中进行了研究,但由于其大量参数,在LLM时代引起了有限的关注。在先前的工作中,大多数研究通常依赖于监督学习来训练基于任务数据的连续提示。此外,在数据稀缺的情况下,迁移学习方法可用于缓解目标任务,缺乏标记数据。这里主要包括两种方法:a. prompt learning with sufficient data;

b. prompt transferrring with scarce data;

  • In-Context Learning

 作为一种特殊的提示形式,上下文学习(ICL)首先与GPT-3一起提出,GPT-3已经成为利用llm的典型方法。

一 ICL Formulation

 如第[55]节所述,ICL使用格式化的自然语言提示,由任务描述/或几个任务示例作为演示。图14显示了ICL的说明。首先,从任务描述开始,从任务数据集中选择了一些示例作为演示。然后,它们以特定的顺序组合,以使用专门的模版形成熙然语言提示。最后,将测试实例附加到演示中,作为LLM的输入,以生成输出。基于任务演示,LLM可以识别并执行新任务,而无需显示梯度更新。

  ICL的整体过程可以由以下公式表示:

 其中,I表示任务描述,Dk表示演示,xk+1表示输入的query。其中实际答案yk+1留作LLM预测的空白。由于ICL的性能严重依赖于演示,因此在提示中正确设计它们是很重要的。根据等式12中的构造过程,我们关注提示中格式演示的3个主要方面,包括如何选择构成演示的示例,用函数f(.)将每个示例格式化为提示,并以合理的顺序安排演示。

 我们将在演示设计和ICL的底层机制两个方面来探讨如何将ICL应用于LLM。此外,ICL和instruction tuning密切相关,因为两者都利用自然语言来格式化任务或者实例。然而,指令调优需要微调llm以适应,而ICL只是在使用的时候prompt LLM。另外,指令调优可以增强llm执行目标任务的ICL能力,特别是在zero-shot的设置中(仅使用任务描述)。

二 Demonstration Design

 一些研究表明,ICL的有效性受到演示设计的高度影响。按照6.2.1节的讨论,我们将从演示选择、格式和顺序三个主要方面介绍ICL的演示设计。

1. Demonstration Selection

 ICL的性能往往具有不同的演示示例,因此重要的是选择可以有效利用LLM的ICL能力的示例子集。主要有两种演示选择方法,即基于启发式和基于LLM的两种方法。

1) 基于启发式方法

 由于其简单性和低成本,现有工作广泛采用启发式方法来选择演示。一些研究采用基于K-NN的检索器来选择与查询语义相关的示例。但是,他们为每个示例单独执行选择,而不是对整个示例级进行评估。为了解决这个问题,有研究工作者提出了基于多样性的选择策略来为特定任务选择最具有代表性的一组示例。此外,在[483]中,在选择演示时同时考虑了相关性和多样性。

2) 基于大模型的方法

 另一项工作通过使用LLM来选择演示。 例如,LLM可用于根据添加示例后的性能增益,直接测量每个示例的信息量。此外,EPR提出了一种两阶段检索方法,该方法首先使用无监督方法回忆相似的示例,然后使用密集检索器(用LLM标记的正例和负例进行训练)对它们进行排名。作为一种替代方法,演示选择的任务可以表述为RL问题,其中LLM作为奖励函数,为训练策略模型提供反馈。由于LLM在文本注释中表现良好,最近的一些研究使用LLM本身作为演示生成器,无须人工干预。

 总而言之,对于上述两种选择方法,ICL中选定的演示示例应该包含有关要解决的任务以及与测试查询相关的足够信息。

2. Demonstration Format

 在选择任务示例以后,下一步是将它们集成到LLM的自然语言提示中。一种简单的方法是使用相应的输入输出对实例化预定义的模板。为了构建更多信息模板,最近的研究考虑添加任务描述或使用思维链提示增强llm的推理能力。例如,在[166]中,作者收集了一个大规模的数据集,其中包含人类编写的任务描述。在使用该数据集进行调整后,可以提高可见任务的性能,LLM也可以在一定程度上推广到看不见的任务。为了减少注释成本,[143]中提出了一种使用由人工编写的任务描述组成的种子集来指导LLM为新任务生成任务描述,提出了一种半自动化方法。由于手工注释不同任务的演示格式成本很高,一些工作还研究了如何自动生成高质量。

作为两种具有代表性的方法,Auto-CoT利用具有zero-shot的"让我们逐步思考"的LLM来生成中间推理步骤。least-to-most prompting方法首先查询LLM来执行问题分解,然后基于llm根据先前解决问题的中间结果,顺序地解决子问题。

3. Demonstration Order

 LLM有时会受到就近偏差的影响,即它们容易重复演示结束时的就近答案。因此,以合理的顺序安排演示(即任务示例)是很重要的。早期的工作提出了几种启发式方法来快速找到一个好的顺序。例如,演示可以根据它们与嵌入空间中的查询的相似性来直接组织。

三 底层机制

 经过预训练后,llm可以在不更新的情况下,表现出有趣的ICL能力。在下文中,我们将讨论LLM ICL能力的两个关键问题,即"预训练如何影响ICL能力"和"LLM在推理过程中如何执行ICL"。

1.预训练如何影响ICL

 ICL最初是在GPT-3中提出的,已经表明ICL能力随着模型大小的增加而变得更加显著。此外,一些研究表明,在专门设计的训练任务上,小规模plm也可以通过持续预训练或微调来证明强大的ICL能力。这通常涉及训练过程中额外的任务示例输入。这表明训练任务的设计是llmICL能力的重要因素。除了训练任务之外,最近的研究还研究了ICL和预训练语料库之间的关系。例如,ICL理论上可以解释为在具有远程连贯性的文档进行预训练的结果。此外,另一项研究从理论上分析,当缩放参数和数据时,基于next-word prediction的LLM可以通过从语言数据存在的组合结构中学习ICL的能力。

2.LLM如何执行ICL

  在推理阶段,研究人员专注于分析ICL能力如何根据给定的演示运行,因为不涉及显式学习或更新。根据讨论,llm主要有两种方法使用演示:任务识别和任务学习。

  • 任务识别

  首先,LLM从演示中识别任务,并利用从预训练中获得的先验知识来解决新的测试任务。有研究假设,存在一个潜在变量来表示预训练数据中的任务,LLM已被证明能够从演示中捕获这个变量,使它们能够识别ICL中的任务。此外,一些实证研究支持ICL作为任务识别的解释。另外,随机替换输入或标签中的演示,不会严重损害llm的性能,这表明llm主要从演示中识别目标任务,而不是从它们中学习;同样,即使提示模板不相关或者误导,llm也可以表现出不错的性能。

  • 任务学习

  通过这种方式,LLM仅通过演示学习预训练阶段看不到的新任务。特别是,任务学习主要从梯度下降的角度进行分析,被认为是隐式微调。然后,ICL可以解释如下,通过前向计算,LLM生成关于演示的元梯度,并通过注意力机制,隐式执行梯度下降。实验还表明,LLM中的某些注意力头,能够执行与任务无关的原子操作,这与ICL能力密切相关。此外,一些研究将ICL抽象为算法学习过程。例如,作者发现,LLM在预训练期间,本质上通过其参数对隐式模型进行编码。使用ICL中提供的示例,LLM可以实现学习算法,例如梯度下降或直接计算封闭形式的解决方案,以在前向计算期间更新这些模型。在这个解释框架下,已经表明llm可以有效地学习简单的线性函数,甚至一些复杂的函数,如ICL决策树。

  正如最近的一项研究中所讨论的,llm在ICL中表现出任务识别和任务学习的能力,但这两种能力似乎具有不同的模型规模。如实验所示,任务识别的能力更容易获得,即使只有350M参数的小型LM也可以表现出这种能力,而任务学习只能出现至少66B参数的LLM。小型LM倾向于忽略标签,主要取决于它们的先验知识来完成任务,而LLM有能力超越他们的先验知识并从演示中获取新知识,从而获得更好的结果。此外,为了提高任务学习能力,Meta-In-Context Learning建议包含多个相关任务,而不仅仅是提示中的单个任务。此外,符号调整在具有语义不相关标签的演示上微调LLM,迫使LLM从演示中学习任务,而不是依赖于先验知识。

  • Chain-of-Thoughout Prompting

  思维链提示是一种改进的提示策略,可以提高llm在复杂推理任务上的性能,如算术推理、常识推理和符号推理。COT提示不是简单地用ICL等输入输出对构建提示,而是进一步结合来中间推理步骤,作为输入和输出之间的桥梁。图14显示了COT的说明。在接下来的部分中,我们将首先详细说明基本的COT提示方法及其改进策略,然后讨论COT提示何时以及为什么有效。

一 基础的COT Promting方法

  COT首先被提出作为ICL的扩展,它将每个演示<输入,输出>增强为<输入,COT,输出>。COT是连接输入和输出的一系列中间推理步骤。通过这些增强的演示,LLM可以跟随它们为新输入生成COTs和答案。然而,与ICL中的<input,output>对不同,COT很难获得,通常需要人工注释。幸运的是,已经发现llm可以通过"让我们逐步思考"等简单指令触发生成cot,使COT提示易于使用。还有一些替代的神奇提示,可以引发COT推理的能力,进一步提高LLM的性能,例如"take a deep breath and work on this problem step by step"。

   如图15所示,COT的生成过程遵循基本COT提示方法中的链结构,其中LLM逐步生成COT;

  COT的生成过程遵循基本COT提示方法中的链结构,其中LLM逐步生成COT;通常,COT采用自然语言文本的格式。然而,文本COTs可能不适用于需要严格逻辑进行推理的复杂任务。考虑到这一点,一些工作使用代码[506,507]。因为它具有结构化和精确的性质。此外,[508]中的作者建议动态选择文本或代码作为COT的格式,以结合它们的优势。

二 改进的COT提示策略

   尽管复杂推理任务的性能有所提高,但COT提示仍然存在推理错误和不稳定性等问题。在本节中,我们首先介绍如何设计更好的COT提示和增强COT生成策略,然后介绍COT基本链结构的扩展,图15说明了具有代表性的COT提示策略的演变。

1.更好的prompt设计

   由于COT prompting依赖于提示来引出LLM的推理性能,因此提示的设计对其性能至关重要。作为直接方法,表明使用不同的COTs(即每个问题的多个推理路径)可以有效地提高性能。另一个直观的想法是,具有更复杂推理路径的提示更有可能引发llm的推理能力,这可能导致生成正确答案的准确性更高。然而,所有这些方法都依赖于带注释的COT数据集,这限制了它们在实践中的使用。为了克服这一限制,“让我们逐步思考”等神奇指令可用于通过提示LLM自动构建COT;

2.增强型COT生成

   由于LLM容易产生不正确的推理步骤,并在生成过程中表现出不稳定性,因此许多研究来改进COT的生成。在本节中,我们将介绍两种典型的方法来增强COT的生成:基于采样和验证的方法。

1) 基于采样的方法

   众所周知,llm在推理过程中存在不稳定性,这可能导致生成的推理步骤中的不忠实性。为了解决这个问题,一些工作建议对多个推理路径进行采样,而不是使用使用贪婪解码。作为代表性解决方案,self-consistency首先生成多个推理路径,然后对相应的答案进行集成,通过多数投票选择最一致的路径。然而,当大多数推理路径被误导时,这种方法仍然会导致错误的答案。考虑到这一点,[433]中的作者仅根据观察到具有更高复杂性的推理路径通常具有更好的性能的先验知识,来投票选择k个最复杂的推理路径。此外,MCR建议在生成下一步时参考来自其他推理路径的步骤,并在多个推理路径上执行推理以生成最终答案。

2) 基于验证的方式

  COTs中推理步骤的顺序性质可以导致当某些步骤不正确时生成的COTs中的错误累积。为了缓解这个问题,最近的研究建议使用经过训练的验证器或者LLM本身来验证生成的推理步骤的正确性。例如,DIVERSE分别训练解决方案级和步骤级验证器来检查不同粒度的推理步骤。另一种方法利用llm通过专门设计的推理格式,逐步自我验证来验证推理步骤的正确性。此外,一些研究提出了反向推理进行验证:它首先从模型的预测中推断出必要的问题条件或者变量,然后将它们与原始问题进行比较。

3.推理结构扩展

   尽管具有通用性,但基于COT提示的链式推理结构,限制了其解决复杂任务的有效性,这需要在推理过程中进行远见和回溯等探索。因此,许多研究致力于通过设计更复杂的思想来扩展推理结构,例如:tree-和graph-structured reasoning。

1) 树结构推理

   这种方法在分层树结构中制定了推理过程,其中中间思想是节点。通过这种方式,它使LLM能够并行探索多个推理路径,并进一步支持前瞻和回溯的操作。      

2) 图结构推理

   尽管树结构有助于并行推理,但它也对推理过程施加了限制。通过更复杂的拓扑结构,图在推理中提供了更大的灵活性,从而能够表征更复杂的关系和交互。

三 COT prompt的进一步讨论

   在本节中,我们将讨论与COT提示相关的两个基本问题,即“当COT提示对LLM有效”和“为什么LLM能执行COT推理”。

1. 为什么COT prompting对LLM是有效的?

   由于COT推理是一种涌现的能力,它只对足够大的模型(通常包含10B或者更多参数)有积极影响,但是对小模型没有影响。此外,由于COT提示通过中间推理步骤增强了标准提示,因此,它主要对需要逐步推理的任务有效,例如算术推理、常识推理和符号推理。然而,对于不依赖于复杂推理的其他任务,COT提示可能会导致比标准提示更差的性能,例如,GLUE的MNLlm/mm,SST-2和QQP;然而,对于不依赖于复杂推理的其他任务,COT提示可能会导致比标准提示更差的性能。有趣的是,似乎只有当标准提示产生较差的结果时,COT提示带来的性能增益才会显著。

2. 为什么LLM能执行COT推理?

   作为第二个问题,我们从以下两个方面讨论了COT提示的潜在机制。

   1) COT推理能力的起源

   关于COT推理能力的来源,人们普遍假设它可以归因于对代码的训练,因为在代码上训练的模型显示出强大的推理能力。直观地说,代码数据通过算法逻辑和编程流程组织得特别好,这可能有助于提高LLM的推理性能。此外,指令调优似乎不是获得COT推理能力的关键原因,因为经验表明,对非COT数据的指令调优并不能提高所提出的COT推理基准的性能。

   2) COT提示成分的影响

   COT提示和标准提示之间的主要区别在于在最终答案之前加入了推理路径。因此,一些研究人员调查了推理路径中不同成分的影响。具体而言,具体的一项研究确定了COT提示中的三个关键组成部分:符号、模式和文本。结果表明,后两个部分(即模式和文本)对模型性能至关重要,删除其中任何一个都会导致性能显著下降。

  然而,符号和图案的正确性似乎并不重要。此外,文本和模式之间存在着共生关系:文本帮助LLM生成有用的模式,模式帮助LLM理解任务并声称有助于解决问题的文本。

  • COT prompt的进一步讨论复杂任务解决规划

   使用ICL和COT提示是解决各种任务的概念简单但通用的方法。然而,这种方法难以处理数学推理,和多跳问答等复杂任务。作为一种增强的方法,已提出了基于提示的计划,将复杂的任务分解为更小的子任务,并生成完成任务的行动计划。

 





53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询