“预训练-提示预测”范式是近年来自然语言处理(NLP)领域的一个重要趋势,它与传统的“预训练-微调-预测”范式相比,提供了一种更为灵活和高效的模型应用方式。
Prompt工程是指在预训练的大型语言模型(如BERT、GPT等)的基础上,通过精心设计的提示(Prompt)来引导模型直接适应和执行特定的下游任务,而无需对模型进行额外的微调。
这种方法的核心在于Prompt的设计,它需要能够准确捕捉任务的需求,并以模型能够理解的方式表达出来。
1.1 Prompt 的定义
- 定义:Prompt 是指用于指导生成式人工智能模型执行特定任务的输入指令 ,这些指令通常以自然语言文本的形式出现。
- 核心目的:Prompt 的核心目的是清晰地描述模型应该执行的任务,以引导模型生成特定的文本、图像、音频等内容。
1.1.1 Prompt的类型和应用
-
情感分类任务:
- 示例:判断下面句子的情感为积极还是消极。
- 作用:通过提供明确的情感分类指令,模型能够准确地对文本进行情感分析。
-
生成任务:
- 示例:以小浣熊吃干脆面为主题,帮我写一首诗。
- 作用:通过特定主题的创作指令,模型能够生成富有创意的诗歌。
-
多模态任务:
- 示例:画一张小浣熊在吃干脆面的图片。
- 作用:在多模态模型的应用场景中,Prompt可以包含画面描述,指导模型生成相应的视觉作品。
1.2 Prompt工程的定义
Prompt 工程(Prompt Engineering),又称提示工程,是指设计和优化用于与生成式人工智能模型交互的 Prompt 的过程。
这种技术的核心在于,将新任务通过Prompt 构建为模型在预训练阶段已经熟悉的形式,利用模型固有的泛化能力来执行新的任务,而无需在额外的特定任务上进行训练。
1.2.1 Prompt工程的核心要素
- 任务说明:明确提出具体的任务要求,清晰、直接地描述期望模型完成的任务。
- 上下文:提供任务相关的背景信息,增强模型对任务的理解并提供解决任务的思路。
- 问题:描述用户的具体问题或需要处理的信息,为模型提供一个明确的起点。
- 输出格式:指示模型以何种形式展示回答,包括输出的格式和任何特定的细节要求。
1.2.2 Prompt工程的挑战
随着Prompt内容的丰富和复杂化,输入到模型中的Prompt长度增加,可能导致模型推理速度减慢和推理成本上升。因此,如何在确保模型性能不受影响的前提下,有效控制和优化Prompt的长度,成为了一个亟待解决的问题。
1.2.3解决方案
- LLMLingua:提出了一种由粗到细的Prompt压缩方法,能够在不牺牲语义完整性的情况下,将Prompt内容压缩至原来的二十分之一倍,同时几乎不损失模型的性能。
- FIT-RAG:通过高效压缩检索出的内容,成功将上下文长度缩短至原来的50%左右,同时保持了性能的稳定,为处理大规模上下文信息提供了有效的解决方案。
1.3 Prompt 分词向量化
在 Prompt 进入大模型之前,需要将它拆分成一个 Token 的序列,其中 Token 是承载语义的最小单元,标识具体某个词,并且每个 Token 由 Token ID 唯一标识。将文本转化为 Token 的过程称之为分词(Tokenization)
1.3.1 分词(Tokenization)的重要性
- 语义保留:分词需要将文本拆分成Token序列,同时保留原始文本的语义信息。
- Token ID:每个Token由唯一的Token ID标识,这是模型理解和处理文本的基础。
- 多种拆分方式:同一句子可能有不同的拆分方式,选择合适的拆分对于模型理解至关重要。
1.3.2 分词器的构建
- 词表构建:分词器依赖于一个词表,该词表包含所有模型能够识别的Token。
- 分词算法:常用的分词算法包括BBPE(Byte-Level Byte Pair Encoding)、BPE(Byte Pair Encoding)和WordPiece等。
1.3.2.1 BBPE算法的分词过程
- 初始化词表:从单字节编码开始,将字符拆分为字节,并作为初始Token。
- 统计词频:统计词表中所有Token对的出现频率。
- 合并高频Token对:选择频率最高的Token对合并成新的Token。
- 迭代合并:重复统计和合并步骤,直至达到预设的词表大小或合并次数。
1.3.2.2 分词器的对比
提供了不同模型分词器的对比,包括词表大小和中英文分词效率。
- 关键特性:分词器需要准确识别关键词和短语,同时具有高效率。
- 性能影响:分词器的质量直接影响模型的训练和推理速度。
1.3.3 Token的处理流程
- 嵌入矩阵:Token经过嵌入矩阵处理,转化为固定大小的表征向量。
- 模型处理:向量序列被输入到模型中,模型根据这些向量计算概率分布并生成输出。
1.4 Prompt 工程的意义
您提到的内容涉及Prompt工程在自然语言处理(NLP)任务中的应用,以及它如何提高效率和灵活性。以下是对您提到的三个应用领域的总结:
1.4.1 垂域任务
Prompt工程使得大型语言模型能够无需特定任务的微调即可执行垂直领域任务。这减少了计算成本和对标注数据的依赖,使得模型能够更好地应用于特定领域。
1.4.2 数据增强
通过Prompt工程,可以利用大型语言模型生成新的高质量数据,用于训练和优化其他模型。这种方法可以将大型模型的能力通过合成数据“蒸馏”到其他模型上,提升小模型的性能,同时保持较小的模型尺寸和低计算成本。
1.4.3 智能代理
Prompt工程还可以用于构建智能代理(Intelligent Agent, IA),这些代理能够感知环境、自主采取行动以实现目标,并通过学习提高性能。
随着模型训练数据规模和参数数量的持续扩大,大语言模型涌现出了上下文学习(In-Context Learning,ICL)能力。
其使得语言模型能够通过给定的任务说明或示例等信息来掌握处理新任务的能力。
引入上下文学习,我们不再需要针对某个任务训练一个模型或者在预训练模型上进行费时费力的微调,就可以快速适应一些下游任务。
这使得用户可以仅仅通过页面或者 API 的方式即可利用大语言模型来解决下游任务,为“语言模型即服务”(LLM as a Service)模式奠定了坚实的能力基础。
2.1 上下文学习的定义
3.1.1 思维链提示(CoT)的定义
- 核心:构造合适的Prompt以触发大语言模型一步一步生成推理路径,并生成最终答案。
- 方法:早期方法通过加入少量包含推理过程的样本示例来引导模型生成答案。
3.1.2 按部就班
- 特点:逻辑连贯性和步骤顺序性。
- 代表方法:CoT、Zero-Shot CoT、Auto-CoT。
- Zero-Shot CoT:
- 方法:通过简单的提示(如“Let’s think step by step”)引导模型自行生成推理链。
- 优点:减少对人工示例的依赖,展现出与原始少样本CoT相媲美甚至更优的性能。
- Auto-CoT:
- 方法:引入与待解决问题相关的问题及其推理链作为示例,由大语言模型自动完成,无需手工标注。
- 流程:利用聚类技术筛选相关问题,借助Zero-Shot CoT的方式生成推理链,形成示例。
3.1.3 三思后行
- 特点:在决策过程中融入审慎和灵活性。
- 代表方法:Tree of Thoughts (ToT)、Graph of Thoughts (GoT)。
- ToT:
- 方法:将推理过程构造为一棵思维树,从拆解、衍生、评估、搜索四个角度进行构造。
- 流程:生成多个方案,评估当前剩余的数字是否能够凑到24点,保留可能凑出24点的节点。
- GoT:
- 方法:将树扩展为有向图,提供每个思维自我评估修正以及思维聚合的操作。
3.1.4 集思广益
- 特点:通过汇集多种不同的观点和方法来优化决策过程。
- 代表方法:Self-Consistency。
- 流程:
- 使用CoT或Zero-Shot CoT的方式引导模型生成一组多样化的推理路径。
- 收集每个推理内容的最终答案,并统计每个答案出现的频率。
- 选择出现频率最高的答案作为最终的、最一致的答案。
4.1 规范 Prompt 编写
- 有效沟通:规范的Prompt是与大型语言模型进行有效沟通的基础。
- 输出质量:Prompt的规范性直接影响模型的输出质量和任务执行的准确性。
4.1.1 经典Prompt的组成部分
- 任务说明:明确模型需要完成的任务。
- 上下文:提供帮助模型理解和回答问题的示例或背景信息。
- 问题:用户真正想要模型解决的问题。
- 输出格式:规范模型的输出格式。
4.1.2 规范编写的要求
-
任务说明要明确:
- 使用明确的动词和具体的名词。
- 简洁明了,避免冗长或复杂的句子结构。
- 结构化布局,将任务说明放置在开头和结尾。
-
上下文丰富且清晰:
- 提供与问题直接相关的背景信息和示例。
- 避免包含冗余或不必要的信息。
-
输出格式要规范:
- 明确指定输出格式,如JSON、CSV等。
- 提供输出格式的示例,帮助模型理解预期的输出结构。
-
排版要清晰:
- 使用一致的分隔符区分不同的Prompt部分。
- 合理使用空白和缩进,增强可读性。
- 为每个部分提供清晰的标题或子标题。
4.2 合理归纳提问
合理归纳提问是在与大语言模型交互中提升信息获取效率和深度的重要技巧。以下是两个高级提问策略的介绍,它们有助于深入理解问题本质,并提高获取信息和解决问题的效率。
4.2.1 复杂问题拆解
这是一种将复杂问题分解为更小、更易于理解的子问题,并逐一解决的策略。这种方法在计算机算法设计中被称为“分而治之”,其基本理念是通过解决子问题来最终解决整个问题。
操作流程:
- 分步引导:将复杂问题细化为多个子问题,并引导模型针对每个子问题进行深入分析和回答。
- 归纳总结:将各个子问题的答案汇总,并综合形成最终的全面回答。
优势:这种方法能够帮助用户和模型更有效地处理复杂信息,确保每个细节都被考虑到,并最终形成一个准确和全面的答案。
例子:
- 用户询问成年小浣熊一天需要吃多少干脆面才能满足能量需求。
- 通过分步引导,问题被分解为“成年小浣熊一天需要摄入多少热量?”和“一包干脆面的热量是多少?”。
- 模型分别回答了这两个问题,提供了小浣熊的日热量需求和干脆面的热量含量。
- 通过归纳总结,用户计算出小浣熊需要摄入的干脆面数量。
4.2.2 追问
追问是在对话中引导大语言模型输出更贴合心意内容的策略。这种交互不仅可以促进更深层次的理解和讨论,而且有助于更精确地表达用户的真实想法,从而更好地指导模型的思考。
追问的三种形式:
-
深入追问:根据模型的输出继续发问,深入挖掘特定话题的深层信息。
- 例子:用户询问小浣熊是否可以食用干脆面,随后深入追问去除调味料和添加剂后的情况。
-
扩展追问:在模型给出回答的基础上,进一步要求模型提供更多相关信息或例子。
- 例子:用户询问小浣熊的常规饮食,随后扩展追问小浣熊是否可以偶尔尝试干脆面作为零食。
-
反馈追问:在模型的输出不符合预期或存在错误时,提供反馈,指出问题所在,并请求模型进行更正或澄清。
- 例子:用户询问小浣熊连续食用20包干脆面后的应对措施,随后通过反馈追问指出小浣熊出现了不良反应,模型修正了回答。