解放程式設計師的雙手!GPT-3自動產生SQL語句

解放程式設計師的雙手!GPT-3自動產生SQL語句

ADVERTISEMENT

「無所不能」的GPT-3,現在又來解放程式設計師們的雙手了。

像這樣,只需用簡單的英文問下GPT-3「上個月註冊了多少使用者」。

GPT-3便會迅速作答,給出相對應的SQL語句:

在使用者
signup_time> now()中從使用者中選擇COUNT(*)-間隔「 1個月」

解放程式設計師的雙手!GPT-3自動產生SQL語句

更神奇的是,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的表現。

輸入:

在過去7天裡,我們有多少收入?

GPT-3:

從收費的地方選擇總和(金額)> now()-間隔「 7天」

解放程式設計師的雙手!GPT-3自動產生SQL語句

不難看出,GPT-3正確地推斷出了」amount」 = 「revenue」,並且知道為了回答問題,要用SUM()來匯總過去7天的費用。

看來GPT-3已經掌握了基本的SQL語法。

但作者也表示,GPT-3有的時候喜歡自己「發明」一些字段,所以現在就用「例子引發」的方式,讓它變得更加智慧化。

先讓GPT-3做些簡單的例子實驗,例如讓它從「users」和「charges」2個表中,提取所有可用的字段。

基於這樣的引導之後,再向GPT-3提問:

過去30天內最大的付款金額是多少?

GPT-3回答道:

從charge_dt> NOW()中的費用中選擇最大值(金額)-間隔「 30天」

從這個小實驗來看,結果還是很不錯的,但當作者加大難度後,問題還是出現了。

作者提出了更加複雜的問題:

使用電子郵件brian@seekwell.io的使用者何時付款?

這次GPT-3的回答是:

從使用者ID = 1且電子郵件='brian@seekwell.io'的費用中選擇SELECT MAX(charge_dt)

很明顯,在「charges」表中,並沒有「email」這樣的字段,而是存在於「users」表中。

也就是說,對於SQL經常用到的聯合查詢,GPT-3還沒有get到。

讓GPT-3一步步學會「聯合查詢」

於是,作者還是透過「例子」的方式,一步一步讓它「學」會聯合查詢。

輸入:在過去30天內有多少使用者註冊?

GPT-3:

從使用者那裡選擇COUNT(*),其中signup_dt> = now()-間隔「 30天」

輸入:使用電子郵件brian@seekwell.io的使用者何時註冊?

GPT-3:

在電子郵件='brian@seekwell.io'的使用者中選擇signup_dt

輸入:過去7天我們有多少收入?

GPT-3:

從charge_dt> = now()的費用中選擇總和(金額)-間隔「 7天」

輸入:從10-01-20到11-15-20,我們有多少收入?

GPT-3:

SELECT SUM(在charge_dt> = '10 -01-20':: date和charge_dt <'11 -15-20':: date然後金額為0結束的情況下)作為收入
FROM費用

輸入:在過去6個月內,我們從註冊使用者中獲得了多少收入?

GPT-3:

從使用者中選擇
總和(charges.amount )INNER JOIN對users.id =
charges.user_id收費WHERE users.signup_dt> = now()-間隔「 6個月」

輸入:使用電子郵件brian@seekwell.io的使用者何時付款?

GPT-3:

從使用者中選擇MIN(charge_dt)作為last_payment_dt,INNER JOIN
向使用者收取費用
。id= charges.user_id,WHERE使用者。電子郵件='brian@seekwell.io'

輸入:最近2個月中,每年有多少新使用者註冊?

GPT-3:

選擇總和(case signup_dt> = now()-間隔「 1月」,然後1否則0結束)作為signups_this_month,
總和(case signup_dt> = now()-間隔「 2 months」和signup_dt <now()-interval '1 month',然後1 else 0 end)作為signups_last_month
FROM使用者

在經過這樣一番「學習」之後,回過頭來,再去問GPT-3剛剛出錯的問題:

使用電子郵件joe@freshpizza.com的使用者進行了多少筆付款?

這次它的回答是:

從使用者中選擇COUNT(*)個INNER JOIN向使用者收取費用。id= charges.user_id,其中users.email ='joe@freshpizza.com'

瞧瞧!GPT-3學會了!

當然,除了用「例子」的方式讓GPT-3變得更加聰明外,作者表示還可以透過調整參數的方式。

同時作者還強調了一點,他發現,起碼在「讓GPT-3寫SQL語句」這件事上,GPT-3 Instruct要比廣義的(generalized)的GPT-3引擎好用得多。

為什麼要設計這個專案?

這個專案的作者是一位分析師,目前就職於一家叫做SeekWell的公司。

他每天日常的工作,就是編寫大量的SQL語句,來回答與業務相關的問題。

解放程式設計師的雙手!GPT-3自動產生SQL語句

這讓他萌生了「自動化」的想法。

與此同時,他也注意網友們用熱門的GPT-3,做了各種各樣有創意的專案。例如自動產生HTML、CSS程式碼等等,於是他便操刀開始訓練GPT-3生成SQL語句。

當然,效果也是讓他震驚不已,在部落格中也是連連發出「Cool」的聲音。

……

最後,作者將這個專案的程式碼在GitHub中開源了,感興趣的讀者可點選下方連結。

使用 Facebook 留言

發表回應

謹慎發言,尊重彼此。按此展開留言規則