<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          告別手敲 SQL ?GPT-3 自動幫你寫

          共 4078字,需瀏覽 9分鐘

           ·

          2022-05-09 23:42

          點擊上方“程序員大白”,選擇“星標”公眾號

          重磅干貨,第一時間送達

          作者 :?Brian Kane?@SeekWell
          編譯: 伍杏玲
          來源: AI科技大本營(ID:rgznai100

          作為分析師,我花費大量時間編寫 SQL 來回復(fù)各類業(yè)務(wù)問題,如簡單的客戶查詢問題“用戶X是否有正確的計劃”,評估 KPI,增長指標“上個月有多少用戶注冊,轉(zhuǎn)換為付費用戶的百分比是多少”,預(yù)估問題“12 個月內(nèi)我們將獲得多少收入”。

          為了讓我的工作更輕松,我盡量使用自動化來完成。盡管公司研發(fā)一些工具來幫助解決,但需要寫 SQL 代碼的話用當前工具很難自動化,GPT-3 來救駕!

          GPT-3 是一種文本完成引擎,它接受輸入的文本并返回它認為接下來會出現(xiàn)的文本?,F(xiàn)在已經(jīng)有很多人使用它根據(jù)指定說明來生成 HTML、CSS 等代碼。

          由于我的大部分工作是寫 SQL,所以我希望通過簡單的英語描述語句,GPT-3 將這些語句轉(zhuǎn)為 SQL 代碼。接著執(zhí)行該 SQL,等待頁面返回結(jié)果。

          01


          對我來說,GPT-3 Instruct(仍處于beta版)比更通用的 GPT-3 引擎更有效果,GPT-3 Instruct(尤其是davinci-instruct)可讓你給出 GPT-3 響應(yīng)的特定指令。下面我將詳細為大家展示下一些示例,其中 gif 里輸入問題由我生成,為綠色,GPT-3 將其轉(zhuǎn)換為SQL(由GPT-3生成,為藍色),我對 GPT-3 說明(黃色)和 GPT-3 示例(橙色)。
          這是我給的第一條指令,一個問題以及GPT-3的回復(fù):

          說明:給定輸入問題,請使用語法正確的 PostgreSQL 進行響應(yīng)??梢杂袆?chuàng)新,但 SQL 必須正確
          輸入how many users signed up in the past month?
          GPT-3
          SELECT?COUNT(*)?FROM?users
          WHERE?signup_time?>?now()?-?interval?'1?month'
          我沒給過數(shù)據(jù)庫架構(gòu),但假設(shè)我有一個名為“ users”的表,有“ signup_time”時間戳字段用于用戶注冊,這個符合邏輯。它知道在 PostgreSQL 中從今天的日期減去一個月的正確方法(now()-間隔“ 1個月”)。太酷了!
          為了給 GPT-3 提供更多的上下文,我將有關(guān)數(shù)據(jù)庫模式的信息添加到指令中。我的新指令:
          說明:給定輸入問題,請使用語法正確的PostgreSQL進行響應(yīng)。僅使用“用戶”和“收費”的表?!坝脩簟北砭哂幸韵铝校篿d(整數(shù)),signup_dt(時間戳),電子郵件(字符變化)和plan_type(字符變化)。“費用”表中包含列:金額(bigint),user_id(整數(shù))和charge_dt(時間戳)。
          我問另一個問題,看看 GPT-3 是否可以根據(jù)實際數(shù)據(jù)庫來響應(yīng):
          輸入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'
          我向它提供了有關(guān)數(shù)據(jù)庫中表和列的更多信息,它正確地推斷出“ amount” =“ revenue”,并 SUM()來統(tǒng)計 7 天收費后的金額,我們看到,它已知道一些基本的SQL語法,并推斷出我的意思。

          02

          用示例啟動GPT-3


          我想需要通過一個簡單的示例來明確告知 GPT-3 表中的列,示例是提供 GPT-3上下文并充實一些細節(jié)的好方法,這有助于確定哪些列和表可以使用(GPT-3有時喜歡“發(fā)明”列)。這是我添加到提示中的示例:
          輸入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(金額)來獲得最大的付款并正確設(shè)置日期條件,沒看到有關(guān)如何從當前日期減去天數(shù)的示例。我們再試試其他的:

          輸入when did user with email [email protected] make his last payment?
          GPT-3
          SELECT?MAX(charge_dt)?FROM?charges?WHERE?user_id?=?1?AND?email?=?'[email protected]'
          不太對,“收費”表中沒有電子郵件列,因此該查詢將失敗。我也從來沒有說過電子郵件=“ [email protected]”的用戶的user_id = 1-不知道從何而來。要正確回答該問題,必須將“收費”表與“用戶”表結(jié)合在一起,因為只有“用戶”有電子郵件列。
          由于知道在users.id = Charges.user_id上聯(lián)接這些表是一個大的進步,所以我將給 GPT-3 一個“聯(lián)接”的示例:
          輸入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?=?'[email protected]'
          我再試一次:
          輸入when did user with email [email protected] 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?=?'[email protected]'
          根據(jù)示例,它變得太簡單了,它正確地更改了MIN()→MAX()并用我要求的電子郵件替換了該電子郵件。我們嘗試另一個難度級別,先加更多示例來提供更多背景信息并改善響應(yīng)。新的例子:
          輸入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 [email protected] sign up?
          輸出
          SELECT?signup_dt?FROM?users?WHERE?email?=?'[email protected]'
          輸入 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 [email protected] 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?=?'[email protected]'
          輸入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
          這些示例為它提供了一些基本查詢,因此它更加熟悉我的數(shù)據(jù)庫以及用例的特定術(shù)語和概念(例如,“付費用戶”表示其plan_type =“ pro”)。我還介紹了匯總兩個日期之間的指標(收入)。我們繼續(xù)加深難度:
          輸入how many payments has user with email [email protected] made?
          GPT-3
          SELECT?COUNT(*)?FROM?users?INNER?JOIN??charges?ON?users.id?=?charges.user_id?WHERE?users.email?=?'[email protected]'
          GPT-3認為這里的COUNT()是適當?shù)谋磉_式,知道將“用戶”與“收費”表結(jié)合在一起,并將電子郵件正確設(shè)置為我所詢問的電子郵件。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結(jié)尾的電子郵件”在SQL中轉(zhuǎn)換為“ 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
          我已經(jīng)教過它如何從10-01-20到11-15-20來獲取收入,所以它要容易一些,它確實知道將6月1日和8月1日轉(zhuǎn)換為SQL中適當?shù)娜掌诟袷剑?06- 01-2020”和“ 08-01-2020”)。如果它只是用“ 6月1日”和“ 8月1日”替換了我示例中的日期,我它不是在獲取日期的概念,只是將模式匹配到最接近的示例。有了這個結(jié)果,我可以知道GPT-3至少在某種程度上了解了日期的概念。

          03

          將 GPT-3 “玩壞了”


          剛才我列舉的例子都是關(guān)于用戶、收入和增長指標等基本問題,GPT-3 處理得很好。現(xiàn)在我想知道有多少用戶轉(zhuǎn)換為付費用戶:
          輸入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'的用戶數(shù)除以用戶總數(shù)即可得到我要求的百分比。我還可以向部分用戶(例如最近6個月內(nèi)注冊的用戶)詢問相同的問題,并獲得準確的答復(fù):

          輸入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'

          04

          調(diào)整 GPT-3 的參數(shù)


          除了給GPT-3提供指導(dǎo)和示例外,還可以調(diào)整參數(shù)來提高 GPT-3 的有效性。其中關(guān)鍵要素是“Temperature”,它轉(zhuǎn)化為GPT-3在響應(yīng)中包含多少隨機性。如果只需要最高的概率響應(yīng)(即無隨機性),則將?Temperature 設(shè)置為0。
          以“最近兩個月的每個月我們有多少收入?”提示為例,將Temperature 設(shè)置為.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 設(shè)置為較低的.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 ?變得更具“創(chuàng)造力”,但也使它過于復(fù)雜并給出了幾乎沒有意義的響應(yīng)。Temperature 設(shè)置為.3,響應(yīng)將問題正確轉(zhuǎn)換為SQL。
          根據(jù)我的經(jīng)驗,如果你問的問題遵循的是示例所建立的模式,則較低的Temperature往往會表現(xiàn)得更好。但是,如果您要問一些需要更多創(chuàng)造力的問題,則更高的Temperature是最佳選擇,因為GPT-3更有可能嘗試未明確教導(dǎo)的事情。
          在下面的案例中,我問:“過去6個月內(nèi)注冊的用戶給我們帶來了多少收入?” (從我的示例中刪除之后)。在較低的Temperature下,GPT-3嘗試在“ charges”表中創(chuàng)建一個“ signup_dt”列,因此不必將“ users”表和“ charges”表連接在一起。隨著 Temperature 的升高,它確實加入了,這是Temperature設(shè)置為.8的響應(yīng):
          輸入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表達式,因此該查詢在技術(shù)上將失敗。但是從結(jié)構(gòu)上講,它通過加入“ charges”和“ users”而處于正確的道路上,因此可以以“ signup_dt”為條件。同時,使用“ charges”表中實際上不存在的“ signup_dt”列,.Temperature設(shè)置為.2時響應(yīng)完全不正確:
          輸入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

          05

          結(jié)論


          GPT-3 實例會根據(jù)簡單的英語問題,將其轉(zhuǎn)換為數(shù)據(jù)庫真正有效的SQL。它不總是完美,對“增長率”或“百分比”等復(fù)雜的概念仍然需要一些人工幫助,但是它對我的日常工作是有用,對于簡單的SQL,GPT-3 能幫忙減輕我的負擔(dān),并且對于不熟悉 SQL 語法的初學(xué)者很有用。
          這個項目的代碼傳送門:https://github.com/bkane1/gpt3-instruct-sandbox
          原文鏈接:https://blog.seekwell.io/gpt3

          國產(chǎn)小眾瀏覽器因屏蔽視頻廣告,被索賠100萬(后續(xù))

          年輕人“不講武德”:因看黃片上癮,把網(wǎng)站和786名女主播起訴了

          中國聯(lián)通官網(wǎng)被發(fā)現(xiàn)含木馬腳本,可向用戶推廣色情APP

          張一鳴:每個逆襲的年輕人,都具備的底層能力


          關(guān)


          ,學(xué),西學(xué)學(xué),質(zhì),結(jié)關(guān)[],學(xué)習(xí)!


          瀏覽 67
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人香蕉网 | AV乱伦小说 | 一级Aa视频免费看 | 超碰成人欧美 | 欧美婷婷|