解放程序员双手!GPT-3自动生成SQL语句 | 代码开源
yuyutoo 2025-01-11 18:30 4 浏览 0 评论
金磊 发自 凹非寺
量子位 报道 | 公众号 QbitAI
“无所不能”的GPT-3,现在又来解放程序员们的双手了。
像这样,只需用简单的英文问下GPT-3“上个月注册了多少个用户”。
GPT-3便会迅速作答,给出对应的SQL语句:
SELECT COUNT(*) FROM users
WHERE signup_time > now() - interval ‘1 month’
更神奇的是,GPT-3是在不知道“数据库模式”的情况下,默认存在“users”这个表;以及在用户注册过程中,存在“signup_time”这样的字段。
相当的智能了!
就连开发者本人都连连惊叹道:妙啊!
更复杂的SQL语句,GPT-3 hold得住吗?
当然,刚才提到的提到的例子,只是非常简单的提问。
那当GPT-3面对更加复杂的SQL查询时,还能如此智能吗?
为此,作者给它“投喂”了更多的上下文,以及与“数据库模式”相关的信息:
输入一个问题,GPT-3需要回答正确的PostgreSQL。
数据库包含2个表,分别是“users”和“charges”。
“users”表包含的字段有:id (integer), signup_dt (timestamp), email (character varying)和 plan_type (character varying)。
“charges”表包含的字段有:amount (bigint), user_id (integer), 以及charge_dt (timestamp)。
OK,信息“投喂”完毕,现在来看下GPT-3的表现。
输入:
how much revenue did we have in the past 7 days?
GPT-3:
SELECT SUM(amount) FROM charges WHERE chargedt > now() - interval ‘7 days’
不难看出,GPT-3正确地推断出了”amount” = “revenue”,并且知道为了回答问题,要用SUM()来汇总过去7天的费用。
看来GPT-3已经掌握了基本的SQL语法。
但作者也表示,GPT-3有的时候喜欢自己“发明”一些字段,所以现在就用“例子引发”的方式,让它变得更加智能。
先让GPT-3做些简单的例子实验,例如让它从“users”和“charges”2个表中,提取所有可用的字段。
基于这样的引导之后,再向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’
这个小实验的结果看着还是挺不错的,但当作者加大难度后,问题还是出现了。
作者提出了更加复杂的问题:
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’
很明显,在“charges”表中,并没有“email”这样的字段,而是存在于“users”表中。
也就是说,对于SQL经常用到的联合查询,GPT-3还没有get到。
让GPT-3一步步学会“联合查询”
于是,作者还是通过“例子”的方式,一步一步让它“学”会联合查询。
输入:how many users signed up in the past 30 days?
GPT-3:
SELECT COUNT(*) FROM users WHERE signup_dt >= now() - interval ‘30 days’
输入:when did user with email brian@seekwell.io sign up?
GPT-3:
SELECT signup_dt FROM users WHERE email = ‘brian@seekwell.io’
输入: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’
输入:how much revenue did we have from 10-01-20 through 11-15-20?
GPT-3:
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?
GPT-3:
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?
GPT-3:
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?
GPT-3:
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
在经过这样一番“学习”之后,回过头来,再去问GPT-3刚刚出错的问题:
how many payments has user with email joe@freshpizza.com made?
这次它的回答是:
SELECT COUNT(*) FROM users INNER JOIN charges ON users.id = charges.user_id WHERE users.email = ‘joe@freshpizza.com’
瞧瞧!GPT-3学会“内联”了,很酷有木有!
当然,除了用“例子”的方式让GPT-3变得更加聪明外,作者表示还可以通过调参的方式。
同时作者还强调了一点,他发现,起码在“让GPT-3写SQL语句”这件事上,GPT-3 Instruct 要比泛化(generalized)的GPT-3引擎好用得多。
为什么要搞这个项目?
这个项目的作者是一位分析师,目前就职于一家叫做SeekWell的公司。
他每天日常的工作,就是编写大量的SQL语句,来回答与业务相关的问题。
这就让他萌生了“自动化”的想法。
与此同时,他也注意网友们用大火的GPT-3,做了各种各样有创意的项目。
例如自动生成HTML、CSS代码等等,于是他便操刀开始训练GPT-3生成SQL语句。
当然,效果也是让他震惊不已,在博客中也是连连发出“Cool”的声音。
……
最后,作者将这个项目的代码在GitHub中开源了,感兴趣的读者可戳下方链接。
参考链接:
https://blog.seekwell.io/gpt3
GitHub项目地址:
https://github.com/bkane1/gpt3-instruct-sandbox
— 完 —
量子位 QbitAI · 头条号签约
关注我们,第一时间获知前沿科技动态
- 上一篇:数据库系统:SQL 语言简介
- 下一篇:SQL用了两年多,分享2个最常用的小技巧
相关推荐
- 当 Linux 根分区 (/) 已满时如何释放空间?
-
根分区(/)是Linux文件系统的核心,包含操作系统核心文件、配置文件、日志文件、缓存和用户数据等。当根分区满载时,系统可能出现无法写入新文件、应用程序崩溃甚至无法启动的情况。常见原因包括:...
- 玩转 Linux 之:磁盘分区、挂载知多少?
-
今天来聊聊linux下磁盘分区、挂载的问题,篇幅所限,不会聊的太底层,纯当科普!!1、Linux分区简介1.1主分区vs扩展分区硬盘分区表中最多能存储四个分区,但我们实际使用时一般只分为两...
- Linux 文件搜索神器 find 实战详解,建议收藏
-
在Linux系统使用中,作为一个管理员,我希望能查找系统中所有的大小超过200M文件,查看近7天系统中哪些文件被修改过,找出所有子目录中的可执行文件,这些任务需求...
- Linux 操作系统磁盘操作(linux 磁盘命令)
-
一、文档介绍本文档描述Linux操作系统下多种场景下的磁盘操作情况。二、名词解释...
- Win10新版19603推送:一键清理磁盘空间、首次集成Linux文件管理器
-
继上周四的Build19592后,微软今晨面向快速通道的Insider会员推送Windows10新预览版,操作系统版本号Build19603。除了一些常规修复,本次更新还带了不少新功能,一起来了...
- Android 16允许Linux终端使用手机全部存储空间
-
IT之家4月20日消息,谷歌Pixel手机正朝着成为强大便携式计算设备的目标迈进。2025年3月的更新中,Linux终端应用的推出为这一转变奠定了重要基础。该应用允许兼容的安卓设备...
- Linux 系统管理大容量磁盘(2TB+)操作指南
-
对于容量超过2TB的磁盘,传统MBR分区表的32位寻址机制存在限制(最大支持2.2TB)。需采用GPT(GUIDPartitionTable)分区方案,其支持64位寻址,理论上限为9.4ZB(9....
- Linux 服务器上查看磁盘类型的方法
-
方法1:使用lsblk命令lsblk输出说明:TYPE列显示设备类型,如disk(物理磁盘)、part(分区)、rom(只读存储)等。...
- ESXI7虚机上的Ubuntu Linux 22.04 LVM空间扩容操作记录
-
本人在实际的使用中经常遇到Vmware上安装的Linux虚机的LVM扩容情况,最终实现lv的扩容,大多数情况因为虚机都是有备用或者可停机的情况,一般情况下通过添加一块物理盘再加入vg,然后扩容lv来实...
- 5.4K Star很容易!Windows读取Linux磁盘格式工具
-
[开源日记],分享10k+Star的优质开源项目...
- Linux 文件系统监控:用脚本自动化磁盘空间管理
-
在Linux系统中,文件系统监控是一项非常重要的任务,它可以帮助我们及时发现磁盘空间不足的问题,避免因磁盘满而导致的系统服务不可用。通过编写脚本自动化磁盘空间管理,我们可以更加高效地处理这一问题。下面...
- Linux磁盘管理LVM实战(linux实验磁盘管理)
-
LVM(逻辑卷管理器,LogicalVolumeManager)是一种在Linux系统中用于灵活管理磁盘空间的技术,通过将物理磁盘抽象为逻辑卷,实现动态调整存储容量、跨磁盘扩展等功能。本章节...
- Linux查看文件大小:`ls`和`du`为何结果不同?一文讲透原理!
-
Linux查看文件大小:ls和du为何结果不同?一文讲透原理!在Linux运维中,查看文件大小是日常高频操作。但你是否遇到过以下困惑?...
- 使用 df 命令检查服务器磁盘满了,但用 du 命令发现实际小于磁盘容量
-
在Linux系统中,管理员或开发者经常会遇到一个令人困惑的问题:使用...
- Linux磁盘爆满紧急救援指南:5步清理释放50GB+小白也能轻松搞定
-
“服务器卡死?网站崩溃?当Linux系统弹出‘Nospaceleft’的红色警报,别慌!本文手把手教你从‘删库到跑路’进阶为‘磁盘清理大师’,5个关键步骤+30条救命命令,快速释放磁盘空间,拯救你...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)