当前位置: 首页 > 编程日记 > 正文

告别手敲 SQL ?GPT-3 自动帮你写

作者 | Brian Kane @SeekWell

编译 | 伍杏玲

出品 | AI科技大本营(ID:rgznai100)

【导语】手写业务 SQL 很繁琐?GPT-3来帮你!本文作者通过手动输入简单的英文描述秒 Get 到 SQL 了。听说 AI 又来抢开发者饭碗,一起来看看吧:

作为分析师,我花费大量时间编写 SQL 来回复各类业务问题,如简单的客户查询问题“用户X是否有正确的计划”,评估 KPI,增长指标“上个月有多少用户注册,转换为付费用户的百分比是多少”,预估问题“12 个月内我们将获得多少收入”。

为了让我的工作更轻松,我尽量使用自动化来完成。尽管公司研发一些工具来帮助解决,但需要写 SQL 代码的话用当前工具很难自动化,GPT-3 来救驾!

GPT-3 是一种文本完成引擎,它接受输入的文本并返回它认为接下来会出现的文本。现在已经有很多人使用它根据指定说明来生成 HTML、CSS 等代码。

由于我的大部分工作是写 SQL,所以我希望通过简单的英语描述语句,GPT-3 将这些语句转为 SQL 代码。接着执行该 SQL,等待页面返回结果。

对我来说,GPT-3 Instruct(仍处于beta版)比更通用的 GPT-3 引擎更有效果,GPT-3 Instruct(尤其是davinci-instruct)可让你给出 GPT-3 响应的特定指令。下面我将详细为大家展示下一些示例,其中 gif 里输入问题由我生成,为绿色,GPT-3 将其转换为SQL(由GPT-3生成,为蓝色),我对 GPT-3 说明(黄色)和 GPT-3 示例(橙色)。

这是我给的第一条指令,一个问题以及GPT-3的回复:

说明:给定输入问题,请使用语法正确的 PostgreSQL 进行响应。可以有创新,但 SQL 必须正确

输入:how many users signed up in the past month?

GPT-3:

SELECT COUNT(*) FROM users
WHERE signup_time > now() - interval '1 month'

我没给过数据库架构,但假设我有一个名为“ users”的表,有“ signup_time”时间戳字段用于用户注册,这个符合逻辑。它知道在 PostgreSQL 中从今天的日期减去一个月的正确方法(now()-间隔“ 1个月”)。太酷了!

为了给 GPT-3 提供更多的上下文,我将有关数据库模式的信息添加到指令中。我的新指令:

说明:给定输入问题,请使用语法正确的PostgreSQL进行响应。仅使用“用户”和“收费”的表。“用户”表具有以下列:id(整数),signup_dt(时间戳),电子邮件(字符变化)和plan_type(字符变化)。“费用”表中包含列:金额(bigint),user_id(整数)和charge_dt(时间戳)。

我问另一个问题,看看 GPT-3 是否可以根据实际数据库来响应:

输入:how much revenue did we have in the past 7 days?

GPT-3:

SELECT SUM(amount) FROM charges WHERE charge_dt > now() - interval '7 days'

我向它提供了有关数据库中表和列的更多信息,它正确地推断出“ amount” =“ revenue”,并 SUM()来统计 7 天收费后的金额,我们看到,它已知道一些基本的SQL语法,并推断出我的意思。

用示例启动GPT-3

我想需要通过一个简单的示例来明确告知 GPT-3 表中的列,示例是提供 GPT-3上下文并充实一些细节的好方法,这有助于确定哪些列和表可以使用(GPT-3有时喜欢“发明”列)。这是我添加到提示中的示例:

输入:select all available columns from users table.

输出:

SELECT id, signup_dt, email, plan_type FROM users

输入:select all available columns from charges table.

输出:

SELECT amount, user_id, and charge_dt FROM charges

将这些示例提供给 GPT-3,我将再问一个问题:

输入:what was the largest payment amount made in the past 30 days?

GPT-3:

SELECT MAX(amount) FROM charges WHERE charge_dt > NOW() - INTERVAL '30 days'

它知道使用MAX(金额)来获得最大的付款并正确设置日期条件,没看到有关如何从当前日期减去天数的示例。我们再试试其他的:

