AI会怎样“夺走”我们的工作 —— 一个基于ChatGPT和Python的小试验

教育   科技   2023-03-04 12:38   加拿大  

点击上方蓝字关注我们吧


众所周知,ChatGPT 目前还只是一个 “聊天机器人” —— 我们把问题写成文字交给它,然后它把答案用文字形式返回给我们:



但是,如果老板想让ChatGPT完全替代我们这些一线白领 —— 比如让它直接分析处理公司的Excel文件,它就会很有底线地回应 “对不起,本人只动嘴不动手” :



由此看来,ChatGPT更像一个经验丰富、热心答疑的老师傅,而不是亲自动手、样样全能的小卷王,这也让各位担心被 AI 抢走饭碗的打工人多少能够心安。



然而,我们真的可以掉以轻心么?如果ChatGPT这样的AI已经能够提出解题思路,它们真的不能直接到我们电脑上把思路变成实际操作么?




于是杨老师突发奇想:能不能做个试验,给 ChatGPT这个“大脑” 配上“一只手”,帮助ChatGPT到我们电脑上自动读取文件,然后自动执行 ChatGPT 思考出的方案,从而代替我们完成全部操作呢?


这种试验,当然离不开号称 “超级胶水语言” 、“万金油战士”的Python!于是杨老师写了一个Python 小程序,只要选择待处理的Excel文件、输入你的任务需求,它就会请ChatGPT生成一段完成该任务的Python代码,然后自动执行这段代码,替我们把Excel处理完毕。比如下面这个简单的任务 —— 计算平均值并显示在指定单元格:



或者再难一点:在中国大学列表中找出所有北京地区的高校,然后将它们的单元格设置为高亮黄色 :



视频里只是一个粗糙的试验,但或许已经让一些同学惊出些冷汗。不过大家不用担心:目前ChatGPT的“编程能力”还远远达不到“无需检查、直接可用”的水平,视频里的演示效果,也是杨老师反复运行多次后,筛选出的少数“成功案例”。更多的时候,ChatGPT返回的代码或者不能运行、或者运行效果完全不符合需求。

即使如此,我相信肯定还是有很多同学对这段程序很感兴趣,毕竟它也预示了“智能办公”未来的可能走向之一。或许再过十年,类似的AI平台真的能够训练出足够可信的编程能力,那时只要在自己电脑上编写视频中这种“桥接”程序,再把视频中输入任务需求的文本框升级为语音输入,完全意义上的“办公自动化”恐怕真会到来。

所以,尽管目前ChatGPT还没有对大陆用户提供服务、以致很多朋友暂时无法运行这段程序,杨老师还是以此为案例,概要介绍一下使用Python+ChatGPT实现办公自动化的关键思路和技巧。


1. 整体思路和挑战

把大象放到冰箱里一共分三步,把任务交给ChatGPT也是分三步
(1)将待处理Excel文件的工作表结构告诉ChatGPT
(2)对ChatGPT提问,让它返回一段Python代码
(3)自动运行这段Python代码

不过在步骤(1)中,有一个问题需要特别注意:ChatGPT只接收文本内容,不存在“上传Excel文件”这样的选项。所以要想让它了解待处理Excel文件,就必须用文本格式描述清楚Excel工作表的结构,比如采用下面的样式:


因此,本程序的整体思路如下图所示:



2. 关键技巧简介

若想实现上面的思路,有几个关键技术问题必须解决,即 “怎样将Excel工作表的格式自动描述为文本形式?”、“怎样向ChatGPT发起提问并得到代码?”、“怎样自动执行ChatGPT返回的代码?”。好在对于 Python 来说,这些问题都有现成的第三方模块或语法糖来解决,具体如下:

(1)把Excel结构转为文本格式

Python社区中有一个名为 “tabulate” 的第三方模块,可以自动分析二维列表、pandas.DataFrame等二维数据结构,然后输出对应的纯文本形式内容。所以,如果我们先使用 xlwings 读入 Excel 工作表、并把它的 UsedRange 读取为二维列表,就可以使用 tabulate模块中的 tabulate( ) 函数,得到这张工作表的文本描述。

关于UsedRange等概念,不熟悉的同学可以参见我们《全民一起玩Python实战篇 办公自动化》课程的讲解,这里不再赘述,我们直接看例子:


