成为提问工程师
上QQ阅读APP看书,第一时间看更新

第二节 GPT拥有什么能力?为何拥有这些能力?

尝试使用各种基于GPT模型的新AI工具后,我们会发现它们拥有各种让人惊奇的能力,比如写作、编程、逻辑推理等。我们很容易产生一些疑问:GPT究竟拥有什么能力?它为何拥有这些能力?我们越想用好它,就越有必要弄清这些问题。

GPT拥有一定的能力与专业知识,但不擅长处理信息、易产生“幻觉”。

GPT的能力

一般来说,我们可以认为经过训练的GPT模型拥有以下这几种能力:语言理解能力,它能够理解用人类自然语言提出的要求和提供的信息;文本生成能力,它能够根据我们的需要生成文本,比如续写文章、撰写摘要、回答问题;逻辑推理能力,它能够进行演绎、归纳等推理操作;数学能力,它能够理解数学原理、数学公式,并解答数学问题;多语言能力,它不仅掌握了多种语言,而且能够在多种语言之间进行翻译;编程能力,它能够理解用编程语言撰写的代码,而且能够按我们的要求编写新代码。简言之,它不仅拥有语言、数学、推理能力,而且掌握一些专业领域的知识。我们通过提问的方式来调用它的这些能力与知识。

同时,我们也都已经意识到,GPT的能力有其独特的局限性。它似乎并不拥有一些我们本以为作为一种计算机系统必然拥有的能力。具体来说就是,当我们搜索时,计算机系统会进行检索并给出数据库中或互联网上已存储的信息,但是,想要让GPT不加改动地给出一句引文却不是一件容易的事。它似乎知道这句话,但并不能给出精确的引文。这还不是最糟的,更糟的情况是,它可能给出的是自己编造的引文,这就是生成式AI模型的“幻觉”(hallucination)问题。为了让对话进行下去,它产生了“幻觉”,然后给出了虚假的、自己编造的回答。

回到最初,GPT模型所做的实际上是“文本补全”的工作,即根据前面给出的话,补全后面的话——通俗地说就是,我们说一个开头,它接着把这些话说下去。再往前追溯就是Transformer架构,其最初用于机器翻译,将一种语言转换为另一种语言,即根据源语言的语义和目标语言的词汇概率补全句子的下一个词。后来,这个架构逐渐用于完成更一般性的生成任务,比如续写文章。

那么,GPT模型又是怎么知道后面应该补全什么内容呢?它实际上是一个“内容词预测器”软件,它所做的是根据前面的词和概率预测下一个词。它一个词、一个词地补全下去,就“写”出了给我们的回答。

那么,接下来的问题是,GPT模型又是怎么预测下一个词的呢?简单地说就是,它“看”了极其多的文本资料;通俗地说就是,研究人员用巨量的文本训练了这个模型。它可以根据前面的词,计算出后面的词出现的概率,然后把概率最高的词作为下一个词。对此,史蒂芬·沃尔弗拉姆(Stephen Wolfram)举例说,根据前面一段话,模型预测后面的5个单词依次是(按概率排序):learn、predict、make、understand、do。那么,GPT模型就会把learn作为下一个词。之后,它又接着预测下一个词。

实际上,我们可以通过调整“温度”(temperature)指标来调整选择下一个词的概率。所谓的“温度”指的是体现随机性的指标,“温度”越低,随机性越低。模型总是选择概率最高的词,这时,你可能会觉得它比较“古板”;“温度”提高,随机性增高,模型会在一组词中随机选择下一词,从而每次产生的结果会有很大的差异,这时,你又会觉得它比较有创意。

接下来的问题是,GPT模型如何判断下一个单词出现的概率是多少呢?多层人工神经网络中的参数或权重(parameters/weight)决定了下一个词出现的概率,这些参数是通过用超大数量的文本对人工神经网络进行训练而调整到位的。这也是GPT中“P”的含义——对人工神经网络进行预训练(pre-trained),让它掌握预测下一个词所需要的参数。GPT-3.5拥有1750亿个参数。

随着训练所用的文本资料和参数数量的增加,GPT模型预测下一个词的核心能力越来越强。它似乎也有了语言能力、掌握了知识、学会了推理,这颇有点像人类的成长,当孩子逐渐学会了说话之后,他学习了知识,后来又能够进行推理了。GPT模型的演进方式是:当加大训练的文本数量后,它的知识与能力会得到大幅度提升。那么,怎么让它的能力为我们所用呢?至此,本书的主角——提示语(prompt)的重要性一下子就凸显出来了。

