LangChain—Prompt Engineering:大模型炼金术

自从NLP领域经历了从“Pre-train + Fine-tune”到“Pre-train, Prompt, and Predict”的范式转移,Prompt便成为了人类控制大模型输出的最核心手段之一。好的Prompt能够激发出大模型令人意想不到的能力,就像魔法一样神奇。最著名的如CoT(思维链)的“Let’s think step by step” ,一句话就启动了大模型的逻辑推理能力。这种神奇魔力也让Prompt Engineering成为了大模型时代的一块淘金圣地,吸引了大批的用户、学者以及创业者孜孜不倦地探索。

1. 魔法咒语的秘密

Prompt指什么?

跟大模型打交道,我们需要"念咒" - 写Prompt。Prompt是用户给大模型的输入,可能是个简单的问题,是一段代码,也可能是个包含若干示例的复杂模板。打过交道的人都知道,Prompt的质量直接影响了输出的好坏。对于作为使用者的我们来说,大模型是预先训练好的黑盒子,无法更改,我们唯一可以控制的就是Prompt——Prompt 如此重要,因为它是用户跟大模型交互的唯一方式。

我们提到Prompt时,所指的场景也不尽相同。用户用自然语言直接跟大模型交互被称为Prompt,用户通过中间层、由中间层将用户的自然语言翻译成更好的指令提供给大模型,也称为Prompt。为了讨论方便,本文把Prompt定义为给大模型的所有输入,也是与大模型交互的唯一媒介。

Prompt的基本构成

如何写一个好的Prompt,让大模型发挥出最优效果?要回答这个问题,让我们先从本质出发,分析Prompt需要包含哪些信息。我们看了各类Prompt,归纳出Prompt核心的几部分结构:

1)系统调参。 是Prompt用来告诉大模型怎么工作(如top-p、频率惩罚等)。这是系统配置类、最底层控制模型的信息。“模型运行时超参数”这部分是通过 API Request 发给模型服务,并控制模型推理行为的参数,虽然通常不是 Chatbot 的输入,但也是调用大模型的一个重要输入。由于我们把 Prompt 定义为给大模型的输入,我们暂且把它归属到 Prompt 的一部分。

2)角色选择(Role Play)。 不少人有过体验,告诉大模型扮演一个角色,它回答的质量会更好(比如让它规划一次旅行,事先跟它说它是位有经验的travel agent,它的规划能力会有提升)。这个现象很有趣,我们推测背后的原因是大模型是使用全人类语料和知识训练出来的一个“通用”智能,它潜在代表了各种各样的人/职业,暗藏了无数种“角色”。任务的环境不同,其扮演的角色也会不同。在大模型执行具体任务时,当告诉它当下最合适的角色是哪个,大模型的“attention”就会把这个角色相关的内容给出更多权重,因而输出质量也会更高。

3)生成风格和输出方式。 这部分其实是对任务提出的约束:以何种形式/格式/方法输出答案。比如写文章,是生成专业口吻、还是随笔风格?写代码,是输出Python还是Java代码?

4)任务描述: 指当大模型涉及到解决复杂任务/多轮对话时对于复杂任务的定义/多轮对话的主题。相当于一个任务session的目标的概述。

5)具体本轮对话的任务。

其中第一部分可以使用缺省值,第四部分在单轮对话的Prompt中可以省掉。

过去大部分对Prompt的讨论集中在第五部分上。实际上,如上所述,**Prompt是一个更为复杂的系统。**在五个部分中,前三个构建了人与大模型的协议(定义大模型如何表现、与内容本身无关),后两个是具体的内容。OpenAI也在这个方向上努力,比如GPT-3.5-turbo开始允许prompt里包含信息的种类(system、assistant和user)。

2. 怎么念好咒语 - Prompt Engineering

为什么咒语这么难念?

很多人抱怨,写出好的Prompt很难。这是为什么呢?

大模型让人机通过自然语言交互成为可能,但是,能够让大模型理解问题、最大化发挥能力的词汇,跟用户使用的词汇之间可能有差异 – 大模型的“语言”和人类语言还是有差异。由于大模型解决问题的过程是个黑盒,人类需要不断摸索使用什么样的词,能让它更好地理解任务、激活相关能力。以著名的CoT(思维链)为例,当用户在Prompt中加上“Let’s think step by step”这句话,大模型的逻辑推理能力就迅速增强了,之前算不对的题也能算对了。这看起来跟魔法一样神奇。实际上,就是因为这句话恰好是能激活大模型逻辑推理能力的那个指令(有人推测,因为大模型训练使用的语料中,很多教学生如何解数学题的语料中,第一句话是这句)。

