paint-brush
ChatSQL – Activation de ChatGPT pour générer des requêtes SQL à partir de texte brutpar@ademakdogan
6,300 lectures
6,300 lectures

ChatSQL – Activation de ChatGPT pour générer des requêtes SQL à partir de texte brut

par adem17m2023/06/21
Read on Terminal Reader

Trop long; Pour lire

Notre objectif est de récupérer les informations de notre base de données en utilisant du texte brut. Dans notre travail, nous avons utilisé MySQL comme base de données cible. Néanmoins, cette approche peut également être utilisée pour générer des requêtes sur d'autres bases de données. L'exemple de base de données est présenté ci-dessous.
featured image - ChatSQL – Activation de ChatGPT pour générer des requêtes SQL à partir de texte brut
adem HackerNoon profile picture
0-item

ChatGPT est sorti en juin 2020 et il est développé par OpenAI. Elle a conduit à des développements révolutionnaires dans de nombreux domaines. L'un de ces domaines est la création de requêtes de base de données. Les requêtes de base de données peuvent être générées à partir de texte brut via ChatGPT . Il vous aide avec des bases de données dont vous avez peu de connaissances.


L'intelligence artificielle, qui s'est progressivement intégrée à notre quotidien, a pris un essor important avec l'essor de ChatGPT. Avant de passer au projet, explorons brièvement ChatGPT.


Pour bien comprendre les capacités de ChatGPT, il est essentiel de bien comprendre son architecture sous-jacente. ChatGPT a été développé sur la base de l'architecture GPT . Voyons donc d'abord les transformateurs.


Pour un accès direct au projet, cliquez ici .


Fig 1. Encodeur et décodeur du transformateur

Les transformateurs utilisent des cadres seq2seq, permettant la conversion d'une séquence en une autre. Les séquences ont un ordre défini. A titre d'illustration, les phrases peuvent être vues comme une succession de mots. Les transformateurs peuvent également être utilisés pour résoudre le NLP tel que la traduction de texte. Nous avons besoin de beaucoup de données étiquetées pour entraîner cette architecture. Cela serait difficile à apprendre pour les transformateurs. Nous pouvons utiliser l'apprentissage par transfert pour résoudre ce problème. Les transformateurs se composent de deux composants (Fig 1) : un encodeur et un décodeur, tous deux aptes à acquérir une représentation linguistique compétente.


Cette maîtrise nous permet de construire des modèles de langage à partir de chaque composant. En empilant les encodeurs, nous obtenons une représentation d' encodeur bidirectionnelle des transformateurs, communément appelée BERT . De même, en empilant les unités de décodage, nous pouvons réaliser un pré- entraînement génératif qui est GPT. Dans notre cas, nous nous concentrons sur GPT. Pensons à l'apprentissage par transfert dans le contexte de GPT. Lorsque nous entraînons un modèle à partir de zéro, cela nécessite généralement une quantité importante de données car les paramètres sont initialement définis de manière aléatoire. Cependant, imaginez un scénario où les paramètres s'alignent fortuitement sur les valeurs dont nous avons besoin. Dans de tels cas, nous n'avons pas besoin d'un ensemble de données étendu pour atteindre le résultat souhaité. Comme on le comprendra, BERT et GPT sont utilisés dans le concept d'apprentissage par transfert.


La formation GPT est ainsi divisée en deux parties. Nous avons une partie de pré-formation où nous formons l'architecture GPT pour comprendre ce qu'est la langue, puis une partie de réglage fin où nous utilisons l'apprentissage par transfert pour former davantage l'architecture GPT afin qu'elle fonctionne bien sur des tâches linguistiques spécifiques


Fig 2. Exemple de prédiction du mot suivant

GPT a une structure qui prend des séquences de mots aléatoires en entrée et prédit le prochain mot le plus approprié. La prédiction de l'échantillon peut être vue à la Fig 2.


La modélisation du langage est sélectionnée comme une base idéale pour comprendre les aspects fondamentaux du langage et peut être facilement affinée. Il est communément appelé tâche auto-supervisée puisque les phrases elles-mêmes servent à la fois d'étiquettes d'entrée et de sortie.

Fig 3. Diagramme ChatGPT — Source


Passons à ChatGPT. Comme on peut le voir sur la figure 3., l'ensemble du processus ChatGPT peut être divisé en trois étapes principales. Dans la première étape, le modèle GPT est utilisé qui a été pré-formé sur la compréhension du langage lui-même. L'étape suivante consiste à affiner le modèle pour traiter efficacement les invites de l'utilisateur et générer des réponses appropriées en fonction de ces invites. Pour faciliter ce processus, les données étiquetées sont obtenues en engageant des étiqueteurs qui non seulement fournissent des invites, mais spécifient également la réponse souhaitée pour chaque invite. Cela permet de s'engager dans un réglage fin supervisé du modèle GPT, car il existe à la fois des invites d'entrée et des réponses de sortie correspondantes.


Dans l'étape suivante, le modèle affiné supervisé est utilisé tel qu'il a été obtenu à partir de la première étape. Une seule invite est transmise à travers le modèle et plusieurs réponses sont générées. L'étiqueteur évalue et classe ensuite la qualité de ces réponses. Chaque réponse générée se voit attribuer une récompense correspondante, qui est utilisée pour former un autre modèle GPT connu sous le nom de modèle de récompenses. Étant lui-même un modèle, le modèle de récompenses fonctionne en prenant une invite initiale et l'une des réponses en entrée et en générant une récompense en sortie. Cette récompense quantifie la qualité ou la qualité de la réponse.


