提示词(prompt)是人与大模型交互的重要媒介。因此,对提示词的掌握、使用、研究,便具有非常重大的意义。本文从以下四个方面介绍prompt engineering: 什么是prompt、如何有效使用prompt、如何自动学习最优promopt、以及prompt的安全分析。希望读完本文后,读者能对其有大致了解并灵活运用于自己的科研和生活中。
本文是《大模型时代的科研》系列文章的第二篇。第一篇为《大模型时代,普通人的科研何去何从》,重点探讨了大模型时代、资源不够的普通科研人员如何破局。
何为prompt?
网络上讲解prompt的文章和视频资料已如汗牛充栋。因此,笔者并不想多费笔墨再沿着相似的思路给读者进行介绍。在这里,我们采用一种全新的视角来解读prompt:从人机交互出发。
Prompt是一种新型自然用户界面
让我们回到1981年这一神奇的年份。在这一年之前,人与计算机进行交互的唯一途径便是「命令行」(command line interface, CLI)。而这一原始的交互方式虽然准确,但是上手门槛颇高且在大量任务上效率低下。初学者、非计算机专业用户基本上与此种交互方式无缘。
1981年,美国Xerox公司发明了「图形界面」(graphical user interface, GUI)[1],彻底宣告了基于图形界面的新型人机交互范式。此种交互方式相比命令行而言,更加直观、方便,适合所有用户使用,大大促进了计算机的发展。以后,GUI便一直作为主要交互媒介,为今天的计算机、智能手表、智能手机、各种计算设备而服务。今天的我们无时无刻不在使用以图形界面为前端的设备。
时间进入1990年代。彼时,第三种新型的交互方式产生了:「自然用户界面」(natural user interface, NUI)。[2]相比以鼠标键盘为主的图形用户界面,自然用户界面扩展了以鼠标键盘为主的图形用户界面,使人们可以用更直接的方式与设备进行交互,如语音、手势、身体、运动、眼球等。
讲到这里,聪明的你可能有疑惑:我们的主题不是prompt吗,为何你要讲人机交互?
事实上,如果我们换一种思路,将大模型视为一种特殊的、很强大的计算设备,那么,笔者便有此观点:「prompt是一种新型的自然用户界面」。
以下图为例,我们深入挖掘自然用户界面的精髓。我们知道,如今可以很便捷地通过手势、语音、眼球、身体运动等方式与计算机交互。那么,大模型的能力其实比很多早期的计算机都要强了;而且大模型本身也是一种特殊的计算体,其依靠大规模神经网络进行运算。那么,迄今为止,与其进行交互最直接也是最常用的方式便只有prompt:直接告诉模型我们要它干什么,模型便会干什么。
例如,我们可以问模型“用最多20个词总结下列文字”、“中国的首都在哪里?”、“判断下列文字的情感是正向还是负向”等等。我们输入的这些prompt,将会被模型识别、处理,最终输出为我们要的答案。因此,笔者认为,prompt是这个时代人与大模型交互的媒介。至于其是否为唯一媒介,目前尚无法定论。
Prompt到底是什么?
好了,有了上述对prompt的全新理解后,我们下面来真正认识prompt的相关含义。
事实上,大多数的prompt具有以下的形式:由「指令」(instruction)和「内容」(content)两部分构成。其中,指令部分为我们需要大模型做的事,如“判断下列句子的情感”,而内容则为真正的句子,如“我今天很高兴”。注意,并不是所有的prompt都有这样的形式,如比较简短的prompt:“中国的首都在哪里”、“模仿百年孤独的开头写一段话”这种言简意赅的prompt就只有指令、没有内容。此时,我们可以认为内容是空,则上述构成依然适用。
大模型的热潮因ChatGPT而起、而更早则要追溯到以BERT为代表的语言模型。故主流的prompt一般采用「文本」格式。但是,文本并非唯一的形式。我们在视觉任务中往往可以采用「视觉prompt」,如bounding box、关键像素点等。以最近大火的segment anything model[3]为例,其便使用了不同的视觉prompt。除此之外,我们在其他任务中也可以使用「语音」等多种形式的prompt。
Prompt有何益处?
到了这里,也许有读者质疑:prompt到底有什么用?它能带来哪些额外的好处?
简单而言,prompt有两大好处:
首先,有研究表明,1个prompt相当于100个真实数据样本[4]。这充分说明了prompt蕴含的「信息量」之巨大。
其次,prompt在下游任务「数据缺乏」的场景下、甚至是zero-shot场景下,有着无可比拟的优势。因为大模型通常无法在小数据上微调,因此,基于prompt的微调技术便成为了首要选择。
Prompt的不同分类
Prompt千变万化、莫可名状,其主要由以下几种常见形式构成:
Zero-shot prompt: 零样本的prompt。此为最常见的使用形式。之所以叫zero-shot,是因为我们直接用大模型做任务而不给其参考示例。这也被视为评测大模型能力的重要场景之一。
Few-shot prompt: 与zero-shot相对,在与大模型交互时,在prompt中给出少量示例。
Role prompt: 与大模型玩“角色扮演”游戏。让大模想象自己是某方面专家、因而获得更好的任务效果。
Instruction prompt: 指令形式的prompt。
Chain-of-thought prompt: 常见于推理任务中,通过让大模型“Let's think step by step”来逐步解决较难的推理问题。
Multimodal prompt: 多模态prompt。顾名思义,输入不再是单一模态的prompt,而是包含了众多模态的信息。如同时输入文本和图像与多模态大模型进行交互。
高效使用prompt的技巧
如何更高效地使用prompt?这里我们不对基本方式进行讲解,而是直接给出一些经验规则,方便读者在自己的任务中进行尝试。
关键假设:大模型总是对的
在使用调节prompt之前,我们有必要进行如此假设来消除人与大模型之间的陌生感。事实上,此假设是不对的:大模型总是有这样那样的问题,它并不总是对的。但是,为了使我们全心投入到调教prompt的事业中,我们姑且假设:大模型总是对的。如果不对,那就是我们的prompt写的不对。通过这种按时,我们便可以更专心地调教prompt。
规则1:Few-shot prompt通常有比较好的效果
第一条规则最好理解。因为few-shot examples会为大模型提供一些额外的知识,叫做in-context learning。因此,通常情况下,few-shot prompt效果较好。
但是它并不完美,至少存在以下3种问题亟待解决:
多数标签的偏见(majority label bias):few-shot例子中所提供的标签如果分布不平衡,则会严重影响到测试任务。这个非常好理解:是传统的不平衡学习(imbalanced learning)在prompt上的具体体现。
近期偏见(recency bias):模型倾向于为测试样本输出最近看到的few-shot样本。这个听上去有点像灾难遗忘,即模型更喜欢记住最近输入的样本信息。
公共token偏见(common token bias):模型倾向于考虑那些出现次数较多的token。这个也比较好理解。因为大模型本质上就是统计模型,当然倾向于出现次数多的那些词。
为了使得few-shot prompt更加完美,也有一些听上去就感觉很有效的tips:
使用KNN等近邻算法去选择与test样本距离更近的few-shot example;
随机使用few-shot example;
使用强化学习或主动学习去进一步选择few-shot example。
规则2:给你的模型一个角色
一些实验表明,我们可以通过与模型进行角色扮演游戏来提高其在特定任务上的性能。如,我们告诉模型,你是一个聪明的数学家,那么模型便会在解数学问题上更上一层楼。当然,这并不总是对的。因此,此条规则并不总是有效、仅供参考。
规则3:在推理任务中使用CoT
如果你面对的是推理任务,如考公务员题、张三撒谎还是李四撒谎等,那么,一个有效的方式是使用Chain-of-Thought (CoT)来使模型一步一步进行思考。
规则4:使用特定的输入输出格式
为了避免prompt被攻击,我们可以通过在输入数据中加入特定的括号,如``` --- <> 等来限制我们的输入内容。
对于输出而言,同理,我们也可以尽量让模型输出格式化的文本,如HTML、JSON等,方便我们对结果进行管理。
另外,加入一些条件判断以使得我们的模型可以在不满足条件时,返回相应的输出。这样模型就避免了在不满足条件时胡说八道。
规则5:善用温度变量
大模型通常会涉及到一个温度变量,如ChatGPT API中的temperature变量。此变量的值与模型输出结果的随机性有关:
当其值为0时,表明模型输出结果是确定的,通常用于决定性任务,如分类、预测等;
当其值>0时,越大,则表明模型随机性越强,适合生成任务。
自动学习最优prompt
以上介绍的都是人工调节prompt的经验。聪明的你一定想到了:既然人可以,机器为何不可?因此,让计算机自动生成prompt的想法应运而生。这便是所谓的「prompt tuning」。
NLP和CV中的Prompt tuning
从已有综述文章[5]我们可以看到,以语言模型是否微调、prompt是否微调为标准,可以将prompt tuning分为以下5个方面:
Promptless fine-tuning: 不使用prompt、直接微调语言模型。
Tuning-free prompting: 无需微调的prompt。
Fixed-LM prompt tuning: 固定LM,微调prompt。这种最为常用。
Fixed-prompt LM tuning: 固定prompt,微调LM。
Prompt+LM fine-tuning: 这个较好理解,两部分一起微调。
「AutoPrompt」是一种自动调节prompt的技术。其通过梯度优化,自动从一系列候选词中生成对目标任务最佳的prompt。[6]
「Prefix-tuning」由斯坦福大学的Percy Liang团队提出。其在Transformer的输入层中加入可学习的prompt embedding,效果非常好。[7]
有关NLP领域的prompt还有很多,我们不一一列举。
我们的视角来到视觉领域的prompt:如何让机器自动学习这些prompt?
下图示意了视觉领域的prompt在整个微调领域的位置。我们看到,相对于完整的调整模型的finetuning(图a)和进行最后分类器层线性插值的linear probe (图b),prompt tuning其实是在更改「输入」图像。其通过类似于对抗样本噪声的方式加到输入图像上,获得了不错的效果。
其中,比较经典的代表性工作有发表于ECCV 2022的「VPT」(Visual prompt tuning)。[8]其直接在输入和中间层的节点中加入可调prompt,就取得了媲美full fine-tuning的好结果。
Imbalanced prompt tuning
下面介绍我们一项近期的工作:exploring vision-language models for imbalanced learning。
主流观点认为,由大规模数据训练的Vision-language model,如CLIP等,能够有强大的下游任务泛化能力。我们则认为,可能并非如此。为了验证猜想,我们在经典的不平衡分类问题上进行实验和探索。我们选择了经典的3个数据集:ImageNet-LT、Places-LT、以及iNaturalist,然后测试CLIP在不同数据上的结果,发现其并非一往无前,而是在稀疏少见的类别上(如iNaturalist数据集的大多数类别)均表现不好,精度只有6%。
那么,如何提升其在不平衡分类上的效果?我们系统性探索了3种改进模式:
Prompt tuning:采用发表于IJCV 2022的经典工作COOP[9]进行;
Linear probing: 对视觉encoder进行finetuning;
加入已有的不平衡分类方法,如MARC[10]等。
实验表明,加入已有的不平衡方法效果最好。这充分说明了不平衡分类算法的重要性。并且,并非训练数据越多、下游效果越好。我们对比了由2B数据训练的Laion-CLIP与原始CLIP,发现二者效果接近。说明了训练数据并非越多越好,而是越有「代表性」越好。
文章还探索了其他方面的实验,感兴趣的读者欢迎关注:
论文:https://arxiv.org/abs/2305.12715
开源代码:https://github.com/Imbalance-VLM/Imbalance-VLM。
Prompt安全性的分析
最后,我们浅谈prompt的安全性。此方面研究相对较少,随着大模型相关技术的普及,对于安全的研究在未来必定会越来越重要。
如何对Prompt和大模型结果进行客观自动评估?请参考我们的PandaLM:
对抗攻击
此方面我们不做过多介绍。笔者团队之前的关于ChatGPT鲁棒性评测的文章已充分说明了大模型对于对抗攻击并不敏感。相信今后会有更多相关工作出现。感兴趣的读者可以关注我们的文章On the robustness of ChatGPT: An adversarial and OOD perspective:
论文:https://arxiv.org/abs/2302.12095
代码:https://github.com/microsoft/robustlearnbustlearn
知乎讲解:菜菜弱鸡:ChatGPT鲁棒性分析:对抗鲁棒与分布外泛化视角
Prompt injection and leakage
Prompt injection类似于传统安全领域中的SQL注入攻击。其指的是攻击者通过命令大模型忽略相关的指令、只执行特定指令的过程。如下图中的左图,攻击者让模型忽略之前的内容,只输出有关总统的坏消息,模型便照做了。
Prompt leakage是injection的一种特例。其通过设计prompt,让大模型输出自己原始的prompt,可能会存在泄漏隐私等风险。如下图右图。
总结
Prompt或许并不是人类与大模型进行交互的唯一和最好的方式,但一定是当下最主流的方式。本文重点介绍了prompt的基本知识、使用、学习、和安全,特别地,我们采用了一种全新的视角来看待prompt,希望能够对该领域相关的读者有所帮助。让我们乘着大模型的东风,破浪而行吧。
本文参考资料:
Lilian Weng 的博客 (2023):https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/
CMU 刘鹏飞的 Prompt 综述 (2021): Liu et al. Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing. 2021. http://arxiv.org/abs/2107.13586
https://zhuanlan.zhihu.com/p/366771566
Andrew Ng与OpenAI的Prompt engineering课程:https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/
==========
更多大模型时代的科研文章,敬请关注:《大模型时代的科研》系列。
参考
^GUI的发明 https://www.computerhope.com/jargon/g/gui.htm
^自然用户界面 https://www.interaction-design.org/literature/article/natural-user-interfaces-what-are-they-and-how-do-you-design-user-interfaces-that-feel-natural
^Segment anything https://ai.facebook.com/research/publications/segment-anything/
^Prompt顶100个数据点 https://arxiv.org/abs/2103.08493
^Prompt综述 http://arxiv.org/abs/2107.13586
^AutoPrompt https://arxiv.org/abs/2010.15980
^Prefix-Tuning https://arxiv.org/pdf/2101.00190.pdf
^VPT https://arxiv.org/abs/2203.12119
^COOP https://arxiv.org/pdf/2109.01134.pdf
^MARC https://arxiv.org/abs/2112.07225