Lilian Weng 现为 OpenAI 应用人工智能研究负责人,主要从事机器学习、深度学习等研究 。她本科毕业于香港大学,硕士毕业于北京大学信息系统与计算机科学系,之后前往印度安纳大学布鲁顿分校攻读博士。

个人博客地址:https://lilianweng.github.io/

谷歌学术:https://scholar.google.com/citations?user=dCa-pW8AAAAJ&hl=en 


Prompt Engineering,也称为In-Context Prompting,指的是如何与 LLM 通信以在不更新模型权重的情况下引导其行为以获得预期结果的方法。这是一门经验科学,即时工程方法的效果在模型之间可能会有很大差异,因此需要大量的实验和启发式方法。

有用的资源:

这篇文章仅关注自回归语言模型的提示工程,因此与完形填空测试、图像生成或多模态模型无关。就其核心而言,即时工程的目标是对齐和模型可操纵性。查看我之前关于可控文本生成的帖子

[我的个人看法]在我看来,一些提示工程论文不值得 8 页长,因为那些技巧可以用一两句话解释,剩下的就是基准测试。一个易于使用和共享的基准基础设施应该对社区更有好处。迭代提示或外部工具的使用并非易事。使整个研究界都采用它也很重要。

基本提示

Zero-shot 和 few-shot learning 是两种最基本的模型提示方法,由许多 LLM 论文开创,通常用于基准 LLM 性能。

零射击

零样本学习是简单地将任务文本输入模型并要求结果。

(所有情感分析示例均来自SST-2)

小镜头

Few-shot learning提供了一组关于目标任务的高质量演示,每个演示都包含输入和期望的输出。当模型首先看到好的例子时,它可以更好地理解人类的意图和需要什么样的答案的标准。因此,少样本学习通常比零样本学习有更好的性能。然而,它是以更多的令牌消耗为代价的,并且当输入和输出文本很长时可能会达到上下文长度限制。

许多研究研究了如何构建上下文中的示例以最大限度地提高性能,并观察到提示格式、训练示例和示例顺序的选择会导致从接近随机猜测到接近 SoTA 的显着不同的性能。

赵等。(2021)调查了少样本分类的情况,并提出 LLM 的几个偏差(他们在实验中使用 GPT-3)导致了如此高的方差:(1)如果示例中的标签分布不平衡,则存在多数标签偏差; (2) Recency bias是指模型可能在最后重复标注的倾向;(3) Common token bias表明 LLM 比 rare tokens 更倾向于产生 common token。为了克服这种偏差,他们提出了一种方法来校准模型输出的标签概率,使其在输入字符串为 时保持一致N/A

示例选择提示

  • 选择在语义上与测试示例相似的示例k-嵌入空间中的 NN 聚类(Liu et al., 2021

  • 为了选择多样化且具有代表性的示例集,Su 等人。(2022)提出使用基于图的方法:(1)首先,构造一个有向图G=(V,E)基于嵌入(例如通过SBERT其他 嵌入 模型)样本之间的余弦相似度,其中每个节点指向其k最近的邻居;(2) 从一组选定的样本开始L=∅和一组剩余样本u. 每个样品你u∈U得分为

这样秒s(v)很低,如果很多v的邻居被选中,因此评分鼓励选择不同的样本。

  • 鲁宾等人。(2022)提出通过特定于一个训练数据集的对比学习来训练嵌入,以进行上下文学习样本选择。给定每个训练对(x,y), 一个例子的质量\( e_{i} \)(格式化的输入输出对)可以通过 LM 分配的条件概率来衡量:    

        我们可以用 top- 识别其他示例�和底部-�将每个训练对的候选正集和负集打分,并将其用于对比学              习。

示例订购提示

  • 一个普遍的建议是保持样本选择的多样性、与测试样本的相关性以及随机顺序,以避免多数标签偏差和近因偏差。
  • 增加模型大小或包含更多训练示例不会减少上下文示例的不同排列之间的方差。相同的订单可能适用于一种型号,但不适用于另一种型号。当验证集有限时,请考虑选择顺序,以使模型不会产生极度不平衡的预测或对其预测过于自信。( Lu et al. 2022 )

指令提示

在提示中展示少量示例的目的是向模型解释我们的意图;换句话说,以演示的形式向模型描述任务指令。然而,few-shot 在令牌使用方面可能很昂贵,并且由于上下文长度有限而限制了输入长度。那么,为什么不直接给出指令呢?

Instructed LM(例如InstructGPTnatural instruction)使用高质量元组(任务指令、输入、ground truth 输出)微调预训练模型,使 LM 更好地理解用户意图并遵循指令。RLHF(人类反馈强化学习)是一种常用的方法。instruction following style fine-tuning 的好处是改进了模型,使其更符合人类的意图,并大大降低了沟通成本。

在与指令模型交互时,我们应该详细描述任务要求,尽量具体准确,避免说“不做某事”,而是具体说明要做什么。

向目标听众解释是另一种聪明的指示方式

  • 例如为孩子们制作教育材料,

  • 和安全的内容,

情境指令学习Ye et al. 2023 ) 将小样本学习与指令提示相结合。它在提示中包含多个跨不同任务的演示示例,每个演示都由指令、任务输入和输出组成。请注意,他们的实验仅针对分类任务,指令提示包含所有标签选项。

