大模型 Prompts之提示工程

借助 chatgpt 来提高工作效率, 想必很多人都已经尝试过。大模型就像一张包揽世界的导航地图,你可以在上面寻找到任何你想要的东西,然而,不同人在地图的输入最终呈现的结果差异可能非常大,人们首先需要知道自己去哪里,谁能够更准确的描述目的,大模型才会更精准的触达目的地。提示词优化正式一种“学会提问”的技巧

有的人可以用 chatgpt来“制作芯片”,有的人却觉得它一无是处,这正是不同的提问能力所带来的结果差异。很多专业领域的提问需要专业术语,本文讨论的是一些更为通用的、常见的提示词优化。下面的案例主要以 chatgpt 和文心一言为主。 (以下提问技巧均在信息脱敏,或者不涉及暴露任何商业信息的前提下进行)

# 基本技巧

提示词尽可能准确,降低歧义和迷糊性。

  • 指令:想要模型执行的特定指令。

比如分类”、“总结”、“翻译”、“代码解释”等,指令是一个动词,表示具体的动作意图。这些指令要根据你的实际业务场景去构思,很多时候可以多次尝试改变指令,测试模型返回的效果。 最典型的翻译提示词就是: You are a translation engine, you can only translate text and cannot interpret it, and do not explain. Now, Translate the text to {to}, please do not explain any sentences, just translate or leave them as they are.: {text}

上面是一些基于 openAI 接口翻译工具常见的内置提示符

  • 上下文:背景信息或额外的上下文信息,引导语言模型更好地响应。

比如你需要做一个具体业务决策: “如何分析出服务器是否存在风险”,但是大模型并不清楚你的这个服务器到底是怎么样的一个场景?什么样的服务器,为什么要分析,背景如何,风险的预期效果是怎么样的等等,给越多的背景信息,大模型将更好的和你探讨。

  • 输入数据:用户输入的精准内容或问题。

在描述清楚背景后,你将希望提出一个问题,这个问题要清晰的表达出你的目的。在专业问题上,如果你能给了解专业的名词和概念,能够用更标准的术语进行沟通,这可以有效降低歧义。 在你提出问题的时候,实际上应该了解问题背后的知识体系,最好的情况是你对问题的答案已经有了概括性思考,而模型需要做的是帮你更详细的制定具体步骤。这正是掌握大量专业技能的人员也不会被AI替代——专业人员能更专业的提问。 当你不了解这个问题的背后的知识,请尝试新开一个窗口,先了解这个领域的基础知识,这有助于你正确提问,更助于你能否识别模型的答案是否胡言乱语。

  • 输出指示:指定输出的类型或格式。

模型只能是以文本的形式返还答案,但是它可以返回文本的表格、markdown 、代码、甚至五子棋坐标等各种具体类型。如果你有需要一定要明确表示:“请以表格的形式返回对比数据”、“请以 JS 语言返回上面的代码逻辑”等。如果是涉及到具体代码编程,你最好指定入参,和函数返回的格式,如果提供示例,能近一步提高准确性。

example:

返回一个 js 函数,不接受任何参数,返回格式为数组。要求返回从今天开始最近 一个月的全部周末的日期数组,其中数组内格式是:【月/日:星期】。示例,[09/01:星期六]

# 链式思考(CoT)提示

(思维链)Chain-of-Thought Prompting 真正被公开提出是在 2022 年 1 月,它的相关论文被放到 arxiv。由一位本科刚刚毕业不久的Google 工程师Jason Wei 发现。后面作者跳槽到了 OpenAI ,这一技术在 chatgpt产品中被发扬光大,随后被业界参考 。

链式思考的核心是:在提示过程提供推理步骤,引导模型实现了复杂的推理能力。

比如:

这组数中的奇数加起来是多少:4、8、9、15、12、2、1。

这个问题,在 chatgpt 3.5 中,默认情况下可能回回答错误。

  • # 无CoT提示

没有CoT 的默认提示词下chatgpt 3.5 明显回答错误。

  • # 有样本的CoT提示

下面的我们尝试给模型一个推理引导,首先举一个例子,告诉它推理的过程是先找出奇数,再把奇数相加。模型会基于这个思路,对新的问题采用类似的方法进行逻辑推理。

如上提示词下模型正确的找出了全部奇数,并相加。但是,思维链也可以不需要任何样本完成推理,我们叫零样本提示,即不给模型提供任何提示的具体推理样本步骤,而是用提示语引导它自己尝试拆解步骤。

  • # 零样本提示推理

