提示词编写技巧

用ChatGPT帮用户生成代码,关键在于提示词的编写。提示词写得不够好,会生成错误的代码,或者效率不够高的代码。本节介绍解决Excel数据分析相关问题时,编写ChatGPT提示词的主要技巧,其中一部分是众所周知的基本的编写要求,另一部分是笔者大量实战后得到的经验的总结。[大谦Excel,dqexcel点com]

普通要求

很多关于提示词的文章都会提到编写提示词的基本技巧,包括

  • 给ChatGPT指定一个角色

做同样一件事,外行和内行做的效果肯定不一样,所以将ChatGPT指定为一个内行角色,有利于生成正确的代码。如示例1-1的提示词中,第一句“你是pandas专家”就给ChatGPT指定了一个内行的角色。

  • 交代背景

这里主要是给出要分析数据的文件路径和名称,以及文件中变量的名称、行数、列数等基本情况。如示例1-1的提示词中,“文件路径为:D:/Samples/ch01/各班学生成绩.xlsx。该Excel文件的第一个工作表中A-C列为给定数据。A-C列分别为’班级’、’姓名’和’成绩’。”就起交代背景的作用。

  • 说明问题

详细说明要解决什么问题,必要时还要说明用什么方法进行解决。指定输出的内容、输出的形式和格式等。比如示例1-1的提示词中,“用pandas导入Excel文件的数据,引擎为‘openpyxl’。请计算各班学生成绩的平均分,平均分保留1位小数。输出各班平均成绩,例如:一班 88.5。添加代码注释。”用于说明问题。

  • 给出示例

阐述要解决的问题时,给出具体的例子能帮助ChatGPT理解你的意图。如示例1-1的提示词中,用一个示例“一般 88.5”指明了输出的内容、方式和格式。

数据相关

使用pandas分析Excel文件数据之前,首先要导入该文件数据。一般用pandas的read_excel函数导入数据,使用该函数时有几点需要注意。

  • 指定引擎

用pandas的read_excel函数导入Excel文件中的数据时需要指定引擎,即需要设置engine参数。Excel文件的扩展名为”.xls”时指定engine参数的值为”xlrd”;Excel文件的扩展名为”.xlsx”时指定engine参数的值为”openpyxl”。并且需要先安装对应的Python包。

  • 指定数据行数和列数

用pandas的read_excel函数导入Excel文件中的数据时不指定数据行数和列数一般是没问题的,有两种情况下需要指定范围。一种是工作表中除了分析数据外还有其他数据,此时必须指定数据范围;另一种是数据所在单元格区域的底下或右侧有空行或空列,如果不指定行数和列数,导入后数据会出现有行或列全是缺失值的情况,这种情况如果不处理会影响后面的数据分析。

  • 指定行索引和列索引

默认时,用pandas的read_excel函数导入Excel文件中的数据会自动将第一行作为DataFrame的索引行。有些情况下需要将某列指定为索引列,此时需要明确指定。例如导入时间序列数据,需要明确指定日期时间数据列作为索引列。

  • 缺失值

如果要分析的数据中存在缺失值,需要先处理缺失值,否则计算时会出错。

表达相关

编写提示词时,表达一定要清晰,要避免含糊不清和模棱两可。

  • 提倡用短句

在表达上,短句更明确更有力。使用长句容易造成理解上的困难和歧义。

  • 用专用词指定对象

分析过程中,有时会出现中间有一个输出结果,后面又要在这个中间结果的基础上进一步处理的情况。此时建议用一个专用符号或名词表示这个中间结果,比如df1。后面要处理这个中间结果时就可以直接用df1代替它,既简洁又方便。

  • 避免使用它、前面等词

在提示词中使用它、前面等词可能会带来歧义,此时宁可啰嗦一点,也要用明确的对象代替这样的词。

  • 指定限定条件

很多时候,完成一个任务可能有多种方法。此时如果希望生成的代码中使用指定的方法,需要在提示词中明确指定对应的方法。如果输出的数据行数很大,可以指定输出的行数,只输出一部分结果。通过增加限定条件,可以让ChatGPT更准确地明白用户的意图。

输出相关

数据处理完毕后需要输出结果,提示词编写中跟输出有关的注意事项有:

  • 指定输出的内容