Dans la troisième étape, une invite invisible sera prise et transmise à une réplique du modèle affiné supervisé. Cela générera une réponse, qui sera ensuite évaluée à l'aide d'un modèle de récompenses pour déterminer son rang ou sa qualité. Le classement obtenu servira à affiner davantage notre modèle déjà affiné. Ceci est réalisé en incorporant le rang dans la fonction de perte du modèle PPO, permettant des mises à jour des paramètres du modèle par rétropropagation. Ce qui est particulièrement fascinant, c'est que ce processus aide non seulement le modèle à présenter un comportement non toxique, mais lui permet également de générer des réponses factuelles. En effet, la récompense elle-même a été générée en fonction de la qualité de la réponse.

ChatSQL

Faisons maintenant un projet avec ChatGPT en utilisant python. Le framework LangChain est utilisé pour ce projet.


Notre objectif est de récupérer les informations de notre base de données en utilisant du texte brut. Dans notre travail, nous avons utilisé MySQL comme base de données cible. Néanmoins, cette approche peut également être utilisée pour générer des requêtes sur d'autres bases de données. L'exemple de base de données est illustré ci-dessous.


Tous les codes peuvent être trouvés ici ( 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 | | . | ....... | ....... | .... | ... | .... | | . | ....... | ....... | .... | ... | .... |

Le ChatSQL se compose de deux parties principales. Tout d'abord, les requêtes mysql sont générées à partir du texte brut donné via ChatGPT. Ces requêtes générées sont exécutées. Dans la deuxième étape, les résultats renvoyés dans la base de données sont évalués. À ce stade, les résultats peuvent être présentés directement à l'utilisateur ou renvoyés à ChatGPT pour une analyse et une interprétation plus approfondies. Vous pouvez donc discuter de votre base de données avec ChatGPT.


Supposons que l'utilisateur veuille "Montrez-moi la fiction de type livre dont la hauteur est supérieure à 175 et inférieure à 178. L'auteur ne doit pas être 'Doyle, Arthur Conan'.". La commande suivante peut donc être utilisée dans ce cas.


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


En conséquence, les informations suivantes sont obtenues.

 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.


Si vos colonnes de base de données sont nommées de manière appropriée, chatgpt comprendra ces noms et répondra aux requêtes en conséquence. Cependant, il peut y avoir des cas où les noms de colonne dans la base de données ne sont pas significatifs ou ChatGPT peut ne pas comprendre complètement leur contexte. Par conséquent, afin de garantir le bon fonctionnement du système, il est nécessaire de fournir à ChatGPT des informations préalables sur la base de données. Le fichier Info.json peut être utilisé pour ajouter des informations.

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

A titre d'exemple, prenons une base de données mal nommée comme ci-dessous. Dans ce cas, les informations requises sur la base de données sont entrées dans le fichier info.json.


{« bt » : « Nom de la table », « aa » : « Titre du livre », « bb » : « Auteur du livre », « cc » : « Type de livre », « dd » : « Hauteur du livre", "ee": "Éditeur de livres"}

puis utilisez la même commande :

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


Même si les noms de colonnes dans la base de données sont mal sélectionnés, chatgpt génère la bonne requête car nous fournissons les bonnes informations

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


Le prochain projet pourrait être de générer des requêtes (mongo, sql) à partir d'invites avec des modèles gratuits (Llama).


Référentiel du projet : https://github.com/ademakdogan/ChatSQL

Github : https://github.com/ademakdogan

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

Les références

[1] Brown, TB, Mann, B., Ryder, N., Subbiah, M., Kaplan, J., Dhariwal, P. et Amodei, D. (2020). Les modèles de langage sont des apprenants peu nombreux. prétirage arXiv arXiv:2005.14165.


[2] Radford, A., Wu, J., Child, R., Luan, D., Amodei, D., Sutskever, I. (2019). Les modèles linguistiques sont des apprenants multitâches non supervisés. Blog OpenAI.


[3] Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, AN et Polosukhin, I. (2017). L'attention est tout ce dont vous avez besoin. Dans les progrès des systèmes de traitement de l'information neuronale (pp. 5998–6008).


[4] Devlin, J., Chang, MW, Lee, K. et Toutanova, K. (2019). BERT : Pré-formation de transformateurs bidirectionnels profonds pour la compréhension du langage. Dans Actes de la conférence 2019 de la section nord-américaine de l'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. et Zettlemoyer, L. (2019). BART : pré-formation de séquence à séquence de débruitage pour la génération, la traduction et la compréhension du langage naturel. prétirage arXiv arXiv:1910.13461.


[6] Raffel, C., Shazeer, N., Roberts, A., Lee, K., Narang, S., Matena, M., … & Liu, PJ (2019). Explorer les limites de l'apprentissage par transfert avec un transformateur texte-texte unifié. prétirage arXiv arXiv:1910.10683.


[7] Vaswani, A., & et al. (2017). Transformer-XL : modèles de langage attentifs au-delà d'un contexte de longueur fixe. prétirage arXiv arXiv:1901.02860.