一名程序员去超市买东西,妻子对他说:去买一个西瓜,如果有包子,买三个。 程序员回来了,扛着三个西瓜。 妻子问:为什么你买了这么多西瓜? 程序员回答:因为有包子。
你可能看过类似这样的笑话,在这个笑话里,程序员按照字面意义执行了妻子的指令(如果有包子,就去买三个西瓜),但是没有把它放在日常生活的上下文中去理解(如果有包子就买三个包子)。
有趣的是我把这个笑话发给ChatGPT,它也认出来了,这是一个笑话。
那么,为什么我会在这里提到这个笑话呢?
是因为ChatGPT是一个通过自然语言输入指令的"程序",无论多么智能,它依然是一个"程序",是程序,就有可能出Bug,所以让它输出更稳定和更贴近我们想要的内容,我们需要尽可能在提示词里,明确我们的需求和问题,把话说明白。
使用明确且具体的指令
第一个原则是:使用明确且具体的指令。
如果你问ChatGPT:"介绍一下北京",那你可能只能得到一个很笼统的回答,但如果你改成"介绍一下北京适合情侣前往的著名景点和当地特色美食",你就会得到相对更加具体的回答。
同样的,如果你想让ChatGPT告诉你一篇文章说了什么,"为以下文章生成一个简短的摘要:[文章内容]"就比"告诉我这是关于什么的?[文章内容]"这样的提示词要更明确和具体。
当你希望得到一个相对简单的回答,你可以对ChatGPT说: "你认为这个方案可行吗?请用‘是’或‘否’回答。”,就会避免ChatGPT生成不确定或模糊答案的可能性。
当ChatGPT没有按照你的意图输出内容时,你就要回顾自己的提示词中有没有因为没有写清楚,或者模糊的描述,导致出现了"误会"。
使用分隔符
分隔符的最大作用,是让ChatGPT能够清晰的知道,哪些是需要执行的"任务",哪些不是需要它处理的东西。
例如,对要翻译的内容用三个引号括起来,这样ChatGPT就知道三引号内的内容是需要翻译的部分。
除了使用两个三引号("""),你也可以使用###,---,甚至类似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. 按照日期整理这些活动为一份行程,用表格输出。
请注意:我对艺术和历史特别感兴趣。