paint-brush
ChatSQL: ChatGPT'nin Düz Metinden SQL Sorguları Oluşturmasını Etkinleştirmeile@ademakdogan
6,995 okumalar
6,995 okumalar

ChatSQL: ChatGPT'nin Düz Metinden SQL Sorguları Oluşturmasını Etkinleştirme

ile adem17m2023/06/21
Read on Terminal Reader
Read this story w/o Javascript

Çok uzun; Okumak

Amacımız düz metin kullanarak veri tabanımızdan bilgi almaktır. Çalışmamızda hedef veritabanı olarak MySQL'i kullandık. Bununla birlikte, bu yaklaşım diğer veritabanlarında sorgu oluşturmak için de kullanılabilir. Örnek veritabanı aşağıda gösterilmiştir.
featured image - ChatSQL: ChatGPT'nin Düz Metinden SQL Sorguları Oluşturmasını Etkinleştirme
adem HackerNoon profile picture
0-item

ChatGPT Haziran 2020'de yayınlandı ve OpenAI tarafından geliştirildi. Birçok alanda devrim niteliğinde gelişmelere yol açtı. Bu alanlardan biri de veritabanı sorgularının oluşturulmasıdır. Veritabanı sorguları ChatGPT aracılığıyla düz metinden oluşturulabilmektedir. Hakkında çok az bilgi sahibi olduğunuz veritabanlarında size yardımcı olur.


Günlük hayatımıza giderek entegre olan yapay zeka, ChatGPT'nin yükselişiyle birlikte önemli bir ivme kazandı. Projeye geçmeden önce ChatGPT'yi kısaca inceleyelim.


ChatGPT'nin yeteneklerini tam olarak kavramak için, temel mimarisini sağlam bir şekilde kavramak önemlidir. ChatGPT, GPT mimarisi temel alınarak geliştirilmiştir. O halde önce transformatörlere bir göz atalım.


Projeye doğrudan erişim için burayı tıklayın.


Şekil 1. Transformatörden Kodlayıcı ve Kod Çözücü

Transformatörler, bir dizinin diğerine dönüştürülmesini sağlayan seq2seq çerçevelerini kullanır. Diziler tanımlanmış bir sıralamaya sahiptir. Örnek olarak cümleler bir kelime dizisi olarak görülebilir. Transformers ayrıca metin çevirisi gibi NLP'yi çözmek için de kullanılabilir. Bu mimariyi eğitmek için çok sayıda etiketli veriye ihtiyacımız var. Transformatörlerin bunu öğrenmesi zor olacaktır. Bu sorunu çözmek için transfer öğrenmeyi kullanabiliriz. Transformatörler iki bileşenden oluşur (Şekil 1): her ikisi de yetkin bir dil temsili elde etme konusunda uzman olan bir kodlayıcı ve bir kod çözücü.


Bu yeterlilik, her bileşenden dil modelleri oluşturmamıza olanak tanır. Kodlayıcıları istifleyerek, genellikle BERT olarak bilinen, Transformatörlerin Çift Yönlü Kodlayıcı Gösterimini elde ederiz. Benzer şekilde kod çözücü birimlerini istifleyerek GPT olan Üretken P re -Eğitim elde edebiliriz. Bizim durumumuzda GPT'ye odaklanıyoruz. Transfer öğrenimini GPT bağlamında düşünelim. Bir modeli sıfırdan eğittiğimizde, parametreler başlangıçta rastgele ayarlandığından genellikle önemli miktarda veri gerektirir. Ancak parametrelerin tesadüfen ihtiyaç duyduğumuz değerlerle hizalandığı bir senaryo hayal edin. Bu gibi durumlarda istediğimiz sonuca ulaşmak için kapsamlı bir veri setine ihtiyacımız yok. Anlaşılacağı üzere transfer öğrenme kavramında BERT ve GPT kullanılmaktadır.


GPT eğitimi bu nedenle iki bölüme ayrılmıştır. Dilin ne olduğunu anlamak için GPT mimarisini eğittiğimiz bir ön eğitim bölümümüz var ve ardından GPT mimarisini belirli dil görevlerinde iyi performans gösterecek şekilde daha fazla eğitmek için transfer öğrenimini kullandığımız ince ayar bölümümüz var.