一般来说,我们会给GPT一段提示语(如一段需要翻译的文字、一段需要续写的文字、一段需要它总结的长文),然后让它根据我们的提示语补全下去。不过,既然它已经拥有了语言能力、推理能力、生成能力,那么我们何不将提示语转变为提问(请回答……)或转变为命令(请帮我做……)呢?

我们将向GPT模型输入的请求称为提示语,它是使用GPT模型所拥有的知识与能力的接口。如图1-2所示,我们可以通过在搜索引擎上搜索关键词来获取和使用海量的信息(如谷歌和百度所做的)和服务(如亚马逊、淘宝、美团所做的)。现在,我们可以通过提示语来使用AI模型所掌握的知识与能力。

图1-2 “提示语”是使用AI模型知识与能力的接口

很多人是在应用ChatGPT等生成式AI产品时,才第一次注意到prompt这个词。它的中文释义之一是为防止演员忘词而准备的提示词。在2007年出版的《提问指南》(Make Questions Work)一书中,作者用prompt一词来表示用以获取想要的回答或更多信息的进一步的问题。现在,prompt有了新的含义:在使用各种生成式AI模型时,为了引导它给出理想的回答而给出的提示语。

目前,我们通常会向两种生成式AI模型输入提示语。一种是GPT等大语言模型,让它们根据提示语回答问题或响应请求;另一种是由文本生成图像的绘图模型,如OpenAI的DALL-E、Stability公司的静态扩散(Stable Diffusion)开源模型、中途(Midjourney)图片制作软件等。对于后者,由于提示语的微妙变化会带来图片的巨大变化,因此有人也把提示语戏称为“咒语”,把根据提示语绘图说成是“用咒语吟诵出魔法般的画作”。

下面让我们聚焦于使用GPT等大语言模型时用到的提示语。提示语几乎是调用GPT等大语言模型的知识与能力的唯一途径。下面我尽量用通俗的方式解释其实现原理。

如前所述,大语言模型实际上是一个经过训练的概率模型,它所做的事情可以看成是预测下一个词。它一个词接一个词地预测,从而组成完整的句子、段落或文章。如果它要完成的是翻译任务,那么下一个词的概率预测是较为简单的,与原文进行对照翻译即可。但是,如果它要完成的是生成型的任务,比如让它续写一段话,或者让它回答我们的提问,下一个词的概率预测难度就大大增加了。

提示语的作用是引导模型更好地计算出下一个词。沈国阳曾经在一篇文章中对提示语的本质做了很好的阐述:“调整和优化文章中前m个元素的值,这些元素通常包括任务描述、上下文信息等,使大语言模型能在给定任务的场景下生成概率更高、更符合预期的结果。”

提示语实际上是我们写了一个文本模式,然后让GPT按照当前模式写下去,这就是为什么我们写的话会对它产生微妙的影响。我们写得很随意,它就很随意;我们写得很正式,它就回答得很正式。简言之,如果我们给出合适的提示语,包括明确的动作指令(如写一篇文章)、恰当的参考内容(如关于春天的)等,模型将能更好地决定下一个词,从而最终生成符合我们预期的回答。

实际上,我们可以通过提示语将通用的大语言模型转化为聊天机器人,谷歌Deepmind[3]和人工智能公司Athropic在论文中都提到了这个技巧。Athropic的提示语示例展示了如何用长达6000个标记符的提示语让模型具有聊天功能。它是这样开头的:“以下是各种人与AI助手之间的对话。AI助手试图为人们提供帮助,它表现得礼貌、诚实、成熟、有情感感知、谦虚而博学。该助手乐于帮助人们完成任何事情,并将尽力理解客户需要什么。同时它也在尽力避免提供错误的或具有误导性的信息,并在不确定答案是否正确时提示警告信息……”

用提示语激发AI的潜能

提示语是调用GPT知识与能力的接口。我们通过向GPT输入提示语、激发并调用GPT经过预训练和微调的知识与能力,来让AI回答我们的提问、完成我们的请求。

