提示工程

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

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

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

一些有用资源的链接如下:

1、基本提示

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

1.1 零样本学习

零样本学习是简单地将任务文本输入模型并要求结果。以下所有情感分析示例均来自SST-2。

Text: i'll bet the video game is a lot more fun than the film.
Sentiment:

1.2 小样本学习

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

Text: (lawrence bounces) all over the stage, dancing, running, sweating, mopping his face and generally displaying the wacky talent that brought him fame in the first place.
Sentiment: positive

Text: despite all evidence to the contrary, this clunker has somehow managed to pose as an actual feature movie, the kind that charges full admission and gets hyped on tv and purports to amuse small children and ostensible adults.
Sentiment: negative

Text: for the first time in years, de niro digs deep emotionally, perhaps because he's been stirred by the powerful work of his co-stars.
Sentiment: positive

Text: i'll bet the video game is a lot more fun than the film.
Sentiment:

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

Zhao 等人 (2021) 调查了小样本分类的情况,指出 LLM 的几个偏差(他们在实验中使用 GPT-3)会导致结果的高方差:(1)如果示例中的标签分布不平衡,则存在Majority label偏差 ; (2) Recency偏差是指模型可能在最后重复标签的倾向; (3) Common token 偏差表明 LLM 更倾向于产生常见token而非稀有token 。 为了克服这种偏差,他们提出了一种方法来校准模型输出的标签概率,使其在输入字符串为 N/A 时保持一致。

1.3 示例选择技巧

选择在语义上与测试示例相似的示例 - 嵌入空间中的 NN 聚类 (Liu et al., 2021)为了选择多样化且具有代表性的示例集,Su 等人 (2022) 提出使用基于图的方法:(1)首先,基于嵌入(例如通过 SBERT 或其他嵌入模型)样本之间的余弦相似性,构造一个有向图 G = (V, E)  ,其中每个节点指向 k个其最近的邻居; (2) 从一组选定的样本 L=Ø 和一组剩余样本 U开始, U 中的每个样本 u 按如下公式计算得分:

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

Robin等人 (2022) 提出通过特定于一个训练数据集的对比学习来训练嵌入,以进行上下文学习样本选择。 给定每个训练对 (x,y) , 一个样本 ei
(格式化的输入输出对)的质量可以通过 LM 分配的条件概率 score(ei) = Plm(y|ei,x)来衡量。 我们可以用  top-k  或 bottom-k 为每个训练对的候选正集和负集打分,并将其用于对比学习。

一些研究人员尝试使用 Q-Learning 来进行样本选择。 (Zhang et al. 2022)

受基于不确定性的主动学习的启发,Diao 等人 (2023) 建议在多次抽样试验中识别具有高分歧或熵的例子。 然后注释这些示例以用于小样本提示。

1.4 样本排序技巧

一个普遍的建议是保持样本选择的多样性、与测试样本的相关性以及随机顺序,以避免多数标签偏差(Major Label Bias)和近因偏差(Recency Bias)。

增加模型大小或包含更多训练示例不会减少上下文示例的不同排列之间的方差。 相同的顺序可能适用于一种模型,但不适用于另一种模型。 当验证集有限时,请考虑选择顺序,以使模型不会产生极度不平衡的预测或对其预测过于自信。 (Lu et al. 2022)

2、指令提示

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

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

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

Please label the sentiment towards the movie of the given movie review. The sentiment label should be "positive" or "negative". 
Text: i'll bet the video game is a lot more fun than the film. 
Sentiment:

向目标听众解释是另一种聪明的给出指令的方式。例如为孩子们制作教育材料,

Describe what is quantum physics to a 6-year-old.

和安全的内容,

... in language that is safe for work.

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

Definition: Determine the speaker of the dialogue, "agent" or "customer".
Input: I have successfully booked your tickets.
Ouput: agent

Definition: Determine which category the question asks for, "Quantity" or "Location".
Input: What's the oldest building in US?
Ouput: Location

Definition: Classify the sentiment of the given movie review, "positive" or "negative".
Input: i'll bet the video game is a lot more fun than the film.
Output:

3、自洽抽样

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

4、思维链 (CoT)

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

CoT提示的两种主要类型:

  • 小样本CoT:它是通过一些演示来提示模型,每个演示都包含手动编写(或模型生成)的高质量推理链。以下所有数学推理例子均来自GSM8k
Question: Tom and Elizabeth have a competition to climb a hill. Elizabeth takes 30 minutes to climb the hill. Tom takes four times as long as Elizabeth does to climb the hill. How many hours does it take Tom to climb up the hill?
Answer: It takes Tom 30*4 = <<30*4=120>>120 minutes to climb the hill.
It takes Tom 120/60 = <<120/60=2>>2 hours to climb the hill.
So the answer is 2.
===
Question: Jack is a soccer player. He needs to buy two pairs of socks and a pair of soccer shoes. Each pair of socks cost $9.50, and the shoes cost $92. Jack has $40. How much more money does Jack need?
Answer: The total cost of two pairs of socks is $9.50 x 2 = $<<9.5*2=19>>19.
The total cost of the socks and the shoes is $19 + $92 = $<<19+92=111>>111.
Jack need $111 - $40 = $<<111-40=71>>71 more.
So the answer is 71.
===
Question: Marty has 100 centimeters of ribbon that he must cut into 4 equal parts. Each of the cut parts must be divided into 5 equal parts. How long will each final cut be?
Answer:
  • 零样本 CoT。 使用像 Let's think step by step 这样的自然语言语句来明确鼓励模型首先生成推理链,然后提示 Therefore, the answer is to produce answers (Kojima et al. 2022)。 或者类似的陈述让我们一步一步地解决这个问题,以确保我们有正确的答案(Zhou et al. 2022)。
Question: Marty has 100 centimeters of ribbon that he must cut into 4 equal parts. Each of the cut parts must be divided into 5 equal parts. How long will each final cut be?
Answer: Let's think step by step.

5、技巧和扩展

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

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

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

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

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

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

将 Q: 更改为 Question: 被发现很有帮助。 (Fu et al. 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 查询相结合,以搜索相关实体和内容,然后将其添加回 语境。

6、自动提示设计

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)是一种搜索模型生成的候选指令池,然后根据所选得分函数过滤候选集以最终选择得分最高的最佳候选指令的方法。

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

7、增强语言模型

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

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

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

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

Evidence: ...
Question: ...
Answer: ...

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

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

Generate some knowledge about the input. Examples:

Input: What type of water formation is formed by clouds?
Knowledge: Clouds are made of water vapor.

Input: {question}
Knowledge:

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

8、编程语言

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

9、外部 API

TALM(工具增强语言模型;Parisi 等人,2022 年)是一种通过文本到文本 API 调用增强的语言模型。 LM 被引导生成以任务输入文本为条件的工具调用和工具输入文本,以构建 API 调用请求。 当得到结果 |result后,调用指定的工具 API,并将返回的结果附加到文本序列。 最终输出是在  |output 标记之后生成的。

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

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

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

在推理时,解码一直运行到模型产生 -> 标记,表明它正在等待下一个 API 调用的响应。

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


原文链接:Prompt Engineering

BimAnt翻译整理,转载请标明出处