paint-brush
ChatSQL:启用 ChatGPT 从纯文本生成 SQL 查询经过@ademakdogan
6,292 讀數
6,292 讀數

ChatSQL:启用 ChatGPT 从纯文本生成 SQL 查询

经过 adem17m2023/06/21
Read on Terminal Reader

太長; 讀書

我们的目标是使用纯文本从我们的数据库中检索信息。在我们的工作中,我们使用 MySQL 作为目标数据库。尽管如此,这种方法也可用于生成对其他数据库的查询。示例数据库如下所示。
featured image - ChatSQL:启用 ChatGPT 从纯文本生成 SQL 查询
adem HackerNoon profile picture
0-item

ChatGPT 于 2020 年 6 月发布,由 OpenAI 开发。它导致了许多领域的革命性发展。这些领域之一是创建数据库查询。数据库查询可以通过ChatGPT从纯文本生成。它可以帮助您处理您知之甚少的数据库。


随着 ChatGPT 的兴起,人工智能已经逐渐融入我们的日常生活,并获得了巨大的发展势头。在进入该项目之前,让我们简要了解一下 ChatGPT。


要充分理解 ChatGPT 的功能,必须牢牢掌握其底层架构。 ChatGPT 是基于GPT架构开发的。所以让我们先来看看变压器。


要直接访问该项目,请单击此处


图 1. Transformer 的编码器和解码器

Transformer 利用 seq2seq 框架,可以将一个序列转换为另一个序列。序列已定义顺序。例如,句子可以看作是一连串的单词。 Transformers也可以用来解决文本翻译等NLP。我们需要大量标记数据来训练这个架构。这对于变形金刚来说很难学习。我们可以使用迁移学习来解决这个问题。 Transformer 由两个组件组成(图 1):一个编码器和一个解码器,两者都擅长获取熟练的语言表示。


这种熟练程度使我们能够从每个组件构建语言模型。通过堆叠编码器,我们获得了一个B idirectional Encoder R epresentation of Transformers ,通常称为BERT 类似地,通过堆叠解码器单元,我们可以实现G generative P re- T raining 即 GPT。在我们的案例中,我们专注于 GPT。让我们考虑一下 GPT 背景下的迁移学习。当我们从头开始训练模型时,它通常需要大量数据,因为参数最初是随机设置的。但是,想象一下参数偶然与我们需要的值一致的情况。在这种情况下,我们不需要大量的数据集来获得我们想要的结果。可以理解,BERT 和 GPT 用于迁移学习概念。


GPT培训因此分为两部分。我们有预训练部分,我们训练 GPT 架构以了解什么是语言,然后进行微调部分,我们使用迁移学习进一步训练 GPT 架构以在特定语言任务上表现良好


图 2. 下一个单词预测样本

GPT 的结构以随机词序列作为输入并预测下一个最合适的词。样本预测见图 2。


语言建模被选为理解语言基本方面的理想基础,并且可以很容易地进行微调。它通常被称为自监督任务,因为句子本身既充当输入标签又充当输出标签。

图 3. ChatGPT 图 — Source


让我们继续讨论 ChatGPT。如图 3 所示,整个 ChatGPT 流程可以分为三个主要步骤。第一步,使用经过预训练的 GPT 模型来理解语言本身。下一步涉及微调模型以有效地处理用户提示并根据这些提示生成适当的响应。为了促进这一过程,标记数据是通过聘请标记者获得的,标记者不仅提供提示,而且还为每个提示指定所需的响应。这允许对 GPT 模型进行有监督的微调,因为既有输入提示也有相应的输出响应。


在下一步中,使用从第一步获得的监督微调模型。单个提示通过模型,并生成多个响应。然后,贴标签者对这些响应的质量进行评估和排名。每个生成的响应都会分配一个相应的奖励,该奖励用于训练另一个称为奖励模型的 GPT 模型。作为模型本身,奖励模型通过将初始提示和其中一个响应作为输入并生成奖励作为输出来发挥作用。该奖励量化了响应的质量或优点。


在第三步中,一个看不见的提示将被获取并通过一个监督微调模型的副本。这将生成一个响应,然后将使用奖励模型对其进行评估以确定其排名或质量。获得的排名将用于进一步完善我们已经微调的模型。这是通过将等级纳入 PPO 模型的损失函数来实现的,允许通过反向传播更新模型的参数。特别令人着迷的是,这个过程不仅帮助模型表现出无毒行为,而且使其能够产生事实反应。这是因为奖励本身是根据响应的质量生成的。

聊天数据库

现在让我们使用 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, VP | 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, HG | 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”:“表名”,“aa”:“书名”,“bb”:“书的作者”,“cc”:“书的类型”,“dd”:“书的高度” book", "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.'}


下一个项目可能是使用免费模型 (Llama) 从提示生成查询(mongo、sql)。


项目回购: https: //github.com/ademakdogan/ChatSQL

Github: https: //github.com/ademakdogan

领英: https://www.linkedin.com/in/adem-akdoğan-948334177/

参考

[1] Brown, TB、Mann, B.、Ryder, N.、Subbiah, M.、Kaplan, J.、Dhariwal, P. 和 Amodei, D.(2020)。语言模型是少样本学习者。 arXiv 预印本 arXiv:2005.14165。


[2] Radford, A.、Wu, J.、Child, R.、Luan, D.、Amodei, D.、Sutskever, I.(2019)。语言模型是无监督的多任务学习者。 OpenAI 博客。


[3] Vaswani, A.、Shazeer, N.、Parmar, N.、Uszkoreit, J.、Jones, L.、Gomez, AN 和 Polosukhin, I.(2017 年)。注意力就是你所需要的。在神经信息处理系统的进展中(第 5998-6008 页)。


[4] Devlin, J., Chang, MW, 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, PJ (2019)。使用统一的文本到文本转换器探索迁移学习的局限性。 arXiv 预印本 arXiv:1910.10683。


[7] Vaswani, A., & 等人。 (2017)。 Transformer-XL:超出固定长度上下文的注意力语言模型。 arXiv 预印本 arXiv:1901.02860。