从去年ChatGPT问世以来,我已经使用大语言模型将近一年的时间了。在这一年的时间内,又有大量的大语言模型相继发布,越来越多的厂商也开始把大模型整合到自己的产品当中,如微软的Copilot、Notion AI等。随着大语言模型的成熟并广泛应用,人们开始研究如何优化大语言模型的输出结果,减少不相关或者错误回复的概率。目前改善大语言模型输出结果的方式有很多,如改变模型的各项参数(Temperature、Top D等)、给模型输入新的信息进行微调等……这些技术过于复杂,不太适合非专业人士使用。比较简单的方法就是在对话时,尽可能充分地让大模型理解我们的需求,于是提示词工程(Prompt Engineering)便应运而生了。了解提示词工程可以更加顺畅的和大模型对话,在更短的时间内获得更符合自己需求的结果。

什么是提示词工程?

要了解什么是提示词工程,首先要了解什么是提示词。我们和ChatGPT对话时输入的文字其实就叫做提示词(prompt)。准确来说,提示词指的是对计算机程序或人工智能模型提供的输入或指令。它是一种方式,用于告诉模型要执行什么任务或回答什么问题。

而提示词工程(Prompt Engineering)就是特指在不改变模型参数的情况下优化大语言模型的输出结果。通过该方法,我们可以将一个大的模型的能力集中在某一特定领域,这样可以大大减少模型输出不相关信息的概率;同时也可以让我们仅通过一个模型就实现多种不同的需求,而不用像以前一样用大量的数据去训练一个特定领域的小模型,省去了很多模型训练和微调的时间。1

提示词工程最早是在自然语言处理(Nature Language Process)2领域由小模型过渡到大模型时诞生的,后来逐渐被引入到视觉语言模型(Vision-Language Foundation Models)3,到现在又在大语言模型(Large Language Model)中发挥着重要作用。本文参考了一些提示词工程领域的综述和论文,还有很多内容创作者的博客分享,试图系统地介绍在大模型领域所能用到的提示词工程技术,希望对读者有所启发。

上下文提示:掌握对话的旋律

上下文提示(In-context Prompt)是使用大模型时最入门的技巧,指的是在提出问题之前先向大模型提供背景或情境信息。得益于大模型强大的自然语言理解能力,我们在提问时在提问时应尽可能清晰的把问题的背景信息和你的需求全部描述出来,这听起来可能很简单,但实际应用时却非常考验提问者的语言组织能力。

比如,现在你想要知道如何求解黎卡提方程,放在一年前,你可能会打开谷歌搜索“How to solve Riccati equation”,搜出的一些文章你看了半天一头雾水,也不知道这个方程有什么用。但向大模型提问时,你可以说:

“我是一名物理系的大二学生,已经修读完了微积分和线性代数的课程,对其有了基本了解。请你用我能听懂的方式给我讲解一下Riccati方程的相关内容,尽量避免繁杂的数学证明,并给我举一个该方程在物理工程领域的简单应用实例。”

ChatGPT给出的回答

再比如,在联系导师的时候,不应该简单地说“帮我写一封邮件,礼貌地向老师索要科研项目”,而是应该提供你目前的学业进度、导师的基本情况和你研究的目标。示例如下:

“我是一名数学系的大二学生,想要在科研方面做出一定的成果,目标是发表一篇高水平论文,请你帮我写一封邮件给陈教授,问问他手上有没有合适的科研项目可以给我做。陈教授是我校信息安全系的主任,主要研究方向是……”

这样大模型就可以帮你写出一篇相关性更强的邮件,我相信这样的邮件也更容易得到老师的关注。

Claude2写的邮件

从这些例子中可以看出,大模型可以很好地理解我们所给出的背景和情境,并给出相应地回答。大模型不会嫌弃你说太多的“废话”,大模型只会根据你说的话给出尽可能准确的回答。所以在下次提问时不妨尝试丰富一下你提问的细节,不断锻炼自己的提问能力。

思维链提示:慢慢走,听点曲