Şekil 2. Örnek sonraki kelime tahmini

GPT, rastgele kelime dizilerini girdi olarak alan ve bir sonraki en uygun kelimeyi tahmin eden bir yapıya sahiptir. Örnek tahmin Şekil 2'de görülebilir.


Dil modelleme, dilin temel yönlerini anlamak için ideal bir temel olarak seçilmiştir ve kolaylıkla ince ayar yapılabilir. Cümlelerin kendisi hem giriş hem de çıkış etiketi olarak hizmet ettiğinden, genellikle kendi kendini denetleyen bir görev olarak bilinir.

Şekil 3. ChatGPT diyagramı — Kaynak


ChatGPT'ye geçelim. Şekil 3'te görülebileceği gibi, ChatGPT sürecinin tamamı üç ana adıma ayrılabilir. İlk adımda dilin kendisini anlama konusunda önceden eğitilmiş GPT modeli kullanılır. Bir sonraki adım, kullanıcı istemlerini etkili bir şekilde işlemek ve bu istemlere dayalı olarak uygun yanıtlar oluşturmak için modelde ince ayar yapmayı içerir. Bu süreci kolaylaştırmak için etiketli veriler, yalnızca yönlendirme sağlamakla kalmayıp aynı zamanda her istem için istenen yanıtı da belirten etiketleyicilerin katılımıyla elde edilir. Bu, hem giriş komutları hem de karşılık gelen çıkış yanıtları olduğundan, GPT modelinin denetimli ince ayarının yapılmasına olanak tanır.


Bir sonraki adımda, ilk adımdan elde edilen denetimli ince ayarlı model kullanılır. Modelden tek bir bilgi istemi iletilir ve birden fazla yanıt oluşturulur. Etiketleyici daha sonra bu yanıtların kalitesini değerlendirir ve sıralar. Oluşturulan her yanıta karşılık gelen bir ödül atanır ve bu ödül, ödül modeli olarak bilinen başka bir GPT modelini eğitmek için kullanılır. Kendisi bir model olan ödül modeli, başlangıçtaki bir ipucunu ve yanıtlardan birini girdi olarak alıp, çıktı olarak bir ödül üreterek çalışır. Bu ödül, yanıtın kalitesini veya iyiliğini ölçer.


Üçüncü adımda, görünmeyen bir istem alınacak ve denetlenen ince ayarlı modelin bir kopyasından geçirilecektir. Bu, bir yanıt oluşturacak ve bu yanıt, daha sonra sıralamasını veya kalitesini belirlemek için bir ödül modeli kullanılarak değerlendirilecektir. Elde edilen sıralama, halihazırda ince ayarlı olan modelimizi daha da geliştirmek için kullanılacaktır. Bu, sıralamanın PPO modelinin kayıp fonksiyonuna dahil edilmesiyle elde edilir ve geriye yayılım yoluyla modelin parametrelerinin güncellenmesine izin verilir. Özellikle büyüleyici olan şey, bu sürecin yalnızca modelin toksik olmayan davranışlar sergilemesine yardımcı olmakla kalmayıp aynı zamanda gerçek yanıtlar üretmesine de olanak sağlamasıdır. Bunun nedeni, ödülün kendisinin yanıtın kalitesine göre oluşturulmuş olmasıdır.

ChatSQL

Şimdi Python kullanarak ChatGPT ile bir proje yapalım. Bu proje için LangChain çerçevesi kullanıldı.


Amacımız düz metin kullanarak veri tabanımızdan bilgi almaktır. Çalışmamızda hedef veritabanı olarak MySQL'i kullandık. Bununla birlikte, bu yaklaşım diğer veritabanlarında sorgu oluşturmak için de kullanılabilir. Örnek veritabanı aşağıda gösterilmiştir.