输入:when did user with email brian@seekwell.io make his last payment?

GPT-3:

SELECT MAX(charge_dt) FROM charges WHERE user_id = 1 AND email = 'brian@seekwell.io'

不太对,“收费”表中没有电子邮件列,因此该查询将失败。我也从来没有说过电子邮件=“ brian@seekwell.io”的用户的user_id = 1-不知道从何而来。要正确回答该问题,必须将“收费”表与“用户”表结合在一起,因为只有“用户”有电子邮件列。

由于知道在users.id = Charges.user_id上联接这些表是一个大的进步,所以我将给 GPT-3 一个“联接”的示例:

输入:when did jane@seekwell.io make her first payment?

输出:

SELECT MIN(charge_dt) as last_payment_dt from charges LEFT JOIN
users ON users.id = charges.user_id
WHERE users.email = 'jane@seekwell.io'

我再试一次:

输入:when did user with email brian@seekwell.io make his last payment?

GPT-3:

SELECT MAX(charge_dt) as last_payment_dt from charges LEFT JOIN users ON users.id = charges.user_id WHERE users.email = 'brian@seekwell.io'

根据示例,它变得太简单了,它正确地更改了MIN()→MAX()并用我要求的电子邮件替换了该电子邮件。我们尝试另一个难度级别,先加更多示例来提供更多背景信息并改善响应。新的例子:

输入:how many users signed up in the past 30 days?

输出:

SELECT COUNT(*) FROM users WHERE signup_dt >= now() - interval '30 days'

输入:when did user with email brian@seekwell.io sign up?

输出:

SELECT signup_dt FROM users WHERE email = 'brian@seekwell.io'

输入: how much revenue did we have in the past 7 days?

输出:

SELECT SUM(amount) from charges WHERE charge_dt >= now() - interval '7 days'

输入:how much revenue did we have from 10-01-20 through 11-15-20?

输出:

SELECT SUM(case when charge_dt>= '10-01-20'::date and charge_dt < '11-15-20'::date then amount else 0 end) as revenue
FROM charges

输入:how much revenue have we had from users that signed up in the last 6 months?

输出:

SELECT SUM(charges.amount) FROM users INNER JOIN
charges ON users.id = charges.user_id
WHERE users.signup_dt>= now() - interval '6 months'

输入:when did user with email brian@seekwell.io make his first payment?

输出:

SELECT MIN(charge_dt) as last_payment_dt from users INNER JOIN
charges ON users.id = charges.user_id
WHERE users.email = 'brian@seekwell.io'

输入:how many new users signed up in each of the last 2 months?

输出:

SELECT sum(case when signup_dt>= now() - interval '1 month' then 1 else 0 end) as signups_this_month,
sum(case when signup_dt>= now() - interval '2 months' and signup_dt < now() - interval '1 month'  then 1 else 0 end) as signups_last_month
FROM users

这些示例为它提供了一些基本查询,因此它更加熟悉我的数据库以及用例的特定术语和概念(例如,“付费用户”表示其plan_type =“ pro”)。我还介绍了汇总两个日期之间的指标(收入)。我们继续加深难度:

输入:how many payments has user with email joe@freshpizza.com made?

GPT-3:

SELECT COUNT(*) FROM users INNER JOIN  charges ON users.id = charges.user_id WHERE users.email = 'joe@freshpizza.com'

GPT-3认为这里的COUNT()是适当的表达式,知道将“用户”与“收费”表结合在一起,并将电子邮件正确设置为我所询问的电子邮件。GPT-3的另一个问题:

输入:how much revenue have we received from users with an email ending in 'seekwell.io' in the last 3 months?

GPT-3:

SELECT SUM(charges.amount) FROM users INNER JOIN charges ON users.id = charges.user_id WHERE users.email LIKE '%seekwell.io%' AND users.signup_dt>= now() - interval '3 months'

太棒了,它知道将“以seekwell.io结尾的电子邮件”在SQL中转换为“ users.email LIKE'%seekwell.io%'”(即使之前从未见过),并对与此匹配的用户收取了所有费用的总和健康)状况。还有一个:

