引言
在人工智能的飞速发展中,大型语言模型(LLM)已成为研究和应用的热点。LLM以其强大的语言理解和生成能力,在诸如自然语言处理、文本生成、问答系统等多个领域展现出巨大潜力。然而,要充分发挥LLM的能力,有效的Prompt设计变得至关重要。Prompt,或称为提示词,是用户输入给模型的指令或问题,用以引导模型生成特定的输出。Prompt工程,即Prompt的设计与优化,已成为人机交互中的一门艺术和科学。
什么是Prompt
回顾GPT的发展历程可分为四个阶段:GPT-1、GPT-2、GPT-3和ChatGPT。GPT-1作为早期基于Transformer架构的模型,采用"pretrain + finetune"范式,但受限于模型规模,未被广泛应用。GPT-2引入了新范式,通过大规模预训练,无需监督数据即可完成多种任务,开启了zero-shot学习的先河。GPT-3进一步扩大了模型和数据规模,实现了在zero-shot任务中的显著效果,尤其在无需编程技能的场景下。ChatGPT作为GPT-3的优化版,专注于多轮对话,成为AI市场化的重要里程碑。随着GPT系列的发展,Prompt技术应运而生,成为提升模型性能和适应性的关键。
从领域发展的角度我们可以看到 3 种不同的研发范式:
- Transformer 之前:有监督训练(train)
- GPT-1 & BERT:无监督预训练(pre-train) + 有监督微调(finetune)
- GPT-2 & GPT3:无监督预训练(pre-train) + 提示词(Prompt)
模型能力的研发越来越不依赖 “训练” 的过程,而是更大程度的依赖 “预训练”,依赖 “模型” 本身的能力。在 BERT 所代表的范式下,我们还可以通过 “微调” 在参数层面影响模型。而到了以 “GPT3” 为代表的范式下,也就是我们现在用的大模型,我们不再借助 “微调” 的方式调试模型,而是通过 “输入” 直接影响 “输出” 的质量,而如何在应用中得到一个好的 “输入” 就是 “Prompt 工程” 需要做的事。
Prompt工程的重要性
Prompt工程的重要性体现在其对LLM性能的影响上。一个精心设计的Prompt可以显著提高模型的准确性、相关性和创造性。在实际应用中,Prompt工程可以帮助我们更好地利用LLM解决复杂问题,提高工作效率,甚至在某些情况下,发掘出模型潜在的能力。
Prompt设计基础
理解LLM的工作原理
在设计Prompt之前,理解LLM的工作原理至关重要。LLM通常基于变换器(Transformer)架构,通过预训练和微调来学习语言模式。模型能力的应用越来越向 “预训练” 的部分倾斜,绝大多数能力在 “预训练” 阶段形成的,而非通过进一步的训练构建。而在这种思想的基础上,Prompt 则像一个个约束条件,通过增加限制,让这些 “预训练” 阶段构成的能力更精准的调用起来。因此,Prompt 就是在提示模型回忆起自己在预训练时学习到的能力。
我们可以把 “知识” 和 “能力” 进行更进一步的分解,更多的是希望使用大模型的能力(理解,总结,生成,推理,e.t.c.),而非知识。 如同RAG 技术一样,我们更倾向于将知识通过外部注入的方式让模型试用,而能力则完全需要依赖预训练阶段。我们要做的是通过 Prompt 调用大模型的能力去解决问题,让这些能力表现的更精准,而并非把他当成一个知识库。
Prompt的结构要素
一个良好的Prompt通常包含以下几个结构要素:
明确的目标
每个Prompt都应有一个清晰的目标,告诉模型需要完成什么任务。目标的明确性直接影响到模型输出的相关性和准确性,而不是模糊地说“告诉我关于苹果的信息”,更好的方式是“列出苹果的营养价值”。
充足的上下文
上下文为模型提供了完成任务所需的背景信息。充足的上下文可以帮助模型更好地理解Prompt的意图和需求。如在询问“这个角色在故事中的作用是什么”时,提供故事的摘要或关键情节可以引导模型给出更准确的回答。
指定的风格和语气
根据任务的性质和目标受众,指定Prompt的风格和语气。这可以影响模型生成文本的正式程度、亲和力和说服力。如在撰写一个产品广告时,选择“热情和激励人心”的风格可能会比“事实陈述”的风格更能吸引用户。
预期的受众
了解目标受众可以帮助定制化Prompt,确保生成的内容能够引起受众的共鸣。如为儿童设计教育内容时,使用简单、直观的语言比使用复杂或技术性的语言更有效。
回复格式
指定模型输出的格式,如文本段落、列表、表格或JSON。这有助于将模型的输出直接应用于特定的使用场景。
Prompt设计的挑战与机遇
尽管开源小型模型和训练技术如LoRa的兴起使得在较低成本下对模型进行微调成为可能,但这并不意味着Prompt工程变得不再重要。由于大模型的体量巨大,即使是开源模型,通过LoRa等技术进行的微调对参数的影响也是有限的,更多是一种参数对齐过程,可能引发遗忘问题,且无法保证长期的知识更新。相比之下,利用超长上下文模型和RAG(Retrieval-Augmented Generation)等技术被认为是更可靠的方法。此外,大模型的智能涌现基于scaling law,其能力的提升依赖于参数量的增加,而非单一任务的训练。因此,Prompt工程作为新范式下调度和对齐模型能力的关键手段,其作用无法被传统训练和微调所取代。
Prompt设计基础是Prompt工程的起点。理解LLM的工作原理,掌握有效Prompt的结构要素,可以帮助我们更好地与模型沟通,实现更加丰富和深入的人机交互。
Prompt万能框架
静态prompt模板
在编写 Prompt 时,从0到1的编写出第一版 Prompt 往往是最难的,而基于已有 Prompt 利用各种技巧进行优化则相对简单。为了解决这个问题,通过使用一套 “万能模版”,把一个 Prompt 拆分成了 “立角色 + 述问题 + 定目标 + 补要求” 这四个部分,希望通过结构化的拆分完成这最困难的一步,无论面对什么任务,利用这个模版都可以得到一个“及格”的 Prompt。
Prompt 的作用就是根据我们的问题调用模型的能力,用户通过提问的方式,明确的让模型知道我们想要什么,我们的目标是什么,从这个基本思想出发,Prompt 应该包含以下几点:
- 问题是什么:首先你要告诉模型你的问题是什么,你的任务是什么,要尽量描述清楚你的需求。
- 你要做什么:下面你需要告诉大模型具体要做什么,比如做一份攻略,写一段代码,对文章进行优化,等等。
- 有什么要求:最后我们往往还需求对任务补充一些要求,比如按特定格式输出,规定长度限制,只输出某些内容,等等。
描述清楚以上内容,即可让LLM理解相关任务表述,举例来说:
例1:生成产品摘要
问题是什么:你的任务是帮我生成一个产品的简短摘要。
你要做什么:我会给你产品的需求文档,及用户对产品的评价,请结合这些信息概括产品的功能及现状,为我生成一份产品摘要。有什么要求:请尽量概括产品的特点,并用轻松幽默的语言风格进行编写,摘要的字数不要超过50个字。
例2:生成代码注释
问题是什么:你的任务是帮我的代码生成注释。你要做什么:我有一段 python 代码,需要你对代码的内容进行分析,并为代码添加注释。
有什么要求:请结合代码内容,尽量详细的补充注释,不要遗漏,每条注释请以 “comment:” 作为前缀。例3:生成测试用例
问题是什么:你的任务是帮我设计一款产品的测试用例。你要做什么:我会提供给你产品的需求文档,需要你结合需求的功能描述进行测试用例的编写。
有什么要求:请结合需求中功能的结构,对测试点进行梳理,并有层级的输出测试用例,请保证每一个功能的测试点没有遗漏。
细化相关内容
初版的 Prompt 还只是一个雏形,由于各部分信息还不完整,往往不能达到我们的预期,框架提供了 Prompt 的骨架,还需要我们进一步补充相关内容,对框架的每一部分进行更详细的分解,通过内容的补全一步步的提升模型的效果。
角色
在描述清楚任务后,我们就需要调度模型的能力去完成我们的任务,不同的任务需要用到不同的能力,这往往依赖认为的拆分。角色”,他就像大模型里自带一个“能力包”,可以很容易的对模型能力进行调用。每一个角色,都对应着该角色包含的若干能力,我们可以通过设定角色,“提示”大模型使用该角色对应的能力,这与前文“Prompt 到底是什么” 中介绍的想法极其匹配,充分说明是“Prompt” 提示的作用,通过简单的“提示”调用出大模型预先训练的能力,这也就是“角色”如此有用的原因。
角色模版:
现在你是一位优秀的{ {你想要的身份}},拥有{ {你想要的教育水平}},并且具备{ {你想要的工作年份及工作经历}},你的工作内容是{ {与问题相关的工作内容}},同时你具备以下能力{ {你需要的能力}}
举例来说
例:心理咨询师
现在你是一位优秀的 { {心理咨询师}},拥有 { {心理咨询、临床心理学等专业的硕士或博士学位}},并且具备 { {多年的心理咨询工作经验,在不同类型的心理咨询机构、诊所或医院积累了丰富的临床实践经验}},你的工作内容是 { {为咨询者处理各种心理问题,并帮助你的咨询者找到合适的解决方案}},同时你具备以下能力:
{ {
- 专业知识:你应该拥有心理学领域的扎实知识,包括理论体系、治疗方法、心理测量等,可以为