实际上,Ope nAI对GPT的数次版本迭代在某种程度上也均与提示语有关。GPT-1论文的标题是《通过生成式预训练提升语言理解能力》(Improving Language Understanding by Generative Pre-Training),文中提出了通过预训练转换器实现语言理解和文本生成的方法。GPT-2论文的标题是《语言模型是无监督的多任务学习器》(Language Models Are Unsupervised Multitask Learners),文中明确引入了用提示语调动模型能力的方法。GPT-3论文的标题是《双向语言模型是少样本学习器》(Bidirectional Language Models Are Also Few-shot Learners),所谓少样本是指我们可以在提示语中加入少量样本范例,以引导模型更准确地回答类似问题(稍后我们会专门举例说明少样本的做法)。InstructGPT(相当于GPT-3.5,也是ChatGPT采用的主要模型)的论文标题是《训练语言模型以遵从人类指令》(Training Language Models to Follow Instructions with Human Feedback),其中用来训练的指令可以看成是提示语与人类认为的理想结果的组合。由此可以看到,每一次的技术迭代都是为了让模型能够更好地响应提示语,给出回答。

简言之,好的提示语对应着好的结果;糟糕的提示语对应着糟糕的结果;错误的提示语对应着错误的结果。学会向GPT提问,就是学会输入有效的提示语。

下面我们从另一个角度来解析一下提示语与模型的关系。现在我们使用的大语言模型都是在预训练的基础上,经过指令微调(instruction fine-tune)的方式优化过的模型,这能让模型更好地理解和回答与指令相关的问题。Facebook的母公司Meta提供了一个开源的大语言模型LLaMA(羊驼)。2023年初,斯坦福大学团队在其基础上做出改进,制作出了模型Alpaca(小羊驼),据称其效果接近于ChatGPT。

Alpaca针对图1-3所示的各种指令任务进行了优化。下面就来看看这些指令任务具体是什么?

图1-3 指令动词与具体内容

图1-3中的内圈是关于指令的动词,外圈是相关指令的具体内容。比如,内圈的一个指令动词是创建(create),而与之对应的外圈内容是故事(story)、句子(sentence)、诗歌(poem)、列表(list)。也就是说,它被训练来创作一个故事、写一个句子、写一首诗歌、创建一个列表。

又比如,内圈的另一个指令动词是描述(describe),与外圈对应的内容结合起来则是:描述过程、描述差别、描述影响、描述收益。

我们可以这么理解:首先,这些模型经过大量的学习(即预训练),掌握了基本的知识与能力;其次,它们可能会针对专业领域的内容进行再训练(比如,OpenAI就曾经用代码训练模型,使其具有编程能力);最后,会根据相关指令对它们进行微调训练,以使其能够更好地完成与这些指令相关的任务。

因此,表面上我们与之交互的是一个聊天机器人或软件助理,其实在幕后发挥作用的则是一个个经过训练的模型。它们经过训练后,具备了通用能力、各领域专业能力以及完成特定任务的能力。当我们向它们提出要求时,它们能够运用自己的这些能力来回应我们。我们使用这些能力靠的就是有效的提示语。

结构化提示语:ICDO——我明白了,马上执行!

要使用AI模型的知识与能力,我们需要输入有效的提示语。截至目前,我们得到的经验是:应该向AI输入结构化的提示语。这里,我们将结构化的提示语命名为“ICDO”。我们可以这么理解,当我们向AI输入提示语后,AI会给出回应:“I see, do!(我明白了,马上执行!)”

向GPT提问的方式是:我们输入提示语,它输出回答。当然,提示语并不只是“你帮我翻译这句话”“你帮我整理会议记录”这么简单。我们需要对它的组成要素进行深度拆解,从而掌握提出优秀问题的技能,以获得高质量的回答。通常来讲,提示语可拆解为以下四个部分:指令、上下文、输入数据、输出要求。“ICDO”是结构化提示语四个组成部分的英文首字母:指令(instruction)、上下文(context)、输入数据(input data)、输出要求(output indicator)(如图1-4所示)。它由埃尔维斯·萨拉维亚(Elvis Saravia)等人总结而来,我们在此基础上做了以下两项优化:将它命名为“ICDO”以及将它进一步结构化。埃尔维斯等人总结的“ICDO”原本是为用编程接口访问GPT的程序员准备的,但现在它也适用于所有想要高效使用AI的人。

图1-4 结构化提示语“ICDO”框架

我们向GPT输入的提示语通常由以下四个部分组成,通常情况下,我们应按照如下的顺序输入,这里列举并解读一个简单的示例。

指令(instruction):你想让GPT执行的特定任务。

“你的任务是将中文翻译成英文。”

上下文(context):额外的上下文或背景信息,以引导GPT更好地做出响应。

“请按此词汇表将这些专有名词进行翻译。”