人们还受之前人机交互形式的影响 。过去,计算机需要我们给出完美指令,计算机要么返回结果,要么程序无法工作。如今,人们面对大模型的Chatbot界面,很多时候会觉得手足无措。他们冥思苦想,试图找出一个完美的指令给到大模型来完成任务。但这个习惯实际上是个误区。自然语言交互是模糊、开放、不受控的,其中很多词汇有歧义,微妙而精细,需要我们不断地通过对话去校准这些歧义。

对比下人类之间的交互。当两个人之间交流有困难时,他们通常会反复沟通,并辅以表情、手势、动作等。后者就是多模态,在交互中很有帮助,只是现在大模型还缺乏这方面功能的支持。

大模型与用户之间的语言“歧义”、人们不习惯多次交互、以及多模态交互的缺失,让咒语难念、Prompt难写。Prompt Engineering, 是指设计和创建有效的Prompt,让大模型表现得更好、更稳定。

怎么写出好的Prompt?

这里我们总结一些写Prompt的经验,帮助大家更好地跟大模型交互。

Role Play。 这个前文提到过,Role Play是Prompt核心结构的一部分,由于大模型训练中使用了各种不同职业和不同角色生成的文本和代码作为语料,因此大模型是众多不同角色的智慧和话语,为了使大模型专注于当前任务需要的角色,需要为大模型明确地指定角色,角色越具体,大模型表现的专业性和一致性越好。

问题校准。 让大模型重复你的问题,帮助优化,从而找到它更容易理解的Prompt。比如,你可以说:你听懂了吗?你把任务复述一下,你觉得这个问题怎么描述更好?一般而言,它会帮你输出它更能听懂的语言,用它生成的这个Prompt给它指令,大概率会得到一个更好的回答。

多Push大模型。 大模型是个“受虐狂”,你越不满意,越高标准严要求,它表现越好。有不少例子验证了这点。如果你一直表现出不满意它的回答,不断提出要求(better、faster、more details等等),大模型反而会表现地越来越好。实际上,因为你的一次次“不满意”“提要求”,是在一次次给大模型机会去探索它之前没有探索到的一些权重。你跟它客气气的反而没什么用。事实证明,跟大模型说thank you之类的话,除了让它对你也更客气些之外,对于答案质量提升没什么帮助。

多说行业黑话。 在Prompt中最难的,是找到恰当的形容词来提升输出质量。这与专业性高度相关,需要写Prompt的人具有相关职业素养。比如,同样是“漂亮”,程序员说代码漂亮、专业编辑评价文章写得漂亮,用的是完全不同的词,有些甚至是非常圈内的人才能懂的黑话(比如形容高质量代码的PEP-8)。因为这些用语只存在专业语料中,给出这样的prompt才能更好地激发大模型与专业相关的输出。从另一个方面,这也说明了大模型并不会取代所有人的工作,但会把专业能力的差距继续拉大:专业能力强的人,能够给出更好的Prompt,从而更好地撬动AI来提升生产力,成为“Superman”;而专业能力差的人,可能还达不到大模型的平均输出水平,最终会被替代。以设计为例,好的设计师也能更好地利用大模型创作,核心在于他的审美和创意。

3. 由咒语调度的魔法世界(Agent)

目前Prompt Engineering中最热门也是最有挑战的一个领域,是如何让Prompt驱动复杂问题解决的自动化 ,也即以AutoGPT等为代表的自主AI智能体方向(Automony AI Agent)。这类智能体以大模型为基础来分解一个复杂任务,由prompt来连接和驱动各个子任务模块来完成任务。

自主AI智能体
主要由如下几部分构成:

  • 规划者。 做问题理解和分解,将复杂问题拆解成一系列的简单问题/任务。核心是推理能力。
  • 调度者。 负责对任务排序、发给执行者,并将执行者返回的结果做总结输出。在整个过程中,调度者在做的是“项目管理”,监督流程按照规划者的规划执行下去。调度组是规划者与执行者中间的角色,其与两者的沟通都通过Prompt来完成。
  • 执行者。 负责将调度者下发的任务执行完成。