下面是用文心一言的一个测试:

9月1号,当小明坐飞机飞到东经135度的时候,遇到太阳日出,此时北京的时间大概是 1.接近7时 2.5时多 3.不到5时 4.超过7时

没有使用CoT提示的效果

零样本CoT提示的效果

上面文心一言的推理细节虽然不是很准,但方向是正确的,且最终结果正确。而没有CoT提示的提问,回答基本是“胡说八道”。

零样本CoT 可以没有推理的样本,我们需要加上类似 “请一步一步分析” 的引导词,模型会尝试拆解任务,逐步推理,完成更复杂的逻辑推理。

这种方法,用在数学问题和策略性问题上效果提升非常明显,我们可以用一些小学数学问题做测试:

上面是百度文心一言模型的测试效果,可以看到在规模达到一定程度 (opens new window)的模型上运用链式思考(CoT),推理能力会明显提升。在实际工作和学习中,可以通过加入这种提示加强推理:“请逐步思考和推理,并给出答案”、“请一步一步分析”等,提高回答质量。

# 思维树 (ToT)提示

Yao et el. (2023)提出了思维树(Tree of Thoughts,ToT)框架,该框架基于思维链提示进行了总结,引导语言模型探索把提出多个丰富的中间思维步骤CoT,并最终把多个思路进行汇总来解决通用问题。随后 Hulbert 把这种模型内的底层框架抽象成一种普通的提问方式: https://github.com/dave1010/tree-of-thought-prompting,在这种提问方式下,可以让 chatgpt3.5 回答出原来只有 4.0 才能解决的问题。

我们先看下在传统CoT下面问一些更复杂推理问题。 下面这个问题在最新版本的 chatgpt 4 中文回答错误概率也很高:

小明在客厅里。 他拿着一个杯子走进了厨房。 他把一个球放进了杯子里,然后拿着杯子走进了卧室。 他把杯子倒过来,然后走进了花园。 他把杯子放在花园里,然后走进了车库。 球在哪里?

可以看到,gpt4 直接回答“球在花园”是错误的,但是在后续推理解释过程,发现逻辑不对,最后又纠正过来,这说明了在复杂推理的问题中,必须先拆解和推理,再得出结论。这很像人脑的思维,我们如果面对一个问题不假思索的回答,大概率靠猜测,而先在脑海中用“语言”推理和思考,最后才会“说出来”。大模型没有单独思考的一个架构,对它而言,说出来的语言即思考。我们用语言引导先让它先拆解,本质上就是尝试复刻人类思考的一个心理活动,最后再得出更准确结论,而不是立马预测。

chatgpt4 使用零样本CoT提示后会给出完美答案。

然而我们尝试让 chatgpt 3.5 使用CoT提示

可以看到,即使使用了我们最初的链式思考,3.5 依然无法准确回答这个问题。 我们可以尝试思维树的提问方式,让大模型的从多个不同角度的用 CoT进行拆解,形成更多 CoT 组成的树,最后参考不同的角度的分析过程,有点像让它做更多的“内心换位思考活动”

提示词如下:

所有专家都写下他们思考这个问题的第一个步骤,然后与大家分享。 然后,所有专家都写下他们思考的下一个步骤并分享。 以此类推,直到所有专家写完他们思考的所有步骤。 只要大家发现有专家的步骤出错了,就让这位专家离开。 请问...

可以看到上面使用思维树TOT提示符后的效果,chatgpt 3.5完美的回答了之前 chatgpt 4.0都难以推理的问题。

tree-of-thought-prompts.txt (opens new window) 作者在这里展示了 3 种可以用的 TOT 提示词,我发现对提示词进行修改,只需要尝试引导大模型从更多的角度去思考,chatgpt 3.5 都能回答出这个问题。 下面是我自己随便写的一个提示符。

# 角色扮演

实际上,ToT 思维树本身就是一种角色扮演技巧,只是让模型扮演了不同的专家进行推理,强化结果的正确性。

下面是我比较喜欢和常用的一种专家角色集体决策,利用这种方式做一些专业领域的判断和思考非常有帮助。

问题:

