存在提示工程的一个关键缘由在于,大模型在不同人群的视角下所发挥的作用差异显著。普通使用者往往仅将大模型视作聊天机器人,他们着重关注的是大模型能否迅速且精准地予以反馈。就像我们之前提及的提示词公式,其足以应对绝大多数日常使用情境。
然而在开发者的视野里,他们期望大模型具备处理复杂任务场景的能力。例如当下众多 Agent 背后所依托的技术,便是借助大模型的推理能力推断出下一步行动,而这一过程高度依赖提示词的精心编写。
多数人是先知晓 ChatGPT,而后才了解提示词,进而认识提示工程。实际上,提示工程并非在 GPT 风靡之后才出现的新技术。它最早源自自然语言处理(Natural Language Processing,简称为 NLP)领域。当时人们就察觉到,在任务执行进程中,若能给予 AI 适宜的引导,AI 便能更为精准地领会我们的意图,并遵循指令作出响应。于是,怎样对 AI 进行有效引导便成为众多研究者的探索方向,提示工程也就此应运而生。
在 GPT 广泛流行之后,人们惊喜地发现相同的技术对大模型同样行之有效,所以越来越多的人开始将目光投向提示工程。
从技术本质来讲,为大模型提供的背景信息越丰富,就越有利于大模型理解我们的意图,而我们向大模型传递信息的主要途径便是借助提示词。从某种程度而言,之前所阐述的提示词公式可被视为提示词工程的一个典型示例,依据此公式,我们能够为大模型提供其推理所必需的各类信息。
至此,大家应该已经对提示工程有了一个初步的认知。接下来,就让我们一同来了解几个提示工程中的典型技术。
零样本提示(Zero-Shot Prompting)
前面我们说过,大模型的一个特点是知识丰富,所以,大模型本身是知道很多东西的。我们就可以利用这个特点,让它帮我们做一些通用的事情。在这种情况下,我们不需要给大模型过多的信息提示,这种提示词的写法称为零样本提示(Zero-Shot Prompting)。
我们来看一个例子:
图片
在当前这个实例当中,我们期望大模型执行一项文本分类的任务,即判定文本内容究竟属于中性、负面还是正面类别。可以明显看出,大模型自身已然知晓分类的概念,并且清楚应当如何依据文本内容来评判其情感倾向。因此,在这个特定的例子里,即便我们未额外提供更多的提示信息,大模型也能够出色地完成分类任务。
零样本提示在提示工程领域属于相对易于理解的一项技术,它尤其适用于较为简单的任务场景。举例来说,某些简单的查询操作便能够运用零样本提示来达成。在此过程中,我们所需做的仅仅是对提示词加以适当调整,从而使大模型能够更为精准地返回我们所期望的内容。
不过,在某些情况下,我们所面临的任务并非具有普遍通用性,此时零样本提示便难以发挥作用。于是,我们可以向大模型提供一些具体的例子,以此助力大模型更好地理解任务要求,而这便是我们接下来即将探讨的另一项提示技术 —— 少样本提示。
少样本提示(Few-Shot Prompting)
虽然大模型知识丰富,但它并不是无所不知的,尤其是它对我们要完成的工作甚至是一无所知的。这时,我们只要给它一些例子,帮助它理解我们的工作内容,它就能很好地进行推理。下面是一个例子:
图片
在该示例中,老师需要依据学习成绩来规划学生的假期活动,而活动的详细内容大模型预先无从知晓。在此情形下,我们运用了少样本提示方法,即提供了若干具体实例:对于成绩在 85 分及以上的学生,安排预习下学期课程;成绩处于 60 至 85 分区间的,要求完成假期作业;成绩低于 60 分的,则需复习本学期课程内容。
有了这些示例后,我们便可向大模型提出具体问题:小刚的期末成绩为 74 分,那么他的假期活动应当是什么?大模型参照我们给出的实例进行推理,进而得出结论:小刚的期末成绩是 74 分,其假期活动应为完成假期作业。
或许看到此例,你会心生疑惑,我们为何会以这样的方式与大模型交流呢?实际上,这并非我们日常的聊天模式,而是一种应用的构建方式。我们会将前面的示例作为提示词的固定组成部分,而后面的问题则依据用户的实际提问进行拼接。在后续讲解 LangChain 时,会涉及一个名为提示词模板(PromptTemplate)的概念,其用途便是用于拼接提示词。此刻,你应该能够明白为何我们强调本讲所涉及的提示工程内容均属于技术范畴了。
少样本学习在简单分类场景中颇为有效,但它也存在显著的局限性。例如,在一些复杂的推理任务里,它就难以应对。于是,便有了下一项提示词技术 —— 思维链。
思维链提示(Chain-of-Thought Prompting)
大模型本质上属于语言模型,其优势显著体现在语言处理能力方面。然而,换个视角审视,大模型在数学与推理等领域确实存在短板。我们常常会察觉到,大模型在面对一些简易数学问题时容易出错,就像判断 3.8 和 3.11 的大小这种基础问题(值得一提的是,各个大模型都在持续努力修正已发现的此类问题)。
依我之见,大模型的表现往往是言语反应快于思考过程,常常未经深思熟虑就给出回应。为促使大模型更出色地履行任务,我们有必要引导它放缓回应速度,避免仅凭直觉作答,而是要激发其理性思维,使其能够更加严谨、准确地处理问题并提供答案。
图片
在这一实例中,左右两侧均旨在获取数学题的答案,并且所采用的样例题目相同。二者的区别在于,标准提示的样例回答是径直给出答案,而运用思维链提示的样例回答则呈现出完整的推导流程。由此可见,由于样例的差异,模型的回答也产生了不同结果。标准提示因直接给出答案,属于 “未加思索” 的回应,最终答案错误;而思维链提示给出的答案伴有完整的思考进程,是一种 “深思熟虑”“慢下来” 的答案,所以得出了正确答案。
至此,大家应该能够明白,所谓思维链,实际上就是这样的思考步骤。此例中的思维链因列举了示例,故而可被视作一种少样本提示。或许有人会思考,既然存在少样本思维链,那么是否存在零样本思维链呢?答案是肯定的。只需在提示词里添加 “Let’s think step by step” 即可,其目的显而易见,是告知大模型要放慢节奏,逐步思考。
无论是上述实例,还是零样本思维链,若自行测试,效果极有可能存在差异。原因在于大模型的推理能力处于持续提升的状态,可能前一天表现欠佳,后一天便有所进步。所以,在实际开发大模型应用时,务必基于特定模型展开测试,以此确保提示词的有效性。
就在撰写这段文字后不久,OpenAI 推出了 o1,其核心原理便是将思维链融入大模型的处理流程之中,从而极大地增强了模型的推理能力。倘若能够领会思维链的内涵,即便我们使用的是推理能力稍弱一些的大模型,依然能够收获较为理想的推理成效。
ReAct 框架
前面提到的这些提示技术都是在说大模型自身的推理过程,不过,很多人对大模型的预期可不仅仅局限于“文字游戏”。那如果大模型能够跳脱自说自话,和周边做更多结合,是不是就可以做更多的事情了呢?
ReAct 框架就是在这个想法下诞生的。ReAct 实际上是两个单词的缩写:Reasoning + Acting,也就是推理 + 行动。下面是这个例子来自引入 ReAct 框架的论文,其原始问题是:
除了苹果遥控器,还有哪些设备可以控制苹果遥控器最初设计用来交互的程序?Aside from the Apple Remote, what other devices can control the program Apple Remote was originally designed to interact with?
下面就是回答这个问题涉及到的不同的步骤:
图片
于该实例当中,大模型若要达成一个宏大目标,便需持续执行一系列任务。每个任务都会历经思考(Thought)、行动(Action)、观察(Observation)这三个关键阶段。思考环节能够确定下一步的行动方向;行动则意味着切实完成某一具体动作;而观察,是对行动所产生的结果予以评估,进而判定是否终止这一处理流程。
虽说推理部分大模型自身便可完成,然而行动所涉及之事,大模型恐难以独自应对。例如搜索苹果遥控器,这显然需要借助其他手段,来辅助大模型完成此搜索行为。实际上,这便是 ReAct 技术被称作框架的根源所在,因其在执行过程中需要融入一些其他的动作才能顺利推进。
如果单看这个例子,你还可能会有些困惑,那下面的例子可以帮助你更好地理解 ReAct 是一个框架。这是来自 LangChain 社区的一个提示词模板,后面我们会讲到 LangChain,这里我们先把注意力放到提示词本身:
Answer the following questions as best you can. You have access to the following tools: {tools} Use the following format:Question: the input question you must answerThought: you should always think about what to doAction: the action to take, should be one of [{tool_names}]Action Input: the input to the actionObservation: the result of the action… (this Thought/Action/Action Input/Observation can repeat N times) Thought: I now know the final answerFinal Answer: the final answer to the original input question Begin! Question: {input}Thought:{agent_scratchpad}
此提示词模板的核心用途在于借助特定工具来达成具体任务。在此处能够看到与之前相似的思考(Thought)、行动(Action)、观察(Obsuation)等阶段。关键之处在于行动阶段,在此阶段我们能够运用不同的工具,而这些工具正是可以被整合进执行流程的关键要素。大模型会依据问题以及工具的特性来抉择下一步的行动策略,例如告知我们应选用何种工具来完成任务,随后便能够执行对应的工具代码。需要注意的是,这里的工具代码属于本地代码,其所能实现的功能更为丰富多样,能够突破大模型自身能力的局限。倘若你能够透彻理解这个提示词模板,那么便意味着你已经初步具备了构建一个 Agent 的基础条件。