ChatSQL:賦能ChatGPT實現純文本創建SQL查詢
譯文譯者 | 布加迪
審校 | 重樓
ChatGPT于2020年6月發布,由OpenAI開發。它已促使許多領域迎來了革命性變化。其中一個領域就是創建數據庫查詢。數據庫查詢可以通過ChatGPT由純文本生成。它可以幫助您了解您不甚了解的數據庫。
隨著ChatGPT的大行其道,人工智能已經逐漸融入到我們的日常生活當中,并且發展勢頭正猛。在切入正題之前,不妨先簡單地探究一下ChatGPT。
為了充分理解ChatGPT的功能,有必要充分掌握其底層架構。ChatGPT是基于GPT架構而開發的。因此不妨先看看Transformer。
若要直接訪問該項目,請點擊這里:https://github.com/ademakdogan/ChatSQL?ref=hackernoon.com。
圖1. 來自Transformer的編碼器和解碼器
Transformer使用seq2seq框架,從而能夠將一個序列轉換成另一個序列。序列定義了排序。舉例來說,我們可以將句子看作是一連串單詞。Transformer還可以用于解決文本翻譯之類的自然語言處理(NLP)問題。我們需要大量的標記數據來訓練這個架構。這對Transformer來說很難學習。我們可以使用遷移學習來解決這個問題。Transformer由兩個部分組成(見圖1):編碼器和解碼器,它們都擅長獲得熟練的語言表示。
這種熟練程度使我們能夠從每個部分構建語言模型。通過堆疊編碼器,我們獲得了Transformer的雙向編碼器表示(通常稱為BERT)。與之相似,通過堆疊解碼器單元,我們可以獲得生成式預訓練(即GPT)。在本文這個例子中,我們僅關注GPT。不妨在GPT的背景下考慮遷移學習。當我們從頭開始訓練一個模型時,它通常需要數量龐大的數據,因為參數最初是隨機設置的。然而,想象一下這樣一個場景:參數偶然與我們需要的值相一致或相對齊。在這種情況下,我們不需要一個廣泛的數據集來獲得我們想要的結果。正如我們所理解,BERT和GPT用于遷移學習概念中。
因此,GPT訓練分為兩個部分。一個是預訓練部分,我們訓練GPT架構以理解語言是什么;另一個是微調部分,我們使用遷移學習來進一步訓練GPT架構,使其針對特定的語言任務時表現良好。
圖2. 示例性的下一個單詞預測
GPT有一種結構,可以將隨機單詞序列作為輸入,并預測下一個最合適的單詞。示例性預測如圖2所示。
語言建模被選為理解語言基本方面的一個理想基礎,而且很容易進行微調。它通常被稱為自監督任務,因為句子本身同時可以充當輸入標簽和輸出標簽。
圖3. ChatGPT示意圖
不妨繼續討論ChatGPT。如圖3所示,整個ChatGPT過程可以分為三個主要步驟。在第一步中,使用GPT模型,該模型已針對理解語言本身進行了預訓練。下一步涉及對模型進行微調,以便有效地處理用戶提示,并根據這些提示生成適當的響應。為了方便這個過程,標記人員獲得已標記的數據;這些標記人員不僅提供提示,還為每個提示指定所需的響應。這便于對GPT模型進行監督式微調,因為既有輸入提示,又有相應的輸出響應。
在下一步中,使用從第一步獲得的監督式微調模型。單個提示通過模型來傳遞,并生成多個響應。然后,標記人員對這些響應的質量進行評估和評定。每個生成的響應都被分配一個相應的獎勵,這個獎勵被用來訓練另一個GPT模型:獎勵模型。獎勵模型本身就是一個模型,其功能是將初始提示和其中一個響應作為輸入,生成獎勵作為輸出。這種獎勵量化了響應的質量或好壞。
在第三步中,一個看不見的提示將被拿來通過監督式微調模型的復制品來傳遞。這將生成響應,然后使用獎勵模型來評估響應的等級或質量。獲得的等級用于進一步完善我們已經微調過的模型。這通過將等級合并到PPO模型的損失函數中來實現,允許通過反向傳播來更新模型的參數。特別吸引人的地方是,這個過程不僅幫助模型表現出無害的行為,還使它能夠生成實際的響應。這是由于獎勵本身是基于響應的質量而生成的。
ChatSQL
現在不妨使用Python借助ChatGPT創建一個項目。該項目使用了LangChain框架。
我們的目標是使用純文本從數據庫檢索信息。為此,我們使用MySQL作為目標數據庫。然而,這種方法也可以用于在其他數據庫上生成查詢。示例數據庫如下所示。
所有代碼都可以在這里找到(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由兩個主要部分組成。首先,MySQL查詢是通過ChatGPT由給定的純文本生成的。執行這些生成的查詢。在第二步中,對數據庫中返回的結果進行評估。在這個階段,結果可以直接呈現給用戶,也可以發回給ChatGPT進行進一步的分析和解釋。因此,您可以使用ChatGPT與您的數據庫進行互動。
假設用戶想要“顯示篇幅大于175頁、少于178頁的圖書類型小說。作者不應該是‘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'. '
結果,獲得了如下信息。
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.
如果數據庫列名稱正確,ChatGPT將理解這些名稱,并相應地響應查詢。然而在一些情況下,數據庫中的列名可能沒有意義,或者ChatGPT可能無法完全搞清楚其上下文。因此,為了確保系統正常運行,有必要向ChatGPT提供有關數據庫的先前信息。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 |
| . | ....... | .......
| .... | ... | .... |
| . | ....... | .......
| .... | ... | .... |
比如說,我們有一個命名糟糕的數據庫,如下所示。在這種情況下,有關數據庫的必要信息被輸入到了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'. '
即使數據庫中的列名選擇不當,ChatGPT也會生成正確的查詢,因為我們提供了正確的信息。
{'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.'}
下一個項目將是使用免費模型(Llama)由提示生成查詢(Mongo和SQL)。
- 項目代碼倉庫:https://github.com/ademakdogan/ChatSQL
- GitHub:https://github.com/ademakdogan
- 領英:https://www.linkedin.com/in/adem-akdo?an-948334177/
原文標題:ChatSQL: Enabling ChatGPT to Generate SQL Queries from Plain Text,作者:Adem Akdogan