(2)调用ChatGPT问答功能

得到了表格结构的文字描述,接下来就需要把这段文字以及用户输入的任务需求,一起提交给ChatGPT服务器。这个环节说简单其实很简单,因为ChatGPT已经提供了一个python模块 openai,只要我们使用 pip 安装这个模块,并调用ChatCompletion.create方法,就能把指定字符串(比如下面例子中的 prompt )作为问题提交给ChatGPT服务器,由后者返回答案字符串。需要注意的是,ChatGPT返回的结果是一个 json 对象,里面包含了很多信息,而我们最需要的答案文本,保存在这个json对象中的 choices[0].message.conent 中,具体见下面的示例:


这个调用看起来很简单,但麻烦的地方在于:我们不仅要通过技术手段,把电脑“伪装”成海外地区IP,而且必须到 openai 官方网站上申请一个“api key”,并且把它填写在python代码中(也就是上面代码中涂成黑色的部分,以及下面官网截图中红色方框内容):


除此之外,杨老师在试验过程中还发现,想让ChatGPT正确理解问题、正确返回结果并不是一件容易的事情。目前我采取的策略是“一次任务、多次提问

首先,请ChatGPT将用户输入的任务要求(中文翻译为英文,因为众所周知,ChatGPT题的回答质量明显高于中文问题(并非openai存歧视,而是因为中文网站只占全球网站的1.3%,无法为ChatGPT供足够多的高质量训练数据

接下来,tabulate生成的Excel工作表描述文字发给ChatGPT,要求它分析表格结构并返回摘要通过这个步骤,我们可以让ChatGPT“事先熟悉”表格结构,以免后面处理出错;

最后,我们把翻译成英文的用户任务要求发给ChatGPT,要求它生成python代码,并且明确告诉它:只返回python程序、不要有任何“解释”、“谦虚”等多余的废话。

下面就是这些提问的代码,可以看到所有提问都使用了英文。这里有一个小秘密:为了避免杨老师标准规范的Chinglish影响对方理解,这些英文都是我让ChatGPT润色改写得到的 。


(3)自动执行ChatGPT生成的Python代码

我们编写的Python程序把提问发给ChatGPT后,后者会生成一段Python代码并返回给这个Python程序。那么怎样让我们的Python程序能够自动运行ChatGPT返回的Python代码呢?这个需求在Python中非常简单 —— 使用系统函数 exec( ) 就可以!

比如下面这个例子,字符串 s 里面是几条Python语句,然后我们运行 exec( s ) ,就可以把 s 字符串解析成一段python脚本,并自动执行:


考虑到代码的组织性,我们甚至可以在字符串中定义一个函数,然后通过 exec( ) 创建这个函数,并且再增加一个运行该函数的字符串,实现自动运行:


在本文的演示案例中,杨老师就是采用了这个策略:要求ChatGPT把生成代码放在一个名为 AIJob( ) 的自定义函数中,然后在我们的Python程序里通过 exec( ) 创建并执行 AIJob( )



3. 示例代码


搞定了前面这些问题,我们就可以开始编写这个试验程序。具体代码包括几个部分:


(1)用于向ChatGPT提问并接收回答的函数 call_ChatGPT,每个任务我们会调用它三次,也就是前面讲到的“三次提问”:


(2)执行自动化任务的主函数 auto_excel,覆盖前面所述的全部关键环节:

(3)主程序,请用户输入Excel文件路径以及任务要求。这里杨老师使用的是我们在《全民一起玩Python 基础篇》中讲解的 Tkinter 窗体界面,代码非常基础,考虑篇幅就不粘贴在这里,大家直接看效果就可以:



如果大家觉得这个界面有点丑,那也赖不到杨老师 —— 因为我懒得写Tkinter代码,所以这个主程序是我让 ChatGPT 自动生成的  


怎么突然觉得有点不对劲呢?“ChatGPT替我写代码”?难不成我们程序员也要被 …… ?!!








杨氏在线教学
由杨洋博士主持,专注制作高品质教学视频,以清晰简洁、生动有趣的教学风格,普及推广Python、VBA、SQL等各类实用计算机技术。 官方网址请见:https://www.ukoedu.com
 最新文章