大模型是规划者,也可以是执行者。而剩下的任务执行者则是各种各样的API/Plugin。如果是大模型自己能解决的任务,大模型是执行者;如果需要调用外部能力,则API是执行者。我们之前文章中介绍过的AutoGPT、ChatGPT Plugins Platform,微软 Office 365 Copilot等这些产品,其核心都是做了一套“调度者”系统,将大模型和一些具备各种能力的API连接起来,构成了一个“智能体”,实际上是一个包含大模型的扩展的增强的系统。

将这个智能体与人类大脑相比,构成有类似之处 。大模型就像人的大脑,负责思考、计划、推理和生成;而Plugins Platform等调度系统就像人的小脑,小脑中沉淀了许多过程顺序记忆,在做动作时可以快速调动相关的多块肌肉,就如Plugin调度系统对API的调用(API沉淀了执行某类任务的过程,解决相关问题直接调用相关API即可)。

Memory

与人类大脑相比,目前AI智能体还缺少一个重要模块 --记忆机制(Memory)。大脑工作时,经常需要唤醒一些相关记忆,作为知识、证据融入思考过程,帮助做决策。目前大模型只通过Context解决了短期记忆,还没有长期记忆

但是,越复杂的问题,越需要有长期记忆。比如构建100万行代码的软件,是不可能一次性写出来的,需要分模块去构建。这需要长期记忆帮助做全局把控和信息组织,并且在代码出现问题时,帮助快速定位到问题所在位置(寻址)。可以说,长期记忆的规模影响了可解问题的复杂度上限。长期记忆越大,可解的问题越复杂,而复杂问题的解决能力直接关系到AI的应用价值。 我们相信,随着大模型的发展,长期记忆机制会逐渐完善。

现阶段,Memory可以通过以下两个方式提供给大模型:

1)Embedding。 这需要大模型本身对此有开放的接口。

2)作为Prompt一部分。 研究表明,只要Context Window足够长,将memory通过Prompt给到大模型,跟通过Embedding给到大模型效果是差不多的。也就是说,我们可以把记忆模块做在大模型之外,把Memory也作为Agent系统的调度者可以调用的“工具”之一。

这样就可以构建出一个完整的AI智能体:规划者+调度者+执行者+Memory。

4. Prompt Engineering未来会消失吗?

Sam Altman曾在采访中提过,他认为Prompt Engineering可能会在5年后消失。他是指,念咒语的能力未来不再这么重要了。我们对此并不完全同意,这里说说我们的一些猜测:

单一任务的Prompt,会越来越容易写。 Prompt难写的根本原因之一,是大模型理解人类的能力有限。随着大模型技术的提升,这个差距会变小。比如,本文提到Prompt的五个部分,其中第一部分是模型控制的超参数,是给专业人员留的控制模型工作方式的口子,随着大模型能力的提升这个需求会越来越少.

多模态会大幅降低人机交互的门槛。 人类交流,除了语言之外还有很多肢体动作、表情、声音等多个维度同时参与。多模态的交互,信息冗余很大:各个维度的信息可以互相印证,冗余让通讯更稳定、更不容易出错。而目前人与大模型基于自然语言的单一模态交互,信息冗余很少,一方面沟通效率低(如在某些任务下,给大模型看一张图会比用一大段文字描述有效率的多),另一方面也造成了大模型的“敏感” – 一个词给错就可能导致输出错误,输出质量不可控,提高了人机交互的难度。可以预期,未来随着大模型引入多模态,将会大幅降低人与AI交互的门槛,同时提升输出的质量和稳定性。

专业能力差距进一步加大。 对于很多工作,AI不是降低了从业门槛,而是加大了从业门槛。AI时代,人最核心的价值是思维和创新的价值 – 只要你能想到,AI就能帮你做到。过去很多行业的顶尖人才受限于生产力,即使有很好的创意也未必能够完全发挥出来。而有了AI帮助,这些人的生产力将大幅提升,成为“Superman”。而对于那些思维和创新能力不足、靠“执行力”生存的人,将很快被AI替代掉。例如,我们认为,未来编程领域架构师的数量会增加,而普通程序员的数量会减少。

思维和创新能力要求越高的领域,Prompt价值越大。 Prompt是人与AI交互的媒介,也是人的思维与创造力的载体。结果的质量好坏越重要的领域,对Prompt的要求越高,好的Prompt的价值就越高。比如,未来顶尖的设计师、创业者,还是有非常大的空间。

from: http:/mp.weixin.qq.com/s/486JGj_Vs7pdsrwkijBO6Q