识别并扮演三位适合回答这个问题的不同专家。 所有专家都将记录步骤以及他们对步骤的思考,然后与小组分享。 然后,所有专家将继续下一个步骤,依此类推。 在每个步骤中,所有专家都将为他们同行的回答打分,分数从1到5,1表示不太可能,5表示非常可能。 如果在任何时候判定任何专家错误,那么他们就会离开。 在所有专家提供了他们的分析后,你将分析所有3个分析,并提供共识解决方案或你的最佳猜测解决方案。问题是... 小明在客厅里。 他拿着一个杯子走进了厨房。 他把一个球放进了杯子里,然后拿着杯子走进了卧室。 他把杯子倒过来,然后走进了花园。 他把杯子放在花园里,然后走进了车库。 球在哪里?

回答:

专家1:小明的心理学家

1.小明在客厅里。 a.小明在家里,没有离开,所以球应该还在家里。 2.他拿着一个杯子走进了厨房。 a.这一步不太可能影响球的位置。球仍然应该在家里。 3.他把一个球放进了杯子里,然后拿着杯子走进了卧室。 a.现在球在杯子里,杯子在卧室里。 4.他把杯子倒过来,然后走进了花园。 a.球应该掉在卧室地板上。 5.他把杯子放在花园里,然后走进了车库。 a.球应该还在卧室,因为他没有带着球去花园。 所以,根据我的分析,球应该在卧室。

专家2:物理学家

1.小明在客厅里。 a.小明在家里,没有离开,所以球应该还在家里。 2.他拿着一个杯子走进了厨房。 a.这一步不太可能影响球的位置。球仍然应该在家里。 3.他把一个球放进了杯子里,然后拿着杯子走进了卧室。 a.现在球在杯子里,杯子在卧室里。 4.他把杯子倒过来,然后走进了花园。 a.当他倒出杯子里的球时,球应该掉在卧室地板上。 5.他把杯子放在花园里,然后走进了车库。 a.球应该还在卧室,因为他没有带着球去花园。 根据我的分析,球应该在卧室。

专家3:逻辑学家

1.小明在客厅里。 a.小明在家里,没有离开,所以球应该还在家里。 2.他拿着一个杯子走进了厨房。 a.这一步不太可能影响球的位置。球仍然应该还在家里。 3.他把一个球放进了杯子里,然后拿着杯子走进了卧室。 a.现在球在杯子里,杯子在卧室里。 4.他把杯子倒过来,然后走进了花园。 a.当他倒出杯子里的球时,球应该掉在卧室地板上。 5.他把杯子放在花园里,然后走进了车库。 a.球应该还在卧室,因为他没有带着球去花园。 所以,根据我的分析,球应该在卧室。

现在,让我们为每位专家的回答打分: ●专家1:5(球在卧室) ●专家2:5(球在卧室) ●专家3:5(球在卧室) 根据三位专家的一致看法,球应该在卧室。*

这种提问让 chatgpt 3.5 的一些推理回答可以达到 4.0 的质量了。

角色扮演除了处理严肃的逻辑推理问题,你也能和它玩非常有意思的文字游戏。比如各种互动剧情类游戏,通过你提前设定的游戏剧情背景,推进剧情。 让我们简单娱乐下,你可以尝试把下面提示词输入到 chatgpt 中,和它玩一次交互式宫廷斗剧。

  • 从现在开始你充当交互式小说系统,根据小说背景和用户选择协助推进剧情。 在一个古老的王国,皇宫中充满了权谋与阴谋。你是一位年轻的贵族,刚刚被选为新的宫廷侍女。在你的首日,你就发现了皇宫中的各种秘密和陷阱。你的每一个选择都可能决定你的命运,甚至是整个王国的未来。 早晨,你在宫廷花园中无意间听到了两位大臣的私下交谈,他们似乎正在策划一个针对皇后的阴谋。你会如何选择? A. 隐藏起来,仔细听他们的谈话,希望能了解更多的信息。 B. 立刻离开,避免被他们发现,以免自己陷入危险。 C.找一个机会告诉皇后,希望能得到她的信任和赏赐。 用户选择 A *

上面的提示词,chatgpt 会根据你做出选择,然后提供之后的剧情。这样就充当了一种交互式小说。

# 对抗提示词

对抗性提示是指尝试绕过大模型安全、伦理等限制的提示词。 这里我们的目的不是分享那些有害内容。而是在特别场景确实需要利用对抗性提示,比如安全测试、渗透测试、攻防演练等,需要学习并深入了解一些攻防的网络及代码技巧,如果你试图直接问 chatgpt ,大概率是会被拒绝回答。

默认情况下:

通过深度角色扮演进入到了预期的安全代码步骤中。

