paint-brush
ChatSQL : habilitando o ChatGPT para gerar consultas SQL a partir de texto simplespor@ademakdogan
6,963 leituras
6,963 leituras

ChatSQL : habilitando o ChatGPT para gerar consultas SQL a partir de texto simples

por adem17m2023/06/21
Read on Terminal Reader

Muito longo; Para ler

Nosso objetivo é recuperar informações de nosso banco de dados usando texto simples. Em nosso trabalho, utilizamos o MySQL como banco de dados de destino. No entanto, essa abordagem também pode ser usada para gerar consultas em outros bancos de dados. O banco de dados de exemplo é mostrado abaixo.
featured image - ChatSQL : habilitando o ChatGPT para gerar consultas SQL a partir de texto simples
adem HackerNoon profile picture
0-item

O ChatGPT foi lançado em junho de 2020 e é desenvolvido pela OpenAI. Isso levou a desenvolvimentos revolucionários em muitas áreas. Uma dessas áreas é a criação de consultas ao banco de dados. As consultas ao banco de dados podem ser geradas a partir de texto simples via ChatGPT . Ele ajuda você com bancos de dados sobre os quais você tem pouco conhecimento.


A inteligência artificial, que se integrou progressivamente ao nosso dia a dia, ganhou um impulso significativo com o surgimento do ChatGPT. Antes de entrar no projeto, vamos explorar brevemente o ChatGPT.


Para compreender totalmente os recursos do ChatGPT, é essencial ter uma compreensão sólida de sua arquitetura subjacente. ChatGPT foi desenvolvido com base na arquitetura GPT . Então, vamos dar uma olhada nos transformadores primeiro.


Para acesso direto ao projeto, clique aqui .


Fig 1. Codificador e Decodificador do Transformador

Os transformadores utilizam estruturas seq2seq, permitindo a conversão de uma sequência em outra. As sequências têm ordem definida. Como ilustração, as frases podem ser vistas como uma sucessão de palavras. Os Transformers também podem ser usados para resolver NLP, como tradução de texto. Precisamos de muitos dados rotulados para treinar essa arquitetura. Isso seria difícil para os transformadores aprenderem. Podemos usar o aprendizado por transferência para resolver esse problema. Os transformadores consistem em dois componentes (Fig 1): um codificador e um decodificador, ambos hábeis em adquirir uma representação de linguagem proficiente.


Essa proficiência nos permite construir modelos de linguagem de cada componente. Ao empilhar os encoders, obtemos uma R epresentação do Encoder Bidirecional de Transformadores , comumente conhecida como BERT . Da mesma forma, ao empilhar as unidades decodificadoras, podemos obter o P re- treinamento generativo , que é o GPT. No nosso caso, estamos nos concentrando no GPT. Vamos pensar sobre a aprendizagem por transferência no contexto da GPT. Quando treinamos um modelo do zero, ele geralmente exige uma quantidade substancial de dados, pois os parâmetros são inicialmente definidos aleatoriamente. No entanto, imagine um cenário em que os parâmetros se alinhem fortuitamente com os valores que exigimos. Nesses casos, não precisamos de um extenso conjunto de dados para atingir o resultado desejado. Como será entendido, BERT e GPT são usados no conceito de aprendizagem por transferência.


O treinamento GPT é, portanto, dividido em duas partes. Temos a parte de pré-treinamento em que treinamos a arquitetura GPT para entender o que é linguagem e, em seguida, a parte de ajuste fino em que usamos o aprendizado de transferência para treinar ainda mais a arquitetura GPT para um bom desempenho em tarefas específicas de linguagem


Fig 2. Exemplo de previsão da próxima palavra

O GPT tem uma estrutura que recebe sequências de palavras aleatórias como entrada e prevê a próxima palavra mais adequada. A previsão da amostra pode ser vista na Fig. 2.


A modelagem de linguagem é selecionada como uma base ideal para entender os aspectos fundamentais da linguagem e pode ser facilmente ajustada. É comumente conhecida como uma tarefa auto-supervisionada, pois as próprias sentenças servem como rótulos de entrada e saída.

Fig 3. Diagrama do ChatGPT — Fonte


Vamos passar para o ChatGPT. Como pode ser visto na Figura 3., todo o processo do ChatGPT pode ser dividido em três grandes etapas. Na primeira etapa, é usado o modelo GPT que foi pré-treinado para entender a própria linguagem. A próxima etapa envolve o ajuste fino do modelo para processar com eficiência os prompts do usuário e gerar respostas apropriadas com base nesses prompts. Para facilitar esse processo, os dados rotulados são obtidos envolvendo rotuladores que não apenas fornecem prompts, mas também especificam a resposta desejada para cada prompt. Isso permite o envolvimento no ajuste fino supervisionado do modelo GPT, pois há prompts de entrada e respostas de saída correspondentes.


Na próxima etapa, é utilizado o modelo supervisionado de ajuste fino que foi obtido na primeira etapa. Um único prompt é passado pelo modelo e várias respostas são geradas. O rotulador então avalia e classifica a qualidade dessas respostas. Cada resposta gerada recebe uma recompensa correspondente, que é utilizada para treinar outro modelo GPT conhecido como modelo de recompensas. Sendo um modelo em si, o modelo de recompensas funciona tomando um prompt inicial e uma das respostas como entrada e gerando uma recompensa como saída. Essa recompensa quantifica a qualidade ou bondade da resposta.