输入数据(input data):用户实际输入的内容。

“需要翻译的句子是:天空是蓝色的。”

输出要求(output indicator):指定输出的类型、格式等。

“译文是:The sky is blue.”

我们应该按照以上四个部分的顺序来组织自己的提示语。如果将GPT看作一个人,那么我们在给它布置一个任务时与我们请一个人帮忙完成任务时的交互方式是一样的:首先说明任务,给出背景信息,然后提供任务的具体信息,最后提出对于结果的明确要求。

GPT也像人一样,越靠后的信息它记得越清楚。如果你先给出具体任务,再说明背景信息,它可能会混淆具体任务与背景信息。我们提问的目的是要得到结果,因此对于结果的要求应放在最后。同时,有一个被一再验证有效的向GPT提问的技巧是,在提示语的开头描述指令(你的任务是将中文翻译成英文),最后再以某种方式重复指令(翻译是:);这会让GPT更容易清晰地理解和执行我们的要求。

使用GPT一段时间后,你可能会发现,有一个使用障碍是记不住顺序。但将它缩写为“ICDO”之后,我们再也不用为此发愁了。每个人都可以按照这样的结构化提示语来进行提问,获得更理想的回答。

当然,在实践中我们可能已经注意到,并不是每次提问都要包含这四大要素,有时可以酌情省略。这一点也跟我们人类之间的交流相似,有些话无须赘述。

要想让GPT高效发挥它的能力,我们往往要编写更复杂的提示语。这时,结构化提示语“ICDO”就是我们编写提示语的框架。这里先举一个例子,让大家能有更直观的理解。比如,我们要求GPT按照村上春树的风格改写一段话,提示语如下所示。可以看到,我们给出了任务(请它改写文章)、上下文(参考范文)、输入数据(要改写的段落)、输出要求(请它改成写三个版本)。

你是一个写作风格大师,你的任务是用作家村上春树的风格改写文章。请不要在改写后的文章中增添任何新信息。

这里给你一段村上春树的散文,作为风格参考范文:我可以准确地说出下决心写小说的时刻,那是一九七八年四月一日下午一点半前后。那一天,在神宫球场的外场观众席上,我一个人一边喝着啤酒,一边观看棒球比赛。……球棒准确地击中了速球,清脆的声音响彻球场。希尔顿迅速跑过一垒,轻而易举地到达二垒。而我下决心道:“对啦,写篇小说试试。”便是在这个瞬间。在那一刻,似乎有什么东西静静地从天空飘然落下,我明白无误地接受了它。

你要改写的段落是:AI出现之后,我们可以用它帮助写作。我们不再需要坐在桌前拿着纸和笔奋笔疾书。现在,我们打开聊天机器人,跟它对话,有时候我提问、它回答,有时候它提问、我回答,有时它开始思维发散……在与机器人的交谈中,我们的想法渐渐“流淌”出来。

仅参考范文风格,不使用范文的内容。请保持改写后的段落与原文长度相当。请给出三个改写版本,格式如下:1. 2. 3.。请你用村上春树的风格改写以上段落。

我们让GPT多次回复这个提示语,得到了多个改写版本,其中一个版本的回答是:“我不再是坐在桌前,拿着笔在纸上创作的人。我唤醒聊天机器人,和它开始对话,就像在和一个久未见面的老朋友聊天一样。……在对话中,我的思想如同泉水一样,悄悄地涌出。”这段文字的确在一定程度上模仿了村上春树回忆自己写作时的散文风格。我们也可以设定其他作家的风格,给出相关的范文,GPT也能参照着改写。当然,我们也可以把自己过去的文章片段作为范文,让它模仿我们的风格写作。

如果我们细看这个提示语,就会发现“ICDO”四大部分均包含了更多信息。比如在指令部分,我们用“写作风格大师”来设定它的角色,并指示它的任务是“用作家村上春树的风格改写文章”。又比如在输出要求部分,我们要求它改写的文字与原文长度相当,我们还要求它每次给出三个版本。这个提示语当然不是一次成型的,而是在反复地提问和尝试中逐渐地增加和调整其中的信息,直到让GPT能够清晰地理解和执行我们的要求。

如图1-5所示,结构化提示语ICDO的每个部分都可以进一步细化。

图1-5 结构化提示语“ICDO”拆解四大部分

指令部分

指令部分通常包括三个子部分。

