1 简介
提示词工程(prompt engineering)是自然语言处理(NLP)中重要技术,主要目的是设计、优化、调整用于指导预训练语言模型的输入提示。
- 重要性
- 引导输出:预训练模型虽然有大量的知识,但其输出往往取决于提示词,通过优化提示词可以引导模型输出更有价值的信息
- 提高模型适应性:不同场景需要模型有不同输出,通过提示词可以定制化模型输出,提升模型适应性
- 简化模型使用:对于非专业人士,对模型进行训练是一项复杂工程,具有挑战性,通过提示词引导,可以简化模型使用
- 提示词价值
- 提升生成质量
- 提高准确性
- 提高相关性
- 改进交互性
- 关键技术
- 提示词设计:作为提示词工程核心工作,需要充分考虑模型的特点、任务需求、用户期望等因素;同时提示词的设计需要遵循一定原则,如简洁明了、具体明确、具有指导性
- 提示词优化:通过不断改进和优化提示词来提升模型性能,同时提升输出的价值;一般可以修改提示词、调整提示词数量、位置、给出示例等
- 提示词评估:通过期望输出和模型输出进行对比,评估提示词效果。一般可以通过召回率、准确率、F1值等方式评估
2 模型常见参数设置
在调用模型时,可以先进行一些参数设置,常见的参数包含:温度(Temperature)、顶部概率(Top P/K)、最大长度(Max Length)、停止序列(Stop Sequences)、频率惩罚(Frequency Penalty)、存在惩罚(Presence Penalty)
- 2.1 温度(Temperature)
- Temperature参数用于调整语言模型生成文本的随机性。简单来说Temperature设置的越小输出的内容越确定,值越大结果越随机。Temperature参数实际上是在抽样策略阶段,对这些概率进行调整,以控制生成文本的多样性和可预测性,通常是大于0的实数,但是值太大意义不大,为0输出最保守,较多的模型将值定义在【0,1】的范围
- 高Temperature :增加生成文本的随机性,使得不太可能的词汇有更高的出现概率。比较适合创作场景,但结果可能太发散、不连贯等
- 低Temperature :减少随机性,使得更可能的词汇出现概率更高。比较适合学术等对确定性要求高的场景,但是会丧失多样性
- 原理
- Temperature参数通过对模型输出的概率分布进行缩放来起作用。具体来说,对于每个可能的下一个词,模型计算出一个原始概率分布,然后使用以下公式进行调整:
- 2.2 Top P/K
- Top P允许模型在生成每个词时只考虑概率最高的一定比例的词汇;模型首先计算出所有可能的下一个词的输出概率,然后只从这个分布中累积概率最高的前P%的词中选择下一个词。这样,Top P采样在保持生成文本连贯性的同时,也为文本的多样性提供了空间
- Top K和P类似,只不过P是按照概率,K是按照数量(如果是Top K,则表示最有可能的前K个)
- 如上图,按照K=2就是United和Netherlands;按照P=15%也是United和Netherlands
- 技术细节(P值方法,K值类似,只是按照数量)
- 计算概率分布:模型为所有可能的下一个词计算概率分布
- 降序排序:将这些概率从高到低进行排序
- 累积概率:从最高的概率开始,累加这些概率,直到累积概率达到或超过预设的阈值P
- 选择词汇:在累积概率达到P的词汇集合中随机选择一个词作为下一个词
- 适用场景:总体来说和temperature类似,在需要创造性和多样性的文本生成任务中,如创意写作、对话生成等,Top P采样可以帮助模型避免过早地陷入重复和固定的模式,值可以更大
- 注意:一般Top和Temperature选择其一使用即可
- 2.3 最大长度(Max Length)
- 最大长度用于控制模型生成的词的最大数量。通过控制长度可以控制tokens消耗以及限制无关信息输出;但是针对文本生成场景要注意参数设置,否则可能导致文本生成不全
- 2.4 停止序列(Stop Sequences)
- 停止序列(Stop Sequences)是在自然语言处理和文本生成任务中使用的一种控制机制,是一系列预定义的字符、词汇、短语或者标记,用于告诉模型在生成文本的过程中何时停止输出;当模型在生成文本时遇到了这些特定的停止序列,就会终止当前的生成任务。
- 作用
- 控制输出长度和内容
- 长度控制:可以有效防止文本生成过长而失去控制。例如,在生成一篇新闻报道时,如果没有停止序列,模型可能会一直生成下去,变得冗长且偏离重点。通过设置停止序列,比如 “。。。结束” 或者特定的标点符号组合,就可以将新闻报道的篇幅控制在合理范围内。
- 内容控制:帮助确保生成的内容符合预期的主题或结构。例如,在回答一个问题时,当出现 “综上所述” 或者 “答案是” 这样的停止序列时,模型可以停止生成,使得回答有一个较为明确的结尾,避免生成无关内容。
- 提高生成效率和质量
- 减少不必要的计算资源消耗。如果模型没有停止信号,它可能会在生成低质量或者不符合要求的内容上浪费时间和资源。停止序列可以让模型及时停止无效的生成过程,提高整体的生成效率。同时,由于能够更好地控制输出内容,也有助于提高生成内容的质量,使其更符合用户的期望。
- 2.5 频率惩罚(Frequency Penalty)
- 频率惩罚(Frequency Penalty)是一种对模型生成文本时单词(或标记)出现频率进行控制的机制。简单来说,就是当模型在生成过程中倾向于过度使用某些单词或短语时,频率惩罚可以降低这些单词或短语再次出现的概率。
- 原理:在模型的生成算法中,每个单词(或标记)都有一个生成概率。频率惩罚会根据单词已经出现的次数来调整这个概率;当一个单词出现的次数较多时,频率惩罚机制会降低其后续生成的概率,使得模型更有可能选择其他单词来生成文本,从而避免生成内容过于单调、重复
- 2.6 存在惩罚(Presence Penalty)
- 存在惩罚(Presence Penalty)主要用于控制生成文本中单词(或词汇单元)的多样性。与频率惩罚(Frequency Penalty)不同,存在惩罚重点关注单词是否出现,而不是出现的频率
- 原理:当设置了存在惩罚参数后,模型在生成文本过程中,如果一个单词已经出现过,存在惩罚会降低这个单词再次被选中的概率。这种降低概率的程度由存在惩罚的具体数值决定。例如,若存在惩罚值较高,那么一旦一个单词出现过,它再次出现的可能性就会被大幅降低,从而促使模型去选择其他尚未出现的单词来构建文本。
3 提示词设计思路
- 3.1 明确提示词的基本元素(RTPO框架)
- 角色(role):告诉模型它需要扮演什么角色,如老师、医生、翻译等
- 模型需要做什么(target):告诉模型的具体任务
- 需要怎么做(plan):告诉模型该怎么做
- 输出格式(output):告诉模型该怎么输出,非必需
在以上基本元素上,不同的提示词工程师有自己的一些变形,下面是一些参考框架
- 3.2 设计提示词基本原则
- 3.2.1 表意清晰明确
- 使用符号
- 通过“”、<>、1/2/3等符号,类似于写作文中的段意明确;增加模型理解提示词
-
- 结构化输入
- 采用一定的范式进行输入,如HTML、JSON、markdown等方式来设计提示词
如markdown格式:
{
"input_format": {
"query": "{query}",
"brand_name": "{品牌名称}",
"shop_name": "{店铺名称}"
},
"output_format": {
"can_invest": "是/否"
}
}
- 提示词完备
- 尽可能完整表达需求,采用特定的格式进行设计
- 给出示例
- 给出一些输入、输出示例,便于模型参考;也是给模型你期望的答案的一种参考
- 3.2.2 给模型思考时间
- 任务分步骤处理
- 给出步骤,让模型按照步骤执行,避免错误理解或跳过思考;类比上学时考试前老师一般都会说请认真审题、不要着急交卷
- 例如:第一步 …… 第二步 ……
- 给模型预留时间提示
- 让模型预留一些时间来思考,因为模型给它一个输入一定会给一个输出,如果不提示思考,会快速给出答案,不关注答案可用性
- 例如:请多花一点时间思考,确保答案的准确性
- 3.3 提示词常用规则
- 引导输出
- 在提示词末尾包含几个字词或短语,以便获得遵循所需形式的响应
- 例如:在提示词末尾加上:请以“小主”作为回答的开头
- 明确语法
- 对提示词使用明确的语法(标点符号、标题、节等)
- 明确语法
- 例如:
- #你是一个心理咨询大师,你需要根据用户的感受给出建议
#你需要按照以下步骤执行:
1、引导用户进行多次输入,围绕用户现状、心理困惑等尽可能详细询问;
2、对用户输入的结果进行理解,并给出用户回复
- 分解任务
- 对于任务较多的,对任务进行拆解
- 例如:
- 第一步:你需要查阅XX
- 第二步:对查询到的XX进行理解
- 思维链提示
- 属于分解任务的变体,不是直接给出步骤,而是提示模型响应逐步进行,并提出所有涉及的步骤,可以减少不确定性(类似让模型给出解答步骤)
- 例如:请给出你思考的过程,并将过程输出
- 末尾重复提示
- 对于重要信息,在末尾重复几次,便于模型重视,因为模型容易受到“近因偏差”影响;类似于重要事情说三遍
- 末尾重复提示
- 元提示
- 可以用来指导AI系统的行为和提高系统性能的基础提示内容,把基础内容封装成模块、模版
- 少样本学习
- 通过少样本学习可以让模型快速适应新任务,一般是在提示中给出一组训练示例,然后要求模型完成多个未完成的示例
- 指定结构输出
- 指定结构输出可以让模型的输出规范化,同时指定结构输出也是让模型作为“连接器”的基础