ChatSQL:让ChatGPT能够从纯文本生成SQL查询
ChatGPT是由OpenAI开发的,于2020年6月发布,它在许多领域引领了革命性的发展。其中之一是数据库查询的创建。通过ChatGPT,可以从纯文本生成数据库查询。它可以帮助你处理自己不熟悉的数据库。要直接访问项目,请点击这里。
人工智能已逐步融入我们的日常生活,随着ChatGPT的兴起,它得到了显著的推动。在进入项目之前,让我们简要探索一下ChatGPT。要充分理解ChatGPT的能力,必须对其基础架构有坚实的掌握。 ChatGPT是基于GPT架构开发的。因此,让我们首先看看变压器。
变形金刚利用seq2seq框架,使一个序列转换成另一个序列。这些序列有定义的顺序。举个例子,句子可以视为词语的连续。变形金刚也可以用于解决自然语言处理,如文本翻译。我们需要大量的标记数据来训练这个架构。这对于变形金刚来说是困难的学习。我们可以使用迁移学习来解决这个问题。变形金刚由两个组件组成(图1):编码器和解码器,两者都擅长获取熟练的语言表示。这种熟练使我们能够从每个组件构建语言模型。通过堆叠编码器,我们获得了变形金刚的双向编码器表示,通常称为BERT。同样,通过堆叠解码器单元,我们可以实现生成式预训练,即GPT。在我们的情况下,我们专注于GPT。让我们在GPT的背景下考虑迁移学习。当我们从头开始训练模型时,由于参数最初随机设置,通常需要大量的数据。然而,想象一种情景,其中参数恰好与我们需要的值相吻合。在这种情况下,我们不需要大量的数据集来实现所需的结果。正如我们将了解的那样,BERT和GPT都在迁移学习概念中使用。
GPT 训练分为两部分。我们有预训练部分,在这部分中我们训练 GPT 架构以理解什么是语言,然后进行微调部分,在这部分中,我们使用迁移学习进一步训练 GPT 架构,在特定的语言任务上表现出色。
GPT具有一种结构,将随机的单词序列作为输入,并预测下一个最合适的单词。示例预测可在图2中看到。语言建模被选择为理解语言基本方面的理想基础,并可以轻松地进行微调。它通常被称为自我监督任务,因为句子本身既作为输入又作为输出标签。
让我们继续ChatGPT。如图3所示,整个ChatGPT过程可以分为三个主要步骤。在第一步中,使用已经预先训练过的GPT模型来理解语言本身。下一步是优化模型,以有效地处理用户提示并根据这些提示生成适当的响应。为了促进这个过程,通过参与标注者获得标记数据,他们不仅提供提示,还为每个提示指定所需的响应。这允许参与GPT模型的受监督优化,因为有输入提示和对应的输出响应。
在下一步骤中,使用从第一步获得的受监督精调模型。将单个提示通过模型传递,并生成多个响应。然后标注器评估和排名这些响应的质量。每个生成的响应都被分配相应的奖励,该奖励用于训练另一个称为奖励模型的GPT模型。作为一个模型本身,奖励模型通过将初始提示和其中一个响应作为输入并生成一个奖励作为输出来工作。此奖励量化响应的质量或好坏程度。
在第三步中,会使用受监督细调模型的复制品来处理一个未见过的提示。这将生成一个响应,然后使用奖励模型来评估响应的排名或质量。获得的排名将用于进一步细化我们已经细调的模型。通过将排名并入PPO模型的损失函数中,可以通过反向传播更新模型的参数。特别有趣的是,这个过程不仅有助于模型表现出无害的行为,而且能够生成事实性的响应。这是因为奖励本身是基于响应质量生成的。
聊天SQL
迄今为止,已经对ChatGPT进行了快速概述。现在,让我们使用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由两个主要部分组成。首先,通过ChatGPT从给定的纯文本生成mysql查询。这些生成的查询被执行。在第二步中,评估返回数据库的结果。在此阶段,结果可以直接呈现给用户,也可以发送回ChatGPT进行进一步的分析和解释。因此,您可以使用ChatGPT聊天有关您的数据库。
假设用户想要“展示高度在175和178之间的小说类型书籍。作者不能是‘道尔,阿瑟·柯南’。”。因此,可以在这种情况下使用以下命令。
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": "表格名", "aa": "书名", "bb": "作者", "cc": "书籍类型", "dd": "书籍高度", "ee": "出版社"}
然后使用相同的命令:
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.'}
下一个项目可能是从提示(mongo,sql)生成查询的自由模型(Llama)。
项目仓库:https://github.com/ademakdogan/ChatSQL
Github: https://github.com/ademakdogan Github:https://github.com/ademakdogan
领英:https://www.linkedin.com/in/adem-akdo%C4%9Fan-948334177/
参考文献
[1] Brown, T. B.,Mann, B.,Ryder, N.,Subbiah, M.,Kaplan, J.,Dhariwal, P. 和 Amodei, D.(2020)。语言模型是少量训练的学习者。arXiv预印本arXiv:2005.14165。
[2] Radford,A.,吴,J.,Child,R.,栾,D.,Amodei,D.,Sutskever,I. (2019年)。语言模型是无监督多任务学习者。OpenAI 博客。
[3] Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N. and Polosukhin, I. (2017). 注意力机制才是关键. 在神经信息处理系统进展中 (pp. 5998-6008).
[4] Devlin,J.,Chang,M. W.,Lee,K.,& Toutanova,K.(2019)。BERT:深度双向传输器的预训练,用于语言理解。 在2019年北美计算语言学协会会议论文集:人类语言技术(第1卷,第4171-4186页)中。
[5] Lewis, M., Liu, Y., Goyal, N., Ghazvininejad, M., Mohamed, A., Levy, O., 和Zettlemoyer, L. (2019). BART:去噪声序列到序列的预训练,用于自然语言生成,翻译和理解。arXiv预印本arXiv:1910.13461。
[6] Raffel,C.,Shazeer,N.,Roberts,A.,Lee,K.,Narang,S.,Matena,M.,& Liu,P. J.(2019)。探索使用统一文本到文本转换器的迁移学习的限制。arXiv预印本arXiv:1910.10683。
[7] Vaswani, A.,及其它(2017)。Transformer-XL:超越固定长度上下文的注意力语言模型。arXiv 预印本 arXiv:1901.02860。