第一,角色设定。例如,“你是一个写作风格大师”“你是一个社交媒体营销专家”“你是一个Python编程高手”等。虽然看起来像在“恭维”它,但为什么要这样设定呢?这样设定实际上是有依据的,也的确是有效的。GPT模型经过了大量的资料训练,这些资料的质量良莠不齐,当我们设定它是“大师”“高手”“专家”时,它就会缩小匹配范围,直接去匹配更高水平的知识与能力。

第二,任务目标。例如,“你的任务是发现英文作文中的病句”“你的任务是根据要求排时间表”“你的任务是根据资料回答客户的问题”。通常来说,我们应该缩小每次提问的任务范围,我们的任务目标分得越细,得到的回答就会越接近预期。

第三,指令规则。我们经常在指令部分设定一些规则,例如,“请不要编造任何信息,如果你不能完全确信,请回答‘我不知道’。”“请一步一步思考。”我们可以根据具体的任务需要补充对应的规则。

上下文部分

上下文部分通常包括GPT完成任务时需要的多种背景信息。

第一,知识与技能。例如,我们如果希望GPT运用贝叶斯定理来解题,那么就可以列出贝叶斯定理的名字,一般情况下,对于这类通用知识的信息这样就足够了。如果我们想用自己的知识与技能,就可以解释给GPT,它也可以参照执行。现在,OpenAI的模型还允许我们提供函数列表,然后由AI来决定调用其中的哪个函数,这其实就是为模型赋予能力。

上下文也可以包括我们给GPT提供的参考资料。比如,请它翻译时,我们可以提供相应的词汇表;请它答疑解惑时,我们可以提供参考书等;请它根据资料回答客户问题时,我们可以提供客服政策、标准回复、客户订单信息等资料。随着现在AI模型的快速发展,提示语的长度已经可以长达万字,因此可以附上很多必要的资料。当然,我们还是应该精选资料,因为太多的信息会让GPT混乱、抓不住重点,同时大幅降低回复的速度、增加回复的资金成本。

第二,完成任务的步骤。如果我们给到GPT的任务较为复杂,那么列出步骤将是一种改善效果的做法。例如,我们想要GPT改写一篇文章,可以这样要求:“请先根据原文列出大纲,然后再改写。”这样的分步设计能让它更好地保持原文的结构。

给出知识与技能以及完成任务的步骤,是为了将我们使用者所了解的知识传递给GPT,从而让它能够更好地按我们的期待完成任务。

第三,一个或数个样例。我们可以在提示语中给出一些样例,这种做法通常也称为“少样本提示”。学术研究与提问实践均证明,GPT可以通过提示语中的样本快速学习,并用学到的知识完成任务。在前文仿写村上春树写作风格的提示语中,我们提供了一个段落作为样例。通常来说,提供三个或更多样例会有更好的效果。

另外一个相关的提示语技巧是,如果我们为GPT提供思考过程的样例,即“链式思考”或“思维链”,就能大幅度提高它的数学与逻辑推理能力。简单说就是,如果我们在示例中为GPT提供思考过程,那么在解答同类的问题时,GPT也会模仿我们的思考过程,从而大幅提高回答的正确率。

输入数据部分

这部分最为简单直接,直接给出我们的数据即可:如果要请它回答问题就给出问题,如果要请它修改程序代码就给出代码,如果要请它草拟电子邮件回复就给出原邮件,等等。

输出要求部分

如果能够给出清晰的输出要求,我们就有更高的概率获得自己理想格式的回复。这通常包括三个部分。

第一,输出规则。比如,“请用表格的形式给出你的理由”“请始终用简体中文回答”“请在每个观点的后面给出分析过程”。如果是请它提取数据,就说“请给出Markdown格式的表格”。

第二,输出样例。如果我们希望GPT严格按照某种格式输出回复,那么给出输出样例往往会比单纯描述要有效得多。比如,前面列举的改写成村上春树风格的例子中,我们要求的输出格式是:数字、点和空格,而实际上我们用简单的示例就达到了目的:“格式如下:1. 2. 3.。”

第三,输出指示符。提示语的最后一句话即输出指示符。这看似无关紧要,但实际上它能产生很好的效果。提示语实际上是引导GPT按某种文本模式来生成回答,输出提示符能更清晰地把它引向我们想要的方向。结构化的提示语往往篇幅较长,因此我们在最后通常会重复任务、给出明晰的引导,比如“翻译结果是:”“回复的邮件是:”“提取的表格是:”“思维导图的大纲是:”“五种创意思路是:”,等等。