摘要
通过以自然语言指令作为条件输入,大型语言模型(LLMs)展现出令人印象深刻的通用计算能力。然而,任务表现严重依赖于用于引导模型的提示(prompt)质量,而最有效的提示通常是由人类手工设计的。受经典程序合成方法和人类提示工程实践的启发,我们提出了自动提示工程师 (Automatic Prompt Engineer, APE)方法,用于自动生成和选择指令。在我们的方法中,将"指令"视作"程序",通过在由LLM提出的一组指令候选中搜索,优化一个目标评分函数,从而选择最优指令。为了评估所选指令的质量,我们使用另一个LLM在零样本设定下执行该指令,并评估其表现。大量实验证明,我们自动生成的指令在24项Instruction Induction任务中全面超越了先前的LLM基线,并在21项BIG-Bench任务中的17项上实现了优于或可比于人类注释者的性能。我们进行了大量定性和定量分析来探索APE的性能,展示了APE生成的提示不仅能提升少样本学习效果(只需将其前缀添加至标准的上下文学习提示中),还能找到更优的零样本chain-of-thought提示,并能引导模型生成更真实和/或更具信息性的内容。
1 引言
大规模和基于注意力机制的架构相结合,使得语言模型具备了前所未有的通用性(Kaplan et al., 2020;Vaswani et al., 2017)。这些被称为"大型语言模型"(LLMs)的系统在各类任务中表现出卓越,甚至超越人类的能力,包括零样本和少样本设定(Brown et al., 2020;Srivastava et al., 2022)。然而,通用性的提升也引出了一个核心问题:我们如何才能让LLM做我们希望它做的事?
为了解决这个问题并引导LLMs展现出期望行为,近期研究探索了多种方法,包括微调(Ouyang et al., 2022;Ziegler et al., 2019)、上下文学习(Brown et al., 2020),以及多种提示生成方法(Gao, 2021),其中包括软提示的可微调方法(Qin & Eisner, 2021;Lester et al., 2021)和自然语言提示工程(Reynolds & McDonell, 2021)。其中,自然语言提示工程特别值得关注,因为它为人类与机器之间提供了一种自然的交互接口,这种方法不仅适用于LLMs,也可能对其他通用模型(例如基于提示的图像生成器,Rombach et al., 2022;Ramesh et al., 2022)具有重要意义。公众对提示设计与生成的兴趣也日益增长(见附录A示例)。
这一现象背后的原因在于:即使目标结果是可以通过其他指令实现的,朴素语言提示也往往无法产生期望的输出。因此,用户需要尝试多种提示以激发模型产生目标行为,因为他们对于哪些指令与特定模型兼容知之甚少。我们可以将LLM看作执行由自然语言指令定义程序的黑盒计算机:尽管它们能够执行大量的自然语言程序,但程序的处理方式可能并不符合人类的直觉,且指令的质量只能通过在下游任务中执行后才能被评估(Sanh et al., 2022;Wei et al., 2021)。

