Prompt 工程
1. Prompt 工程简介
"预训练-提示预测"范式是近年来自然语言处理(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 分词器的对比
提供了不同模型分词器的对比,包括词表大小和中英文分词效率。
模型 | 词表大小 | 中文分词效率(字/Token) | 英文分词效率(词/Token) |
---|---|---|---|
LLaMA1 | 32000 | 0.6588 | 0.6891 |
LLaMA2 | 32000 | 0.6588 | 0.6891 |
LLaMA3 | 128256 | 1.0996 | 0.7870 |
DeepSeek-V1 | 100016 | 1.2915 | 0.7625 |
DeepSeek-V2 | 100002 | 1.2915 | 0.7625 |
GPT-3.5 & GPT-4 | 100256 | 0.7723 | 0.7867 |
GPT-3 | 50,257 | 0.4858 | 0.7522 |
Qwen-1.5 | 151646 | 1.2989 | 0.7865 |
StarCoder | 49152 | 0.9344 | 0.6513 |
- 关键特性:分词器需要准确识别关键词和短语,同时具有高效率。
- 性能影响:分词器的质量直接影响模型的训练和推理速度。
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),这些代理能够感知环境、自主采取行动以实现目标,并通过学习提高性能。
2. 上下文学习的定义
随着模型训练数据规模和参数数量的持续扩大,大语言模型涌现出了上下文学习(In-Context Learning,ICL)能力。
其使得语言模型能够通过给定的任务说明或示例等信息来掌握处理新任务的能力。
引入上下文学习,我们不再需要针对某个任务训练一个模型或者在预训练模型上进行费时费力的微调,就可以快速适应一些下游任务。
这使得用户可以仅仅通过页面或者 API 的方式即可利用大语言模型来解决下游任务,为"语言模型即服务"(LLM as a Service)模式奠定了坚实的能力基础。
2.1 上下文学习的定义
上下文学习(In-Context Learning, ICL)是一种通过构造特定的Prompt,使得语言模型能够理解并学习下游任务的范式。这种学习方式的关键是如何设计有效的Prompt,以引导模型理解任务的上下文和目标。
2.1.1 上下文学习的应用示例
- 情感分类任务:模型根据给定文本判断情感倾向,识别积极或消极情绪。
- 数学运算任务 :模型根据示例的形式,直接给出对应的运算结果。
2.1.2 上下文学习的不同形式
- 零样本(Zero-shot)上下文学习:仅需提供任务说明,无需提供任何示例。依赖于模型的泛化能力。
- 单样本(One-shot)上下文学习:为模型提供一个示例,贴合人类"举一反一"的学习模式。
- 少样本(Few-shot)上下文学习 :为模型提供少量示例(几个至十几个),提升模型在特定任务上的表现。
2.1.3 上下文学习的理论解释
- 隐式贝叶斯推理:斯坦福大学的研究提供了一种解释,将上下文学习视为隐式贝叶斯推理。模型在预训练阶段学习潜在的概念,当运用上下文学习进行推理时,借助演示示例来"锚定"其在预训练期间所习得的相关概念,从而进行上下文学习,并对问题进行预测。
2.2 演示示例选择
在上下文学习(In-Context Learning)中,选择合适的演示示例对于引导大型语言模型理解任务至关重要。以下是三种基于相似性和多样性的示例选择方法的总结:
2.2.1 直接检索
- 方法:直接检索方法根据候选示例与待解决问题之间的相似性进行排序,选取排名靠前的K个示例。
- 代表性方法:KATE(Knowledge-Aware Text Encoder)
- 操作流程 :
- 使用RoBERTa等模型对问题和候选示例进行编码。
- 计算问题编码和候选示例编码间的向量余弦相似度。
- 选择评分最高的K个示例作为演示示例。
- 优点:简单易操作,应用广泛。
- 缺点 :未考虑示例多样性,可能导致示例同质化。
2.2.2 聚类检索
- 方法:先聚类后检索,以保证检索结果的多样性。
- 代表性方法:Self-Prompting
- 操作流程 :
- 将候选示例和待解决问题编码成向量形式。
- 使用K-Means算法将示例集合聚为K个簇。
- 从每个簇中选取与问题最相似的示例。
- 优点:提高了示例的多样性。
- 缺点 :可能选择的示例相似性不够高,因为有些簇与问题可能并不相似。
2.2.3 迭代检索
- 方法:兼顾相似性和多样性,动态选择下一个示例。
- 代表性方法:RetICL(Retrieval-based In-Context Learning)
- 操作流程 :
- 根据当前问题初始化检索器内部状态,并选择一个示例。
- 根据当前问题和所选示例集更新检索器内部状态。
- 迭代选择下一个示例,直到得到K个示例。
- 优点:生成更优的示例集,在复杂任务中展现出更好的适应性和灵活性。
- 缺点 :计算上相对复杂。
2.3 性能影响因素
2.3.1 预训练数据的影响
- 领域丰富度:预训练数据覆盖的领域越丰富,模型的领域泛化能力越强。跨领域预训练的模型在上下文学习中表现更稳定。
- 任务多样性:预训练数据中包含的任务类型越多样化,模型学习到的知识和技能越广泛,增强了任务泛化能力。
- 训练数据的分布特性:训练数据中的突发性分布和罕见类别能够提升模型处理少见或新颖输入的能力。
2.3.2 预训练模型的影响
- 模型参数规模:模型参数达到一定规模(亿级别及以上)时,上下文学习能力得以涌现。模型规模越大,上下文学习性能通常越强。
- 模型架构和训练策略:模型的架构和训练策略也对上下文学习性能有重要影响。
2.3.3 演示示例的影响
- 示例格式:不同任务对示例格式的要求不同。对于复杂推理任务,以思维链的形式构造示例有助于模型学习更复杂的映射关系。
- 输入-输出映射的正确性:如果给定示例中的输入-输出映射是错误的,会影响上下文学习的效果。大型模型对输入-输出映射的正确性更敏感。
- 演示示例的数量和顺序:增加演示示例的数量通常能提升上下文学习性能,但性能提升速率会逐渐减缓。生成任务比分类任务更能从增加的示例数量中获益。演示示例的顺序对模型表现有显著影响,且最优顺序具有模型依赖性。
2.3.4 任务说明的质量
- 清晰、明确的任务说明:能够为模型提供明确指导,提升上下文学习的性能。
3.1 思维链
思维链提示(Chain-of-Thought,CoT)是一种用于提升大语言模型在复杂任务中表现的Prompt范式。它通过模拟人类解决复杂问题时的思考过程,引导模型进行逐步推理。
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 技巧
4.1 规范 Prompt 编写
- 有效沟通:规范的Prompt是与大型语言模型进行有效沟通的基础。
- 输出质量:Prompt的规范性直接影响模型的输出质量和任务执行的准确性。
4.1.1 经典Prompt的组成部分
- 任务说明:明确模型需要完成的任务。
- 上下文:提供帮助模型理解和回答问题的示例或背景信息。
- 问题:用户真正想要模型解决的问题。
- 输出格式:规范模型的输出格式。
4.1.2 规范编写的要求
-
任务说明要明确:
- 使用明确的动词和具体的名词。
- 简洁明了,避免冗长或复杂的句子结构。
- 结构化布局,将任务说明放置在开头和结尾。
-
上下文丰富且清晰:
- 提供与问题直接相关的背景信息和示例。
- 避免包含冗余或不必要的信息。
-
输出格式要规范:
- 明确指定输出格式,如JSON、CSV等。
- 提供输出格式的示例,帮助模型理解预期的输出结构。
-
排版要清晰:
- 使用一致的分隔符区分不同的Prompt部分。
- 合理使用空白和缩进,增强可读性。
- 为每个部分提供清晰的标题或子标题。
4.2 合理归纳提问
合理归纳提问是在与大语言模型交互中提升信息获取效率和深度的重要技巧。以下是两个高级提问策略的介绍,它们有助于深入理解问题本质,并提高获取信息和解决问题的效率。
4.2.1 复杂问题拆解
这是一种将复杂问题分解为更小、更易于理解的子问题,并逐一解决的策略。这种方法在计算机算法设计中被称为"分而治之",其基本理念是通过解决子问题来最终解决整个问题。
操作流程:
- 分步引导:将复杂问题细化为多个子问题,并引导模型针对每个子问题进行深入分析和回答。
- 归纳总结:将各个子问题的答案汇总,并综合形成最终的全面回答。
优势:这种方法能够帮助用户和模型更有效地处理复杂信息,确保每个细节都被考虑到,并最终形成一个准确和全面的答案。
例子:
- 用户询问成年小浣熊一天需要吃多少干脆面才能满足能量需求。
- 通过分步引导,问题被分解为"成年小浣熊一天需要摄入多少热量?"和"一包干脆面的热量是多少?"。
- 模型分别回答了这两个问题,提供了小浣熊的日热量需求和干脆面的热量含量。
- 通过归纳总结,用户计算出小浣熊需要摄入的干脆面数量。
4.2.2 追问
追问是在对话中引导大语言模型输出更贴合心意内容的策略。这种交互不仅可以促进更深层次的理解和讨论,而且有助于更精确地表达用户的真实想法,从而更好地指导模型的思考。
追问的三种形式:
-
深入追问:根据模型的输出继续发问,深入挖掘特定话题的深层信息。
- 例子:用户询问小浣熊是否可以食用干脆面,随后深入追问去除调味料和添加剂后的情况。
-
扩展追问:在模型给出回答的基础上,进一步要求模型提供更多相关信息或例子。
- 例子:用户询问小浣熊的常规饮食,随后扩展追问小浣熊是否可以偶尔尝试干脆面作为零食。
-
反馈追问:在模型的输出不符合预期或存在错误时,提供反馈,指出问题所在,并请求模型进行更正或澄清。
- 例子:用户询问小浣熊连续食用20包干脆面后的应对措施,随后通过反馈追问指出小浣熊出现了不良反应,模型修正了回答。
4.4 善用心理暗示
您提供的内容详细介绍了如何通过心理暗示,特别是角色扮演和情景代入,来提升大语言模型的交互效率和输出质量。以下是对这些策略的总结和进一步解释:
4.4.1 角色扮演(Role-Playing)
- 定义:通过Prompt指导大语言模型扮演特定角色,以改善其与角色相关的技能。
- 实施:为模型设定一个详尽的角色,如数据科学家、诗人或律师,并在指令中包含角色的具体属性、职责、知识和技能。
- 效果:角色扮演可以使模型生成更准确、角色相关的内容,提供更高质量的回答。
- 示例:在小浣熊营养顾问的角色中,模型不仅坚持了小浣熊的自然饮食原则,还巧妙地提出了将干脆面作为零食的建议,并强调了控制分量的重要性。
4.4.2 情景代入
- 定义:将模型置于特定的"情景"或"环境"中,影响其生成的文本内容和风格。
- 实施:将特定情境下所需的专业知识、历史背景等信息嵌入到模型的响应中。
- 效果:情景代入使模型能够深入理解并反映特定情境下的文化社会背景与现实环境,生成更加丰富和有深度的回答。
- 示例:在90年代的街头情景中,模型不仅描述了小浣熊干脆面的口味,还能够捕捉到那个时代特有的文化现象------通过收集卡片来交换乐趣,唤起用户的情感共鸣。