什么是Prompt?
Prompt(提示词)是大模型的输入,也是调用大模型能力的接口,用以激发或引导大模型生成特定类型的回答。
这个定义很标准,并不需要多余的解释,我们继续追问。
为什么需要Prompt?
直接回答这个问题可能会有些抽象,此处引入ICIO框架,ICIO的核心思想,是通过明确定义任务的各个方面,来提高AI响应时的效率和准确性。它是业内广泛认为最为简单且易于遵循的提示框架,因其简单性而受到青睐。
在ICIO的框架的设计中,Prompt可能包含四要素:
- Instruction(指令):这是最重要的部分,它直接告诉模型需要执行的具体任务。
- Context(上下文/背景):上下文提供了任务执行所需的背景信息,帮助模型理解任务的情景和环境。
- Input Data(输入数据):输入数据是模型需要处理的具体信息。
- Output Indicator(输出指示器):输出指示器告诉模型用户期望的输出类型或格式。
其中除了指令以外,其他要素都是可选的,说明指令对于大模型来说是最重要的,其他要素都是对指令的补充。这意味着:
提示词最基本的作用是沟通和引导,其核心是要清晰地传达用户的意图,而上下文和输入输出等内容,是对意图的补充,帮助大模型更快、更准确地理解意图。
什么是优质Prompt?
优质的Prompt,可以清晰地传达用户的意图。
那么如何做到清晰呢?
当A的提问话术为“我配XXXX吗?”,B应当如何思考。
A的预期
理想情况下,B会在脑海中构建一个关于这个问题的上下文框架,根据A的人物性格特性,理解到A的这种表达方式是想要B为自己做一些事情,更多是期待获得某种情感上的回应,进而基于这个框架来形成回答:“没问题,你想要的我都会帮你实现”。
B的回答
如果B的回复,是告诉A你想要的也可以自己来实现。这个回答可能会让A不高兴,因为B没有真正理解A的意图,A实际上是希望B能帮忙做XXXX。
可以看出,在这个语境中,我们的GPT B的关注点,落在了“事件”上,而非“配”上,导致B误以为A是简单的想要XXXX,进而导致了其不符合预期的输出。
这种预期上的差异,一方面来源于GPT B的性能不足,另一方面是A的Prompt不够好,导致B对上下文中信息的捕捉不够充分,进而没能充分理解A的意图。所以,要想做到清晰,指令很重要,而指令背后的上下文,也很重要。
好,提到上下文和理解,我们继续问下一个问题。
GPT如何理解Prompt?
GPT的结构
上图是GPT模型的基本结构,GPT模型源自于Transformer模型。由于Transformer模型最初的设计是进行类似文本翻译的序列到序列的任务,而GPT模型的目标是进行预测性的生成式任务,比如预测下一个单词的概率分布,并不需要Encoder来处理输入序列,因此进行了简化。
GPT模型使用了Transformer的解码器部分,且舍弃了解码器中的交叉注意力层,但是保留了最核心的两层
- 掩码多头自注意力层(Masked Multi Self Attention Layers,对应Transformer的Masked Multi-Head Attention,简称MHA)
- 前置反馈网络层(Feed Forward Networks Layers,简称FFN)
其中,自注意力层的功能是理解输入内容,它使模型能够在处理序列时捕捉到输入数据之间的依赖关系和上下文信息,GPT亮亮对麦琳情绪的捕捉就在此发生。FFN层会对自注意力层的输出进行进一步的非线性变换,以提取更高级别的特征,类似于我们的大脑在思考如何回应,进而基于已有的信息和知识,产生新的内容。
本篇并不打算深入讨论FFN,因为在FNN层,Prompt对大模型输出的影响是通过自注意力层的输出间接产生的,且FNN层的非线性变换很难用语言表述清楚。
而在自注意力层,Prompt的影响相对可以解释,其重点在于:Prompt会影响自注意力层对上下文信息的捕捉。
自注意力机制
老规矩,从问题出发,掩码多头自注意力层是如何捕捉上下文信息的?
在一次大模型的执行过程中,Prompt首先会通过Tokenization(分词)形成一个token(词元)序列,首先通过Embedding(词嵌入)转变成高维空间中的向量。在向量空间中,每一个点代表一个实体,可以是单词、短语、句子等任何需要被AI处理的数据,这些点在向量空间中的位置和分布反映了实体之间的相似性和关系,其所在空间的每一个方向都代表了数据的某种属性或特征。
Embedding产生的原始的向量的语义,就是词本身的语义,但是在不同的上下文语境中,相同的词也会有不同的含义。比如“苹果”这个词,在“苹果公司的财报”、“苹果的口感”这两句话中,分别代表着苹果公司和水果。因此大模型需要对原始向量“苹果”,基于上下文中“公司”、“财报”、“口感”等信息,来进行向量的调整,丰富其语义。
Prompt对上下文信息的理解,就体现在如何基于原始向量产生新向量的过程中。
为了实现这种能力,GPT引入了自注意力机制,它是GPT的自注意力层的核心,它的核心思想是模仿人类的注意力,即在处理大量信息时,能够聚焦于当前任务最相关的部分,而忽略其他不太重要的信息。
通过自注意力机制的计算,序列中的每一个token都会评估其他token对于丰富自身信息的重要性,来得到其与其他token的注意力权重。
举个例子,输入“有一天,一位勇敢的探险家”来要求GPT进行文章续写,对于其中token“探险家”而言,它会去评估“有一天”、“一位”、“勇敢的”对于自身的重要性,发现从语义、语法等角度分析,“勇敢的”对于自身的内容理解相对重要,就会给其赋予更高的权重,此时我们可以说,“探险家”注意到了“勇敢的”。
回归到Prompt对模型输出的影响上,我们可以认为:Prompt的不同部分对输出结果影响的大小,主要体现在注意力权重的分配上。
单头注意力(缩放点积注意力)
上图来自于论文《Attention Is All You Need》中对于注意力的描述,其中Multi-Head Attention(简称MHA)就是我们平时说的注意力层。多头注意力是由多个并行运行的缩放点积注意力组成,其中缩放点积注意力的目的,是帮助模型在大量数据中快速找到并专注于那些对当前任务最有价值的信息。换句话说,就是计算注意力大小的权重。
缩放点积注意力的过程,可以概括为:
1.首先通过给予输入数据形成的嵌入矩阵与Wq、Wk、Wv的权重矩阵分别相乘,获得Q、K、V三个矩阵。
2.通过Q与K的点积运算结果来评估不同词元之间的相似度。
3.进行掩码操作,避免当前词元之后的词元的上下文信息对当前词元产生影响(GPT属于因果解码器,这种掩码方式体现了因果解码器的基本特性)。
4.进行归一化操作,将点积形式的权重转化为总和为1的注意力分布。
5.最后将注意力分布与K所对应的V相乘,加权求和,得到一个矩阵向量,该向量就是我们所希望求解的上下文向量。
有些抽象?别急,让我们来一步一步慢慢分析。
在论文中,对于缩放点积注意力的计算过程,选择了使用一个非常简洁的公式来表达,如下图:
如何理解这个公式?首先,我们输入的token序列,在经过词嵌入后会形成嵌入矩阵X,并与模型通过预训练获得的Wq、Wk、Wv这三个权重矩阵分别相乘,分别获得三个核心的矩阵向量Q、K、V。
他们分别代表着什么?我们继续以“有一天,一位勇敢的探险家”这句话举例。
用图书馆中查找书籍来举例,也许会更通俗一点。有一天,你刚看完《流浪地球》,心潮澎湃,希望去找一些与科幻有关的书,此时:
- Q:代表了你的需求,比如“我希望找一些和科幻有关的书”;
- K:代表了书籍的特征,比如我最喜欢的《三体》这本书,就包含了“科幻”、“社会批判”、“宇宙社会学”等标签;
- V:代表了书籍的内容,你通过特征找到了《三体》,知道了它的作者是刘慈欣,内容摘要、以及它几十万字的精彩内容;
那么这三个向量是如何得到注意力的权重的?让我们来到“探险家”的计算过程中。“探险家”所提供的Q,会分别与序列中的其他token的K计算点积,获得与其他token的语义相似度,进而得到注意力的分数,公式如下(T是矩阵转置,目的是匹配矩阵的维度,dk是K的维度,除以其平方根是为了缩放点积,确保数值稳定)
有可能,“探险家”由于其也具有“冒险”、“勇气”等关键特征,其与“勇敢的”的点积相对更大,那么其在归一化后的占比也会更高,在GPT的理解中,“勇敢的”对于“探险家”而言,就更重要。
另外说明一下,各位也许会看到“注意力函数”的描述。注意力函数有两种,“点积注意力”和“加性注意力”。Transformer团队在论文中明确提及,选择点积注意力,因为它在计算上高效且能稳定梯度,同时能够捕捉序列中元素间的长距离依赖关系。
之后进行掩码(Mask),由于在因果解码器中,当前词元是无法看到自身之后的词元的,所以需要将当前词元之后的所有点积置为负无穷,以便使其在归一化后的占比为零。
这个分布,就叫做注意力分布,对应着下面表格中“探险家”所对应的那一列。它代表着从“探险家”的视角出发,每一个token对于自身内容理解的重要程度。
softmax后获得的权重,会分别与每一个K对应的V相乘,通过注意力权重加权求和,就可以得到一个向量,称为上下文向量。
上下文向量,就是Attention(Q, K, V)求解出来的值,其中包含了序列中与当前元素最相关的信息,可以认为是GPT在结合了上下文的信息后,对Prompt的理解的一种表示。
多头注意力(MHA)
注意力机制并没有结束,上面只是对于单头注意力的分析。在论文中提到
Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this
这段表述的意思是,多头注意力允许模型同时关注不同表示子空间中的信息,使用单个注意力头时,平均会抑制这一点。
因此Transformer引入了多头注意力,这里的多头,指的是注意力函数实例。可以理解为,不同的头,他们的Wq、Wk、Wv都不同,也就是词元会从不同角度去发问,同时表达出不同角度的特征。这对于充分捕获上下文信息,是有帮助的。
目前的大模型,上图是从《大语言模型概述》中摘录的配置表,可以看到都是多头注意力机制(实际上大家使用的是在MHA的基础上进行性能优化的版本,比如分组多头注意力GQA,多查询注意力MQA)。N代表头数,可以看到GPT-3中有96个头。
每个头都按照缩放点积注意力的方式进行运算后,会将他们的上下文向量,基于输出投影矩阵Wo进行变换。论文中提到,由于每个头的维度降低,总的计算成本与具有完整维度的单头注意力相似。所以性能上相对于单头注意力并没有太大影响。
再之后,就是基于理解进行作答,这部分并不是本文关注的重点,简单概括下:就是将上下文向量传入前置反馈层(FNN),经过两次线性变化加一次激活函数来提取更深层次的特征,再通过残差连接和归一化来加速收敛。最后在输出层通过对线性变换后计算生成的logits进行归一化,来得到下一个词的概率分布,通过解码策略来选择具体的token,然后将输出的token作为Prompt的一部分再来一轮,由此往复,直至完成作答。
其中输出层涉及到了大模型的解码策略,其中GPT提供了常见的temperature、top-p等参数,这些参数的设定同样会影响模型输出的结果。
此外,AI就是最好的老师,非常推荐大家使用AI来获取相关知识并辅助理解,会有事半功倍的效果。
来源 | 阿里云开发者公众号
作者 | 佳叙