当前位置: 首页 > 科技观察

解放程序员的双手!GPT-3自动生成SQL语句-代码开源

时间:2023-03-18 20:08:47 科技观察

本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。“万能”的GPT-3现在又一次解放了程序员的双手。像这样,用简单的英文问GPT-3“上个月有多少用户注册”就可以了。GPT-3会很快回答并给出相应的SQL语句:SELECTCOUNT(*)FROMusersWHEREsignup_time>now()-interval'1month'更神奇的是GPT-3不知道“数据库模式”接下来是表“用户”默认存在;在用户注册过程中,有一个字段,例如“signup_time”。相当聪明!就连开发者自己也连连惊叹:太棒了!GPT-3能否容纳更复杂的SQL语句?当然,刚才说的例子只是很简单的问题。面对更复杂的SQL查询,GPT-3还能这么聪明吗?为此,作者“喂养”它更多的上下文,以及与“数据库模式”相关的信息:输入一个问题,GPT-3需要回答正确的PostgreSQL。数据库包含2个表,即“用户”和“费用”。“用户”表包含字段:id(整数)、signup_dt(时间戳)、email(不同字符)和plan_type(不同字符)。“费用”表包含以下字段:金额(bigint)、user_id(整数)和charge_dt(时间戳)。OK,信息“喂”完了,现在我们来看看GPT-3的表现。输入:过去7天我们有多少收入?GPT-3:SELECTSUM(amount)FROMchargesWHEREchargedt>now()-interval'7days'不难看出GPT-3正确推断出“amount”=“revenue”,并且知道为了回答问题,SUM()将用于总结过去7天的费用。看起来GPT-3已经掌握了基本的SQL语法。但是作者也说了,GPT-3有时候喜欢自己去“发明”一些领域,所以现在用“例子触发”的方式让它变得更加智能。让GPT-3做一些简单的示例实验,例如让它从“users”和“charges”表中提取所有可用字段。根据这个指导,问GPT-3:过去30天最大的支付金额是多少?GPT-3回复:SELECTMAX(amount)FROMchargesWHEREcharge_dt>NOW()-INTERVAL'30days'这个小实验结果看起来还不错,但是当作者增加难度的时候,问题还是出现了。作者提出了一个更复杂的问题:邮箱brian@seekwell.io的用户最后一次付款是什么时候?这次GPT-3回答:SELECTMAX(charge_dt)FROMchargesWHEREuser_id=1ANDemail='brian@seekwell.io'显然,在“charges”表中,没有“email”这样的字段,但存在于“users”表中。也就是说,GPT-3还没有得到SQL中经常使用的联合查询。让GPT-3一步步学习“联合查询”所以,作者还是通过“例子”让它一步步“学习”联合查询。输入:过去30天有多少用户注册?GPT-3:SELECTCOUNT(*)FROMusersWHEREsignup_dt>=now()-interval'30days'输入:邮箱为brian@seekwell.io的用户什么时候注册的?GPT-3:SELECTsignup_dtFROMusersWHEREemail='brian@seekwell.io'输入:过去7天我们有多少收入?GPT-3:SELECTSUM(amount)fromchargesWHEREcharge_dt>=now()-interval'7days'输入:我们有多少收入从10-01-20到11-15-20?GPT-3:SELECTSUM(casewhencharge_dt>='10-01-20'::dateandcharge_dt<'11-15-20'::datethenamountelse0end)asrevenueFROMcharges输入:多少我们从过去6个月注册的用户那里获得了收入?GPT-3:SELECTSUM(charges.amount)FROMusersINNERJOINchargesONusers.id=charges.user_idWHEREusers.signup_dt>=now()-interval'6months'输入:用户什么时候电子邮件brian@seekwell.io进行他的第一笔付款?GPT-3:SELECTMIN(charge_dt)aslast_payment_dtfromusersINNERJOINchargesONusers.id=charges.user_idWHEREusers.email='brian@seekwell.io'输入:过去2个月每年有多少新用户注册?GPT-3:SELECTsum(casewhensignup_dt>=now()-interval'1month'then1else0end)assignups_this_month,sum(casewhensignup_dt>=now()-interval'2months'andsignup_dt