最近被OpenAI的ChatGPT刷屏了。我猜你已经读了很多关于ChatGPT的文章,不需要再介绍了。假如碰巧您还不太了解ChatGPT是什么,可以先看一下这篇文章,然后再回来继续。
与ChatGPT对话很有趣,甚至很有启发性。我们的内容创作部门已经将ChatGPT用于文案生成。那么对研发部门,ChatGPT是否有用呢?我在算法团队做了一个测试,让ChatGPT来完成算法研究中频繁要做的数据清洗和处理问题,结果让人非常满意。我甚至愿意聘请ChatGPT做算法团队的数据工程师。

文章目录
我们首先从简单的任务入手,让ChatGPT完成数据加载和简单的清洗工作。
上面这4个任务是算法执行前必须要做的常规工作。我们看一下ChatGPT的表现

import pandas as pd
import numpy as np
def load_csv_data(file_path):
# Load the csv file into a pandas DataFrame
df = pd.read_csv(file_path)
# Convert string type data to numeric type and save the mapping in a dictionary
conversion_map = {}
for column in df.columns:
if df[column].dtype == 'O':
unique_values = df[column].unique()
conversion_map[column] = {unique_values[i]: i for i in range(len(unique_values))}
df[column] = df[column].map(conversion_map[column])
# Check for missing values
missing_value_counts = df.isnull().sum()
for column, missing_count in missing_value_counts.items():
if missing_count > 1:
df.drop(df[df[column].isnull()].index, inplace=True)
elif missing_count == 1:
df[column].fillna(df[column].mean(), inplace=True)
# Split the dataset into training and validation sets
train_df = df.sample(frac=0.8, random_state=0)
val_df = df.drop(train_df.index)
return train_df, val_df, conversion_map
上面代码可以完美完成目标任务,从csv文件中加载数据集,并以80/20的比例将数据集拆分为测试集和训练集,关键逻辑还加上了注释,ChatGPT甚至贴心的给出了函数使用方法。
ChatGPT生成上面代码总共用时116秒,同时我们的数据工程师编写同样功能的代码用时225秒。二者的代码差异不大,但是我们的数据工程师没写注释。
上面的任务是数据工程师几乎天天都要写的代码,他们很熟练。我又找了一个大学刚毕业还在实习期的数据助理来写,居然半个小时才完成,由于对接口不熟悉,大量时间花在了百度上[捂脸]。
第一轮比试,从各个维度上,都是ChatGPT胜。
在上一轮的比试中,我发现我们的数据工程师有“偷鸡”行为——由于平时经常需要完成上面工作,他将很多功能封装成了独立的函数,用的时候直接引入或拷贝。使用函数按照逻辑组织代码,不仅能够促进代码复用,还有利于代码维护。所以我们接下来试着让ChatGPT重构一下自己的代码。
将上面的代码按照功能合理地拆分成若干函数。

import pandas as pd
import numpy as np
def load_csv(file_path):
return pd.read_csv(file_path)
def convert_strings_to_numeric(df):
conversion_map = {}
for column in df.columns:
if df[column].dtype == 'O':
unique_values = df[column].unique()
conversion_map[column] = {unique_values[i]: i for i in range(len(unique_values))}
df[column] = df[column].map(conversion_map[column])
return df, conversion_map
def handle_missing_values(df):
missing_value_counts = df.isnull().sum()
for column, missing_count in missing_value_counts.items():
if missing_count > 1:
df.drop(df[df[column].isnull()].index, inplace=True)
elif missing_count == 1:
df[column].fillna(df[column].mean(), inplace=True)
return df
def split_data(df):
train_df = df.sample(frac=0.8, random_state=0)
val_df = df.drop(train_df.index)
return train_df, val_df
def prepare_data(file_path):
df = load_csv(file_path)
df, conversion_map = convert_strings_to_numeric(df)
df = handle_missing_values(df)
train_df, val_df = split_data(df)
return train_df, val_df, conversion_map
ChatGPT拆分出5个函数:
load_csv(file_path) 负责从csv文件中加载数据集,返回DataFrame;convert_strings_to_numeric(df) 负责将DataFrame中的非数值类型数据转换为数值类型,并记录转换映射表;handle_missing_values(df) 负责处理缺失值;split_data(df) 负责将数据集拆分为训练集和测试集;prepare_data(file_path) 将上面4给函数串起来,构成一个pipeline。不得不说,ChatGPT有一次完美地完成了任务!并且函数名起得非常好,看函数名就能知道函数的功能,比很多中国程序员用拼音或缩写命名函数友好多了。
重构后的代码结构已经非常清晰了,但是还是有缺陷,那就是不够灵活,很多规则都是写死的。为了让代码更灵活、可扩展性更强,我们一般会将变量以参数的形式传入。
重构上面的代码,以参数的形式从命令行传入以下内容:

