paint-brush
ChatSQL: ChatGPT를 활성화하여 일반 텍스트에서 SQL 쿼리 생성~에 의해@ademakdogan
6,997 판독값
6,997 판독값

ChatSQL: ChatGPT를 활성화하여 일반 텍스트에서 SQL 쿼리 생성

~에 의해 adem17m2023/06/21
Read on Terminal Reader
Read this story w/o Javascript

너무 오래; 읽다

우리의 목표는 일반 텍스트를 사용하여 데이터베이스에서 정보를 검색하는 것입니다. 우리 작업에서는 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를 해결하는 데에도 사용할 수 있습니다. 이 아키텍처를 훈련하려면 레이블이 지정된 데이터가 많이 필요합니다. 이는 변압기가 배우기 어려울 것입니다. 전이 학습을 사용하여 이 문제를 해결할 수 있습니다. 변환기는 인코더와 디코더의 두 가지 구성 요소(그림 1)로 구성되며 둘 다 능숙한 언어 표현을 획득하는 데 적합합니다.


이러한 능숙함을 통해 우리는 각 구성 요소에서 언어 모델을 구성할 수 있습니다. 인코더를 쌓아서 우리는 일반적으로 BERT 로 알려진 트랜스포머양방향 인코더 표현 을 얻습니다. 마찬가지로 디코더 유닛을 적층함으로써 GPT생성적 사전 예측 을 달성할 수 있습니다. 우리의 경우에는 GPT에 중점을 두고 있습니다. GPT의 맥락에서 전이 학습을 생각해 봅시다. 모델을 처음부터 훈련할 때 매개변수가 처음에 무작위로 설정되므로 일반적으로 상당한 양의 데이터가 필요합니다. 그러나 매개변수가 필요한 값과 우연히 일치하는 시나리오를 상상해 보십시오. 이러한 경우 원하는 결과를 얻기 위해 광범위한 데이터 세트가 필요하지 않습니다. 이해되듯이 BERT와 GPT는 전이 학습 개념에 사용됩니다.


따라서 GPT 교육은 두 부분으로 나누어집니다. 언어가 무엇인지 이해하기 위해 GPT 아키텍처를 교육하는 사전 교육 부분과 특정 언어 작업을 잘 수행할 수 있도록 GPT 아키텍처를 추가로 교육하기 위해 전이 학습을 사용하는 미세 조정 부분이 있습니다.


그림 2. 다음 단어 예측 샘플

GPT는 임의의 단어 시퀀스를 입력으로 받아 다음으로 가장 적합한 단어를 예측하는 구조를 가지고 있습니다. 샘플 예측은 그림 2에서 볼 수 있습니다.


언어 모델링은 언어의 기본 측면을 이해하기 위한 이상적인 기반으로 선택되었으며 쉽게 미세 조정할 수 있습니다. 문장 자체가 입력 및 출력 레이블 역할을 하기 때문에 일반적으로 자기 지도 작업으로 알려져 있습니다.

그림 3. ChatGPT 다이어그램 — 출처


ChatGPT로 넘어가겠습니다. 그림 3에서 볼 수 있듯이 전체 ChatGPT 프로세스는 세 가지 주요 단계로 나눌 수 있습니다. 첫 번째 단계에서는 언어 자체를 이해하도록 사전 훈련된 GPT 모델이 사용됩니다. 다음 단계에서는 사용자 프롬프트를 효과적으로 처리하고 해당 프롬프트를 기반으로 적절한 응답을 생성하도록 모델을 미세 조정하는 작업이 포함됩니다. 이 프로세스를 용이하게 하기 위해 프롬프트를 제공할 뿐만 아니라 각 프롬프트에 대해 원하는 응답을 지정하는 라벨러를 참여시켜 라벨이 지정된 데이터를 얻습니다. 입력 프롬프트와 해당 출력 응답이 모두 있으므로 이를 통해 GPT 모델의 감독된 미세 조정에 참여할 수 있습니다.


다음 단계에서는 첫 번째 단계에서 얻은 지도 미세 조정 모델을 사용합니다. 단일 프롬프트가 모델을 통해 전달되고 여러 응답이 생성됩니다. 그런 다음 라벨러는 이러한 응답의 품질을 평가하고 순위를 매깁니다. 생성된 각 응답에는 해당 보상이 할당되며, 이는 보상 모델로 알려진 또 다른 GPT 모델을 훈련하는 데 사용됩니다. 모델 자체이기 때문에 보상 모델은 초기 프롬프트와 응답 중 하나를 입력으로 사용하고 보상을 출력으로 생성하는 방식으로 작동합니다. 이 보상은 응답의 품질이나 우수성을 수량화합니다.


세 번째 단계에서는 보이지 않는 프롬프트를 가져와 감독된 미세 조정 모델의 복제본을 통해 전달합니다. 그러면 응답이 생성되고 보상 모델을 사용하여 평가되어 순위나 품질이 결정됩니다. 획득한 순위는 이미 미세 조정된 모델을 더욱 개선하는 데 사용됩니다. 이는 PPO 모델의 손실 함수에 순위를 통합하여 역전파를 통해 모델의 매개변수를 업데이트함으로써 달성됩니다. 특히 흥미로운 점은 이 프로세스가 모델이 무해한 동작을 나타내는 데 도움이 될 뿐만 아니라 사실적 응답을 생성할 수도 있다는 것입니다. 응답의 질에 따라 보상 자체가 생성되었기 때문이다.

ChatSQL

이제 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은 두 가지 주요 부분으로 구성됩니다. 우선, 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”: “책의 높이” 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

깃허브 : 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). 주의가 필요한 전부입니다. 신경 정보 처리 시스템의 발전(pp. 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., & et al. (2017). Transformer-XL: 고정 길이 컨텍스트를 뛰어넘는 세심한 언어 모델입니다. arXiv 사전 인쇄 arXiv:1901.02860.