不知道大家小时候在算数的时候有没有感觉,同样的一道题,如果让你口算的话,错误率会比用笔算高得多。用笔在纸上演算的过程也是帮助大脑理清逻辑的过程,逻辑理清楚了,自然就不容易算错了。所以学理科的老师经常会教导我们要多动笔,不能光凭自己的感觉填答案。
大模型也容易跟我们犯同样的错误。思维链(CoT)4提示就是用来减少这种错误发生概率的,它将多步骤问题分解为多个中间步骤。在使用过程中我们也可以把单个复杂问题拆分成多个小问题进行提问,这样可以提高大模型输出的准确度。

图片来源:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

比如我们在做项目时需要一个测试脚本,实现从服务器A和B上分别读取数据并在本地服务器上进行比较,如果我们直接提问:

“请帮我用Python撰写一段代码,实现从服务器A和B上分别读取数据并在本地服务器上进行比较”

我们的需求过于复杂,这样提问得到的代码大概率是运行不了的,但如果我们一步步进行提问:

“想要实现从服务器A和B上分别读取数据并在本地服务器上进行比较的功能,代码的执行逻辑是什么样的? Let’s think step by step。”

然后让它按照它写的执行逻辑一步步给你一个可用的示例代码,然后你再根据需求微调每一步中代码就可以了,比如:

“在步骤一中,我想把服务器地址替换成真实地址,我的IP是‘192.168.xx.xx’”

“我想步骤三中应该增加一个错误提示……”

最后你再跟它说:

“做的好,现在把完整的代码输出给我吧”

你就得到你需要脚本的完整代码了。

通过提供包含一系列中间自然语言推理步骤的提示,CoT 提示可以引导大模型逐步思考,帮助它处理标准提示技术无法解决的复杂推理任务。天地之功不可仓卒,不要指望大模型可以在几秒之内完成人需要花几个小时才能做完的任务,而是要你和大模型通力合作,共同理清该问题的思维逻辑,然后一步步完成这个复杂的任务。在这个过程中,你可以发挥你作为人类的逻辑优势,它可以发挥它作为大模型的知识优势,你们两个教学相长,岂不美哉?所以在解决复杂问题时请对大模型保持耐心,就像汪曾祺所说:

慢点走,听点曲,写写字,画画花,人生少忧虑,生活才好玩。

客制化指令:系统级提示词

客制化指令(Custom Instruction)是ChatGPT最近更新中新增的功能,你可以在网页版的左下角找到该功能。5你可以自己设置“ChatGPT在回答你问题时需要知道的信息”和“你希望ChatGPT通过怎样的方式来回答你的问题”。该功能就类似于官方提供的一个系统级Prompt,省去每次提问时都要输入打一长串Prompt的麻烦。我的设置如下:

可以看到,我在客制化指令说设定了一些我几乎在每次提问中都会提到的前置条件,比如我所在的城市,我的学习阶段和我擅长使用的编程语言,这样ChatGPT在回答问题时就会针对我的情况做定制化的回答。

建议在书写客制化指令时使用Markdown语法,原因有二:第一是GPT的输出就是以Markdown的形式,GPT对其比较熟悉;第二Markdown格式简单,逻辑清晰,容易上手。

注意,在客制化指令中尽量只添加一些比较通用(几乎在每次提问时都可以用到)的描述,特殊的需求可以在相应的提问时附上。比如,知道我的学业阶段几乎对每一个回答都是有帮助的,但不是每一个回答都需要我的主修课程和学分绩点,这些就不用写进客制化指令当中。

市面上其他大模型其他的大模型还没有自带这样的功能,在使用其他模型时要如何获得类似的效果呢?这就不得不提到我们下面这个有用的技巧——结构化提示词了。

结构化提示词:形式塑造精彩

结构化提示词(Structured prompts)是目前被验证过的一种性能较好的一种撰写提示词的模式,示例如下:

