购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 如何提问才能让ChatGPT更懂你

通过上面的案例,你可能对如何使用ChatGPT有了些感性的认识。如果你想继续深入了解提问的技巧,可以重点看看这一节。

OpenAI提供了一些关于Prompt的指导性建议:

❑使你的Prompt更加明确。

❑指定你想要的答案格式。

❑让模型在确定答案之前逐步思考或辩论利弊。

此外,我们还可以提供案例,以及提供尽可能足够的上下文,让模型更好地理解问题的背景和意图。接下来将举一些例子,让读者有更直观的感受。

2.2.1 提问清晰且明确

我们通过对比,再来感受下清晰、明确的Prompt是怎样的。

先看一个粗略的Prompt:

Prompt

请用JavaScript写一个贪吃蛇的游戏。

感兴趣的读者可以试试,ChatGPT立刻就能生成一个可运行的贪吃蛇游戏的代码。原因很简单,贪吃蛇是一个大众熟知的游戏,ChatGPT已经把相关源代码都存储在它的知识库了。

那么如何让ChatGPT输出一个定制化的贪吃蛇游戏的代码呢?我们举一个例子:

Prompt

请用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的表现就越好。

2.2.2 提供可参考的格式和案例说明

有时候,你的目标可能在你心中有明确的图景,但不容易用命令式的语言描述出来,这时就可以提供一些案例让ChatGPT学习。

比如,你要让ChatGPT帮助做命名实体识别,从文本中提取出人名、公司名等作为文本标签,可以用案例的方式告诉ChatGPT你想要的结果是怎样的。

Prompt

阅读下面的文本,提取2种实体类型:公司名、人名。

期望格式:

公司名:<逗号分隔的公司名称列表>

人名:<逗号分隔的人名列表>

##

案例文本:华为宣布突破ERP系统封锁 任正非孟晚舟发声

公司名:华为

人名:任正非,孟晚舟

##

文本:特斯拉的创始人兼CEO埃隆·马斯克(Elon Musk)也因此成为世界上最富有的人,他的个人财富达到了近3000亿美元,超过了亚马逊的杰夫·贝索斯(Jeff Bezos)和微软的比尔·盖茨(Bill Gates)。

ChatGPT

公司名:特斯拉,亚马逊,微软

人名:埃隆·马斯克,杰夫·贝索斯,比尔·盖茨

ChatGPT学得很到位,它不仅理解了“公司名”和“人名”的含义,还学到了输出格式。

2.2.3 提供上下文

ChatGPT的背后是大语言模型(Large Language Model,LLM),它学习并吸收了全世界的知识,形成了自己的智慧。但它不了解你,包括你的想法、你的目的和你的要求。

回想一下,我们在工作中给别人交代任务时,也需要考虑对方是否了解这个任务的背景。如果对方不了解,你就需要把背景介绍清楚。ChatGPT也需要尽可能详细地描述你交给它的任务背景。

在写程序时,我们经常遇到错误或者运行结果不符合预期,这时候可以让ChatGPT帮忙进行分析。

1. 结果不符合预期

比如,有个简单的使用指针交换两个数的代码,运行结果不符合预期,想要ChatGPT帮忙看看。我们可以把代码复制上来,并把问题描述清楚。

Prompt

我正在学习C语言,写了以下程序,想要实现a和b的交换。

但是在运行结果中,a和b并没有交换,请问为什么?

ChatGPT

在您的程序中,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。

Prompt

我正在学习C语言,我写了以下程序,想要实现a和b的交换。

但是编译报错了,错误信息是:

程序代码是:

请帮我看看问题在哪,如何修改?

注意看,我将上面的描述分成了4段:第一段描述问题背景;第二段给出编译报错信息;第三段给出源代码,用```c把代码包裹起来,表示代码是用C语言写的;第四段向ChatGPT发问。

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数量的限制,我们可以按函数接口来划分。

Prompt

请分析下这段代码的功能,并加上注释:

ChatGPT

这段代码的功能是将当前进程转换为守护进程(daemon)。守护进程是在后台运行的一种特殊进程,它们通常用于执行系统管理任务。下面是带注释的代码:

通过执行这段代码,当前进程会成为一个守护进程。它会在后台运行,与控制终端分离,并忽略一些可能导致进程意外终止的信号。

ChatGPT给源代码加上了注释,提高了代码可读性。

2.2.4 8个OpenAI推荐的最佳实践

下面介绍的是官方推荐的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语句的开头提示)。

可以看出,好的案例的共性是描述详细、准确,并加上格式、背景和案例。 74nDAMq3VSGiSTtondK/qtKV9FkVzub7GseSYMf3GgVQbxkhthQ7yLetgQIotO6B

点击中间区域
呼出菜单
上一章
目录
下一章
×