Eat Study Love

먹고 공부하고 사랑하라

Data Science/Research & Paper

PostgreSQL SQL2NL(2)

eatplaylove 2025. 1. 14. 21:17

세상에 존재하는 모든 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 영역으로 들어올 수 있는 기회를 제공하는 기술이기 때문이다.

Prompt Base SQL to Natural Language

일단 SQL문에 Error가 있는 것을 가정하면 너무나도 코드가 복잡해지기 때문에, Error가 있는 SQL문은 생각하고 있지 않다.

 

따라서, Semantic Refinement에 해당 기능을 적용시킬 수 있을 것으로 사료되는데,

과연 SQL문과 아주 유사한 형태의 NL을 가지고 어떻게 Refinement를 진행할 수 있을까?

 

일단 각 종 Join / Order, Group by / Aggregation , Statistic 한 SQL문도 NL로 표현까지 시켜놓고,

 

LLM 등으로 다듬던지 해보자고..!