import pandas as pd
import numpy as np
import argparse
def load_csv(file_path):
return pd.read_csv(file_path)
def convert_strings_to_numeric(df):
conversion_map = {}
for column in df.columns:
if df[column].dtype == 'O':
unique_values = df[column].unique()
conversion_map[column] = {unique_values[i]: i for i in range(len(unique_values))}
df[column] = df[column].map(conversion_map[column])
return df, conversion_map
def handle_missing_values(df, threshold):
missing_value_counts = df.isnull().sum()
for column, missing_count in missing_value_counts.items():
if missing_count > threshold:
df.drop(df[df[column].isnull()].index, inplace=True)
elif missing_count <= threshold:
df[column].fillna(df[column].mean(), inplace=True)
return df
def split_data(df, split_ratio):
train_df = df.sample(frac=split_ratio, random_state=0)
val_df = df.drop(train_df.index)
return train_df, val_df
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Prepare data for machine learning.')
parser.add_argument('file_path', help='Path to the csv file.')
parser.add_argument('--split-ratio', type=float, default=0.8, help='Ratio of the training set size.')
parser.add_argument('--threshold', type=int, default=1, help='Threshold for handling missing values.')
args = parser.parse_args()
df = load_csv(args.file_path)
df, conversion_map = convert_strings_to_numeric(df)
df = handle_missing_values(df, args.threshold)
train_df, val_df = split_data(df, args.split_ratio)
ChatGPT很好地理解了我们的意图,引入了argparse模块来管理和解析命令行参数,关键是参数名起的也非常合理,参数说明也非常准确(尽管是英文的)。参数都正确地传入了所属的函数,又一次完美的完成了任务。
ChatGPT根据我们提供的规范,在创建、重构、扩展一个简单的数据预处理Python脚本方面做得非常出色,每一步的结果都符合要求。虽然这不是一个复杂任务,确实日常工作中最常见的基本工作。ChatGPT的表现确实惊艳了众人,预示着它朝着成为真正有用的编程助手迈出重要的一步。
最终我们从如下几个方面将ChatGPT和我们的数据工程师做了对比:
| ChatGPT | 人类程序员 | |
|---|---|---|
| 正确性 | ✅ | ✅ |
| 速度 | ✅ | |
| 编码规范 | ✅ | |
| 文档注释 | ✅ |
可见ChatGPT在编码速度和编码习惯上都完胜人类工程师。这让我不得不开始担心程序员未来的饭碗。是的,你没有看错!程序员这个曾经被认为是最不可能被AI取代的职业,如今将面临来自ChatGPT的巨大挑战。根据测试,ChatGPT已经通过Google L3级工程师测试,这意味着大部分基础coding的工作可以由ChatGPT完成。尽管ChatGPT在涉及业务的任务上表现不佳,但未来更可能的工作方式是架构师或设计师于ChatGPT协同完成工作,不再需要编码的码农。
英文版英文链接关注公众号在“亚特兰蒂斯的回声”中踏上一段难忘的冒险之旅,深入未知的海洋深处。足智多谋的考古学家AriaSeaborne偶然发现了一件古代神器,揭示了一张通往失落之城亚特兰蒂斯的隐藏地图。在她神秘的导师内森·兰登教授的指导和勇敢的冒险家亚历克斯·默瑟的帮助下,阿丽亚开始了一段危险的旅程,以揭开这座传说中城市的真相。他们的冒险之旅带领他们穿越险恶的大海、神秘的岛屿和充满陷阱和谜语的致命迷宫。随着Aria潜在的魔法能力的觉醒,她被睿智勇敢的QueenNeria的幻象所指引,她让她为即将到来的挑战做好准备。三人组揭开亚特兰蒂斯令人惊叹的隐藏文明,并了解到邪恶的巫师马拉卡勋爵试图利用其古
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我有一个模块:moduleMyModuledefdo_something#...endend由类使用如下:classMyCommandextendMyModuledefself.execute#...do_somethingendend如何验证MyCommand.execute调用了do_something?我已经尝试使用mocha进行部分模拟,但是当未调用do_something时它不会失败:it"callsdo_something"doMyCommand.stubs(:do_something)MyCommand.executeend 最佳答案
我有一个定义类的Ruby脚本。我希望脚本执行语句BoolParser.generate:file_base=>'bool_parser'仅当脚本作为可执行文件被调用时,而不是当它被irbrequire(或通过-r在命令行上传递)时。我可以用什么来包装上面的语句,以防止它在我的Ruby文件加载时执行? 最佳答案 条件$0==__FILE__...!/usr/bin/ruby1.8classBoolParserdefself.generate(args)p['BoolParser.generate',args]endendif$0==_
2022年底,OpenAI的预训练模型ChatGPT给人工智能领域的爱好者和研究人员留下了深刻的印象和启发,他展现的惊人能力将人工智能的研究和应用热度推向高潮,网上也充斥着和ChatGPT的各种聊天,他可以作诗、写小说、写代码、讨论疫情问题等。下面就是一些他的神回复:人命关天的坑: 写歌,留给词作者的机会不多了。。。 回答人类怎么样面对人工智能: 什么是ChatGPT?借用网上的一段介绍,ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动
目录ChatGPT简介技术原理应用未来发展ChatGPT的10 种用法ChatGPT简介ChatGPT是一种基于深度学习的大型语言模型,由OpenAI公司开发。技术原理GPT是GenerativePre-trainedTransformer的缩写,意为生成式预训练变压器。它的技术原理是使用了一个基于注意力机制的变压器(Trans
我在新的Rails应用程序(3.2.3)中运行迁移时遇到了问题。我们正在使用postrgres9.1.3和-pg(0.13.2)-当我运行rakedb:create,然后运行rakedb:migrate,我得到->1.9.3-p194(master)rakedb:migrate--trace**Invokedb:migrate(first_time)**Invokeenvironment(first_time)**Executeenvironmentrakeaborted!PG::Error:ERROR:relation"roles"doesnotexistLINE4:WHEREa
我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文
我在Heroku上部署了一个新版本的Rails5应用程序,在cedar-14堆栈上运行。它在部署时没有预编译,所以我手动执行了herokurunrakeassets:precompile。不过,我可以看到它包含旧Assets,同时需要css和js文件。我的文件在app/assets中,所以该目录不可能不在Assets编译路径中。我在application.rb和production.rb上的配置:config.assets.compile=true#Icheckedtheenvironmentvariable,itrespondsto'enabled',#whichwouldretur
我所在的团队负责管理公司面向公众的云平台。我们拥有大量运行面向互联网的VM的用户群。我想对我们的地址空间进行自动扫描,看看是否有人在运行Rails应用程序,这样我就可以通知他们升级他们的Rails版本,以避免本周出现的严重安全漏洞。我注意到在某些Apache部署中,有一个有用的PassengerHeader:X-Powered-By:PhusionPassenger(mod_rails/mod_rack)2.0.3然而,这并不可靠。我想知道是否有一种可靠的方法来检测在Web服务器后面运行的Rails,无论是使用响应header还是某种可以确定的GET/POST。谢谢!