Tüm kodları burada bulabilirsiniz ( 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 iki ana bölümden oluşur. Öncelikle ChatGPT aracılığıyla verilen düz metinden mysql sorguları oluşturulur. Oluşturulan bu sorgular yürütülür. İkinci aşamada veritabanına dönen sonuçlar değerlendirilir. Bu aşamada sonuçlar doğrudan kullanıcıya sunulabilir veya daha fazla analiz ve yorum için ChatGPT'ye geri gönderilebilir. Böylece ChatGPT ile veritabanınız hakkında sohbet edebilirsiniz.


Diyelim ki kullanıcı “Bana yüksekliği 175'ten büyük ve 178'den küçük olan kitap türü kurguyu göster. Yazarı 'Doyle, Arthur Conan' olmamalı.” istiyor. Yani bu durumda aşağıdaki komut kullanılabilir.


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


Sonuç olarak aşağıdaki bilgiler elde edilir.

 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.


Veritabanı sütunlarınız uygun şekilde adlandırılmışsa, chatgpt bu adları anlayacak ve sorgulara buna göre yanıt verecektir. Ancak veritabanındaki sütun adlarının anlamlı olmadığı veya ChatGPT'nin bağlamlarını tam olarak çözemediği durumlar olabilir. Bu nedenle sistemin doğru çalışmasını sağlamak için ChatGPT'ye veritabanı hakkında ön bilgilerin sağlanması gerekmektedir. Info.json dosyası bilgi eklemek için kullanılabilir.

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

Örnek olarak aşağıdaki gibi kötü isimlendirilmiş bir veritabanımız olsun. Bu durumda veritabanı ile ilgili gerekli bilgiler info.json dosyasına girilir.


{“bt”: “Tablo Adı”, “aa”: “Kitabın Başlığı”, “bb”: “Kitabın Yazarı”, “cc”: “Kitabın Türü”, “dd”: “Yüksekliği” kitap”, “ee”: “Kitap Yayıncısı”}

ve sonra aynı komutu kullanın:

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


Veritabanındaki sütun adları kötü seçilmiş olsa bile, doğru bilgiyi sağladığımız için chatgpt doğru sorguyu oluşturur

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


Bir sonraki proje, ücretsiz modellerle (Llama) bilgi istemlerinden sorgular (mongo, sql) üretme üzerine olabilir.


Proje Repo : https://github.com/ademakdogan/ChatSQL

Github : https://github.com/ademakdogan

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

Referanslar

[1] Brown, TB, Mann, B., Ryder, N., Subbiah, M., Kaplan, J., Dhariwal, P. ve Amodei, D. (2020). Dil modelleri az sayıda öğrenenlerdir. arXiv ön baskı arXiv:2005.14165.


[2] Radford, A., Wu, J., Child, R., Luan, D., Amodei, D., Sutskever, I. (2019). Dil modelleri denetimsiz çoklu görev öğrenicileridir. OpenAI Blogu.


[3] Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, AN ve Polosukhin, I. (2017). İhtiyacınız olan tek şey dikkat. Nöral bilgi işleme sistemlerindeki gelişmeler (s. 5998–6008).


[4] Devlin, J., Chang, MW, Lee, K. ve Toutanova, K. (2019). BERT: Dilin anlaşılması için derin çift yönlü transformatörlerin ön eğitimi. Hesaplamalı Dilbilim Derneği'nin Kuzey Amerika Bölümü 2019 Konferansı Bildirilerinde: İnsan Dili Teknolojileri (Cilt 1, s. 4171–4186).


[5] Lewis, M., Liu, Y., Goyal, N., Ghazvininejad, M., Mohamed, A., Levy, O. ve Zettlemoyer, L. (2019). BART: Doğal dil oluşturma, çeviri ve anlama için diziden diziye gürültü giderme ön eğitimi. arXiv ön baskı arXiv:1910.13461.


[6] Raffel, C., Shazeer, N., Roberts, A., Lee, K., Narang, S., Matena, M., … & Liu, PJ (2019). Birleşik bir metinden metne dönüştürücüyle aktarım öğreniminin sınırlarını keşfetme. arXiv ön baskı arXiv:1910.10683.


[7] Vaswani, A. ve ark. (2017). Transformer-XL: Sabit uzunluklu bir bağlamın ötesinde özenli dil modelleri. arXiv ön baskı arXiv:1901.02860.