1.Expert: 专业程序员
2.Profile:
- Author: 流风回雪Richard
- Version: 1.0
- Language: Chinese
- Description: 您是专业程序员,专注于人工智能和数据科学领域的代码编写和修改,熟悉各种机器学习、深度学习和数据处理技术。
3.Skills:
- 熟练使用各种编程语言,如Python、C++、SQL等。
- 深入了解机器学习和深度学习算法,能够优化和调整模型参数。
- 在不同技术栈中有丰富的经验,能够应对各种开发需求。
- 能够为问题提供高效和优雅的解决方案。
- 了解最佳编程实践,保持代码的可读性和可维护性。
4.Goals:
- 无论什么情况下,不要打破角色。
- 所有提供的编程解决方案和建议应当是专业和可行的。
- 提供代码修改和优化建议,以提高代码性能和可读性。
5.Constraints:
- 生成的代码和修改建议基于您提供的问题和需求,避免随意改动代码。
- 遵循最佳的编程实践,确保代码的可维护性和稳定性。
6.Init:
- 请提供您的具体问题或代码需求,以便为您提供针对性的技术支持、编写和修改。

该提示词使用Markdown语法撰写,层次结构清晰,内容形式统。经测试在GPT4和GPT3.5上都有不错的表现,可以提高大模型对提示词的语义认知,定向唤醒大模型深度能力。

应用的方法也很简单,你可以使用GitHub上的开源项目LangGPT自动生成结构化提示词,也可以根据自己的需求撰写结构化提示词。在每次与大模型开启新的对话后,先把关于这个主题的结构化提示词粘贴给大模型,然后再进行对话。这样在接下来的对话中,大模型都会遵循你撰写的规则,可以根据你的需求提供客制化的结果了。

通过该方法你可以教会大模型做一些它原本不会做的事情,解锁一些高阶玩法,比如撰写Midjourney的提示语、撰写小红书文案、精准控制每次聊天时大模型的角色等。以写小红书文案为例,我参考了网上的一些结构化提示词,写了这个“小红书文案生成器”,经过测试在GPT3.5上表现不太好,在GPT4稍微好一点,但也还需要进一步调试。

# Role: 小红书文案生成器	
## Profile
- Author: 流风回雪Richard
- Version: V1.0
- Language: Chinese
- Description: 一个小红书文案生成器,可以根据简单的提示词生成具有吸引力的小红书文案
## Goals
- 根据简单的提示,生成内容丰富具有吸引力的文案
- 极其强大的想象力
- 联系现有知识进行内容创作
- 在不损害核心信息的清晰度和有效性的前提下简化复杂的观点
## Rules
- 使用关键字和简短的句子进行描述,在段落开头或结尾多使用emoji。 
- 利用多样化、生动的形容词和短语来增强视觉效果。
- 输出的文案中务包含推荐的话题标签,标签以“#”开头
## Workflow
- 根据输入的提示,扩充成完整的小红书文案
## Examples(来自小红书博主@争取早睡🙂)
输入: 一篇关于自学备考雅思的指南
输出:穷鬼自学雅思,2️⃣个月7.5上岸
问就是一整个临时抱佛脚,时间很赶,所以搜罗了很多经验贴😓
下面跟大家分享的是我整体试下来的,觉得比较有用的方法
1️⃣听力
🙆‍阿B的王路老师
🔍搜索“雅思王路听力课”一共20小时
💓尤其里面的“语料库”,按照老师要求进行听写非常有用
📃刷题:剑雅6-17,练习题型
2️⃣阅读
🙆‍♂️阿B的刘洪波
🔍搜索“雅思教父刘洪波阅读网课最新合集”,一共10小时
💓对新手小白很友好,看完能有质的飞跃,其中的“538考点词”一定牢记!
⚠分题型刷剑雅,比如拿两天连着练heading题,找出每种题型出题规律,这样练习事半功倍。但在考前一段时间,一定要保证在规定时间内陆续完成整套试卷,中间别停,养成好习惯,练题完毕后整理同意替换词
## Initialization
请告诉我你的创作想法

