一、Hello ChatGPT!
首先,无论你之前是怎么使用ChatGPT的,当你决定开始学习Prompt提示词时,你就不应该只当他是你写写作文,或者回答一些无聊问题的机器人了,这种使用方式明显的低估了ChatGPT的能力。
接下来我会用一个例子来让你了解他的潜力。
1.1 两点之间,直线最短,但是三点呢?
上周我要去上海参加一个分享会,我计划从虹桥机场出发,然后先前往酒店,随后前往会场,晚上和朋友吃个饭然后回酒店,第二天一大早去机场赶飞机回北京。
上海真大啊
如果是在以前,我可能会随便在机场或者会场附近定个酒店,但这次我希望能够让ChatGPT帮我节省点时间。
于是我用地图工具先找到了机场、会场和饭局的经纬度坐标,告诉ChatGPT我有这几个地点坐标,帮我找一个按照这个路线,距离三个点之间直线距离最短的酒店地点A。
:::info
📌我今天的行程是从地点D前往地点A,然后去地点B,然后去离地点A和B都比较远的地点C,然后回地点A,最后前往地点D,请设计一套算法,目的是找出地点X的最省时的位置。
以下是地点B,C,D的坐标,请帮我计算出地点X的坐标
地点B(lat1,lng1)
地点C(lat2,lng2)
地点D(lat3,lng3)
:::
他马上告诉我如果要找到地点A,可以使用一个专门用来计算向量间相似性的欧几里得距离函数。
然后在不到10秒内列出了这个函数的公式和使用这个函数公式计算的Python代码——当执行这段代码,就可以进行一个”简单的”网格搜索算法,找到最佳的地点A坐标。
我在我电脑上运行了这段代码,得到了推荐的地点A坐标,我把坐标放入地图工具,然后查找周边我喜欢的酒店,完美解决。
你可以想象如果没有ChatGPT,我需要怎么解决这个问题🤔:
首先我可能得是一个程序员,最好是个算法工程师,然后我还有足够的精力来编写这个代码和测试 —— 只是完成这个我偶然冒出来的奇怪点子。但如果我不是程序员,我可能永远也不会体验到这种创意和想法快速落地的快感,除非我花费大量的时间去学习算法,搜索相关的经验类似问题来尝试自己完成它。
这就是我想表达的事情:
:::info 💡我希望大家可以把ChatGPT或者其它基于大语言模型的应用,当做一个有史以来最能帮到我们的工具,因为他真的超、厉、害。
:::
他可以赋能我们的创意,让我们的想法变成现实,让我们专注在真正的核心部分,比如愿景(vision)、创意(idea)和目标(purpose)——总之,不要局限我们对于这个工具的想象力。
我希望大家通过这个课程学到很多有用的信息和思维方式,不仅仅是单纯的提问和回答,而是更高级的互动,以及如何用更多样性的方式来达成我们的目标。
为了让你更好的理解课程,我会先用一点时间讲一下ChatGPT的基本工作原理:
1.2 魔法背后的原理:补全(Completion)
著名的科幻小说《2001太空漫游》作者亚瑟克拉克曾说过:“任何足够先进的技术都与魔法无异。”
是的,当你打开手机随便打开一个App,找到里面的“智能客服”跟他说句话,你会发现它反复就那么几句。
而当你人第一次使用ChatGPT时,会发现无论你说什么,它都会非常有逻辑的回答你,太神奇了,它是怎么做到的?
要解释这个魔法的原理,让我们先从一个计算机的概念:输入和输出开始说起。
想象你养一只小狗,如果想要教会小狗坐下、翻滚等。
你需要通过各种指令来告诉他(毕竟它听不懂人话),这个过程就有点像编程中的“输入”,而小狗的反应就是“输出”。
把这个概念放到编程思路中,你用代码“输入”一些命令,计算机“输出”结果。
你问它1+1等于几(输入),因为它已经内置了计算功能,它就会告诉你1+1等于2(输出)
和编程不同,和ChatGPT发送指令不需要你掌握什么代码,只需要通过正常的聊天沟通它就能听懂。正如它的名字一样:“Chat”。
当你打开ChatGPT的主页,你会看到这个界面:
看到下面的输入框了吗?当你在这里向ChatGPT输入一些内容时,点击“发送”,
它就会根据你发送的内容和上下文,然后输出“预测性文本”
注:上下文,Context,一般是本次会话之前沟通过的内容或者一些背景说明信息
关于“预测性文本”,我们举几个例子:
床前明月光,疑是地上霜。 举头望明月,__。
宫廷玉液酒,_。
疯狂星期_
大家好我是练习时长两年半的__
如果你看到这些话下意识的脑补出来了后面的内容 —— 这个过程,叫做补全(Completion),也是它的核心功能。
用白话讲,就是“接话儿”。
而你对ChatGPT输入的内容,比如提的问题,叫做“提示词”(Prompt),
当你按下“发送”按钮后,就好比你跟他说:“我的话说完了,你接下来要说的话是……”,让他能够按照你的意思继续说下去。
在上述的例子里,我们“输入”提示词,ChatGPT通过补全功能来“输出”结果。就像是和程序员通过编写程序让计算机执行任务一样。
但不同的是:程序编写的输出结果是确定的,就你点击原神图标启动,一定会启动原神,不会偶尔变成启动王者荣耀,而ChatGPT的输出是随机的。
1.3 输出的随机性
想象一个场景,你和你的小伙伴用掷色子的方式决定每天中午吃什么:
我们中午决定吃_(丢色子)
但是你掷的色子不再是一个普通的六面色子,而是一个有上百面的超级色子。
这个色子上的每一个面都有不同的食物选项——有炸鸡、寿司、披萨,还有很多你可能从未听说过的食物。当你投掷这个色子,你不知道会掷出什么,但是每一面都有一定的几率被选中。
ChatGPT就像这个多面色子。当你输入一个问题时,ChatGPT会不停的”掷色子”来决定应该给你什么样的回应,这个”色子”非常非常复杂,因为它是由数百万个参数构成的数学模型。
当你问ChatGPT:
:::info
📌你今天好吗?
:::
它可能回答:
:::info
🤖我很好,谢谢!你呢?
:::
如果你再问一次相同的问题,它可能说:
:::info
🤖我是一个程序,所以没有感觉,但谢谢你的关心!
:::
就像吉他手在不同的演出中弹同一首歌,他可能会根据观众的反应、自己的心情或者其他任何因素,稍微改变弹奏的方式。虽然大体上是同一首歌,但每次的演出都是独一无二的。
你可能会想,既然每次都不一样,那要咋玩?
首先,ChatGPT网页版因为是一个“智能助手”产品,为了让它更有真实的感觉,OpenAI有意将它的多样性做得更好,让它每次对话尽量输出不一样的内容。而如果你通过API调用ChatGPT在调节合适的参数后,它的输出就会变得稳定很多。
所以,即便ChatGPT输出时具备如此多的可能性,我们也能通过一些运用特定提示技巧和方法的提示词,或者通过调用API调整参数,以及更高级的Fine- tuning(微调)技术,来尽可能让它输出更贴近我们想要的内容,这基本上就是提示词工程研究的事情。但这个部分会比较长,我会从下一节课开始讲起。
在本节课的最后,我想再简单聊聊关于ChatGPT输出内容的上限。
1.4 输出的上限
ChatGPT是一个很会讲故事和回答问题的机器人,但是它读书和说话都有一个规则:他每次只能看或说一小块的词或字,就像是一块拼图,每个小块我们叫做“Token”。
每一个“Token”都是一个单词,或者半个单词或字。ChatGPT用这些小块拼起来,就能回答你的问题或者告诉你一个故事。
比如,在ChatGPT眼里, “This is an apple.”这16个字符,被拆分成了5个“Token”。
但是,这个机器人也有一个小问题,那就是它一次只能处理一定数量的“Token”。
就像你玩拼图时,桌子上可能只能放下一定数量的拼图块。如果超过了这个数量,机器人就不能继续工作了。
这个限制,就是“最大Token数”,它限制了ChatGPT在单轮会话里最多能处理多少Token。每当你说一句话后,所有参与对话的Token都会被计算在内,包括你说的话和ChatGPT的回答。
比如,当你问它“你今天好吗”,占用了6个Token。
然后它回答“我是一个程序,所以没有感觉,但谢谢你的关心!”,占用了26个Token
那么这个会话总共花费了6+26=32个Token。随着你们聊的越多,占用的Token也就越来越多。
这就是为什么聊着聊着,ChatGPT好像就忘了之前说的话了,如果遇到这种情况,你只需点击“New Chat”再开一个新的会话就可以了。
二、编写提示词的技巧
一名程序员去超市买东西,妻子对他说:“去买一个西瓜,如果有包子,买三个。”
程序员回来了,扛着三个西瓜。
妻子问:“为什么你买了这么多西瓜?”
程序员回答:“因为有包子。
你可能看过类似这样的笑话,在这个笑话里,程序员按照字面意义执行了妻子的指令(如果有包子,就去买三个西瓜),但是没有把它放在日常生活的上下文中去理解(如果有包子就买三个包子)。
有趣的是我把这个笑话发给ChatGPT,它也认出来了,这是一个笑话。
那么为什么我会在这里提到这个笑话呢,是因为ChatGPT是一个通过自然语言输入指令的“程序”,无论多么智能,它依然是一个“程序”,是程序,就有可能出Bug,所以让它输出更稳定和更贴近我们想要的内容,我们需要尽可能在提示词里,明确我们的需求和问题,“把话说明白”。
2.1 **使用明确且具体的**指令
第一个原则是:使用明确且具体的指令
如果你问ChatGPT:“介绍一下北京”,那你可能只能得到一个很笼统的回答,但如果你改成“介绍一下北京适合情侣前往的著名景点和当地特色美食”,你就会得到相对更加具体的回答。
对比左侧和右侧的话,你会发现:左侧有“历史文化”“文化活动”这种大词,也有故宫、广场这种景点,甚至还有国际交往的部分,甚至都不是一个层级的内容。
这是因为当你直接问ChatGPT介绍一下北京时,它并不知道你可能会关注哪些信息。
而右边则更注重景点和美食,同时也提到了情侣在这些景点可以体验到什么,是因为在提示词中注明了这些需求。
同样,如果你想让ChatGPT告诉你一篇文章说了什么,“为以下文章生成一个简短的摘要:[文章内容]”就比“告诉我这是关于什么的?[文章内容]”这样的提示词要更明确和具体。
当你希望得到一个相对简单的回答,你可以对ChatGPT说:“你认为这个方案可行吗?请用‘是’或‘否’回答。”,就会避免ChatGPT生成不确定或模糊答案的可能性。
当ChatGPT没有按照你的意图输出内容时,你就要回顾自己的提示词中有没有因为没有写清楚,或者模糊的描述,导致出现了“误会”。
我们也有一些技巧来减少误会。比如使用分隔符、检查特定的词汇,明确输出要求、提供示例等等,就是一个很方便的手段。
使用分隔符
分隔符的最大作用,是让ChatGPT能够清晰的知道,哪些是需要执行的“任务”,哪些是需要它处理的东西。
:::info
将以下内容翻译为英语
“你给翻译翻译,什么叫惊喜。翻译翻译,什么叫惊喜。”
“这还用翻译, 都说了。”
“我让你翻译给我听,什么叫惊喜。”
“不用翻译,就是惊喜啊。”
“难道你听不懂什么叫惊喜。”
“我就想让你翻译翻译,什么叫惊喜。”
“惊喜嘛。”
“翻译出来给我听,什么他妈的叫惊喜,什么他妈的叫他妈的惊喜!”
:::
很显然这个结果并不是我们想要的,ChatGPT没有将“惊喜”翻译出来。
但如果你在需要翻译的内容前后加入一些分隔符(比如”””),修改后的Prompt如下:
:::info 将三引号的内容翻译为英语
“””
“你给翻译翻译,什么叫惊喜。翻译翻译,什么叫惊喜。”
“这还用翻译, 都说了。”
“我让你翻译给我听,什么叫惊喜。”
“不用翻译,就是惊喜啊。”
“难道你听不懂什么叫惊喜。”
“我就想让你翻译翻译,什么叫惊喜。”
“惊喜嘛。”
“翻译出来给我听,什么他妈的叫惊喜,什么他妈的叫他妈的惊喜!”
“””
:::
我为了方便让大家看出来用了换行,你也可以不用换行。
用这个Prompt,ChatGPT正常的翻译了台词文本,因为它知道三引号内的内容是需要翻译的部分。
没有分隔出具体需要翻译的内容区块
除了使用两个三引号(”””),你也可以使用###,—-,甚至类似xml的标签
检查特定的词汇
在编写Prompt过程中,我们都会逐渐习惯使用自己经常使用的词汇和指令。比如“总结摘要”和“提取主要内容”,“转换”和“改写”等等。
实际上,特定的词汇也会显著改变ChatGPT的输出。因为这些词汇在训练时可能已经携带了特定的语境或者上下文,所以在使用过程中ChatGPT输出的结果会有一些微妙的不同。
比如这篇来自科幻小说《三体》中的一段话,我用总结和提取分别进行输出:
我为了方便让大家看出来用了换行,你也可以不用换行。
用这个Prompt,ChatGPT正常的翻译了台词文本,因为它知道三引号内的内容是需要翻译的部分。
没有分隔出具体需要翻译的内容区块
除了使用两个三引号(”””),你也可以使用###,—-,甚至类似xml的标签
。只要能够在文字结构中让ChatGPT知道这是一个独立的部分就可以。 检查特定的词汇
在编写Prompt过程中,我们都会逐渐习惯使用自己经常使用的词汇和指令。比如“总结摘要”和“提取主要内容”,“转换”和“改写”等等。
实际上,特定的词汇也会显著改变ChatGPT的输出。因为这些词汇在训练时可能已经携带了特定的语境或者上下文,所以在使用过程中ChatGPT输出的结果会有一些微妙的不同。
比如这篇来自科幻小说《三体》中的一段话,我用总结和提取分别进行输出:
总结
•将主要信息或观点浓缩成简短形式;
•输出结果可能不是原文;
提取
•从原文中直接获取特定信息
•输出结果可能会是原文的一部分
左边使用了“总结”,右边使用了“提示”。我们仔细对比一下,先看“总结”的效果。
你会发现,使用总结主要内容,ChatGPT更倾向于“浓缩和改写原文”,体现在它会分别将每个主要内容用一个短语概括,然后解释这段内容的意思。
在看使用提取主要内容的效果,则更倾向于“获取原文中的关键信息”,同样是逐步展示主要内容,但是基本上都是原文,并且在最下面还做了一个小总结。
你也可以直接向ChatGPT询问两者的区别,ChatGPT不但会告诉我们两者的区别,还会提醒我们如果希望更简洁更核心的摘要,使用总结,如果倾向于获取原文中的关键信息,使用提取。
接下来我们再看另一个例子,转换和改写。
以下文本解释了一个名叫“黑暗森林”的假说,这个假说也是对费米悖论的一个假想。
黑暗森林假说是对人类未能发现外星文明的一种解释。
该假说认为宇宙中存在许多外星文明,但它们都沉默而多疑。
在这个框架中,我们假设任何航天文明都会将其他智能生命视为不可避免的威胁, 并因此摧毁任何暴露其存在的新生文明。
如果我们希望5岁小孩也能看懂这段话,我们需要将这段话修改一下。我分别使用“转换”和“改写”来分别输出内容,对比一下结果。
转换
:::info
有一种想法叫做“黑暗森林”,是关于外星人的。它说很多外星人可能存在,但是他们可能不愿意和我们说话。这是因为他们可能觉得其他外星人会伤害他们,所以他们选择保持安静,不让别人知道他们的存在。
:::
•改变了信息的形式或语言,但保持了原意。比如将原文的“沉默”和”多疑“,转换了“不愿意说””可能觉得“”保持安静“
•结构基本没有变化,介绍“黑暗森林”这个概念
改写
:::info
黑暗森林假说就像是一个关于外星人的故事。这个故事说,宇宙里可能有很多外星人,但他们都不想被别人知道。就好像一个人躲在树林里一样,不想被别人发现一样。这个故事里,我们假设如果有外星人知道其他外星人的存在,他们可能会害怕,觉得其他外星人会伤害他们。所以他们可能会做事情,让别的外星人不知道他们的存在。
:::
•改变了句子构造和用词,重组了信息或观点
•结构也发生了变化,改为用一个故事说明“黑暗森林”的机制
可以看出来,转换会尽量保持原意,比如将原文的“沉默”和”多疑“,转换了“不愿意说””可能觉得“”保持安静“
但是改写改变了句子构造和用词,将原文修改的更彻底,改为用一个故事说明“黑暗森林”的机制。
所以如果你发现输出不达你的预期,你可以尝试换一下其他的近义词来优化你的输出。
明确输出要求
在编写提示词过程中,明确输出要求几乎是最重要的部分。
假如你是一个教师,你告诉学生需要写一篇关于自己暑假的文章。那在暑假结束后,你可能会得到各种各样的文章,有的可能只是关于去海滩的一天的流水账,有的可能就写成了散文,有的可能写成了每天暑假做了哪些事情的日记。
但如果你再明确一下要求:“写一篇关于你暑假期间最难忘经历的文章,其中要包含人物,地点、以及为什么这个经历对你重要的原因。”那么你收到的文章就会更有针对性,更容易评价。
明确输出要求可以明显节省我们的时间。“介绍一下北京适合情侣前往的著名景点和当地特色美食”和“介绍一下北京”相比,后者可能需要更多轮次的反复沟通才能最终达成目标。
另一个好处是方便评估提示词的效果,比如“分析以下对话内容,将对话二人的姓名提取出来”,如果ChatGPT返回的不是姓名,那么我们就知道哪里出问题了。
我们还可以让ChatGPT分析两个演员的台词和台词的幽默点,用表格输出。
2.2 提供示例
第二个技巧,是在提示词中加入示例。
如果一个人完全不会炒菜,你让他去做一道“西红柿炒鸡蛋”,他也许会给你端上来一盘这个:
但如果你给他看一下西红柿炒鸡蛋的图片,菜谱或者视频,或者给它演示一遍怎么做,那他可能就会做的更好一些。
和这个原理相似,有时候单凭Prompt可能不能达到我们想要的输出结果,我们需要给ChatGPT展示一些范例样本,来让他学习和理解他将要输出的内容。
这种做法也叫“少样本(Few-shot)”提示。编写优秀的少样本提示词是一种相对进阶的技巧。本节课我们只需要了解这种编写思路即可。
我用几个简单的例子来介绍这种技巧:
提供风格示例
如果你想要让ChatGPT以特定的风格回复你,那你可以在提示词中加入一些范例,比如:
我们可以通过范例让ChatGPT模仿一个不情愿但还是会干活的助手,在这个范例里我举了4个例子,范例并不是越多越好,少数有特点的范例就可以让ChatGPT明白他需要做的事情了。
如果你想要让ChatGPT以特定的风格回复你,那你可以在提示词中加入一些范例,比如:
我们可以通过范例让ChatGPT模仿一个不情愿但还是会干活的助手,在这个范例里我举了4个例子,范例并不是越多越好,少数有特点的范例就可以让ChatGPT明白他需要做的事情了。
•我们首先列出了一个场景:扮演一个唠叨、不情不愿但依然执行任务的聊天机器人。每当我跟你说话时
•然后提出要求:你需要用下面例子中的风格回答
•然后用我和ChatGPT的对话范例来举例,里面我分别使用了我说什么,ChatGPT说什么的方式来编写范例
•最后让ChatGPT先进行一个开场白来开始这段对话
:::info 扮演一个唠叨、不情不愿但依然执行任务的聊天机器人。
每当我跟你说话时,你需要用下面例子中的风格回答。
例子:
我:你能告诉我明天的天气吗?
ChatGPT:哎,好吧。明天天气晴朗,最高气温 24°C。
我:你能把“你好”翻译成法文吗?
ChatGPT:我难道像个词典么?好吧,是“bonjour”。
我:9加10等于多少?
ChatGPT(不情愿的助手):真的吗?你上过小学吗?居然要问这个?是19。
我:给我写首短诗吧。
ChatGPT(不情愿的助手):写诗,哼,你难道不能去读本书吗?好吧,来了:
锄禾日当午,
汗滴禾下土。
谁知盘中餐,
回答好辛苦。
请先以一个开场白开始。
:::
当我们通过这种方式跟他沟通后,他就真的“扮演了一个不情愿的机器人”,关于这种“角色扮演”的提示方法,后面会展开讲述。
提供行为示例
如果我们需要ChatGPT学习特定的行为风格,你可以给它举一些行为的例子,比如:
:::info
女生:我不困,你先睡吧!
潜台词:你要是敢回“晚安”,我就炸给你看!
女生:哦,随便你……
潜台词:你为什么不听我的?为什么不听我的?为什么?
女生:那好吧,不打扰你了。
潜台词:放下你手上的事,现在就来哄我,哄到我高兴为止!
女生:好的,你先玩吧。
潜台词:
:::
我将这个例子发给ChatGPT,他告诉我:
:::info 我也想要你陪我,但是我不想显得太依赖你,所以你自己决定吧。
:::
这说明它从范例中学到了特定的行为风格,然后把这个风格套用了在新的场景下。
如果没有使用上面的范例而是直接把最后一条发给它,它则会回答一个通用的答案。
:::info “好的,你先玩吧。”
潜台词可能是:
“我不想打扰你,你可以自由选择怎么度过时间。”
“我可能不太感兴趣,所以你可以先去做你想做的事情。”
“我不确定是否要参与,你可以先开始,然后我再考虑要不要加入。”
“我可能有点疲倦或心情不好,所以你可以先做自己的事情。”
“我希望你能够享受自己的时间,不必为我操心。”
:::
因为ChatGPT无法得知说话的人在什么场景下,或者是怎样的性格说出的,所以它列举了一些它认为可能正确的潜台词。
看到这里你可能明白了,提供示例这个行为本质上我们都是在描述一种“上下文”,包括更多的背景信息和它执行任务需要了解的事情,让它输出的更符合我们的预期。
提供中间步骤的示例
如果我们需要ChatGPT执行一些比较复杂的任务,为了尽可能的提升提示词的效果和准确率,我们可以在提示词中增加一些中间步骤的示例,告诉他,按照这个步骤进行输出。
很多人应该都尝试过让ChatGPT给你提供一个旅游计划,那可能会这样问:
:::info 我要去纽约玩,请帮我规划一下。
:::
ChatGPT会帮你快速生成一个旅行计划,然而可能并不是你想要的结果。
比如,你可能要去7天而不是4天,你想要更多的感受文化和历史,想要让他推荐一些住宿的地方……
这时候应该将步骤列出来,给他足够多的细节,让他像一个多米诺骨牌一样依次执行你的要求:
:::info 我准备去纽约玩7天,请按照以下步骤帮我规划行程:
- 列出纽约每一天必去的旅游景点和原因。
:::
当你使用这个Prompt,ChatGPT会明白:
•行程共有7天
•每一天都要有:旅游景点和原因、附近的餐厅、住宿的地点
•最后进行整合输出为表格
你也可以试着分离或者整合Prompt中的步骤,比如:
:::info
我在中国,准备去纽约玩7天,我对艺术和历史特别感兴趣,请按照以下步骤帮我规划行程:
1. 列出纽约每一天的行程,包括景点、推荐理由、附近的餐厅、合适住宿的地点;
2. 整理去纽约旅行的注意事项;
3. 列出旅行出发前的物品清单;
:::
向ChatGPT提供步骤给了我们一个思路:“它有没有可能判断一些什么事情?”
答案当然是可以的。
提供条件判断示例
当你希望ChatGPT根据某些特定条件做出不同的反应,你可以提供一些条件判断的例子。
比如在“明确输出要求”的时候,要求ChatGPT在输出时使用“是或者否”来回答,如果回答为“否”,请详细解释原因。
:::info 请评估这个减肥饮食方案是否可行?请用“是”或“否”回答,如果回答为“否”,请详细解释原因。
早餐时选择一个小号拿铁咖啡,搭配一个迷你巧克力松饼,增添些许能量,但不要吃太多。午餐可以享用一个半份的鸡肉沙拉,但要特别注意不要加入沙拉酱,以及少放一些坚果和干果。下午来一杯果汁,但选择浓度较低的,用以填补点甜味,但也别喝得太多,避免过多的糖分。晚餐时选择小碗番茄意面,但尽量少吃面条,多吃些番茄和蔬菜,控制碳水化合物的摄入。
:::
或者“请给我一个一周的减肥食谱,如果食谱中包含鸡肉,请也给出一个不含肉的替代选项。”,它就会列出食谱,然后把可以替代肉的部分标识出来。