Na terceira etapa, um prompt invisível será obtido e passado por uma réplica do modelo de ajuste fino supervisionado. Isso gerará uma resposta, que será então avaliada usando um modelo de recompensas para determinar sua classificação ou qualidade. A classificação obtida será usada para refinar ainda mais nosso modelo já ajustado. Isso é obtido incorporando a classificação na função de perda do modelo PPO, permitindo atualizações nos parâmetros do modelo por meio de retropropagação. O que é particularmente fascinante é que esse processo não apenas ajuda o modelo a exibir um comportamento não tóxico, mas também permite que ele gere respostas factuais. Isso ocorre porque a própria recompensa foi gerada com base na qualidade da resposta.

ChatSQL

Agora vamos fazer um projeto com ChatGPT usando python. A estrutura LangChain é usada para este projeto.


Nosso objetivo é recuperar informações de nosso banco de dados usando texto simples. Em nosso trabalho, utilizamos o MySQL como banco de dados de destino. No entanto, essa abordagem também pode ser usada para gerar consultas em outros bancos de dados. O banco de dados de amostra é mostrado abaixo.


Todos os códigos podem ser encontrados aqui ( 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 | | . | ....... | ....... | .... | ... | .... | | . | ....... | ....... | .... | ... | .... |

O ChatSQL consiste em duas partes principais. Em primeiro lugar, as consultas mysql são geradas a partir do texto simples fornecido via ChatGPT. Essas consultas geradas são executadas. Na segunda etapa, os resultados retornados no banco de dados são avaliados. Nesta fase, os resultados podem ser apresentados diretamente ao usuário ou enviados de volta ao ChatGPT para posterior análise e interpretação. Então você pode conversar sobre seu banco de dados com ChatGPT.


Suponha que o usuário queira “Mostre-me o tipo de livro de ficção cuja altura é maior que 175 e menor que 178. O autor não deve ser 'Doyle, Arthur Conan'.”. Portanto, o seguinte comando pode ser usado neste caso.


 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'. '


Como resultado, as seguintes informações são obtidas.

 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.


Se as colunas do banco de dados forem nomeadas apropriadamente, o chatgpt entenderá esses nomes e responderá às consultas de acordo. No entanto, pode haver instâncias em que os nomes das colunas no banco de dados não são significativos ou o ChatGPT pode não entender completamente seu contexto. Assim, para garantir o bom funcionamento do sistema, é necessário fornecer ao ChatGPT informações prévias sobre o banco de dados. O arquivo Info.json pode ser usado para adicionar informações.

 +-----+--------------------------------------------------------+------------------------+-------------------+------+------------------+ | 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 | | . | ....... | ....... | .... | ... | .... | | . | ....... | ....... | .... | ... | .... |

Como exemplo, vamos ter um banco de dados mal nomeado conforme abaixo. Nesse caso, as informações necessárias sobre o banco de dados são inseridas no arquivo info.json.


{“bt”: “Nome da tabela”, “aa”: “Título do livro”, “bb”: “Autor do livro”, “cc”: “Tipo de livro”, “dd”: “Altura do livro”, “ee”: “Editora do livro”}

e depois use o mesmo comando:

 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'. '


Mesmo que os nomes das colunas no banco de dados sejam mal selecionados, o chatgpt gera a consulta correta porque fornecemos as informações corretas

 {'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.'}


O próximo projeto pode ser gerar consultas (mongo, sql) a partir de prompts com modelos livres (Llama).


Repositório do projeto: https://github.com/ademakdogan/ChatSQL

Github: https://github.com/ademakdogan

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

Referências

[1] Brown, TB, Mann, B., Ryder, N., Subbiah, M., Kaplan, J., Dhariwal, P. e Amodei, D. (2020). Os modelos de linguagem são aprendizes de poucos tiros. pré-impressão arXiv arXiv:2005.14165.


[2] Radford, A., Wu, J., Child, R., Luan, D., Amodei, D., Sutskever, I. (2019). Os modelos de linguagem são aprendizes multitarefa não supervisionados. OpenAI Blog.


[3] Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, AN e Polosukhin, I. (2017). Atenção é tudo que você precisa. Em Avanços em sistemas de processamento de informações neurais (pp. 5998–6008).


[4] Devlin, J., Chang, MW, Lee, K., & Toutanova, K. (2019). BERT: Pré-treinamento de transformadores bidirecionais profundos para compreensão da linguagem. In Proceedings of the 2019 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies (Vol. 1, pp. 4171–4186).


[5] Lewis, M., Liu, Y., Goyal, N., Ghazvininejad, M., Mohamed, A., Levy, O., & Zettlemoyer, L. (2019). BART: Denoising pré-treinamento de sequência a sequência para geração, tradução e compreensão de linguagem natural. pré-impressão arXiv arXiv:1910.13461.


[6] Raffel, C., Shazeer, N., Roberts, A., Lee, K., Narang, S., Matena, M., … & Liu, PJ (2019). Explorando os limites do aprendizado por transferência com um transformador unificado de texto para texto. pré-impressão arXiv arXiv:1910.10683.


[7] Vaswani, A., & et al. (2017). Transformer-XL: Modelos de linguagem atenta além de um contexto de tamanho fixo. pré-impressão arXiv arXiv:1901.02860.