提示工程:从人机交互视角解读
提示词(prompt)是人与大模型交互的重要媒介。
因此,对提示词的掌握、使用、研究,便具有非常重大的意义。
本文从以下四个方面介绍 prompt engineering: 什么是 prompt、如何有效使用 prompt、如何自动学习最优 promopt、以及 prompt 的安全分析。希望读完本文后,读者能对其有大致了解并灵活运用于自己的科研和生活中。
本文是《大模型时代的科研》系列文章的第二篇。第一篇为《大模型时代,普通人的科研何去何从》,重点探讨了大模型时代、资源不够的普通科研人员如何破局。
01
何为 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,而是包含了众多模态的信息。如同时输入文本和图像与多模态大模型进行交互。
02
高效使用 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 时,越大,则表明模型随机性越强,适合生成任务。
03 自动学习最优 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:
王晋东不在家: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,可能会存在泄漏隐私等风险。如下图右图。
04
总结
Prompt 或许并不是人类与大模型进行交互的唯一和最好的方式,但一定是当下最主流的方式。
本文重点介绍了 prompt 的基本知识、使用、学习、和安全,特别地,我们采用了一种全新的视角来看待 prompt,希望能够对该领域相关的读者有所帮助。让我们乘着大模型的东风,破浪而行吧。
本文参考资料:
[1]Lilian Weng 的博客 (2023):https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/
[2]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
[3]https://zhuanlan.zhihu.com/p/366771566
[4]Andrew Ng 与 OpenAI 的 Prompt engineering 课程:
https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/
更多与 AI 高效对话的内容
来看看这几本书吧!
▊《与 AI 对话:ChatGPT 提示工程揭秘》
陈峥 著
人人都是提示工程师(PromptEngineering)
系统介绍 ChatGPT
揭秘本世纪头等重要的职业技能
教你构建高质量的提示指令,成为与 AI 交流的高手
本书以独特的角度,深入浅出地介绍 ChatGPT、提示工程及自然语言处理等相关技术。
在内容上,本书科普性与专业性并重,既为普通读者提供基础知识,又有对专业领域的深入探讨。
本书通过 7 章的内容,在全面介绍 ChatGPT 内部原理的基础上,重点解析提示指令的构建方法, 以及如何针对各类任务构建合适的提示指令,为广大读者提供实战经验和指导。
本书适合对 ChatGPT 充满好奇心的所有读者,不仅可以满足他们探寻 ChatGPT 内部原理 的需求,还能让他们了解如何将其运用于实际工作中。此外,对于有志成为提示工程师的读者, 本书提供一条从新手到专家的成长之路,帮助他们打开新的职业发展大门。
(快快扫码抢购吧!)
评论