一名程序员去超市买东西,妻子对他说:去买一个西瓜,如果有包子,买三个。程序员回来了,扛着三个西瓜。妻子问:为什么你买了这么多西瓜?程序员回答:因为有包子。
在这个笑话里,程序员按照字面意义执行了妻子的指令,但是没有把它放在日常生活的上下文中去理解。有趣的是,这个笑话也常被用来解释大模型的行为逻辑。
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 天,请按照以下步骤帮我规划行程:
列出纽约每一天必去的旅游景点和原因。
为每个景点推荐一个附近的餐厅。
为每一天推荐一个合适的住宿地点。
按照日期整理这些活动为一份行程,用表格输出。
请注意:我对艺术和历史特别感兴趣。


