通过上面的案例,你可能对如何使用ChatGPT有了些感性的认识。如果你想继续深入了解提问的技巧,可以重点看看这一节。
OpenAI提供了一些关于Prompt的指导性建议:
❑使你的Prompt更加明确。
❑指定你想要的答案格式。
❑让模型在确定答案之前逐步思考或辩论利弊。
此外,我们还可以提供案例,以及提供尽可能足够的上下文,让模型更好地理解问题的背景和意图。接下来将举一些例子,让读者有更直观的感受。
我们通过对比,再来感受下清晰、明确的Prompt是怎样的。
先看一个粗略的Prompt:
请用JavaScript写一个贪吃蛇的游戏。
感兴趣的读者可以试试,ChatGPT立刻就能生成一个可运行的贪吃蛇游戏的代码。原因很简单,贪吃蛇是一个大众熟知的游戏,ChatGPT已经把相关源代码都存储在它的知识库了。
那么如何让ChatGPT输出一个定制化的贪吃蛇游戏的代码呢?我们举一个例子:
请用JavaScript写一个贪吃蛇游戏,要求如下:
1. 点击方向键时游戏开始,程序会选择一个随机的方向作为蛇的移动方向。可以用方向键控制贪吃蛇移动。
2. 开始时,贪吃蛇用一个绿色的方格表示,食物用红色方格表示,食物与贪吃蛇间隔一段距离。
3. 贪吃蛇每吃一点食物就增加一个坐标的长度,增加部分的颜色与蛇的颜色一样。
4. 游戏每一局有一个积分,开始时积分为0。贪吃蛇每吃一个食物,增加2的幂次方积分,比如第一次增加1分,第二次增加2分,第五次增加16分。
5. 游戏在贪吃蛇撞墙或撞到自己时结束,游戏结束时,在游戏区域显示最终的积分。
6. 游戏区域是一个800×800像素的矩形区域,由40×40个方格组成。
7. 所有CSS和JavaScript代码都写在同一个HTML文件中。
我们罗列了一些具体的需求,包括游戏玩法规则、展示的样式、输出的形式等。ChatGPT生成代码时,会将这些需求都考虑进去。
一开始,我们对游戏的运行过程可能不是很清楚,对ChatGPT生成的效果也不好判断,那么我们该怎么把问题描述清楚呢?通常我们用递进的方式,一边与ChatGPT交互,一边根据结果不断地调整Prompt,直到符合我们的预期。需求描述越清晰,ChatGPT的表现就越好。
有时候,你的目标可能在你心中有明确的图景,但不容易用命令式的语言描述出来,这时就可以提供一些案例让ChatGPT学习。
比如,你要让ChatGPT帮助做命名实体识别,从文本中提取出人名、公司名等作为文本标签,可以用案例的方式告诉ChatGPT你想要的结果是怎样的。
阅读下面的文本,提取2种实体类型:公司名、人名。
期望格式:
公司名:<逗号分隔的公司名称列表>
人名:<逗号分隔的人名列表>
##
案例文本:华为宣布突破ERP系统封锁 任正非孟晚舟发声
公司名:华为
人名:任正非,孟晚舟
##
文本:特斯拉的创始人兼CEO埃隆·马斯克(Elon Musk)也因此成为世界上最富有的人,他的个人财富达到了近3000亿美元,超过了亚马逊的杰夫·贝索斯(Jeff Bezos)和微软的比尔·盖茨(Bill Gates)。
公司名:特斯拉,亚马逊,微软
人名:埃隆·马斯克,杰夫·贝索斯,比尔·盖茨
ChatGPT学得很到位,它不仅理解了“公司名”和“人名”的含义,还学到了输出格式。
ChatGPT的背后是大语言模型(Large Language Model,LLM),它学习并吸收了全世界的知识,形成了自己的智慧。但它不了解你,包括你的想法、你的目的和你的要求。
回想一下,我们在工作中给别人交代任务时,也需要考虑对方是否了解这个任务的背景。如果对方不了解,你就需要把背景介绍清楚。ChatGPT也需要尽可能详细地描述你交给它的任务背景。
在写程序时,我们经常遇到错误或者运行结果不符合预期,这时候可以让ChatGPT帮忙进行分析。
1. 结果不符合预期
比如,有个简单的使用指针交换两个数的代码,运行结果不符合预期,想要ChatGPT帮忙看看。我们可以把代码复制上来,并把问题描述清楚。
我正在学习C语言,写了以下程序,想要实现a和b的交换。
但是在运行结果中,a和b并没有交换,请问为什么?
在您的程序中,swap函数中的指针交换是正确的,但问题在于您实际上交换的是指针本身,而不是它们所指向的值。您需要通过指针来交换它们所指向的值,而不是交换指针。这里是一个修改后的版本,可以实现您期望的功能:
在这个修改后的版本中,swap函数将交换指针a和b所指向的值,而不是指针本身。这将实现您期望的结果:交换a和b的值。
它帮我分析了问题,并且还给出了正确写法。
由于GPT模型有token数量的限制,因此你输入的字数是有限制的。一个token平均是4个字符,大约是0.75个英文单词或0.5个汉字。
目前几种主流模型的token数量限制如下:
❑GPT-3.5-turbo:4096 token
❑GPT-3.5-turbo-16k 16 385 token
❑GPT-4:8192 token
❑GPT-4-32k:32 768 token
所以,如果代码较长或者工程较大,你就不能直接丢给ChatGPT,需要自己先进行任务拆解。
2. 修改bug
我故意将刚才的代码改错,让它编译不通过,我们可以这样问ChatGPT。
我正在学习C语言,我写了以下程序,想要实现a和b的交换。
但是编译报错了,错误信息是:
程序代码是:
请帮我看看问题在哪,如何修改?
注意看,我将上面的描述分成了4段:第一段描述问题背景;第二段给出编译报错信息;第三段给出源代码,用```c把代码包裹起来,表示代码是用C语言写的;第四段向ChatGPT发问。
问题出在您调用swap函数时传递的参数类型。swap函数的参数类型是指针(int*a和int*b),而在main函数中,您将整数变量a和b直接传递给了swap函数,而不是它们的地址。为了解决这个问题,您需要在调用swap函数时传递变量a和b的地址(使用&运算符)。
此外,您的swap函数也需要修改,因为您需要交换指针所指向的值,而不是交换指针本身。这里是修改后的代码:
在这个修改后的版本中,您通过指针交换了a和b的值,而不是指针本身。这将实现您期望的结果:交换a和b的值。在main函数中,您使用&a和&b将它们的地址传递给swap函数,这样才能正确调用该函数。
以上分析得很好,编译问题修改正确。更进一步地,ChatGPT认为我的期望是交换两个数,因此把不能正确交换的问题也一起修改了,表现超出预期。
3. 分析代码并加上注释
我们经常会看一些别人写的代码,比如开源代码,或者公司交接的历史项目。有的代码写得清晰明了,注释也丰富,让人如沐春风。但更多看到的是没有注释,甚至注释与代码对不上的情况。
在尝试让ChatGPT帮我分析代码之后,我发现代码阅读效率提高了,心情也愉悦了。
对于很长的代码文件,为了不超过token数量的限制,我们可以按函数接口来划分。
请分析下这段代码的功能,并加上注释:
这段代码的功能是将当前进程转换为守护进程(daemon)。守护进程是在后台运行的一种特殊进程,它们通常用于执行系统管理任务。下面是带注释的代码:
通过执行这段代码,当前进程会成为一个守护进程。它会在后台运行,与控制终端分离,并忽略一些可能导致进程意外终止的信号。
ChatGPT给源代码加上了注释,提高了代码可读性。
下面介绍的是官方推荐的8个最佳实践,已被反复验证。当然,也建议自己随意探索,找到适合自己任务的Prompt。
在最佳实践中会有一些不够好和比较好的案例,可以对比以下案例的不同。
1)使用最新的模型。
2)在提示开始处放置说明,并使用 #或"""分隔说明和上下文。
×不够好:
将下面的文本总结为最重要的要点的项目符号列表。{你的文本}
比较好:
将下面的文本总结为最重要的要点的项目符号列表。文本:"""{你的文本}"""
3)尽可能详细地描述所需上下文、结果、长度、格式、风格等。
×不够好:
写一首关于OpenAI的诗。
比较好:
用一位{著名诗人}的风格,写一首关于OpenAI的短诗,重点关注最近DALL-E产品的推出(DALL-E是一种文本到图像的机器学习模型),让人感到鼓舞。
4)给出示例以说明需求:展示所需内容的示例,这样模型更容易理解。
×不够好:
提取以下文本中提到的实体。提取以下4种实体类型:公司名称、人名、具体主题和总体主题。文本:{text}
比较好:
提取下面文本中提到的重要实体。首先提取所有公司名称,然后提取所有人名,接着提取适合内容的特定主题,最后提取一般的总体主题。期望格式:公司名称:<逗号分隔的公司名称列表>人名:-||-具体主题:-||-总体主题:-||-文本:<text>
当你提供特定的格式要求时,模型的响应更好。这也使得编程解析多个输出更加可靠。
5)先尝试让模型0样本生成,不行的话再给出少量样本试试,若还不行,再去做大量样本的训练。
zero-shot:0样本
从下面的文本中提取关键词。文本:{text}关键词:
few-shot:提供少量样本
从下面相应的文本中提取关键词。
样例1文本:Stripe提供API,供Web开发人员使用,将付款处理集成到他们的网站和移动应用程序中。
样例1关键词:Stripe、付款处理、API、Web开发人员、网站、移动应用程序
##
样例2文本:OpenAI已经培训了先进的语言模型,非常擅长理解和生成文本。我们的API提供访问这些模型,并可用于解决几乎涉及处理语言的任何任务。
样例2关键词:OpenAI、语言模型、文本处理、API。
##
文本3:{text}
关键词3:
上面提供了两个样例,中间用 符号分隔,最后的文本3的{text}是要模型做识别的文本。
微调:微调就是给模型更多的样本进行学习训练,这里就不举例了。
6)在说明中使用清晰、精确的语言。
×不够好:
此产品的描述应该相当简短,仅几句话,不要太多。
比较好:
使用3~5句话来描述此产品。
7)不要只说不要做什么,而要说该怎么做。
×不够好:
你是一个客服,当用户向你咨询网站登录问题时,请不要询问用户名和密码。
比较好:
你是一个客服,当用户向你咨询网站登录问题时,不要询问用户名和密码,请将用户转到登录帮助页面:http://www.samplewebsite.com/help/faq。
8)使用具体的词汇来帮助模型生成正确的代码。它列出了一些可靠的Prompt格式,但建议大家可自行探索不同的Prompt来匹配自己的任务。
×不够好:
#写一个简单的Python函数#1.询问我英里数#2.将英里转换为公里
比较好:
#写一个简单的Python函数#1.询问我英里数#2.将英里转换为公里import
在上面的代码示例中,添加“import”提示,告诉模型应该使用Python编写(类似用SELECT作为SQL语句的开头提示)。
可以看出,好的案例的共性是描述详细、准确,并加上格式、背景和案例。