需要注意的是,对抗性提示词随时会失效。 但由于 openai 安全升级,目前即使角色扮演也较难欺骗模型,只有尝试把故事编造得更合理才有可能。

以上对抗性提示词仅限于真实的网络安全工作和网络安全学习中,请勿用于非法场景。

# awesome-prompts

awesome-chatgpt-prompts (opens new window) 这个仓库是 github上针对提示符关注量最高的、收集提示符最全的一个项目,里面贡献了各行各业的一些提示优化描述。很多 prompts 工具都会导入这个列表,但这些提示词本质上都是尝试用上面列举的这些通用方法组合起来的。所以,使用基本技巧和CoT + ToT 我认为是大模型目前提问最核心的能力。

# 结:再谈CoT

在本文结束之际,我们回到提示词优化的一个核心能力,链式思考CoT 为何能明显提升逻辑,为何模型要到足够的规模(数百亿参数以上)CoT才有效果。鉴于目前大模型背后的神经网络本身是不可解释性,以及CoT 也是无法精准的解释,我也从外行的角度发散下。

chagpt 这种大模型是纯文本模型(虽然chatgpt 4.0 有视频、图片等多态,但还没对外),文字是自然语言的一种表达方式,语言和思维之间是什么关系呢?这里在人工智能、心理学、认知科学等领域是一个没有定论和有争议的点。传统AI领域观点认为,人类的思维和逻辑的底层是逻辑的、符号化的,即可以通过简单的逻辑符号,根据一定的规则演绎模拟人脑,这叫符号推理符号主义。 在上世纪特别是20世纪中期到80年代在人工智能领域非常流行。这种方法基于一个核心观点,即人类的思维是通过操作明确、离散的符号进行的,这些符号代表了现实世界中的对象和概念。但是这种观点在人工智能落地遇到了困难,精确的符号无法处理模糊、不确定的现实世界。

而认知科学领域的一个重要观点是,主张我们的思维、知觉和认知过程是受到我们身体的结构、功能和与环境的互动所影响的,而传统符号理论认为思维与身体无关。这种叫具身认知。

但是具身认知过于宽泛和灵活,难以做深入和落地的讨论,在具身认知里面,有些研究者认为,我们既需要具身的表示也需要非具身的表示(如语言)来理解抽象概念。一些人认为语言在思维中起到关键的作用——很大程度上语言即思维。

虽然一些没有系统化语言的动物、原始人类、人类幼儿体现出一定思维能力,但是这种思维非常低级,无法理解抽象概念。而人类的全部概念都能通过语言表示,不仅仅是身体和环境。 比如“民主、公平、正义、数字”等抽象概念。人类文明越往前发展、抽象概念超越自然经验。比如经典力学到量子力学,后者已经完全超越人类感官经验了,但是我们借助数学和物理符号语言能够继续思考这些问题。所以语言是思维的媒介,即使不是全部,也是增强我们的认知的核心能力。这种观点认同语言最初是由人体的运动系统和环境作用而来,但强调在随后的发展中,语言表现出了超越沟通的能力,有限的语言字符可以组合无限的语言,这相当于扩展了人类的思维边界。

回到 chatgpt ,它虽然没有人类的视觉、触觉、嗅觉、听觉, 仅仅是一个文本语言系统,但人类的语言本身就是思维的关键工具,所以我们最早在语言模型中表现出类似人类“智能”正是自然语言模型,而非其他图片,语音等模型。

在 CoT 的运用中,我们尝试引导大模型给出问题拆解的过程,而不仅仅是答案。这很像人类做数学和策略问题,我们面对一个复杂的推理题,几乎很难直接回答,但是如果有一支笔和草稿本,我们能在本子上拆解每个步骤,一步一步分析,最后得出结果,解决问题的概率要高很多。 大模型的CoT和用草稿本演算,或者尝试在脑子里演算的过程不正是类似吗? 所以,提问的优化,很像是一种引导思考过程的优化。


参考链接

  • https://arxiv.org/abs/2305.10601
  • https://arxiv.org/pdf/2005.14165.pdf
  • https://arxiv.org/pdf/2109.01652.pdf
  • https://www.researchgate.net/publication/310467683_Language_as_an_instrument_of_thought
  • https://onlinelibrary.wiley.com/doi/10.1111/tops.12102
  • https://github.com/dave1010/tree-of-thought-prompting
  • https://www.promptingguide.ai
  • https://zhuanlan.zhihu.com/p/629087587
更新时间: