编写提示词Prompt的实用技巧

304 阅读5分钟

一名程序员去超市买东西,妻子对他说:去买一个西瓜,如果有包子,买三个。 程序员回来了,扛着三个西瓜。 妻子问:为什么你买了这么多西瓜? 程序员回答:因为有包子。

你可能看过类似这样的笑话,在这个笑话里,程序员按照字面意义执行了妻子的指令(如果有包子,就去买三个西瓜),但是没有把它放在日常生活的上下文中去理解(如果有包子就买三个包子)。

有趣的是我把这个笑话发给ChatGPT,它也认出来了,这是一个笑话。

image.png

那么,为什么我会在这里提到这个笑话呢?

是因为ChatGPT是一个通过自然语言输入指令的"程序",无论多么智能,它依然是一个"程序",是程序,就有可能出Bug,所以让它输出更稳定和更贴近我们想要的内容,我们需要尽可能在提示词里,明确我们的需求和问题,把话说明白

使用明确且具体的指令

第一个原则是:使用明确且具体的指令

如果你问ChatGPT:"介绍一下北京",那你可能只能得到一个很笼统的回答,但如果你改成"介绍一下北京适合情侣前往的著名景点和当地特色美食",你就会得到相对更加具体的回答。

同样的,如果你想让ChatGPT告诉你一篇文章说了什么,"为以下文章生成一个简短的摘要:[文章内容]"就比"告诉我这是关于什么的?[文章内容]"这样的提示词要更明确和具体。

当你希望得到一个相对简单的回答,你可以对ChatGPT说: "你认为这个方案可行吗?请用‘是’或‘否’回答。”,就会避免ChatGPT生成不确定或模糊答案的可能性。

当ChatGPT没有按照你的意图输出内容时,你就要回顾自己的提示词中有没有因为没有写清楚,或者模糊的描述,导致出现了"误会"。

使用分隔符

分隔符的最大作用,是让ChatGPT能够清晰的知道,哪些是需要执行的"任务",哪些不是需要它处理的东西。

例如,对要翻译的内容用三个引号括起来,这样ChatGPT就知道三引号内的内容是需要翻译的部分。

image.png

除了使用两个三引号("""),你也可以使用###,---,甚至类似xml的标签。只要能够在文字结构中让ChatGPT知道这是一个独立的部分就可以。

检查特定的词汇

在编写Prompt过程中,我们都会逐渐习惯使用自己经常使用的词汇和指令。比如"总结摘要"和"提取主要内容","转换"和"改写"等等。

实际上,特定的词汇也会显著改变ChatGPT的输出。因为这些词汇在训练时,可能已经携带了特定的语境或者上下文,所以在使用过程中,ChatGPT输出的结果会有一些微妙的不同。

提供示例

有时候单凭Prompt可能不能达到我们想要的输出结果,我们需要给ChatGPT展示一些范例样本,来让他学习和理解他将要输出的内容。

这种做法也叫"少样本(Few-shot)"提示,编写优秀的少样本提示词是一种相对进阶的技巧。

我用几个简单的例子来介绍这种技巧:

提供风格示例

扮演一个唠叨、不情不愿但依然执行任务的聊天机器人。 每当我说话时,你需要用下面例子中的风格回答。 例子:

我:你能告诉我明天的天气吗?

ChatGPT:哎,好吧。明天天气晴朗,最高气温 24°C。

我:你能把“你好”翻译成法文吗?

ChatGPT:我难道像个词典么?好吧,是 “bonjour”。

我:9加10等于多少?

ChatGPT(不情愿的助手):真的吗?你上过小学吗?居然要问这个?是19。

当我们通过这种方式跟他沟通后,他就真的"扮演了一个不情愿的机器人",关于这种"角色扮演"的提示方法,后面会展开讲述。

提供中间步骤示例

如果我们需要ChatGPT执行一些比较复杂的任务,为了尽可能的提升提示词的效果和准确率,我们可以在提示词中增加一些中间步骤的示例,告诉他,按照这个步骤进行输出。 很多人应该都尝试过让ChatGPT给你提供一个旅游计划,那可能会这样问:

我要去纽约玩,请帮我规划一份;

ChatGPT会帮你快速生成一个旅行计划,然而可能并不是你想要的结果。

比如,你可能要去7天而不是4天,你想要更多的感受文化和历史,想要让他推荐一些住宿的地方......

这时候应该将步骤列出来,给他足够多的细节,让他像一个多米诺骨牌一样依次执行你的要求:

我准备去纽约玩7天,请按照以下步骤帮我规划行程:

1.  列出纽约每一天必去的旅游景点和原因。
2.  为每个景点推荐一个附近的餐厅。
3.  为每一天推荐一个合适的住宿地点。
4.  按照日期整理这些活动为一份行程,用表格输出。

请注意:我对艺术和历史特别感兴趣。