为了减少在创建和验证有效指令过程中所需的人力成本,我们提出了一种使用大语言模型(LLM)自动生成和筛选指令的新算法。我们将这一问题称为自然语言程序合成(natural language program synthesis) ,并提出将其作为一个黑盒优化问题来解决,利用LLM生成并在启发式可行的候选解空间中进行搜索。在此过程中,我们从三个方面利用了LLM的通用能力。首先,我们将LLM作为推理模型(Ellis 等,2021;Honovich 等,2022),根据少量输入-输出示例生成指令候选项。接着,我们通过计算每条指令在目标LLM下的评分来引导搜索过程。最后,我们提出了一种迭代的蒙特卡洛搜索方法,由LLM生成语义相近的指令变体以改进当前最佳候选项。
直观地说,我们的算法让LLM根据示例生成一组指令候选项,并评估哪些指令更具潜力。我们将此算法命名为自动提示工程师(Automatic Prompt Engineer,APE)。我们的主要贡献如下:
- 我们将指令生成建模为自然语言程序合成问题,形式化为一个由LLM引导的黑盒优化问题,并提出了朴素的和迭代的蒙特卡洛搜索方法来近似求解。
- 我们提出的方法 APE 在由模型生成指令的零样本学习任务中达到了人类水平的表现,在24个Instruction Induction任务中全部通过(24/24),在21个Big-Bench任务中完成了17个(17/21)。
- 我们提供了广泛的定性和定量分析,探讨了APE的多个方面,并展示了APE在提升小样本学习效果、发现更优的零样本思维链提示(zero-shot chain of thought prompts)以及引导LLM朝向更真实和/或更具信息性的行为方面的应用。
2 相关工作
大型语言模型
通过在模型规模、训练数据和计算资源方面对基于transformer的语言模型进行扩展,已经被证明可以在各种下游自然语言处理任务中带来可预测的性能提升(Vaswani et al., 2017;Devlin et al., 2018;Brown et al., 2020)。随着规模扩展,LLM展现出了许多涌现能力(Wei et al., 2022a),包括小样本上下文学习、零样本问题求解、思维链推理、指令遵循和指令诱导(Cobbe et al., 2021;Wei et al., 2022b;Kojima et al., 2022;Sanh et al., 2022;Wei et al., 2021;Ouyang et al., 2022;Honovich et al., 2022)。在本文中,我们将LLM视为能够执行由自然语言指令指定程序的黑盒计算机,并研究如何利用模型生成的指令来控制LLM的行为。
提示工程
提示(prompting)为人类与通用模型如LLM的交互提供了一种自然直观的接口。由于其灵活性,提示已被广泛用于各种NLP任务中(Schick & Schütze, 2021;Brown et al., 2020;Sanh et al., 2022)。然而,LLM对提示的理解方式与人类不同,因此需要精心设计提示,无论是手动(Reynolds & McDonell, 2021)还是自动(Gao et al., 2021;Shin et al., 2020)生成。尽管许多成功的提示微调方法使用基于梯度的方式在连续空间中进行优化(Liu et al., 2021;Qin & Eisner, 2021;Lester et al., 2021),但随着模型规模的增加,这种方法的计算代价变得越来越高,并且API化的模型使用方式往往不再提供梯度访问权限。
在本文中,我们借鉴了离散提示搜索方法中的组件,如提示生成(Gao et al., 2021;Ben-David et al., 2021)、提示评分(Davison et al., 2019)和提示释义(Jiang et al., 2020;Yuan et al., 2021),通过直接在自然语言假设空间中搜索来优化指令。与这些依赖于多个专用模型并严重依赖人工模板的工作不同,我们展示了整个搜索过程可以由单一LLM完成。
程序合成
程序合成指的是在"程序空间"中自动搜索,找到满足特定规范的程序(Gulwani et al., 2017)。现代程序合成支持多种形式的规范,包括输入-输出示例(Ellis et al., 2021;Wong et al., 2021)和自然语言(Jain et al., 2022)。可搜索的程序空间也在不断扩大,从早期受限的领域特定语言逐步发展为支持通用编程语言(Austin et al., 2021)。
与需要结构化假设空间和组件库的传统方法(Liang et al., 2010;Ellis et al., 2018)不同,我们利用LLM所提供的结构,在自然语言程序空间中进行搜索。使用推理模型是一种常见的加速搜索的方式,通过限制搜索空间为一小部分可行表达来提高效率(Menon et al., 2013;Lee et al., 2018;Devlin et al., 2017;Ellis et al., 2021)。受此启发,我们将LLM作为近似推理模型,基于少量示例生成程序候选项。与传统程序合成方法不同,我们的推理模型无需训练,并且能够很好地泛化到各种任务。
3 使用LLM进行自然语言程序合成
我们考虑这样一个任务:由数据集 D train = { ( Q , A ) } { \mathcal { D } } _ { \operatorname { t r a i n } } = \{ ( Q , A ) \} Dtrain={(Q,A)} 指定,该数据集由来自总体 X X X 的输入/输出示例组成,同时还包括一个提示式模型 M M M。自然语言程序合成的目标是找到一个指令 ρ \rho ρ,使得当模型 M M M 接收到 ρ \rho ρ 和给定输入 Q Q Q 的拼接 [ ρ ; Q ] [\rho ; Q] [ρ;Q] 作为提示时,能够输出相应的输出 A A A。更形式化地,我们将这一过程表述为一个优化问题:寻找指令 ρ \rho ρ,以最大化某个对单个样本打分函数 f ( ρ , Q , A ) f(\rho, Q, A) f(ρ,Q,A) 在所有可能的 ( Q , A ) (Q, A) (Q,A) 上的期望:
ρ ⋆ = arg max ρ f ( ρ ) = arg max ρ E ( Q , A ) [ f ( ρ , Q , A ) ] ( 1 ) \rho^{\star} = \underset{\rho}{\arg\operatorname*{max}} \; f(\rho) = \underset{\rho}{\arg\operatorname*{max}} \; \mathbb{E}_{(Q, A)} \left[ f(\rho, Q, A) \right] \quad(1) ρ⋆=ρargmaxf(ρ)=ρargmaxE(Q,A)[f(ρ,Q,A)](1)
需要注意的是, Q Q Q 一般也可以是空字符串,此时我们等价地在优化一个能直接生成输出 A {A} A 的指令 ρ \rho ρ。尽管人类经常尝试该任务,但我们对某个特定指令与模型 M M M 之间的兼容性知之甚少。因此,我们提出将这一人类难以处理的问题转化为一个由LLM引导的黑盒优化过程。
我们的算法 APE(Automatic Prompt Engineer)在两个关键组件中使用LLM:候选指令生成(proposal)和 评分(scoring)。如图和算法中所示,APE 首先生成一组候选提示,然后根据选定的评分函数对这些候选集进行过滤或改进,最终选出得分最高的指令作为最终输出。我们将在接下来的部分讨论候选生成与评分策略的具体实现方案。
3.1 初始提议分布
由于搜索空间几乎无限大,找到合适的指令极为困难,这也使得自然语言程序合成在历史上一直被认为是难以实现的任务。NLP领域的最新进展表明,语言模型在生成多样的自然语言文本方面表现优异。因此,我们考虑利用预训练的LLM来提出一组良好的候选解集合 U U U,以引导我们的搜索过程。虽然从LLM中随机采样不太可能生成理想的 ( Q , A ) (Q, A) (Q,A) 对,但我们可以改为请求LLM基于输入/输出示例近似推断出那些具有较高得分的最可能指令,即从 P ( ρ ∣ D train ; f ( ρ ) 高 ) P(\rho \mid \mathcal{D}_{\text{train}}; f(\rho) \text{ 高}) P(ρ∣Dtrain;f(ρ) 高) 中进行近似采样。

正向模式生成(Forward Mode Generation)
我们考虑两种从 P ( ρ ∣ D t r a i n , f ( ρ ) i s h i g h ) P ( \rho \, | \, \mathcal { D } _ { \mathrm { t r a i n } } , \ f ( \rho ) \ \mathrm { i s \ h i g h } ) P(ρ∣Dtrain, f(ρ) is high) 中生成高质量候选项的方法。第一种方法是基于"正向"模式的生成,通过将该分布 P ( ρ ∣ D t r a i n , f ( ρ ) i s h i g h ) P ( \rho \, | \, \mathcal { D } _ { \mathrm { t r a i n } } , \ f ( \rho ) \ \mathrm { i s \ h i g h } ) P(ρ∣Dtrain, f(ρ) is high) 翻译为自然语言文本。例如,在我们的指令诱导实验中(第4.1小节),我们遵循 Honovich 等人(2022)的方法,使用图2(上)中的提示方式来提示LLM。
反向模式生成(Reverse Mode Generation)
尽管"正向"模型对大多数预训练LLM而言可以直接使用,但将 P ( ρ ∣ D t r a i n , f ( ρ ) i s h i g h ) P ( \rho \, | \, \mathcal { D } _ { \mathrm { t r a i n } } , \ f ( \rho ) \ \mathrm { i s \ h i g h } ) P(ρ∣Dtrain, f(ρ) is high) 翻译为自然语言文本在不同任务中仍需要自定义设计。这是因为指令通常出现在段落的开头,而"正向"模型只能从左到右生成文本,这要求指令必须出现在提示的末尾才能被预测。因此,我们希望采用一种更灵活的方法,使得指令可以出现在文本中的任意位置。
为了解决这一问题,我们提出"反向"模式生成方法,利用具备填空能力的LLM(例如 T5(Raffel et al., 2020)、GLM(Du et al., 2022)以及 InsertGPT(Bavarian et al., 2022))来推断缺失的指令。我们的"反向"模型通过填空的方式直接从 P ( ρ ∣ D t r a i n , f ( ρ ) i s h i g h ) P ( \rho \, | \, \mathcal { D } _ { \mathrm { t r a i n } } , \ f ( \rho ) \ \mathrm { i s \ h i g h } ) P(ρ∣Dtrain, f(ρ) is high) 中进行采样。图2(中)展示了这种模板的一个示例。
定制提示(Customized Prompts)
需要注意的是,根据所使用的评分函数的不同,可能存在比上述样例更合适的提示方式。例如,在我们的 TruthfulQA 实验中,我们从原始数据集中人类设计的指令出发(Lin et al., 2022),并请求"反向"模型生成符合缺失上下文的初始指令样本(见图2(下))。

3.2 评分函数
为了将我们的问题建模为黑盒优化问题,我们选择一个评分函数,用以准确衡量数据集与模型生成数据之间的一致性。在我们的指令诱导实验中,我们考虑了两种潜在的评分函数,下面将进行介绍。在 TruthfulQA 实验中,我们主要采用 Lin 等人(2022)提出的自动化度量指标,这些指标与执行准确率(execution accuracy)类似。在每种情况下,我们使用公式(1)对生成指令的质量进行评估,并在保留的测试数据集 D test \mathcal{D}_{\text{test}} Dtest 上取期望。
执行准确率(Execution Accuracy)
首先,我们考虑使用 Honovich 等人(2022)提出的执行准确率指标来评估指令 ρ \rho ρ 的质量,记作 f exec f_{\text{exec}} fexec。在大多数情况下,执行准确率被简单地定义为 0-1 损失函数: f ( ρ , Q , A ) = 1 [ M ( [ ρ ; Q ] ) = A ] f ( \rho , Q , A ) = \mathbb { 1 } \left[ \mathcal { M } ( [ \rho ; Q ] ) = A \right] f(ρ,Q,A)=1[M([ρ;Q])=A] ,其中, 1 [ ⋅ ] \mathbf{1}[\cdot] 1[⋅] 是指示函数,若括号内的条件为真则返回 1,否则返回 0。在某些任务中,执行准确率还会考虑不变性(invariants);例如,它可能是一个对顺序不敏感的集合匹配损失函数,具体定义详见 Honovich 等人(2022)附录 A。
对数概率
我们进一步考虑一种更柔和的概率评分函数,我们假设这种方法在搜索低质量指令候选时,能够通过提供更细粒度的信号来改善优化效果。具体来说,我们考虑在目标模型 MM 下,给定指令和问题时期望答案的对数概率,即每个样本上的 log P ( A ∣ [ ρ ; Q ] ) \log P(A \mid [\rho; Q]) logP(A∣[ρ;Q])。
温馨提示:
阅读全文请访问"AI深语解构 " APE:大语言模型具有人类水平的提示工程能力