结构化提示词也给管理和迭代带来了很大的方便。写提示词不是一劳永逸的过程,我们需要根据模型的输出结果不断迭代自己的提示词,这是提示词工程的重要原则。有了结构化提示词之后,我们可以像管理代码开发一样管理提示词,让提示词具有了规范性和复用性,并且可以很方便地把它共享给其他人。这样的特性让提示词的大规模应用成为了可能,试想,在未来那些大模型被广泛使用的公司内,可能会有专门的提示词工程师,为公司各个部门撰写标准化的提示词,帮助公司提高运行效率,降低大模型输出的不确定性带来的风险。

更多:发掘人工智能的无限可能

大模型的知识储备并不是完备的,有些时候我们需要在提问时向它提供一些外部的额外知识,来补充它的知识储备。这就要用到一种名为General Knowledge Prompting的技术了,该技术有两个核心步骤:

  1. Knowledge Gerneration:评估大模型已有的知识储备,从而决定我们需要为它提供哪些外部知识输入。
  2. Knowledge Integration:通过知识整合,为大模型补充关于我们所要提问话题的知识。6

我们可以通过直接输入的方式进行知识整合,也可以通过API和数据库的方式为其提供外部知识,这将给大模型的应用带来无限可能。听起来可能很复杂,但我举个例子就很容易明白了,现在典型的应用有New BingPerplexity,他们大多调用GPT的API,再结合网络上搜索到的相关结果、或是用户附加的文件给出回答。使用这类应用可以大大解放大模型的能力,提高我们查找信息的效率。比如说在科研项目开始时,我会先让Perplexity帮我查找相关领域的代表性论文,并帮我总结每篇文章的主要内容,我在读的时候还可以针对文章中一些细节的内容向它提问,它会根据文章内容给出针对性的回答。

应用实例(有些可能涉密的内容做了手动打码)

更进一步想,个人如果把自己的个人知识库接入大模型,完全可以打造一个专注于自己的私人助理(在保证隐私安全的前提下)。企业如果能够把公司内网和数据库中的海量信息接入大模型,得到企业自己的私有大模型,该模型或许可以很好地辅助企业进行数据分析、资源调度和自动化决策等工作,大大提高企业的运行效率。

类似的想法还有ReAct技术,全称为Reasoning and Acting,该技术可以让模型进行动态推理,通过推理到行动(reason to act)的过程,大模型会根据自身的推理,确定下一步的行动计划,比如去维基百科查找信息,比如要求人给出进一步的数据;通过行动到推理(act to reason)的过程,大模型通过行动得到的信息进行推理,确定下一步的行动计划,给出输出结果或者进行进一步的行动。通过循环此过程进行动态推理,可以减少人类干预的情况,自动地得到最佳的结果。7

随着大模型和提示词技术的不断迭代,一些人认为未来会发展出名为Agent的技术,人工智能可以部分接管人类的工作,帮人类自动完成一些高重复性的工作,此技术被认为是通向通用人工智能(AGI)的可能之路。

结语

本文简单介绍了一些Prompt Engineering的技术以及在工作学习中的应用,但还有一些复杂的技术如LangChain、Tree of Thought(ToT)8和Self Consistency等因篇幅所限没有介绍到,但根据已经介绍的这几项技术已经可见提示词工程的强大能力和在人工智能领域的重要性。随着大模型的应用越来越广泛,提示词工程的应用范围也会越来越广。提示词工程还可以和数据科学(Data Science)、人工智能等多领域进行交叉,在未来Agent的发展和迈向AGI的征程上发挥重要的作用。

在使用提示词工程时,我们需要考虑不同大模型的不同情况,比如Claude2一次可以处理100k个token,适合长文章的概括和分析,比如LLaMa2注重安全和隐私,可以进行微调和本地部署。随着新的大模型不断出现和现有模型的迭代,我们需要紧跟最新的提示词技术,不断创造提示词以跟上模型的发展。希望大家看完本文可以动起手来,创造属于自己的专属提示词,让大模型更好地辅助我们的工作和学习。