偶然看到一篇文章@MasterPa写的《与 ChatGPT 一起写律诗》,感觉很有趣,作者试图让ChatGPT帮忙填词,让GPT给出平仄合理的选择,但后来马上发现GPT无法判断出一个汉字的平仄,然后作者用了很多种提示方法都难以奏效。一个辅导孩子做功课失败的家长形象跃然纸上。

这个故事可以作为一道prompt工程师的面试题了,文理兼收,而且通过观察对话过程可以了解面试者的知识结构和处事方式

令ChatGPT为这两句诗填入合适的字:灯尽鲸脂AB骨,舱空鸦片换纶巾。其中A是平声字,B是仄声字。

考点

这道题的考点如下:

  • ChatGPT所使用的是Transformer模型,是统计模型,根据训练文字资料集合做出统计预测
  • 该模型的实质是预测下一个token出现的概率
  • 所谓token是单词或者字母组合
  • Transformer模型处理的最小单元是token
  • ChatGPT不知道的时候,就会胡诌(Hallucination,这个词翻译成幻觉不够好,胡诌既是准确含义又兼顾读音拼写)

考点解析

  • ChatGPT的训练资料是文字,不包含语音。它其实不知道每个字的读音是什么,类似是一个读了很多书的先天聋哑人。
  • 如果ChatGPT之前没有被训练过某个汉字对应的平仄,那么它是不知道的,它不知道的时候就会胡诌。
  • 让ChatGPT通过拼音来推测平仄是对的,但将拼音中的字母分离出来对ChatGPT是有困难的,因为最小处理单元是token而不是字母。一个常见测试是令ChatGPT将一个英文单词反过来写,比如把hello,写成olleh,通常是会失败的。

知之为知之不知为不知

子曰:知之为知之不知为不知

这句话中没有主语和谓语,如果我们重新填写会有很多种组合:

  • 我知道自己知道哪些信息,我知道自己不知道哪些信息
  • 我知道你知道哪些信息,我知道你不知道哪些信息
  • 我知道你知道哪些信息,我知道你不知道哪些信息,我知道你为什么知道那些信息,我知道你为什么不知道那些信息

参考答案

  • Me:
请试着判断一个字的平仄,
首先你需要将汉字的读音标注出来,分别用上普通话拼音和粤语拼音,
然后你需要将注音的声调标记出来,
然后根据声调来判断字的平仄。
Let's think step by step
请判断"二"字的平仄
  • ChatGPT:
首先,我们需要标注出"二"字的读音。
在普通话中,"二"的拼音是"èr",声调是四声;在粤语中,"二"的拼音是"yi6",声调是6声。
然后,我们需要根据声调来判断字的平仄。
在汉语诗词中,平仄是根据声调来判断的,一般来说,阴平(一声)和阳平(二声)为平,上声(三声)、去声(四声)和入声为仄。
因此,根据上述规则,普通话中的"二"(èr,四声)和粤语中的"二"(yi6,6声)都应判断为仄。
  • Me:
很好,根据你学到的判断平仄的方法。请试着为这首七言律诗填入缺失的两个字:

江口归舟列碎鳞,白帆黑水动星辰。
千山此景堪含楚,四海无人可避秦。
灯尽鲸脂AB骨,舱空鸦片换纶巾。
霍桑猜虐终难改,何苦争先据要津。

A应该是平声字;B应该是仄声字

请提供几个可能的AB组合,并验证每个组合是否满足要求的平仄。

Let's think step by step
  • ChatGPT:
根据要求,A应该是平声字,B应该是仄声字。
我们可以选择一些常见的汉字来尝试填充。以下是一些可能的组合:

A = "如",B = "烬"
A = "春", B = "烬"
A = "如", B = "燃"
A = "春", B = "燃"
现在我们来验证这些组合是否满足平仄的要求。

"如烬":普通话中,"如"的拼音是"rú",声调是二声,属于平声;"烬"的拼音是"jìn",声调是四声,属于仄声。所以"如烬"满足要求。
"春烬":普通话中,"春"的拼音是"chūn",声调是一声,属于平声;"烬"的拼音是"jìn",声调是四声,属于仄声。所以"春烬"满足要求。
"如燃":普通话中,"如"的拼音是"rú",声调是二声,属于平声;"燃"的拼音是"rán",声调是二声,属于平声。所以"如燃"不满足要求。
"春燃":普通话中,"春"的拼音是"chūn",声调是一声,属于平声;"燃"的拼音是"rán",声调是二声,属于平声。所以"春燃"不满足要求。
所以,满足要求的组合有"如烬"和"春烬"。

参考答案解析

  • ChatGPT处理上下文的能力有限,对于复杂任务应当拆解成多个子任务完成。
  • 对于ChatGPT不知道该怎么做的事情,你需要告诉它做事的步骤,也就是Chain of Thought,思维链。
  • Let's think step by step是一个魔法语句,要求ChatGPT显式处理思维链,将思考过程写出来。
  • 令ChatGPT自行处理一个字,相当于提供了一个示例(few shot)。ChatGPT在对话中会包含上下文,所以这个示例将在临近的几个对话中被感知到。
  • 为避免ChatGPT的胡诌,可以要求它对给出的答案进行验证(Self-Consistency)

知识点参考

补充参考答案

李元魁给出了一个很有趣的答案

  • 首先他主动询问ChatGPT如何判断平仄,为ChatGPT建立思维链做了基础。这个操作也有个名字叫Generated Knowledge Prompting
  • 然后他用“三人行必有我师焉”做了 Few Shot
  • 接下来是关键点,他在prompt时采用的是繁体中文,ChatGPT在回答的过程中使用了以文字形式书写的台湾拼音,“ㄅㄆㄇㄈㄉㄊㄋㄌ”
    • 《与 ChatGPT 一起写律诗》一文中造成失败的重要原因是使用了英文字母书写的拼音,并且判定平仄时使用的规则是“p,t,k结尾的字”,前述提到GPT难以提取拼音的结尾,于是造成失败。
    • 文字书写的拼音声母和韵母是单个字,在GPT处理时,很可能是单个字就处理为单个token,于是可以识别
    • 更进一步,我的答案和李元魁的答案中,都是令GPT以音调作为判断标准。GPT没有陷入从英文字母组合中提取结尾字母的困难之中。而@MasterPa给GPT的判定标准是两组,比较模糊。