The Prompt Report
提示工程调查报告《The Prompt Report: A Systematic Survey of Prompting Techniques》
主要内容
Core Prompting Techniques
- Text based Techniques:PRISMA流程,58中基于文本的提示技术,提示语术语分类表;
- MLT:Multilingual Techniques:多语言;
- MMT:Multimodel Techniques:多模态
- Agents:融入外部工具,如计算器;
- Safety:安全措施
- Evaluation:更好的评估输出,以避免出现幻觉;
- Security:安全性
2 A Meta-Analysis of Prompting 元分析
Text-Based Techniques基于文本的提示技术
- 58种基于文本的提示技术
- 6个主要类别
Text-Based Techniques术语(表)结构章节对照:
Text-Based Prompt Tech
- Zero-Shot 2.2.2
- Emotion Prompting 2.2.2 情绪
- Role Prompting 2.2.2 角色
- Style Prompting 2.2.2 风格
- S2A 2.2.2
- SimToM 2.2.2
- RaR 2.2.2
- RE2 2.2.2
- Self-Ask 2.2.2
- Few-Shot 2.2.1
- Exemplar Generation 范例生成
- SG-ICL 2.2.1.2
- Exemplar Ordering 2.2.1.1 样本订购
- Exemplar Selection 2.2.1.2 样本选择
- KNN 2.2.1.2
- Vote-K 2.2.1.2
- Exemplar Generation 范例生成
- Thought Generation 2.2.3
- Chain-of-Thought (CoT) 2.2.3 思维链
- Zero-Shot CoT 2.2.3.1
- Analogical Prompting 2.2.3.1 类比
- Step-Back Prompting 2.2.3.1 退步
- Thread-of-Thought (ThoT) 2.2.3.1 思维线程
- Tab-CoT 2.2.3.1
- Few-Shot CoT 2.2.3.2
- Active-Prompt 2.2.3.2
- Auto-CoT 2.2.3.2
- Complexity-Based 2.2.3.2 基于复杂性
- Contrastive 2.2.3.2 对比
- Memory-of-Thought 2.2.3.2 记忆思维
- Uncertainty-Routed CoT 2.2.3.2 不确定路由
- Prompt Mining 2.2.1.2 提示挖掘
- Zero-Shot CoT 2.2.3.1
- Chain-of-Thought (CoT) 2.2.3 思维链
- Ensembling 2.2.5 合成器
- COSP 2.2.5
- DENSE 2.2.5
- DiVeRSe 2.2.5
- Max Mutual Information 2.2.5 最大互信息
- Meta-CoT 2.2.5
- MoRE 2.2.5
- Self-Consistency 2.2.5 自一致性
- Universal Self-Consistency 2.2.5 通用自一致性
- USP 2.2.5
- Prompt Paraphrasing 2.2.5 提示释义
- Self-Criticism 2.2.6 自我批评
- Chain-of-Verification 2.2.6 验证链
- Self-Calibration 2.2.6 自校准
- Self-Refine 2.2.6 自我完善
- Self-Verification 2.2.6 自验证
- ReverseCoT 2.2.6
- Cumulative Reason. 2.2.6 累积原因
- Decomposition 2.2.4 分解
- DECOMP 2.2.4
- Faithful CoT 2.2.4
- Least-to-Most 2.2.4 最小到最多
- Plan-and-Solve 2.2.4 计划和解决
- Program-of-Thought 2.2.4 思维程序
- Recurs-of-Thought 2.2.4 反复思考
- Skeleton-of-Thought 2.2.4 思维大纲
- Tree-of-Thought 2.2.4 思维树
In-Context Learning(ICL) 情景学习
ICL指的是GenAI"学习"技能的能力(并不是真的学习),可以从存在于prompt中的相关说明或直接提供的示例中学习,而无需更新权重(或者就没有学习,直接使用了训练数据中已存在的知识);
Few-Shot Prompting:少量样本提示,就像这样:
- GenAI只通过了2个范例就完成了任务;
py
2+2: four
4+5: nine
8+0:
这里样本/样例 的 英文是 Exemplar,后面我们尽量统一将其标识为"范例",而不再指代样本这样的常用词;
制作 Few-Shot Prompting 时实用的6个主要设计方法(注意这些方法并不适用于所有任务):
- 范例的多样性/数量:如少量样本分类时,范例要能覆盖所有(或尽可能多)的分类;
- 样本数量多一些通常会改善模型性能,特别是在大模型中;
- 在某些情况下,超过20个样本,收益可能会减少;
- 范例的顺序:要有随机性;
- 范例的标签分布:要提供均衡的标签分布,以二分类为例,如果正样是2个,那么负样最好也是2个,否则会引入偏置;
- 范例标签的质量:保障样本标签标注的正确性;
- 某些情况下,错误的标签会严重影响性能;
- 范例格式:尽量选择常见的格式标识符,不要引入不常见的符号;
- 一个常见格式是
Q:{input}, A:{label}
- 如果能够使用类似训练数据的格式,将会有更好的性能;
- 一个常见格式是
- 范例的相似性:要选择与待推理的query类似的范例,如上面的实例中,问题是
8+0
,就不要使用八加零这样的query;- 与测试样本相似通常有利于提高性能(相似和多样化是相对的,这里的相似感觉更多是再说形式上的相似)
Few-Shot Learning(FSL)少量样本学习,经常与 Few-Shot Prompting 混淆,但要注意的是:FSL是一种更广意义的机器学习范式,它可以使用少量的样例去调整模型参数,而Few-Shot Prompting专门应用在prompt中,不涉及更新模型参数;
Few-Shot Prompting Techniques,这里介绍了几种选择和测试样本相近样本的几种技术:
- KNN
- Vote-K
- Self-Generated In-Context Learning (SG-ICL):利用GenAI自动生成样本;
- Prompt Mining:如在格式上做优化,不使用
Q:{input}, A:{label}
这样的常见格式,而是分析大语料库,提取出出现频率更高的格式; - More Complicated Techniques 其他复杂技术
Zero-Shot
零样本提示,以下介绍独立的零样本技术,后续还会讨论zero-shot与另一个概念"思维链"的结合;
zero-shot techniques
- Role Prompting:角色提示
- 通过向GenAI分配一个特定角色,有助于在开放任务上创造更理想的输出,某些情况下可以提高准确性;
- Style Prompting:风格提示
- 提示风格、语气、性别,帮助塑造GenAI的输出,和角色提示有重叠
- Emotion Prompting:情绪提示
- 提示融入人类心理相关短语,可能会提高LLM基准测试和开放式文本生成方面的表现;
- System 2 Attention (S2A):
- 首先,要求LLM重写prompt并且删除任何与问题不相关的信息;
- 然后,将这个新的prompt发送给LLM以检索最终结果;
- SimToM:
- 处理涉及多个人、多个对象的复杂问题;
- 给定一个问题,尝试确定一个人所知道的事实集合,然后仅仅根据这些事实回答问题;
- 这是一个双提示的过程,可以帮助消除提示中不相关信息的影响;
- Rephrase and Respond (RaR):重新措辞和回答
- 指示LLM在生成最终答案之前,重新表述和扩展问题,如添加这样的短语
"重新表述和扩展问题,然后回答(Rephrase and expand the question, and respond)"
- RaR已经在多个基准测试上表现出改进;
- 指示LLM在生成最终答案之前,重新表述和扩展问题,如添加这样的短语
- Re-reading (RE2):
- 在提示中添加短语
"再次阅读问题(Read the question again)"
,这在处理复杂问题时可改进基准;
- 在提示中添加短语
- Self-Ask:
- 提示LLM 首先决定 是否针对给定的提示 提出后续问题;如果需要,LLM将生成这些问题,然后回答这些问题,最后回答原始问题;
Thought Generation
思维生成,涉及一系列的技术,可以在解决问题时,帮助LLM阐明其推理过程;
Chain-of-Thought (CoT) Prompting:思维链(CoT)提示
- 利用少量提示来鼓励LLM在给出最终答案之前,表达其思维过程;
- 事实证明,这可以显著提高LLM在数学和推理任务中的表现;
- 具体提示包含:一个问题、一条推理路径和正确答案;
py
# 这是一个 One-Shot 的 CoT
Q: 杰克有两个篮子,每个篮子里有三个球。杰克一共有多少个球?
A: 一个篮子有3个球,所以两个篮子里有 3 * 2 = 6个球。
Q: {question}
A:
Zero-Shot-CoT:
- 在提示中附加一个引发思考的短语,如
"让我们一步一步思考(Let's think step by step.)"
- 或者其他的短语,包括
"让我们一步一步地解决这个问题,以确保我们得到正确的答案(Let's work this out in a step by step way to be sure we have the right answer)"
- 零样本提示 不需要额外的样本,并且通常与任务无关;
1)Step-Back Prompting:
- 是CoT的改良版,LLM在被要求深入推理前,先提出一个关于相关概念或事实的一般性高级问题;
- 这对某些基线有显著提高;
2)Analogical Prompting:类比提示
- 与SG-ICL(Self-Generated In-Context Learning,自生成样本的上下文学习)类似,可自动生成包含CoT的样本;
- 在数学推理和代码生成方面有所改进;
3)Thread-of-Thought (ThoT) Prompting:思路提示
- 包含一个改进思路的诱导器,不在使用"让我们一步一步思考",而是使用
"一步一步地引导我完成这个可管理的部分,并在过程中进行总结和分析(Walk me through this context in manageable parts step by step, summarizing and analyzing as we go.)"
; - 这种诱导器在问答和检索设置中效果很好,尤其是在处理大型、复杂的问题时;
4)Tabular Chain-of-Thought (Tab-CoT) :表格式思维链
- 由使LLM输出推理为MarkDown表格的零样本提示组成
- 这种表格涉及使得LLM能够改进其输出结构,进而改进其推理能力;
Few-Shot CoT:
- 为LLM提供多个范例,其中包括 chains-of-thought思维链;
- 有时可以显著提高性能(又称 Manual-CoT或Golden CoT)
1)Contrastive CoT Prompting:对比性 CoT 提示
- 将正确和不正确解释的范例添加到CoT提示中,以向LLM展示如何
不去
推理; - 被证明在 算术推理和事实问答领域有显著进步;
2)Uncertainty-Routed CoT Prompting:不确定路由CoT提示
- 对多个 CoT推理路径进行采样,如果高于某个阈值(根据验证数据计算,
这里的阈值应该指的是推理链的长度
),则选择大多数都支持的结果;如果不高于,则会贪婪采样并选择响应;
3)Complexity-based Prompting:基于复杂性的提示
- 涉及对CoT的两大修改,首先,基于问题长度或所需的推理步骤等因素选择复杂示例进行注释并包含在提示中;
- 其次,在推理过程中,会对多个推理链进行抽样,并在超过
一定长度阈值的链
中使用多数投票; - 这里的一个前提是:
较长的推理
表示更高的答案质量;
4)Active Prompting:主动提示
- 选择一些训练问题(范例),让LLM解决这些问题,然后计算不确定性,要求人工注释者重写不确定性最高的样本;(相当于一个特别的范例)
5)Memory-of-Thought Prompting:思维记忆提示
- 利用未标记的训练样本,在测试时构建 Few-Shot CoT;
- 在测试前,使用CoT对未标记的训练样本进行推理;
- 在测试时,它会重新检索与测试样本相似的示例;
- 该方法对算术、常识和事实推理基准有改进
6)Automatic Chain-of-Thought (Auto-CoT) Prompting
- 使用 Zero-Shot提示自动生成思维链,然后使用这些思维链为测试样本构建Few-Shot CoT提示;
Decomposition:分解
- 将复杂问题分解为更简单的子问题,对于人类和GenAI来说,这都是有效的问题解决策略;
- 一部分分解技术类似 思维链诱导技术,如CoT,通常自然地将问题分解为更简单的组件;
- 但是,明确的分解问题可以进一步提高LLM解决问题的能力;
1)Least-to-Most Prompting
- 首先,提示LLM将给定问题 分解为子问题,但不解决它们;
- 然后,按照顺序解决它们,每次将模型响应附加到提示中,直到得出最终结果;
- 这种方法,在涉及符号操作、组合泛化和数据推理的任务中表现出显著的改进;
2)Decomposed Prompting (DECOMP):分解提示
- Few-Shot可以提示LLM调用某些功能(函数或工具,如字符串拆分和互联网搜索);
- 如果有针对不同子问题的不同处理函数,则可以使用LLM将原始问题分解的子问题发送给不同函数,以改进表现;
3)Plan-and-Solve Prompting
- 由改进的Zero-Shot CoT提示组成,如
"让我们先理解问题,并且制定一个解决它的计划。然后,让我们执行计划并逐步解决问题(Let's first understand the problem and devise a plan to solve it. Then, let's carry out the plan and solve the problem step by step)"
; - 此方法在多个数据集上测试比标准Zero-Shot-CoT生成更强大的推理过程;
4)Tree-of-Thought (ToT):思维树
- 从初始问题开始,生成多个可能的思维链(步骤),创建一个树状搜索问题;
- 评估每个能解决问题的步骤,并决定继续执行哪些步骤,继续产生更多想法;
- ToT对需要搜索和规划的任务特别有效;
5)Recursion-of-Thought:递归思维
- 与常规CoT类似,只是,每次在推理链中遇到复杂问题时,都会将问题发送到另一个Prompt/LLM中调用,完成后将答案插入原始提示中;
- 以递归的方式解决复杂问题,包括那些可能超出最大上下文长度的问题;
- 该方法在算法上表现出了进步;
6)Program-of-Thoughts:思维程序
- 使用Codex等LLM生成 程序代码,作为推理步骤;代码执行器执行这些步骤以获得最终答案;
- 在数学和编程相关任务表现出色,但在语义推理任务方面效果价差;
7)Faithful Chain-of-Thought:可信的思维链
- 生成一个既有自然语言推理,又有符号语言(如Python)推理的CoT,类似Program-of-Thoughts;
8)Skeleton-of-Thought:
- 专注于并行化来加快回答速度;
- 给定一个问题,它会提示LLM创建答案的骨架,从某种意义上说,是需要解决的子问题;
- 然后,它会并行地将这些问题发送给LLM,并将所有输出连接起来以获得最终答案;
Ensembling:集成
- 集成是 使用多个 提示来解决同一个问题,再将这些响应聚合呈最终输出的过程;
- 在许多情况下,也可以多数投票(选择最常见的响应)用于生成最终结果;
- 集成技术减少了LLM输出的方差,通常会提高准确性,代价是增加了调用模型的次数;
1)Demonstration Ensembling (DENSE):演示集成
- 创建多个来自不同样本子集的小样本提示,聚合这些提示的输出以生成最终响应;
2)Mixture of Reasoning Experts (MoRE):混合专家推理
- 通过对不同推理类型使用不同的专门提示,如 对
事实推理使用检索增强生成
,对数学推理使用思维链推理,对常识推理使用生成知识提示; - 这样创建一组多样化的推理专家;根据
一致性得分
从所有专家中选择最佳答案;
3)Max Mutual Information Method:最大化相互信息
- 创建具有不同风格和范例的多个提示模版,然后选择最佳模版作为最大化 提示和LLM输出之间 的相互互信息 模版;
4)Self-Consistency
:自洽性
- 根据
多种推理路径可以得出相同答案的直觉
; - 该方法首先,多次提示LLM执行CoT,关键是使用非零
温度
来引出不同的推理路径; - 接下来,对所有生成的答案使用多数投票来选择最终答案;
5)Universal Self-Consistency:通用自洽性
- 与自洽性不同的是,它
不是用过程序计算
出现频率来选择(多数支持的)答案,而是将所有输出插入提示模版中来选择多数答案;
6)Meta-Reasoning over Multiple CoTs:多个 CoT 上的元推理
- 类似通用自洽性,首先针对给定问题生成多个推理链,然后将所有这些
链
插入到单个提示模版中,然后从中生成最终答案;
7)DiVeRSe:
- 针对给定问题创建
多个提示
,然后对每个提示进行自洽,从而生成多个推理路径; - 再根据其中的每个步骤对推理路径进行评分,然后选择(某一推理路径生成的)最终答案;
8)Consistency-based Self-adaptive Prompting (COSP) :基于一致性的自适应提示
- 通过在 一组示例上 运行具有自一致性的Zero-Shot Cot来构建Few-Shot Cot;
- 然后选择输出中 一致性 较高的子集 作为
范例
包含在最终提示中; - 再次用这个最终提示表现自一致性;
9)Universal Self-Adaptive Prompting (USP):通用自适应提示
- 建立在COSP基础上,旨在使其能够推广到所有任务;
- USP利用未标注的数据生成样本,并使用更复杂的
评分函数
来选择样本;(可见,使用外部工具/插件的能力,已经被看作是LLM常用能力之一) - USP不使用自洽性;
10)Prompt Paraphrasing:提示解释
- 通过改变部分措辞来转换原始提示,同时仍保持整体含义;
- 实际是一种数据增强技术,可用于集成生成提示;
Self-Criticism:自我批评
- 让LLM批评自己的输出,可能会很有用;或者让LLM提供反馈用于改进答案;
1)Self-Calibration:自我校准
- 首先,提示LLM回答一个问题;
- 然后,LLM构建一个 包含 问题、LLM答案以及 询问答案是否正确的附加说明 的馨提示;
- 在应用LLM时,决定何时接受或修改原始答案,这可以用来衡量信心水平;
2)Self-Refine:自我完善
- 这是一个迭代框架,给定LLM的初始答案,并提示同一个LLM对答案提供的反馈;
- 然后,
提示LLM根据反馈改进答案
;此迭代过程持续进行知道满足条件为止(如达到最大步数) - 在一系列推理、编码和生成任务中表现出了进步;
3)Reversing Chain-of-Thought (RCoT):逆向思维链
- 首先,提示LLM根据
答案
构建问题; - 然后,它会在原始问题和重构问题之间进行细粒度的比较,以检查是否存在任何不一致之处;
- 再讲这些不一致转化为反馈,供LLM
修改生成的答案
;
4)Self-Verification:自我验证
- 使用CoT生成多个候选解决方案;
- 然后,通过屏蔽原始问题的某些部分要求LLM根据问题的其余部分和生成的解决方案对其进行预测,来对每个解决方案进行评分;
- 该方法在8个推理数据集上显示出了改进;
5)Chain-of-Verification (COVE):验证链 (COVE)
- 首先,使用LLM生成给定问题的答案;
- 然后,(使用LLM)创建一个相关问题的列表,以帮助验证答案的正确性;
- 每个问题都由LLM回答,然后将所有信息提供给LLM以生成最终的修改答案;
- 这种方法在各种问答和文本生成任务重都显示出了改进;
6)Cumulative Reasoning:累积推理
- 首先生成回答问题的几个潜在步骤,然后让LLM评估它们;
- 决定接受还是拒绝这些步骤,对于接受步骤的推理结果,检查是否是最终结果;
- 如果是,则终止,否则重复该过程;
- 该方法在逻辑推理任务和数学问题方面有改进;
Prompting Technique Usage
基于文本的提示技巧有很多,但只有一小部分被经常用到,如:Few-Shot Learning、Zero-Shot Reasoning、Good In-Context Examples、Self-Consistency、Prompt Order Sensitivity、Least-to-Most Prompting、Prompt Retrieval、Human-Level Prompting、Automatic CoT、Self-Ask、Tree of Thoughts等;
Prompt Engineering
Meta Prompting:元提示
- 提示LLM生成(或提高)提示(或提示模版)的过程;
AutoPrompt:
- 提示模版中支持一些训练时已加入的"触发标记",这些触发标记也是参与训练的数据的一部分,这是一个软提示(soft-prompting)的版本;
Automatic Prompt Engineer (APE)
- 使用一个范例的集合来生成 Zero-Shot指令提示;
- 它生成多个可能得提示,对它们进行评分,然后创建最好的一个的变体
- 这个过程不断重复,直到达到某些期望值;
- 注意这个目标是生成
提示
;
Gradientfree Instructional Prompt Search (GrIPS) :无梯度教学提示搜索
- 与APE类似,但是用了更复杂的操作,删除 增加 交换和释义,以便创建起始提示的变体;
Prompt Optimization with Textual Gradients (Pro-TeGi):使用文本渐变进行提示优化
- 通过多步骤过程 改进 提示模版的 提示工程手段;
- 首先,通过模版输入一批数据,然后将 输出、ground truth和提示,加到另一个Prompt中,这个Prompt可以批评原始的promot;最后从这些批评中生成新的提示,然后使用一个bandit算法来选择一个;
RLPrompt:
- 使用一个冻结的LLM,添加未冻结的模块,使用对模版进行评分的数据集,然后使用更新解冻模块的Soft Q-Learning;
- 有趣的是,该方法经常选择语法混乱的文本作为最佳提示模板。
Dialogue-comprised Policy-gradient-based Discrete Prompt Optimization (DP2O) :
- 包含对话框的基于策略梯度的离散提示优化
- 可能是最复杂的提示工程技术,涉及强化学习、自定义提示评分功能以及与LLM的对话,以构建Prompt;
Answer Engineering
这是一个从LLM的输出中提取答案的算法中开发或选择 的迭代过程;
这里考虑一个二分类任务:
- 标签未 "仇恨言论"和"非仇恨言论"
- 一个可能得提示如下:
py
这是"仇恨言论"还是"非仇恨言论":
{文本}
中的输出可能不仅仅包含标签值,还可能包括一些其他的辅助描述信息,这导致响应格式存在差异,很难一致的解析;而使用改进的提示仅在一定程度上有帮助;
答案工程有三个设计角色帮助解决这一问题:
- 答案空间的选择:包含所有的标签答案(的可能值),以上面的二分类例子,答案空间应限制为"仇恨言论"和"非仇恨言论";
- 可能包含值的范围
- 答案的形状(answer shape):特定的修饰格式,仍是这个例子,我们希望不要有任何其他修饰内容,因此答案形状应限制为单个标签/标记("仇恨言论"和"非仇恨言论"中的一个);
- 一个标记、一系列标记、一张图或视频
- 答案提取器(extractor):仅提取 适当的 标签,如"仇恨言论"
- 在无法控制答案空间时,可以定义规则来提取最终答案,如一个简单的正则,也可以是单独的LLM;
1)Verbalizer:
- 将输出映射到标签(以及相反过程);
- 如果我们希望一个模型预测一条Tweet是积极的还是消极的,我们可以提示它输出"+"或"-",语言化器会将这些标记序列映射到适当的标签;语言表达器的选择是答案工程的一个组成部分;
2)Regex:
- 正则表达式通常用于提取答案。它们通常用于 搜索标签的第一个实例。
- 如果要根据输出格式、是否生成CoT ,那么实际搜索的目标是最后一个实例可能更好。
3)Separate LLM
- 有时输出非常复杂,正则表达式无法一致地工作;
- 在这种情况下,使用单独的LLM评估输出并提取答案,会很有用。