明确指定要输出哪些数据,可以是全部结果数据,也可以是结果数据的一部分;可以是数据本身,也可以是用数据绘制的图表。

  • 指定输出的形式

指定结果数据以表的形式输出,或者以其他形式输出;是否用xlwings或者OpenPyXL输出到Excel工作表的指定位置。

  • 指定输出的格式

指定数据输出的格式,比如数字保留两位小数,日期时间数据只保留日期等,可以结合例子来指定。

  • 保存数据到文件

如果需要保存结果数据到文件,需要指定文件的路径和名称,甚至数据范围、编码等更多细节。

效率相关

完成一个任务可能有多种方法,但不同方法的工作效率可能相差甚远,此时可以通过在提示词中添加限定条件指定用具体的方法进行处理。

本书主张处理Excel数据的计算问题时使用Python的pandas包,因为它是为处理大型数据而生的,进行数据运算时使用了矢量运算等算法,计算速度很快。pandas包中的很多函数或方法中已经封装了矢量运算,此时不需要通过循环来进行处理。如果用循环处理,会慢很多。

体现在提示词上,比如下面的提示词中,因为添加了“遍历各行数据”,生成的代码大概率会使用for循环来处理各行数据,这样就慢了。去掉这几个字,就会用pandas封装的矢量运算方法进行处理,快很多。

prompt
你是pandas专家,文件路径为:D:/Samples/09 文本数据处理/改变文本大小写/姓名首字母大写.xlsx。用pandas导入第1个工作表中的数据,第1行为索引列,导入前5行数据,引擎为"openpyxl"。遍历各行数据,将姓名中的单词修改为首字母大写,后面的字母小写。添加代码注释。

语言相关

笔者通过大量实战发现,ChatGPT生成不同语言的代码时效果是不一样的。生成Python代码时效果比较好,提示词不需要特别细致的描述,这里面又以pandas代码的效果最好。用提示词生成正确的VBA代码就困难得多。个人甚至认为,一个不懂VBA编程的同学是很难通过ChatGPT解决很多问题的,因为写提示词时需要有编程思维和编程逻辑。

比如下面是用代码实现中国式排名的例子,同样的数据,生成pandas代码的提示词为:

prompt
你是pandas专家,文件路径为:D:/Samples/07 数据排名/中国式排名/短跑成绩排名.xlsx。该Excel文件的第一个工作表中A1:B8为给定数据,A-B列分别为“姓名”和“短跑成绩(秒)”数据。用pandas导入Excel文件的数据,第1行为索引行,引擎为"openpyxl",请根据短跑成绩进行排名,用时越少排名越靠前。排名为整数,采用中国式排名,名次相同时取最小名次,数据添加在最后一列。根据排名对行数据进行升序排列。给代码添加注释。

生成VBA代码的提示词为:

prompt
你是Excel VBA专家,第一个工作表中A1:B8为给定数据,A-B列分别为“姓名”和“短跑成绩(秒)”数据,第1行为变量名称。遍历第2行到末行,首先按照短跑成绩对各行数据进行升序排列,得到各行对应的序号。排序后的姓名和短跑成绩数据放在第E列和第F列,变量名为“姓名”和“短跑成绩(秒)”,数据从第2行开始往下放。排序后行数据处于第几行序号就是几。比如,假设排序后短跑成绩(10 11 11 12 13 13 13 15)对应的序号为(1 2 3 4 5 6 7 8),对于短跑成绩相同的情况,比如成绩都为11的有两个,它们对应的序号为2和3,采用中国式排名,现在序号都取2,取最小值;成绩都为13的有三个,它们对应的序号为5,6和7,都取最小值5。处理完后,最终序号添加在第G列,变量名为“排名”。给代码添加注释。

为什么会有这么明显的差异呢?笔者考虑主要有两点原因。第一个原因是ChatGPT是用Python写的,大量使用了Python深度学习的包,而这些包跟pandas是一脉相承的;第二个原因是pandas已经封装了很多算法,比如本例中的排名算法,pandas中直接调用rank方法就可解决,而VBA中需要向ChatGPT详细描述算法,相当于写一个中国式排名算法的伪代码。