在探索人工智能的深海中,提示词(Prompt)是引导大模型输出的灯塔。本文希望通过对自身所学所思进行总结,解析提示词如何塑造AI的响应,揭示其背后的机制。
Prompt(提示词)是大模型的输入,也是调用大模型能力的接口,用以激发或引导大模型生成特定类型的回答。
这个定义很标准,并不需要多余的解释,我们继续追问。
直接回答这个问题可能会有些抽象,此处引入ICIO框架,ICIO的核心思想,是通过明确定义任务的各个方面,来提高AI响应时的效率和准确性。它是业内广泛认为最为简单且易于遵循的提示框架,因其简单性而受到青睐。
在ICIO的框架的设计中,Prompt可能包含四要素:
-
Instruction(指令):这是最重要的部分,它直接告诉模型需要执行的具体任务。
-
Context(上下文/背景):上下文提供了任务执行所需的背景信息,帮助模型理解任务的情景和环境。
-
Input Data(输入数据):输入数据是模型需要处理的具体信息。
-
Output Indicator(输出指示器):输出指示器告诉模型用户期望的输出类型或格式。
其中除了指令以外,其他要素都是可选的,说明指令对于大模型来说是最重要的,其他要素都是对指令的补充。这意味着:
提示词最基本的作用是沟通和引导,其核心是要清晰地传达用户的意图,而上下文和输入输出等内容,是对意图的补充,帮助大模型更快、更准确地理解意图。
当A的提问话术为“我配XXXX吗?”,B应当如何思考。
理想情况下,B会在脑海中构建一个关于这个问题的上下文框架,根据A的人物性格特性,理解到A的这种表达方式是想要B为自己做一些事情,更多是期待获得某种情感上的回应,进而基于这个框架来形成回答:“没问题,你想要的我都会帮你实现”。
如果B的回复,是告诉A你想要的也可以自己来实现。这个回答可能会让A不高兴,因为B没有真正理解A的意图,A实际上是希望B能帮忙做XXXX。
可以看出,在这个语境中,我们的GPT B的关注点,落在了“事件”上,而非“配”上,导致B误以为A是简单的想要XXXX,进而导致了其不符合预期的输出。
这种预期上的差异,一方面来源于GPT B的性能不足,另一方面是A的Prompt不够好,导致B对上下文中信息的捕捉不够充分,进而没能充分理解A的意图。所以,要想做到清晰,指令很重要,而指令背后的上下文,也很重要。
上图是GPT模型的基本结构,GPT模型源自于Transformer模型。由于Transformer模型最初的设计是进行类似文本翻译的序列到序列的任务,而GPT模型的目标是进行预测性的生成式任务,比如预测下一个单词的概率分布,并不需要Encoder来处理输入序列,因此进行了简化。
GPT模型使用了Transformer的解码器部分,且舍弃了解码器中的交叉注意力层,但是保留了最核心的两层
其中,自注意力层的功能是理解输入内容,它使模型能够在处理序列时捕捉到输入数据之间的依赖关系和上下文信息,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》
单头注意力(缩放点积注意力)
上图来自于论文《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。
QKV计算公式,引自《A Survey of Large Language Models》
他们分别代表着什么?我们继续以“有一天,一位勇敢的探险家”这句话举例。
用图书馆中查找书籍来举例,也许会更通俗一点。有一天,你刚看完《流浪地球》,心潮澎湃,希望去找一些与科幻有关的书,此时:
-
Q:代表了你的需求,比如“我希望找一些和科幻有关的书”;
-
K:代表了书籍的特征,比如我最喜欢的《三体》这本书,就包含了“科幻”、“社会批判”、“宇宙社会学”等标签;
-
V:代表了书籍的内容,你通过特征找到了《三体》,知道了它的作者是刘慈欣,内容摘要、以及它几十万字的精彩内容;
那么这三个向量是如何得到注意力的权重的?让我们来到“探险家”的计算过程中。“探险家”所提供的Q,会分别与序列中的其他token的K计算点积,获得与其他token的语义相似度,进而得到注意力的分数,公式如下(T是矩阵转置,目的是匹配矩阵的维度,dk是K的维度,除以其平方根是为了缩放点积,确保数值稳定)
有可能,“探险家”由于其也具有“冒险”、“勇气”等关键特征,其与“勇敢的”的点积相对更大,那么其在归一化后的占比也会更高,在GPT的理解中,“勇敢的”对于“探险家”而言,就更重要。
另外说明一下,各位也许会看到“注意力函数”的描述。注意力函数有两种,“点积注意力”和“加性注意力”。Transformer团队在论文中明确提及,选择点积注意力,因为它在计算上高效且能稳定梯度,同时能够捕捉序列中元素间的长距离依赖关系。
之后进行掩码(Mask),由于在因果解码器中,当前词元是无法看到自身之后的词元的,所以需要将当前词元之后的所有点积置为负无穷,以便使其在归一化后的占比为零。
这个分布,就叫做注意力分布,对应着下面表格中“探险家”所对应的那一列。它代表着从“探险家”的视角出发,每一个token对于自身内容理解的重要程度。
一个可能的softmax后的概率分布(GPT生成,数值通过模拟产生)
softmax后获得的权重,会分别与每一个K对应的V相乘,通过注意力权重加权求和,就可以得到一个向量,称为上下文向量。