在了解提示过程之前,先了解一下什么是提示prompt,见最后附录部分 参考资料: 吴恩达《面向开发者的ChatGPT Prompt Engineering工程》
在整个自然语言的发展过程中, 经历了四个阶段
- 非神经网络的特征工程:在非神经网络时代, 人工智能主流的计算都是使用完全监督的机器学习的方法。这个方法最大的特点是完全的依赖于统计和传统的机器学习算法(比如贝叶斯算法、决策树)等等, 这些算法的最大的特点是需要先对于存量的数据进行人工的标注, 比如这个是猫那个是狗, 通过这样的方式, 让模型建设先验的知识, 然后当给到一张新的图片之后, 可以基于这个图片进行决策, 得到一个新的结论。这个方式最大的问题,就是标准的数量和质量决定了模型的质量的上限, 同时成本非常巨大。
- 基于神经网络的完全监督学习 :这个时代的优势是不需要手动去给训练数据进行单独标注, 而是找到合适的数据进行足够的训练, 就可以获取很好的训练的效果。
- 预训练:其大模型的雏形了。这个阶段的最大的特点是无监督。我们一直说的通用智能, 其实就说大模型,其实已经将我们的大部分的知识, 沉淀到自己的模型中。本质就是讲模型, 用信息压缩的方式记录了起来。通过无监督的预训练得到的通用的大模型之后, 使用特定的数据集, 对模型进行针对性的训练, 使得模型更加适应新的数据。这个就是这次大模型最大的升级。无论 是 GPT 还是 Bert 其实都是一样的方案。通过大模型大量的数据海量的训练,大力出奇迹,然后再用小量的数据, 进行针对性的微调。
- Prompt 工程:就是我们今天重点要讲的Prompt。通过引入合适的模板, 去管控模型的输入、处理和输出的结果。使用这种模型, 可以用 zero shot(零样本),few shot 少量样本的方式去调试模型, 充分利用了模型的推理能力, 让模型按照 Prompt 中对于模型的要求进行输出, 满足各个行业, 各个场景的个性化的需求。
-
提示工程(Prompt Engineering):这是一种通过设计特定的输入提示来引导模型生成期望输出的方法。它的优点是实现快速,直接针对特定需求,但可能需要多次尝试才能得到最佳答案,并且不适用于所有问题。
-
知识库嵌入(Knowledge Based Embeddings):结合模型与外部知识库,使模型在生成答案时可以引用这些外部知识。这种方法增加了模型处理复杂和特定问题的能力,但需要整合和维护知识库,确保其准确性和及时性。
-
微调(Fine-tuning):在特定数据集上对预先训练的模型进行额外的训练,使其更适应特定任务或领域。微调的优点是优化模型性能,使其更加专业和适应,但缺点是需要大量标记数据,并可能导致过拟合。
举个例子:
- 提示工程相当于领导口头布置任务,大学生根据经验和知识完成任务。
- 知识库嵌入相当于提供操作手册,大学生在遇到问题时可以查阅手册。
- 微调相当于上岗前的培训,使大学生更适应具体的工作环境。
提示工程(Prompt Engingering),也被称为上下文提示(In-Context Prompting),指的是通过结构化文本等方式来完善提示词,引导LLM输出我们期望的结果。通过提示词工程可以在不更新模型权重的情况下,让LLM完成不同类型的任务。其主要依赖于经验,而且提示词工程方法的效果在不同的模型中可能会有很大的差异,因此需要大量的实验和探索。
提示工程旨在获取这些提示并帮助模型在其输出中实现高准确度和相关性,掌握提示工程相关技能将有助于用户更好地了解大型语言模型的能力和局限性。特别地, 矢量数据库、agent和prompt pipeline已经被用作在对话中,作为向 LLM 提供相关上下文数据的途径。
提示工程涉及选择、编写和组织提示,以便获得所需的输出,主要包括以下方面:
-
Prompt 格式:确定 prompt 的结构和格式,例如,问题形式、描述形式、关键词形式等。
-
Prompt 内容:选择合适的词语、短语或问题,以确保模型理解用户的意图。
-
Prompt 上下文:考虑前文或上下文信息,以确保模型的回应与先前的对话或情境相关。
-
Prompt 编写技巧:使用清晰、简洁和明了的语言编写 prompt,以准确传达用户的需求。
-
Prompt 优化:在尝试不同 prompt 后,根据结果对 prompt 进行调整和优化,以获得更满意的回应。
提示工程可以帮助改善大语言模型的性能,使其更好地满足用户需求。这是在与模型互动时常用的策略,特别是在自然语言处理任务和生成性任务中,如文本生成、答案生成、文章写作等。
1. Zero-shot Prompting
Zero-Shot Prompting 指的是在大型语言模型(LLM)中,不需要额外微调或训练,直接通过文本提示就可以完成指定的下游任务。
主要思想:
- 先训练一个通用的大型语言模型,学习语言的基本规则,掌握丰富的常识和知识。
- 然后在不改变模型参数的情况下,只通过软性提示指导模型完成特定任务。
- 模型根据提示和已掌握的知识,生成对应任务的输出。
缺点:Zero-Shot Prompting 技术依赖于预训练的语言模型,这些模型可能会受到训练数据集的限制和偏见。它的输出有时可能不够准确,或不符合预期。这可能需要对模型进⾏进⼀步的微调或添加更多的提示⽂本来纠正。
案例:
2. Few-shot Prompting
few-shot prompting则是通过提供模型少量高质量的示例,这些示例包括目标任务的输入和期望输出。通过观察这些良好的示例,模型可以更好地理解人类意图和生成准确输出的标准。
关键思想:
- 仍然基于预训练好的通用语言模型
- 使用软提示指导模型完成新任务
- 额外提供1-2个相关示例作为提示补充
缺点:这种方法可能会消耗更多的token,并且在处理长文本的输入或者输出的时候可能会遇到上下文长度限制的问题。大型语言模型(例如GPT-3)在zero-shot能力方面表现出色。但对于复杂任务,few-shot 提示性能更好。为了提高性能,我们使用,few-shot 提示进行上下文学习,通过在提示中提供演示来指导模型执行任务。换句话说,将模型置于一些特定任务的示例中有助于提高模型性能。
案例:
3. Instruction Prompting
指令提示是LLM的最常见用途,尤其是像ChatGPT这样的聊天机器人。指令提示旨在向大语言模型提供指令提示示例,以便它可以消除训练或测试差异(模型是在Web规模语料库上训练并在大多数指令上进行测试),并模拟聊天机器人的实际使用场景。指令提示使用(任务说明,输入,真实输出)元组对预训练模型进行微调,以使模型更好地与用户意图对齐并遵循说明。与说明模型交互时,应该详细描述任务要求,尽量具体和准确,清楚地指定要做什么(而不是说不要做某事)。
案例:
Prompt Engingeering 之所以成为工程方式,是因为存在着各种相对复杂的Prompt方式,主要包括思维链(CoT) 和
递归提示( Recursive Prompting)等
1. Chain-of-Thought Prompting
Chain-of-Thought(CoT)提示生成一系列短句,即被称为推理链的句子。
思维链提示,就是把一个多步骤推理问题,分解成很多个中间步骤,分配给更多的计算量,生成更多的 token,再把这些答案拼接在一起进行求解。
对于复杂推理的任务和较大的模型,可获得更多的好处。常见的两种基本CoT提示包括Few-shot CoT 和 Zero-Shot CoT.
1)Few-shot CoT
Few-shot CoT 允许模型查看一些高质量推理链的演示。
2)Zero-shot CoT
Zero-shot CoT是由Kojima等人在2022年首先提出的,它在提示中添加了“Let’s think step by step”,有助于提高模型性能。让我们看一个下面的例子:Zero-shot CoT能够帮助我们看到模型内部,并了解它是如何推理得出答案的。
2. Recursive Prompting
递归提示是一种问题解决方法,它涉及将复杂问题分解成更小、更易管理的子问题,然后通过一系列提示递归地解决这些子问题。这种方法对需要组合泛化的任务尤其有用,其中语言模型必须学习如何组合不同的信息来解决问题。
在自然语言处理的背景下,递归提示可以使用少量提示方法将复杂问题分解为子问题,然后顺序解决提取的子问题,使用前一个子问题的解决方案来回答下一个子问题。这种方法可以用于数学问题或问答等任务,其中语言模型需要能够将复杂问题分解为更小、更易管理的部分,以得出解决方案。
3. CoT 与 递归提示的混合使用
自我提问(self-ask )可以视为另一种类型的递归提示,是一种反复提示模型提出后续问题以迭代构建思维过程的方法。后续问题可以通过搜索引擎结果来回答。类似地,IRCoT 和 ReAct将迭代 CoT 提示与对 Wikipedia API 的查询相结合,以搜索相关实体和内容,然后将其添加回上下文中。
思维树(Tree of Thought)通过探索每一步的多种推理可能性来扩展 CoT。它首先将问题分解为多个思维步骤,并在每个步骤中生成多个思维,实质上是创建一个树形结构。搜索过程可以是广度优先过程或深度优先的过程,而每个节点的评估分类器可以通过Prompt提示的方式完成。
提示工程的实现涉及到基于LLM应用中的各个方面,这里给出一些提示工程的常见实践:
-
静态提示:Prompt可以遵循zero、single或few shot的方法。LLM 的生成能力通过在Prompt中包含示例数据来遵循一次性学习或几次性学习得到了极大的增强。
-
上下文提示:上下文提示在生成响应时提供对 LLM 的参考框架,在很大程度上可以避免 LLM 的幻觉。
-
提示模板:静态提示转换为模板,其中键值被替换为占位符,占位符在运行时被应用程序的值/变量替换。提示模板中的变量或占位符通过用户提出的问题,以及从知识存储中搜索的知识来填充,因此也称为提示注入或实体注入。
-
提示链:提示链,也称为LLM链,是创建一个由一系列模型调用组成的链的概念。这一系列调用相继发生,其中一个链的输出作为另一个链的输入。每个链的目标都是小型且范围良好的子任务,因此单个 LLM 是用于寻址任务的多个有序子组件之一。
-
提示流水线:在机器学习中,流水线可以描述为端到端结构,来协调事件和数据流。流水线由触发器启动或启动; 并且基于某些事件和参数,遵循一个流程,该流程将产生一个输出。对于提示流水线而言,流在大多数情况下是由用户请求启动的,请求被定向到特定的提示模板。因此,提示流水线可以描述为提示模板的智能扩展。
-
Agent代理:对于 LLM 相关的操作,其自动化的形式是所谓的Agent代理。提示链是执行预先确定和设置的操作序列,Agent 不遵循预先确定的事件顺序,可以保持高度的自主性。Agent可以访问一组工具,任何属于这些工具范围的请求都可以由Agent处理。执行流水线为Agent提供了自治权,在代理到达最终答案之前可能需要进行多次迭代。
-
CoT提示:CoT提示使大型语言模型(LLM)能够处理常识推理和算术等复杂任务。通过Prompt建立CoT推理并相应地指导 LLM,这是一种相当直接的实现。思维链提示特别有用的地方在于,通过分解 LLM 输入和 LLM 输出,它创建了一个洞察和解释窗口。
-
ChatML:LLM 的主要安全漏洞和滥用途径是Prompt注入攻击,ChatML 将允许针对这些类型的攻击提供保护。为了消除prompt注入攻击,会话被分为以下几个层次或角色: 系统、助理和用户等, 然后做相应的prompt防护。
优点:
1、任务归一化:将所有的任务归一化为预训练语言模型的任务,使得所有的任务在方法上变得一致。避免了预训练和fine-tuning之间的gap,使得几乎所有NLP任务都可以直接使用,不需要额外的训练数据。
2、优秀的性能:在少样本的数据集上,Prompt Engineering能取得超过fine-tuning的效果。
3、信息量丰富:有研究表明,一个prompt相当于100个真实数据样本。这充分说明了prompt蕴含的「信息量」之巨大。
4、适应能力强:prompt在下游任务「数据缺乏」的场景下、甚至是zero-shot场景下,有着无可比拟的优势。因为大模型通常无法在小数据上微调,因此,基于prompt的技术便成为首要选择。
缺点:
1、设计复杂:对于Label较多的任务,很难合理地定义Prompt和Answer之间的映射。同时构建一对最佳的Prompt和Answer也是一个具有挑战性的问题。
2、理论分析不足:尽管Prompt方法在很多场景中取得了成功,但是目前关于Prompt-based Learning的理论分析和保证的研究成果很少,Prompt取得成果的可解释性较差。
3、bias问题:存在以下三种bias问题需要解决:
(1)样本不平衡的bias:如果few-shot例子中所提供的标签分布不平衡,则会严重影响到测试任务。这是传统的不平衡学习在prompt上的具体体现。
(2)最近样本的bias:模型倾向于为测试样本输出最近看到的few-shot样本。这有点像灾难遗忘,即模型更喜欢记住最近输入的样本信息。
(3)高频词的bias:模型倾向于考虑那些出现次数较多的token。因为大模型本质上就是统计模型,当然倾向于出现次数多的那些词。
Prompt Engineering是模型开发最简单的一步,但是需要理解大模型开发的方方面面细节,虽然很简单,确实很值钱。值得深入学习和思考。
- 非常不错的教程:earningprompt.wiki/
- 吴恩达《ChatGPT Prompt Engineering for Developers》课程中文版:https://www.bilibili.com/video/BV1oi4y167Nz/?spm_id_from=333.999.0.0
- Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing
- LLM提示词工程学习笔记
- https://zhuanlan.zhihu.com/p/671863250
Prompt提示是模型接收以生成响应或完成任务的初始文本输入。我们给AI一组Prompt输入,用于指导模型生成响应以执行任务。这个输入可以是一个问题、一段描述、一组关键词,或任何其他形式的文本,用于引导模型产生特定内容的响应。
例如,在chatGPT中,用户通常使用 prompt 来与大语言模型进行交互,请求回答问题、生成文本、完成任务等。模型会根据提供的 prompt 来生成一个与之相关的文本,尽量符合用户的要求。
从不同的视角, 可以对Prompt 进行不同的分类。在这里,根据可解释性、交互方式和应用领域三个方面对Prompt 进行分类。
2.1 可解释性分类:硬提示和软提示
硬提示(hard prompt ) 是手工制作的、预定义的带有离散输入标记的文本,或者文本模板。静态提示可以合并到程序中用于编程、存储和重用,基于大模型的应用程序可以有多个提示模板供其使用。
静态提示一种硬编码的提示。建立在LangChain 之上的基于大模型的很多应用程序,其提示模板在很大程度上是静态的,它指示代理执行哪些操作。一般来说,模板包括: 定义了可以访问哪些工具,何时应该调用这些工具,以及一般的用户输入。
软提示(soft prompt ) 是在提示调优过程中创建的。与hard prompt 不同,软提示不能在文本中查看和编辑,包含一个嵌入或一串数字,代表从大模型中获得知识。软提示缺乏软可解释性。人工智能发现与特定任务相关的软提示,但不能解释为什么它。与深度学习模型本身一样,软提示也是不透明的。软提示可以替代额外的训练数据,一个好的语言分类器软提示有几百到几千个额外的数据点。
提示微调包括了在使用 LLM 之前使用一个小的可训练模型。小模型用于对文本提示进行编码并生成特定于任务的虚拟令牌。这些虚拟令牌被预先追加到Prompt上并传递给 LLM。调优过程完成后,这些虚拟令牌将存储在一个查找表中,并在推断期间使用,从而替换原来的小模型。当提供上下文时,LLM 的表现要好得多,而且提示微调是一种快速有效的方法,能够以动态地创建急需的上下文。
2.2 交互方式分类:在线提示和离线提示
在线提示(Online prompt) 是在与模型的实时互动中提供的提示,通常用于即时的交互式应用。这种提示在用户与模型进行实际对话时提供,用户可以逐步输入、编辑或更改提示,在在线聊天、语音助手、实时问题回答等应用中常见。
**离线提示(Offline prompt )**是预先准备好的提示,通常在用户与模型的实际互动之前创建。这种提示在没有用户互动时预先设计和输入,然后整批输入模型进行批量处理。在离线文本生成、文章写作、大规模数据处理等应用中常见。
对提示分类为 “online” 或 “offline” ,可帮助确定如何有效地使用提示,以满足不同应用的需求。在线提示通常用于需要实时交互和即时反馈的情况,而 离线提示则适用于需要大规模处理或预生成文本的情况。根据具体应用和使用情境,您可以选择适当的提示类型。
2.3 应用领域分类
用途分类可以帮助确定 prompt 的主要目标,以便更有效地使用它们。以下是一些常见的 prompt 类别:
- Information Retrieval (信息检索):这些 prompt 用于从模型中检索特定信息,如回答问题、提供事实或解释概念。用途包括问答、信息检索、事实核实等。
- Text Generation (文本生成):这些 prompt 用于指导模型生成文本,可能是文章、故事、评论等。用途包括创意写作、内容生成、自动摘要等。
- Translation (翻译): 这些 prompt 用于将文本从一种语言翻译成另一种语言。用途包括机器翻译应用。
- Sentiment Analysis (情感分析):这些 prompt 用于评估文本的情感倾向,如正面、负面或中性。用途包括社交媒体监测、情感分析应用。
- Programming and Code Generation (编程和代码生成):这些 prompt 用于生成计算机程序代码或解决编程问题。用途包括编程辅助、自动化代码生成等。
- Conversation (对话): 这些 prompt 用于模拟对话或聊天,并回应用户提出的问题或评论。用途包括聊天机器人、虚拟助手等。
- Task-Specific (特定任务) :这些 prompt 针对特定应用或任务,如制定旅行计划、编写营销文案、生成报告等。用途因任务而异。
- Custom Applications (自定义应用): 这些 prompt 针对特定领域或自定义应用,具体用途由用户定义。用途根据用户需求而定。
通过将 prompt 分类为不同的用途,可以更好地理解模型如何应用于各种任务和情境。这有助于选择合适的提示类型,并设计它们以满足特定需求。
在应用Prompt的时候,我们需要理解一个Prompt 可能包含的6个要素:任务,上下文,示例,角色,格式和语气,而且这些要素是按重要性降序排列的。
-
格式(Format): 格式部分可视化了你期望输出的外观和结构,如表格、列表、段落等。明确指定输出的格式可以确保ChatGPT生成的内容符合你的预期。
-
语气(Tone): 语气定义了输出文本的语气或风格,如正式、非正式、幽默等。指定语气有助于确保ChatGPT的回应符合所需的情感和风格要求。
通过合理组织这六个要素,可以创建一个清晰明了的Prompt,有效引导ChatGPT生成符合期望的文本输出。
大模型的文本生成可以理解为目标文本的补全,假设想让“Paris is the city…”这句话继续下去。编码器使用Bloom-560M模型发送我们拥有的所有token的logits,这些logits可以使用softmax函数转换为选择生成token的概率。
如果查看top 5个输出token,它们都是有意义的。我们可以生成以下看起来合法的短语:
Paris is the city of love.
Paris is the city that never sleeps.
Paris is the city where art and culture flourish.
Paris is the city with iconic landmarks.
Paris is the city in which history has a unique charm.
然后, 有不同的策略来选择token。
4.1 greedy sampling
使用贪婪策略是计算效率高且直接的方法,但也会带来重复或过于确定性的输出。由于模型在每一步中只考虑最可能的标记,可能无法捕捉到上下文和语言的全部多样性,也不能产生最富创造力的回答。模型的这种目光短浅的特点仅仅关注每一步中最可能的标记,而忽视了对整个序列的整体影响。
示例中生成的输出可能是:Paris is the city of the future. The
4.2 Beam Search
4.3 probability sampling
4.4 ramdom sampling with temperature
4.5 top-k sampling
4.6 top-P sampling
top-p采样不是指定一个固定的“k”令牌数量,而是使用一个概率阈值“p”。该阈值代表了希望在采样中包括的累积概率。模型在每个步骤中计算所有可能令牌的概率,然后按照降序的方式对它们进行排序。
4.7 Prompt 的可能工作机制
在预训练语言模型中,解码策略对于文本生成非常重要。有多种方法来定义概率,又有多种方法来使用这些概率。温度控制了解码过程中token选择的随机性。较高的温度增强了创造力,而较低的温度则关注连贯性和结构。虽然创造力可以带来有趣的语言体验,但适度的稳定性可以确保生成的文本的优雅。
那么,Prompt 的本质大概应该是语义特征的显式表达, Prompt 的工作机制很可能只是影响大模型所选择生成文本token 的概率。由于大模型在很大程度上是一个黑盒子,其涌现特性具有难解释性,而海量的数据关系很难抽象出确定性的特征,只能是概率性结果。另一方面,用户的需求千变万化,并且对于需求的表达更是极具多样性。因此, Prompt 很可能在某些限定的领域才存在一些通用的表达方式。
在 OpenAI 官方文档中, 强调了, 跟大模型交互最重要的点, 是需要描述清晰, 具体的需求。你需要给到他没有任何歧义的需求, 大模型才能给你更加准确的反馈。 他用了一个很有趣, 但是精准的描述, 给大模型讲 Prompt 就跟给外星人讲人类世界是一样的。
原则1:清晰明确
不要像女人说话一样,让大模型去猜测,去揣摩人心。写的越具体越好。
1、使用分隔符:清楚地表示输入的不同部分,让模型清楚地了解要处理哪段文本。分隔符可以是任何明确的标点符号(双引号、单引号、XML标记、章节标题等)。
2、结构化输出:为了更容易解析模型的输出,结构化输出很有帮助,如HTML或JSON
3、具体和直接:越直接,信息传递就越有效
4、要做什么:避免说「不要做」什么,而是说「要做」什么
5、少样本提示:让模型执行实际任务前,提供给模型成功执行该任务的示例,以此告诉模型,你想让模型做的任务是什么(In context Learning)
原则2:给模型思考的过程
1、指令拆分:分条目编写指令,指定完成任务所需的步骤
2、逻辑链:让模型给出结论前先自行推理
3、检查并改进:设置一个新的prompt,定义什么是「好」,并要求LLM检查其先前的输出以查看它是否「好」。