세상에 존재하는 모든 SQL을 NL로 LLM 없이 변환하는 것은 불가능하다.
그치만 그래도 연구해볼법 한 주제인 SQL to NL.
일단, 용도는 NL to SQL Module을 검증하는 용도이다. SQL을 다시 NL로 변환하여 본래 사람들의 자연어와 정확히 일치하는 지 체크를 할 수 있다는 생각이다.
그치만 이게 가능은 하려나..
question |
What is the e-mail address of the administrator of the school located in the San Bernardino county, District of San Bernardino City Unified that opened between 1/1/2009 to 12/31/2010 whose school types are public Intermediate/Middle Schools and Unified Scools?
|
evidence |
Intermediate/Middle Schools refers to SOC = 62; Unified School refers to DOC = 54; years between 2009 and 2010 can refer to 'between 1/1/2009 to 12/31/2010'
|
gold SQL |
SELECT T2.AdmEmail1 FROM frpm AS T1 INNER JOIN schools AS T2 ON T1.CDSCode = T2.CDSCode WHERE T2.County = 'San Bernardino' AND T2.City = 'San Bernardino' AND T2.DOC = 54 AND strftime('%Y', T2.OpenDate) BETWEEN '2009' AND '2010' AND T2.SOC = 62
|
pred SQL |
SELECT AdmEmail1 FROM schools INNER JOIN frpm ON schools.CDSCode = frpm.CDSCode WHERE County = 'San Bernardino' AND District = 'San Bernardino City Unified' AND OpenDate BETWEEN '2009-01-01' AND '2010-12-31' AND (SOC = '62' OR DOC = '54')
|
question |
What is the administrator's email address of the chartered school with the fewest students enrolled in grades 1 through 12?
|
evidence |
Charted school means `Charter School (Y/N)` = 1 in the table frpm; Students enrolled in grades 1 through 12 refers to `Enrollment (K-12)`
|
gold SQL |
SELECT T2.AdmEmail1 FROM frpm AS T1 INNER JOIN schools AS T2 ON T1.CDSCode = T2.CDSCode WHERE T1.`Charter School (Y/N)` = 1 ORDER BY T1.`Enrollment (K-12)` ASC LIMIT 1
|
pred SQL |
SELECT T3.`Administrator Email Address` FROM schools AS T3 INNER JOIN frpm AS T1 ON T1.CDSCode = T3.CDSCode WHERE T1.`Charter School (Y/N)` = 'Y' ORDER BY CAST(T1.`Enrollment (K-12)` AS REAL) ASC LIMIT 1
|
question |
For the school with the highest average score in Reading in the SAT test, what is its FRPM count for students aged 5-17?
|
evidence | |
gold SQL | SELECT T2.`FRPM Count (Ages 5-17)` FROM satscores AS T1 INNER JOIN frpm AS T2 ON T1.cds = T2.CDSCode ORDER BY T1.AvgScrRead DESC LIMIT 1 |
pred SQL |
SELECT T1.`FRPM Count (Ages 5-17)` FROM frpm AS T1 INNER JOIN satscores AS T2 ON T1.CDSCode = T2.cds WHERE T2.AvgScrRead = (SELECT MAX(AvgScrRead) FROM satscores);
|
question | What is the unabbreviated mailing address of the school with the highest FRPM count for K-12 students? |
evidence | |
gold SQL | SELECT T2.MailStreet FROM frpm AS T1 INNER JOIN schools AS T2 ON T1.CDSCode = T2.CDSCode ORDER BY T1.`FRPM Count (K-12)` DESC LIMIT 1 |
pred SQL |
SELECT T2.MailStreet, T2.MailCity, T2.MailZip, T2.MailState FROM frpm AS T1 INNER JOIN schools AS T2 ON T1.CDSCode = T2.CDSCode ORDER BY CAST(T1.`FRPM Count (K-12)` AS REAL) DESC LIMIT 1
|
위는 NL to SQL 정확도 체크에 사용되는 NL <-> SQL Gold Query pair이다.
내가 지금 하고 있는 연구(?)는 PostgreSQL의 SQL문 Parsing 과정에서 각 Clause 別 Token을 따와서 그것을 조합해 NL을 만드는 일을 한다. 이는, 결국 반환되는 NL문이 기존 SQL문과 크게 다르지 않다는 것이다. 왜냐하면 SQL문의 Grammer를 담당하는 Word 앞 뒤로 주어지는 Component를 그대로 따오기 때문에 새로운 말을 만들어내는 것이 불가하다.
가령 ASC LIMIT 1 이라는 SQL문에서 the fewest / the lowest / the minimum 등의 '최소'를 뜻하는 표현들을 만들어낼 수는 없는 것이다.
이런 와중에 내게 주어진 과업..
1. GPT로 대표되는 LLM이 SQL2NL을 못하는 증거를 찾자 ( SQL2NL을 GPT가 잘 못 하는 이유 -> Train이 부족해서 그럴듯, GPT가 잘 분석 못 하는 예문들의 특징을 특정해보자.) ( 여기서 드는 의구심은, GPT역시 SQL문의 Grammer 특징을 알려주면서 학습시키면 충분히 잘 할 거 같다.. 즉, Train을 하기만 하면 GPT역시 SQL2NL을 잘 할 것 같다.) 2. SQL을 NL로 변환하는 중간과정에서 LLM을 써도 된다. 아마 NL to NL을 통해 내가 만든 어색한 NL을 사람이 이해하기 쉬운 NL로 변환하는 단계에 LLM을 쓰면 될 듯 3. 모든 SQL문에 대해선 아니지만, 주어진 특정 SQL에 대해선 거의 100%의 정확도를 가져다 주는 모듈을 만들자. |
이것을 논문화시키려면, 위 2번의 LLM을 사용할 땐 LLM을 쓸 수밖에 없던 이유를 설명해야 한다.
이를테면, 나는 SQL문의 Parse Tree 구조를 따라다니며 Parsing된 Token을 조합해 NL을 만드는 것이기 때문에 Output NL의 경우에 그 형태가 기존 SQL문과 비슷하며 사람이 읽기엔 다소 어색할 수도 있기 때문에 LLM으로 이 NL을 다듬는다.
자, 그러면 이제 SQL to NL 연구가 어디에 쓰일까?
가장 대표적으론 아래 그림과 같이 NL to SQL Module의 Refinement 부분에서 사용될 수 있을 것이다.
NL to SQL의 효용성은 두 말 하면 입이 아플 정도로 매우 높다. 아무개가 생각을 해봐도 일반인들이 SQL 영역으로 들어올 수 있는 기회를 제공하는 기술이기 때문이다.
일단 SQL문에 Error가 있는 것을 가정하면 너무나도 코드가 복잡해지기 때문에, Error가 있는 SQL문은 생각하고 있지 않다.
따라서, Semantic Refinement에 해당 기능을 적용시킬 수 있을 것으로 사료되는데,
과연 SQL문과 아주 유사한 형태의 NL을 가지고 어떻게 Refinement를 진행할 수 있을까?
일단 각 종 Join / Order, Group by / Aggregation , Statistic 한 SQL문도 NL로 표현까지 시켜놓고,
LLM 등으로 다듬던지 해보자고..!
'Data Science > Research & Paper' 카테고리의 다른 글
PostgreSQL SQL2NL(3) - PostgreSQL 코드 좀 더 일반화 하기 + Python 연결 (0) | 2025.02.07 |
---|---|
PostgreSQL SQL2NL(3) (0) | 2025.02.03 |
PostgreSQL SQL2NL(1) (0) | 2025.01.08 |
PostgreSQL 실습에 유용한 code (1) | 2025.01.02 |
PostgreSQL 설치 및 특징 (2) | 2024.12.27 |