输入:how much revenue did we have between June 1st and August 1st 2020?

GPT-3:

SELECT SUM(case when charge_dt >= '06-01-2020'::date and charge_dt < '08-01-2020'::date then amount else 0 end) as revenue FROM charges

我已经教过它如何从10-01-20到11-15-20来获取收入,所以它要容易一些,它确实知道将6月1日和8月1日转换为SQL中适当的日期格式('06- 01-2020”和“ 08-01-2020”)。如果它只是用“ 6月1日”和“ 8月1日”替换了我示例中的日期,我它不是在获取日期的概念,只是将模式匹配到最接近的示例。有了这个结果,我可以知道GPT-3至少在某种程度上了解了日期的概念。

将 GPT-3 “玩坏了”

刚才我列举的例子都是关于用户、收入和增长指标等基本问题,GPT-3 处理得很好。现在我想知道有多少用户转换为付费用户:

输入:what percent of users who signed up converted to paid?

GPT-3:

SELECT COUNT() as total_users, COUNT() as total_paid_users, 100.0*(COUNT() as total_paid_users) / COUNT() as total_users AS percent_converted FROM users

这不是我想要的,绝对不是正确的SQL。它不理解“百分比”的概,它仅是 COUNT()并乘以100。我使用“百分比”来试验下:

输入:what percent of users have an email ending in 'gmail.com'?

输出:

SELECT SUM(CASE WHEN email like '%gmail.com' then 1 else 0 end)/COUNT(*) as percent_gmail
FROM users

当我尝试相同的问题时,我得到:

输入:what percent of users who signed up converted to paid?

GPT-3:

SELECT SUM(CASE WHEN plan_type = 'pro' THEN 1 else 0 end)/COUNT(*) as percent_paid FROM users

整洁多了,它知道将plan_type ='pro'的用户数除以用户总数即可得到我要求的百分比。我还可以向部分用户(例如最近6个月内注册的用户)询问相同的问题,并获得准确的答复:

输入:what percent of users that signed up in the past 6 months converted to paid?

GPT-3:

SELECT SUM(CASE WHEN plan_type='pro' THEN 1 ELSE 0 END)/COUNT(*) AS percent_paid FROM users WHERE users.signup_dt>= now() - interval '6 months'

调整 GPT-3 的参数

除了给GPT-3提供指导和示例外,还可以调整参数来提高 GPT-3 的有效性。其中关键要素是“Temperature”,它转化为GPT-3在响应中包含多少随机性。如果只需要最高的概率响应(即无随机性),则将 Temperature 设置为0。

以“最近两个月的每个月我们有多少收入?”提示为例,将Temperature 设置为.8的话:

输入: how much revenue did we have in each of the last 2 months?

Temperature为.8时 GPT-3:

SELECT SUM(case when charge_dt>= now() - interval '1 month'  then charges.amount else 0 end) as revenue_this_month, CASE WHEN signup_dt>= now() - interval '2 months' AND signup_dt < now() - interval '1 month' THEN SUM(charges.amount) else 0 end as revenue_last_month FROM charges  LEFT OUTER JOIN users ON users.id = charges.user_id \ WHERE users.signup_dt >= now() - interval '1 month'

将Temperature 设置为较低的.3,可提供一个有效的查询,并回答以下问题:

输入:how much revenue did we have in each of the last 2 months?

Temperature为.3时 GPT-3:

SELECT SUM(case when charge_dt>= now() - interval '1 month' then amount else 0 end) as revenue_this_month, SUM(case when charge_dt>= now() - interval '2 months' and charge_dt < now() - interval '1 month' then amount else 0 end) as revenue_last_month FROM charges

更高的Temperature 让 GPT-3  变得更具“创造力”,但也使它过于复杂并给出了几乎没有意义的响应。Temperature 设置为.3,响应将问题正确转换为SQL。

根据我的经验,如果你问的问题遵循的是示例所建立的模式,则较低的Temperature往往会表现得更好。但是,如果您要问一些需要更多创造力的问题,则更高的Temperature是最佳选择,因为GPT-3更有可能尝试未明确教导的事情。

在下面的案例中,我问:“过去6个月内注册的用户给我们带来了多少收入?” (从我的示例中删除之后)。在较低的Temperature下,GPT-3尝试在“ charges”表中创建一个“ signup_dt”列,因此不必将“ users”表和“ charges”表连接在一起。随着 Temperature 的升高,它确实加入了,这是Temperature设置为.8的响应:

输入:how much revenue have we had from users that signed up in the last 6 months?

Temperature为.8时 GPT-3:

SELECT SUM(charges.amount) FROM users INNER JOIN charges ON users.id = charges.user_id WHERE signup_dt >= DATE_SUB(now(), INTERVAL '6 months')

可以肯定的是,“ DATE_SUB(now(),INTERVAL'6 months')”不是一个有效的Postgres表达式,因此该查询在技术上将失败。但是从结构上讲,它通过加入“ charges”和“ users”而处于正确的道路上,因此可以以“ signup_dt”为条件。同时,使用“ charges”表中实际上不存在的“ signup_dt”列,.Temperature设置为.2时响应完全不正确:

输入:how much revenue have we had from users that signed up in the last 6 months?

Temperature为.2时 GPT-3:

SELECT SUM(CASE WHEN signup_dt >= now() - interval '6 months' THEN amount ELSE 0 END) AS revenue FROM charges

结论

GPT-3 实例会根据简单的英语问题,将其转换为数据库真正有效的SQL。它不总是完美,对“增长率”或“百分比”等复杂的概念仍然需要一些人工帮助,但是它对我的日常工作是有用,对于简单的SQL,GPT-3 能帮忙减轻我的负担,并且对于不熟悉 SQL 语法的初学者很有用。

这个项目的代码传送门:https://github.com/bkane1/gpt3-instruct-sandbox

原文链接:https://blog.seekwell.io/gpt3

本文为AI科技大本营翻译,转载请注明来源出处。

相关文章:

Java IO 体系结构

参考文章地址: http://blog.csdn.net/oracle_microsoft/article/details/2634231 Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点: 1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系 2.…

ACCESS数据库防止下载

1. 修改数据库名。这是常用方法&#xff0c;将数据库名该成怪异名字或长名字&#xff0c;以防别人猜测。一旦被人猜到&#xff0c;别人还是能下载数据库文件&#xff0c;但几率不大。如将数据库database.mdb改成dslfjds$^&ijjkgf.mdb等 2. 修改数据库后缀。一般改成databa…

CentOS 7 SSH 免密登录的方法

先决条件 3 台 CentOS 7 HOSTNAMEIPROLEserver110.8.26.197Masterserver210.8.26.196Slave1server310.8.26.195Slave21. 用 root 用户登录。每台服务器都生成公钥&#xff0c;再合并到 authorized_keys。 2. CentOS 默认没有启动 ssh 无密登录&#xff0c;去掉 /etc/ssh/sshd_c…

webconfig加密

退到根目录 cd/跳到某盘 c: ..跳到某目录 cd Documents and Settings/All Users上一层 cd .. cd WINDOWS/Microsoft.NET/Framework/v2.0.50727 回车 aspnet_regiis -pef connectionStrings D:/NET aspnet_regiis -pe connectionStrings -app /NET 虚拟目录aspnet_regiis -pd…

WIN7 任务栏放右侧 有个BUG

不能变窄啊&#xff0c;微软又在设计上。转载于:https://www.cnblogs.com/whitetiger/p/3269827.html

全领域通吃,12个经典Python数据可视化库盘点

责编 | 寇雪芹头图 | 下载于视觉中国来源 | 博文视点BroadviewPython有很多数据可视化库&#xff0c;这些数据可视化库主要分为探索式可视化库和交互式可视化库。前者透过简单直接的视觉图形&#xff0c;更方便用户看懂原数据&#xff0c;后者主要用于与业务结合过程中展现总体…

add nodes to the swarm

一旦你们创建了一个带有管理节点的swarm集群&#xff0c;你就可以开始添加 worker节点$ docker-machine ssh worker1 $ docker swarm join \--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \192.168.99.100:2377 This node …

三种方法,用Python轻松提取PDF中的全部图片

作者 | 陈熹、刘早起来源 | 早起Python头图 | 下载于视觉中国有时我们需要将一份或者多份PDF文件中的图片提取出来&#xff0c;如果采取在线的网站实现的话又担心图片泄漏&#xff0c;手动操作又觉得麻烦&#xff0c;其实用Python也可以轻松搞定&#xff01;今天就跟大家系统分…

ASP.NET中如何防范SQL注入式攻击

1将sql中使用的一些特殊符号&#xff0c;如 -- /* ; %等用Replace()过滤&#xff1b;2限制文本框输入字符的长度&#xff1b;3检查用户输入的合法性&#xff1b;客户端与服务器端都要执行&#xff0c;可以使用正则。4使用带参数的SQL语句形式。 ASP.NET中如何防范SQL注入式攻击…

iOS下的类似Android的toast提示

一般人会说&#xff0c;就是用那个MBProgressHUD不就行了吗&#xff1f; 的确是&#xff0c;MBProgressHUD能为我们做了好多loading指示器&#xff0c;但是toast不一样&#xff0c;它是在屏幕某个地方出现一行小提示&#xff0c;例如网络状态&#xff0c;出现的时候不会妨碍用户…

配置Activiti Explorer使用MYSQL

http://blog.csdn.net/lxxxzzl/article/details/39583977

初学者SQL语句介绍

初学者SQL语句介绍 1.用 Select 子句检索记录 Select 子句是每一个检索数据的查询核心。它告诉数据库引擎返回什么字段。 Select 子句的常见形式是&#xff1a; Select * 该子句的意思是“返回在所指定的记录源中能找到的所有字段”。这种命令形式很方便&#xff…

转型AI成功几率有几分?太真实了......

技术转型&#xff0c;这两年一直是程序员圈子里的热门话题。对于大部分基层程序员来说&#xff0c;基础岗位上薪资的涨幅很难跟上年龄的增长。而近些年&#xff0c;AI技术发展势头迅猛&#xff0c;优秀人才短缺。在这种情况下&#xff0c;无疑是谁先转型成功&#xff0c;谁就占…

如何使用聚簇索引

2019独角兽企业重金招聘Python工程师标准>>> 聚簇索引是一种对磁盘上实际数据重新组织以按指定的一个或多个列的值排序。由于聚簇索引的索引页面指针指向数据页面&#xff0c;所以使用聚簇索引查找数据几乎 总是比使用非聚簇索引快。每张表只能建一个聚簇索引&#…

C语言实现汉诺塔问题

代码如下&#xff1a; #include <stdio.h> #include <stdlib.h> void move(int n,char x,char y,char z) {if (n1) {printf("%c--->%c\n",x,z);}else {move(n-1,x,z,y);printf("%c--->%c\n",x,z);move(n-1,y,x,z);} } int main() {int n…

将Session值储存于SQL Server中

一般情况下&#xff0c;我们喜欢使用Session储存我们的变量。Asp.Net提供了下面一些方法储存Session的值&#xff1a; InProc State Server SQL Server “InProc”表示我们使用传统ASP一样的方法储存Session的值&#xff0c;而且“State Server”则表示使用另外一台主机来…

系统定时关机的方法

曾经在网上搜索过关于windows XP定时关机的方法&#xff0c;很多人都说下载一个定时关机的软件。其实根本不需要这么麻烦&#xff0c;windowsXP本身就自带有定时关机这个功能&#xff0c;而且有两种方法。方法一&#xff1a;使用at命令(1)"开始"->"运行"…

让线上学习不打折扣,作业帮如何用技术促进课堂高频互动场?

“在大班直播课上&#xff0c;可能有数千甚至上万学员同时上课&#xff0c;但是他们彼此看不见也听不见&#xff0c;是千千万万个‘孤独的个体’&#xff0c;而‘小组直播间’却可以让他们随时随刻感觉到自己置身于一个温暖的集体之中。” “小组直播间”是曹越一直主张在大班…

在python中调用js或者nodejs要使用PyExecJs第三方包。

在python中调用js或者nodejs要使用PyExecJs第三方包。 使用时&#xff1a;import execjs这是没有用到nodejs的情况&#xff1b;如果用到nodejs&#xff0c;这种写法会报“Cannot find module xxx”的错误。 如果要用nodejs&#xff0c;要在环境变量中指定node_modules的路径。转…

超越Google,快手落地业界首个万亿参数推荐精排模型

整理 | 兆雨 责编 | 阿司匹林 出品 | AI科技大本营 精准的推荐系统模型是很多互联网产品的核心竞争力&#xff0c;个性化推荐系统旨在根据用户的行为数据提供“定制化”的产品体验。国民级短视频App快手&#xff0c;每天为数亿用户推荐百亿的视频&#xff0c;遇到的挑战之一是推…

Cache总义Cache用法之页面声明

Cache总义Cache用法之页面声明 <% outputCacheDuration"#ofseconds"Location"Any|Client|Downstream|Server|None"VaryByControl"ControlName"VaryByCustom"browser|customstring"VaryByHeader"headers"VaryByParam&quo…

InfBox V7.0 企业绩效助手客户端使用简介

1&#xff0c;点击此处下载InfBox V7.0 客户端软件。2&#xff0c;把下载下来的InfBox.rar压缩包&#xff0c;加压缩到E盘&#xff0c;解压后的目录如下&#xff1a;3&#xff0c;双击运行infbox.exe文件&#xff0c;点击登录窗口的左下角配置图标&#xff0c;设置服务器IP地址…

iOS:转载:UIControl的使用

主要功能&#xff1a; UIContol&#xff08;控件是所有控件的基类 如&#xff1a;&#xff08;UIButton&#xff09;按钮主要用于与用户交互&#xff0c;通常情况下我们不会直接使用UIControl&#xff0c;而是子类化它。常用属性&#xff1a; BOOL enabled 空间默认是启用的&am…

fprintf、printf、sprintf、fscanf、scanf、sscanf 格式化输入输出

格式化输入输出 1. fprintf&#xff08;格式化输出数据至文件&#xff09; 相关函数 printf&#xff0c;fscanf&#xff0c;vfprintf 表头文件 #include<stdio.h> 定义函数 int fprintf(FILE * stream, const char * format,.......); 函数说明 fprint…

毕业后五年之内将决定你的一生

大家千万不要错过这篇文章&#xff0c;毕业2年多了&#xff0c;能看到这篇文章也是一种幸运&#xff0c;真的受益匪浅&#xff0c;对我有很大启迪&#xff0c;这篇文章将会改变我的一生&#xff0c;真的太好了&#xff0c;希望与有缘人分享&#xff0c;也希望对有缘人有所帮助&…

达沃斯议程对话会:张亚勤解读人工智能发展 3R 原则

在国内外新冠疫情持续的特殊形势下&#xff0c;2021年世界经济论坛“达沃斯议程”对话会于1月25日至29日以线上形式举行。此次论坛上&#xff0c;全球70多个国家和地区的1500多位政商界和社会组织领导人围绕“把握关键之年&#xff0c;重建各方信任”这一主题&#xff0c;就如何…

The note of Developing Innovative Ideas for New Companies Course

This course is free on the Coursera Site&#xff0c;But it only has English version Threee pieces of the course overview&#xff1a; 1、opportunity analysis Canvas 2、business model Canvas&#xff1a;执行与验证 3、business plan 1.3&#xff1a; By first und…

C语言的一个关键字——static

C语言的一个关键字——static Static在C语言里面有两个作用&#xff0c;第一个是修饰变量&#xff0c;第二个是修饰函数。 1、Static修饰变量 按照作用范围的不同&#xff0c;变量分为局部变量和全局变量。如果用static修饰变量&#xff0c;不论这个变量是全局的还是局部的都是…

Android常用URI收藏

http://www.android-study.com/jichuzhishi/338.html转载于:https://www.cnblogs.com/hyzhou/p/3286550.html

Teradata推出Vantage on Azure,可实现自助配置、快速部署,提供安全、可扩展的高性能分析

云数据分析平台公司Teradata今日宣布推出全新Teradata Vantage on Azure 服务&#xff0c;帮助客户在部署其Teradata Vantage 环境时&#xff0c;将Vantage的强大功能与Microsoft Azure 基础架构的敏捷性和灵活性更好地结合&#xff0c;以更轻松地成为具有一流分析能力的数据驱…