ChatSQL:賦能ChatGPT實(shí)現(xiàn)純文本創(chuàng)建SQL查詢
譯文譯者 | 布加迪
審校 | 重樓
ChatGPT于2020年6月發(fā)布,由OpenAI開發(fā)。它已促使許多領(lǐng)域迎來了革命性變化。其中一個(gè)領(lǐng)域就是創(chuàng)建數(shù)據(jù)庫查詢。數(shù)據(jù)庫查詢可以通過ChatGPT由純文本生成。它可以幫助您了解您不甚了解的數(shù)據(jù)庫。
隨著ChatGPT的大行其道,人工智能已經(jīng)逐漸融入到我們的日常生活當(dāng)中,并且發(fā)展勢頭正猛。在切入正題之前,不妨先簡單地探究一下ChatGPT。
為了充分理解ChatGPT的功能,有必要充分掌握其底層架構(gòu)。ChatGPT是基于GPT架構(gòu)而開發(fā)的。因此不妨先看看Transformer。
若要直接訪問該項(xiàng)目,請點(diǎn)擊這里:https://github.com/ademakdogan/ChatSQL?ref=hackernoon.com。
圖1. 來自Transformer的編碼器和解碼器
Transformer使用seq2seq框架,從而能夠?qū)?/span>一個(gè)序列轉(zhuǎn)換成另一個(gè)序列。序列定義了排序。舉例來說,我們可以將句子看作是一連串單詞。Transformer還可以用于解決文本翻譯之類的自然語言處理(NLP)問題。我們需要大量的標(biāo)記數(shù)據(jù)來訓(xùn)練這個(gè)架構(gòu)。這對Transformer來說很難學(xué)習(xí)。我們可以使用遷移學(xué)習(xí)來解決這個(gè)問題。Transformer由兩個(gè)部分組成(見圖1):編碼器和解碼器,它們都擅長獲得熟練的語言表示。
這種熟練程度使我們能夠從每個(gè)部分構(gòu)建語言模型。通過堆疊編碼器,我們獲得了Transformer的雙向編碼器表示(通常稱為BERT)。與之相似,通過堆疊解碼器單元,我們可以獲得生成式預(yù)訓(xùn)練(即GPT)。在本文這個(gè)例子中,我們僅關(guān)注GPT。不妨在GPT的背景下考慮遷移學(xué)習(xí)。當(dāng)我們從頭開始訓(xùn)練一個(gè)模型時(shí),它通常需要數(shù)量龐大的數(shù)據(jù),因?yàn)閰?shù)最初是隨機(jī)設(shè)置的。然而,想象一下這樣一個(gè)場景:參數(shù)偶然與我們需要的值相一致或相對齊。在這種情況下,我們不需要一個(gè)廣泛的數(shù)據(jù)集來獲得我們想要的結(jié)果。正如我們所理解,BERT和GPT用于遷移學(xué)習(xí)概念中。
因此,GPT訓(xùn)練分為兩個(gè)部分。一個(gè)是預(yù)訓(xùn)練部分,我們訓(xùn)練GPT架構(gòu)以理解語言是什么;另一個(gè)是微調(diào)部分,我們使用遷移學(xué)習(xí)來進(jìn)一步訓(xùn)練GPT架構(gòu),使其針對特定的語言任務(wù)時(shí)表現(xiàn)良好。
圖2. 示例性的下一個(gè)單詞預(yù)測
GPT有一種結(jié)構(gòu),可以將隨機(jī)單詞序列作為輸入,并預(yù)測下一個(gè)最合適的單詞。示例性預(yù)測如圖2所示。
語言建模被選為理解語言基本方面的一個(gè)理想基礎(chǔ),而且很容易進(jìn)行微調(diào)。它通常被稱為自監(jiān)督任務(wù),因?yàn)榫渥颖旧硗瑫r(shí)可以充當(dāng)輸入標(biāo)簽和輸出標(biāo)簽。
圖3. ChatGPT示意圖
不妨繼續(xù)討論ChatGPT。如圖3所示,整個(gè)ChatGPT過程可以分為三個(gè)主要步驟。在第一步中,使用GPT模型,該模型已針對理解語言本身進(jìn)行了預(yù)訓(xùn)練。下一步涉及對模型進(jìn)行微調(diào),以便有效地處理用戶提示,并根據(jù)這些提示生成適當(dāng)?shù)捻憫?yīng)。為了方便這個(gè)過程,標(biāo)記人員獲得已標(biāo)記的數(shù)據(jù);這些標(biāo)記人員不僅提供提示,還為每個(gè)提示指定所需的響應(yīng)。這便于對GPT模型進(jìn)行監(jiān)督式微調(diào),因?yàn)榧扔休斎胩崾荆?/span>又有相應(yīng)的輸出響應(yīng)。
在下一步中,使用從第一步獲得的監(jiān)督式微調(diào)模型。單個(gè)提示通過模型來傳遞,并生成多個(gè)響應(yīng)。然后,標(biāo)記人員對這些響應(yīng)的質(zhì)量進(jìn)行評估和評定。每個(gè)生成的響應(yīng)都被分配一個(gè)相應(yīng)的獎(jiǎng)勵(lì),這個(gè)獎(jiǎng)勵(lì)被用來訓(xùn)練另一個(gè)GPT模型:獎(jiǎng)勵(lì)模型。獎(jiǎng)勵(lì)模型本身就是一個(gè)模型,其功能是將初始提示和其中一個(gè)響應(yīng)作為輸入,生成獎(jiǎng)勵(lì)作為輸出。這種獎(jiǎng)勵(lì)量化了響應(yīng)的質(zhì)量或好壞。
在第三步中,一個(gè)看不見的提示將被拿來通過監(jiān)督式微調(diào)模型的復(fù)制品來傳遞。這將生成響應(yīng),然后使用獎(jiǎng)勵(lì)模型來評估響應(yīng)的等級或質(zhì)量。獲得的等級用于進(jìn)一步完善我們已經(jīng)微調(diào)過的模型。這通過將等級合并到PPO模型的損失函數(shù)中來實(shí)現(xiàn),允許通過反向傳播來更新模型的參數(shù)。特別吸引人的地方是,這個(gè)過程不僅幫助模型表現(xiàn)出無害的行為,還使它能夠生成實(shí)際的響應(yīng)。這是由于獎(jiǎng)勵(lì)本身是基于響應(yīng)的質(zhì)量而生成的。
ChatSQL
現(xiàn)在不妨使用Python借助ChatGPT創(chuàng)建一個(gè)項(xiàng)目。該項(xiàng)目使用了LangChain框架。
我們的目標(biāo)是使用純文本從數(shù)據(jù)庫檢索信息。為此,我們使用MySQL作為目標(biāo)數(shù)據(jù)庫。然而,這種方法也可以用于在其他數(shù)據(jù)庫上生成查詢。示例數(shù)據(jù)庫如下所示。
所有代碼都可以在這里找到(https://github.com/ademakdogan/ChatSQL)
+-----+--------------------------------------------------------+------------------------+-------------------+--------+------------------+
| ID | Title | Author | Genre | Height | Publisher |
+-----+--------------------------------------------------------+------------------------+-------------------+--------+------------------+
| 1 | Fundamentals of Wavelets | Goswami, Jaideva | signal_processing | 228 | Wiley |
| 2 | Data Smart | Foreman, John | data_science | 235 | Wiley |
| 3 | God Created the Integers | Hawking, Stephen | mathematics | 197 | Penguin |
| 4 | Superfreakonomics | Dubner, Stephen | economics | 179 | HarperCollins |
| 5 | Orientalism | Said, Edward | history | 197 | Penguin |
| 6 | Nature of Statistical Learning Theory, The | Vapnik, Vladimir | data_science | 230 | Springer |
| 7 | Integration of the Indian States | Menon, V P | history | 217 | Orient Blackswan |
| 8 | Drunkard's Walk, The | Mlodinow, Leonard | science | 197 | Penguin |
| 9 | Image Processing & Mathematical Morphology | Shih, Frank | signal_processing | 241 | CRC |
| 10 | How to Think Like Sherlock Holmes | Konnikova, Maria | psychology | 240 | Penguin |
| 11 | Data Scientists at Work | Sebastian Gutierrez | data_science | 230 | Apress |
| 12 | Slaughterhouse Five | Vonnegut, Kurt | fiction | 198 | Random House |
| 13 | Birth of a Theorem | Villani, Cedric | mathematics | 234 | Bodley Head |
| 14 | Structure & Interpretation of Computer Programs | Sussman, Gerald | computer_science | 240 | MIT Press |
| 15 | Age of Wrath, The | Eraly, Abraham | history | 238 | Penguin |
| 16 | Trial, The | Kafka, Frank | fiction | 198 | Random House |
| 17 | Statistical Decision Theory' | Pratt, John | data_science | 236 | MIT Press |
| 18 | Data Mining Handbook | Nisbet, Robert | data_science | 242 | Apress |
| 19 | New Machiavelli, The | Wells, H. G. | fiction | 180 | Penguin |
| 20 | Physics & Philosophy | Heisenberg, Werner | science | 197 | Penguin |
| 21 | Making Software | Oram, Andy | computer_science | 232 | O'Reilly |
| . | ....... | ....... | .... | ... | .... |
| . | ....... | ....... | .... | ... | .... |
ChatSQL由兩個(gè)主要部分組成。首先,MySQL查詢是通過ChatGPT由給定的純文本生成的。執(zhí)行這些生成的查詢。在第二步中,對數(shù)據(jù)庫中返回的結(jié)果進(jìn)行評估。在這個(gè)階段,結(jié)果可以直接呈現(xiàn)給用戶,也可以發(fā)回給ChatGPT進(jìn)行進(jìn)一步的分析和解釋。因此,您可以使用ChatGPT與您的數(shù)據(jù)庫進(jìn)行互動(dòng)。
假設(shè)用戶想要“顯示篇幅大于175頁、少于178頁的圖書類型小說。作者不應(yīng)該是‘Doyle, Arthur Conan’。”因此,可以在這種情況下使用以下命令。
python3 chatsql.py -p 'Show me the book type fiction which they height bigger than 175 and smaller than 178. The author shouldn't be 'Doyle, Arthur Conan'. '
結(jié)果,獲得了如下信息。
CHATGPT QUERY------------------:
SELECT * FROM bt WHERE Genre = 'Fiction' AND Height > 175 AND Height < 178 AND Author != 'Doyle, Arthur Conan'
RAW RESULT------------------:
[(32, 'Pillars of the Earth, The', 'Follett, Ken', 'fiction', 176, 'Random House'), (37, 'Veteran, The', 'Forsyth, Frederick', 'fiction', 177, 'Transworld'), (38, 'False Impressions', 'Archer, Jeffery', 'fiction', 177, 'Pan'), (72, 'Prisoner of Birth, A', 'Archer, Jeffery', 'fiction', 176, 'Pan'), (87, 'City of Joy, The', 'Lapierre, Dominique', 'fiction', 177, 'vikas'), (128, 'Rosy is My Relative', 'Durrell, Gerald', 'fiction', 176, 'nan')]
PROCESSED RESULT------------------ :
The books 'Pillars of the Earth, The' by Ken Follett, 'Veteran, The' by Frederick Forsyth, 'False Impressions' by Jeffery Archer, 'Prisoner of Birth, A' by Jeffery Archer, 'City of Joy, The' by Dominique Lapierre, and 'Rosy is My Relative' by Gerald Durrell are all fiction books with 176 or 177 pages published by Random House, Transworld, Pan, Vikas, and Nan, respectively.
如果數(shù)據(jù)庫列名稱正確,ChatGPT將理解這些名稱,并相應(yīng)地響應(yīng)查詢。然而在一些情況下,數(shù)據(jù)庫中的列名可能沒有意義,或者ChatGPT可能無法完全搞清楚其上下文。因此,為了確保系統(tǒng)正常運(yùn)行,有必要向ChatGPT提供有關(guān)數(shù)據(jù)庫的先前信息。info.json文件可以用來添加信息。
+-----+--------------------------------------------------------+------------------------+-------------------+------+------------------+
| ID | aa | bb
| cc | dd | ee |
+-----+--------------------------------------------------------+------------------------+-------------------+------+------------------+
| 1 | Fundamentals of Wavelets | Goswami, Jaideva
| signal_processing | 228 | Wiley |
| 2 | Data Smart | Foreman, John
| data_science | 235 | Wiley |
| 3 | God Created the Integers | Hawking, Stephen
| mathematics | 197 | Penguin |
| 4 | Superfreakonomics | Dubner, Stephen
| economics | 179 | HarperCollins |
| 5 | Orientalism | Said, Edward
| history | 197 | Penguin |
| . | ....... | .......
| .... | ... | .... |
| . | ....... | .......
| .... | ... | .... |
比如說,我們有一個(gè)命名糟糕的數(shù)據(jù)庫,如下所示。在這種情況下,有關(guān)數(shù)據(jù)庫的必要信息被輸入到了info.json文件中。
{“bt”: “Table Name”, “aa”: “Title of the book”, “bb”: “Author of the book”, “cc”: “Type of book”, “dd”: “Height of the book”, “ee”: “Book Publisher”}
然后使用相同的命令:
python3 chatsql.py -p 'Show me the book type fiction which they height bigger than 175 and smaller than 178. The author shouldn't be 'Doyle, Arthur Conan'. '
即使數(shù)據(jù)庫中的列名選擇不當(dāng),ChatGPT也會(huì)生成正確的查詢,因?yàn)槲覀兲峁┝苏_的信息。
{'query': "SELECT aa, bb, cc, dd FROM bt WHERE cc = 'fiction' AND dd > 175 AND dd < 178 AND bb != 'Doyle, Arthur Conan'", 'raw_result': "[('Pillars of the Earth, The',
'Follett, Ken', 'fiction', 176), ('Veteran, The', 'Forsyth, Frederick', 'fiction',
177), ('False Impressions', 'Archer, Jeffery', 'fiction', 177), ('Prisoner of Birth,
A', 'Archer, Jeffery', 'fiction', 176), ('City of Joy, The', 'Lapierre, Dominique',
'fiction', 177), ('Rosy is My Relative', 'Durrell, Gerald', 'fiction', 176)]",
'processed_result': '\nThe books "Pillars of the Earth, The" by Ken Follett, "Veteran,
The" by Frederick Forsyth, "False Impressions" by Jeffery Archer, "Prisoner of Birth,
A" by Jeffery Archer, "City of Joy, The" by Dominique Lapierre and "Rosy is My
Relative" by Gerald Durrell are all fiction and have page lengths of 176 or 177.'}
下一個(gè)項(xiàng)目將是使用免費(fèi)模型(Llama)由提示生成查詢(Mongo和SQL)。
- 項(xiàng)目代碼倉庫:https://github.com/ademakdogan/ChatSQL
- GitHub:https://github.com/ademakdogan
- 領(lǐng)英:https://www.linkedin.com/in/adem-akdo?an-948334177/
原文標(biāo)題:ChatSQL: Enabling ChatGPT to Generate SQL Queries from Plain Text,作者:Adem Akdogan