自洽抽样

自洽采样Wang et al. 2022a ) 是对温度 > 0 的多个输出进行采样,然后从这些候选中选择最好的一个。选择最佳候选人的标准因任务而异。一个通用的解决方案是选择多数票。对于易于验证的任务,例如带有单元测试的编程问题,我们可以简单地运行解释器并通过单元测试验证正确性。

思维链 (CoT)

思维链 (CoT) 提示Wei et al. 2022 ) 生成一系列短句来逐步描述推理逻辑,称为推理链基本原理,最终得出最终答案。CoT 的好处对于复杂的推理任务更为明显,同时使用大型模型(例如,具有超过 50B 个参数)。简单的任务只能从 CoT 提示中略微获益。

CoT 提示的类型

CoT提示的两种主要类型:

  • 少镜头CoT。它是通过一些演示来提示模型,每个演示都包含手动编写(或模型生成)的高质量推理链。

(所有数学推理示例均来自GSM8k

  • 零射击 CoT。使用自然语言语句Let's think step by step明确鼓励模型首先生成推理链,然后提示Therefore, the answer is生成答案(Kojima 等人,2022 年)。或者类似的说法Let's work this out it a step by step to be sure we have the right answerZhou et al. 2022)。

提示和扩展

  • 自洽抽样可以通过抽取多个不同的答案然后进行多数表决来提高推理的准确性。( Wang et al. 2022a )

  • 集成学习的另一种方法是改变示例顺序或使用模型生成的基本原理来代替人工编写的基本原理,以在多个样本试验中引入随机性。然后以多数票聚合模型输出以获得最终答案。(王等人 2022b

  • 如果训练样例只与真答案相关联(易于验证!)但没有基本原理,我们可以遵循 STaR  Self-Taught Reasoner;Zelikman et al. 2022)方法: (1) 让 LLM 生成推理链,只保留那些导致正确答案的人;(2) 然后用生成的基本原理微调模型并重复该过程直到收敛。请注意,更高的温度更有可能产生错误的基本原理和正确的答案。如果训练样本没有真实答案,可以考虑使用多数票作为“正确”答案。

  • 提示具有更高推理复杂性的演示可以实现更好的性能,其中复杂性由链中推理步骤的数量来衡量。分隔推理步骤时,换行符比、句号或分号\n更有效。(傅等,2023step i.;

  • 基于复杂性的一致性是通过仅在顶部进行多数投票,在所有世代中明确偏好复杂链�复杂的链条。(傅等,2023

  • 后来,Shum 等人。(2023)发现在他们的实验中,仅使用复杂示例的 CoT 提示可以提高复杂问题的准确性,但在简单问题中表现不佳;GSM8k 上显示的证据。

  • 发现改成Q:有用。Question:傅等,2023

  • Ye & Durrett (2022)发现,对于涉及文本推理的 NLP 任务(即 QA 和 NLI),在提示中包含解释的好处很小到中等,并且效果因模型而异。他们观察到解释更可能是非事实的而不是不一致的(即解释是否需要预测)。非事实的解释很可能导致错误的预测。

  • Self-Ask ( Press et al. 2022 ) 是一种反复提示模型提出后续问题以迭代构建思维过程的方法。可以通过搜索引擎结果回答后续问题。同样,IRCoT(Interleaving Retrieval CoT;Trivedi et al. 2022)和ReAct(Reason + Act;Yao et al. 2023)将迭代 CoT 提示与维基百科 API 查询相结合,以搜索相关实体和内容,然后将其添加回语境。

自动提示设计

Prompt 是一系列前缀标记,可增加在给定输入的情况下获得所需输出的概率。因此,我们可以将它们视为可训练的参数,并通过梯度下降直接在嵌入空间上对其进行优化,例如AutoPrompt ( Shin et al., 2020 , Prefix-Tuning ( Li & Liang (2021) ), P-tuning ( Liu et al . 2021 ) 和Prompt-Tuning ( Lester et al. 2021 ).我的“可控神经文本生成”帖子中的这一部分对它们有很好的介绍。从 AutoPrompt 到 Prompt-Tuning 的趋势是设置逐渐简化。

APE(Automatic Prompt Engineer;Zhou et al. 2022)是一种搜索模型生成的候选指令池,然后根据所选得分函数过滤候选集,最终选择得分最高的最佳候选指令的方法。

  1. 提示 LLM 基于输入输出对形式的一小组演示生成候选指令。例如{{Given desired input-output pairs}}\n\nThe instruction is

  2. 使用迭代蒙特卡洛搜索方法通过提示提出语义相似的变体来改进最佳候选者,例如Generate a variation of the following instruction while keeping the semantic meaning.\n\nInput: ...\n\nOutput:...

为了自动构建思想链提示,Shum 等人。(2023)建议 augment-prune-select,一个三步过程:

  1. 增强:使用少样本或零样本 CoT 提示生成给定问题的多个伪思维链;
  2. Prune:根据生成的答案是否与基本事实相匹配来修剪伪链。
  3. 选择:应用方差减少的策略梯度策略来学习所选示例的概率分布,同时将示例的概率分布视为策略,将验证集的准确性视为奖励。

张等。(2023)改为采用聚类技术对问题进行抽样,然后生成链。他们观察到 LLM 倾向于犯某些类型的错误。一种类型的错误在嵌入空间中可能相似,因此被组合在一起。通过只从频繁错误的集群中抽取一个或几个样本,我们可以防止对一种错误类型的过多错误演示,并收集一组不同的例子。

  1. 问题聚类:嵌入问题并运行�- 用于聚类的方法。
  2. 演示选择:从每个集群中选择一组具有代表性的问题;即来自一个集群的一个演示。每个簇中的样本按到簇质心的距离排序,最接近质心的样本首先被选择。
  3. Rationale generation : 使用零样本 CoT 为选定的问题生成推理链,并构建少样本提示以运行推理。

增强语言模型

Mialon 等人对增强语言模型的调查。(2023)广泛涵盖了多种语言模型类别,这些语言模型增强了推理技能和使用外部工具的能力。推荐它。

恢复

通常我们需要在模型预训练时间截止或内部/私有知识库之后完成需要最新知识的任务。在这种情况下,如果我们没有在提示中明确提供上下文,模型将不知道上下文。开放域问答的许多方法都依赖于首先对知识库进行检索,然后将检索到的内容作为提示的一部分。这种过程的准确性取决于检索和生成步骤的质量。

拉扎里杜等人。(2022)研究了如何使用谷歌搜索进行文档检索以增强 LLM。给出一个问题�,从 Google 返回的 20 个 URL 中提取干净的文本,生成一组文档。因为这些文件很长,每个文件被分成6个句子的段落,{p}. 段落按照证据段落和查询之间基于 TF-IDF 的余弦相似度进行排序。提示中仅使用最相关的段落来生成答案a.

对于闭卷 QA,每个演示的格式如下,以构建 few-shot 提示。发现将问题与证据交换(问题和答案之间的距离更长)在所有数据集中始终产生较低的结果。

答案概率以三种方式计算:

针对基于不同日期的问题的SituatedQA数据集的一项观察是,尽管 LM(预训练截止日期为 2020 年)可以通过 Google 搜索访问最新信息,但其在 2020 年后问题上的表现仍然比 2020 年前问题差很多。这表明上下文信息和模型内部知识之间存在一些差异或参数冲突。

有趣的是,即使仅使用“内部检索”也被发现是有益的,即在回答问题之前生成关于某个主题的知识(Liu 等人,2022 年)。首先我们可以使用下面的模板来抽取知识:

然后用模型生成的知识,进一步提示 LM 得到答案。

编程语言

既有PAL(程序辅助语言模型);高等。2022 ) 和PoT (Program of Thoughts prompting; Chen et al. 2022 ) 要求 LLM 生成编程语言语句来解决自然语言推理问题,从而将求解步骤卸载到运行时,例如 Python 解释器。这样的设置解耦了复杂的计算和推理。它依赖于具有足够好的编码技能的 LM。

外部 API

TALM(工具增强语言模型;Parisi 等人,2022 年)是一种通过文本到文本 API 调用进行增强的语言模型。LM 被引导生成|tool-calltool input text以任务输入文本为条件来构造 API 调用请求。当|result出现时,调用指定的工具 API,并将返回的结果附加到文本序列。最终输出是在|output令牌之后生成的。

TALM 采用自我对弈的方法来迭代引导工具使用示例的数据集,并用它来微调 LM。这个迭代的自我对弈管道模仿了一个 RL 过程,其中 LM 是策略网络,它由带有二元奖励信号的策略梯度训练。

Toolformer ( Schick et al. 2023 ) 是一种可以通过简单的 API 使用外部工具的 LM,它以自我监督的方式构建,每个 API 只需要少量的演示。Toolformer 的工具箱包括:

  • 计算器帮助 LM 缺乏精确的数学技能;
  • 问答系统,以帮助解决不忠实的内容和幻觉;
  • 搜索引擎在预训练截止时间后提供最新信息;
  • 提高低资源语言性能的翻译系统;
  • 使 LM 了解时间进程的日历。

Toolformer 的训练如下:

  1. 提示注释潜在的 API 调用。要求预训练的 LM 通过带有 API 调用使用示例的少量学习来注释数据集。格式化示例:

在推理时,解码一直运行到模型产生“→" 令牌,表明它正在等待下一个 API 调用的响应。

Toolformer 目前不支持链式使用工具(即使用一个工具的输出作为另一个工具的输入)或以交互方式(即在人工选择后采用 API 响应)。两者都是未来扩展模型的有趣方向。

引用

引用为:

Cited as:

Weng, Lilian. (Mar 2023). Prompt Engineering. Lil’Log. https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/.

或者

参考文献

[1] Zhao et al. “Calibrate Before Use: Improving Few-shot Performance of Language Models." ICML 2021

[2] Liu et al. “What Makes Good In-Context Examples for GPT-3?" arXiv preprint arXiv:2101.06804 (2021).

[3] Lu et al. “Fantastically Ordered Prompts and Where to Find Them: Overcoming Few-Shot Prompt Order Sensitivity." ACL 2022

[4] Ye et al. “In-Context Instruction Learning." arXiv preprint arXiv:2302.14691 (2023).

[5] Su et al. “Selective annotation makes language models better few-shot learners." arXiv preprint arXiv:2209.01975 (2022).

[6] Rubin et al. “Learning to retrieve prompts for in-context learning." NAACL-HLT 2022

[7] Wei et al. “Chain of thought prompting elicits reasoning in large language models." NeurIPS 2022

[8] Wang et al. “Self-Consistency Improves Chain of Thought Reasoning in Language Models." ICLR 2023.

[9] Diao et al. “Active Prompting with Chain-of-Thought for Large Language Models." arXiv preprint arXiv:2302.12246 (2023).

[10] Zelikman et al. “STaR: Bootstrapping Reasoning With Reasoning." arXiv preprint arXiv:2203.14465 (2022).

[11] Ye & Durrett. “The unreliability of explanations in few-shot in-context learning." arXiv preprint arXiv:2205.03401 (2022).

[12] Trivedi et al. “Interleaving retrieval with chain-of-thought reasoning for knowledge-intensive multi-step questions." arXiv preprint arXiv:2212.10509 (2022).

[13] Press et al. “Measuring and narrowing the compositionality gap in language models." arXiv preprint arXiv:2210.03350 (2022).

[14] Yao et al. “ReAct: Synergizing reasoning and acting in language models." ICLR 2023.

[15] Fu et al. “Complexity-based prompting for multi-step reasoning." arXiv preprint arXiv:2210.00720 (2022).

[16] Wang et al. “Rationale-augmented ensembles in language models." arXiv preprint arXiv:2207.00747 (2022).

[17] Zhang et al. “Automatic chain of thought prompting in large language models." arXiv preprint arXiv:2210.03493 (2022).

[18] Shum et al. “Automatic Prompt Augmentation and Selection with Chain-of-Thought from Labeled Data." arXiv preprint arXiv:2302.12822 (2023).

[19] Zhou et al. “Large Language Models Are Human-Level Prompt Engineers." ICLR 2023.

[20] Lazaridou et al. “Internet augmented language models through few-shot prompting for open-domain question answering." arXiv preprint arXiv:2203.05115 (2022).

[21] Chen et al. “Program of Thoughts Prompting: Disentangling Computation from Reasoning for Numerical Reasoning Tasks." arXiv preprint arXiv:2211.12588 (2022).

[22] Gao et al. “PAL: Program-aided language models." arXiv preprint arXiv:2211.10435 (2022).

[23] Parisi et al. “TALM: Tool Augmented Language Models” arXiv preprint arXiv:2205.12255 (2022).

[24] Schick et al. “Toolformer: Language Models Can Teach Themselves to Use Tools." arXiv preprint arXiv:2302.04761 (2023).

[25] Mialon et al. “Augmented Language Models: a Survey” arXiv preprint arXiv:2302.07842 (2023).