Eat Study Love

먹고 공부하고 사랑하라

Data Science/Research

PostgreSQL SQL2NL(4) review so far

eatplaylove 2025. 3. 11. 16:15

다른 시험을 준비한다고, 연구를 좀 소홀히 하였다.

그러다보니 연구내용을 거진 까먹어버려서 시작한 재활치료 ㅋ;;

 

일단 내 실험환경인 WSL - PostgreSQL과 Python과의 연결은 아래와 같이 Setting 해서 연결 완료.

 

그럼 이제 해야하는 것은?

1. LLM이 SQL -> NL변환 잘 못하는 Case 파악하기

2. 위 1번에 파악한 질의에 Table에 대한 Meta Data + PSQL에서 Parsing한 정보를 같이 주면 정확도가 올라가는지 파악하기

 

뭐.. 여태 한 연구가 사실 2번에서도 일부인 Table Meta Data에다가 추가적인 보너스로 주어지는 Parsing정보 정도인 것은 조금 현타가 오지만, 그래도 뭐가 되었던 무의미한 연구시간은 아니었다.

 

생각해볼 점,

1번은 어떤식으로 파악할 것인가.. GPT setting은 되어 있는데, SQL2NL Pair를 LLM에 다 돌려보면서 파악하나?

그리고 그 Pair를 다 돌렸다고 했을 때, SQL이 NL로 잘 변환되었는 지 아닌지를 어떤 기준으로 Accuracy 측정을 하나?

사람의 눈으로 파악을 하는지..? 아니면 다른 Matrix가 있는지..

 

사실 1번에 대한 고민만 끝나면, 거기다가 Meta data 덧붙이는 건 쉽다.

비교군을

No.1 (Vaniila) No.2 No.3
Naive SQL2NL No.1 + Table Meta Data No. 2 + SQL Parsing Data in PSQL

이렇게 설정해보면 어떠할지 싶다.

 

그래서 No.2가 효과가 있다면, DB안에서 Table의 Column 정보 등 Mata Data를 따로 저장해서 관리하면 SQL2NL 정확도를 올릴 수 있고, 그게 빡세면 Table 사이의 PK/FK 정보라도 Meta Data로 제공하자.

 

알아봐야 할 것은, PostgreSQL 안에서 Table 정보를 어디까지 저장하고 있는지, 그리고 그것들을 Retrieve할 수 있는 방안은 무엇이 있는지..!

 

아.. 근데 다시..  그래서 LLM에 SQL문을 던지고 그 정확도는 어떻게 파악할 건데?

 

일단 쉬운거부터 생각을 해보자..

 

나중에 논문화시킬때는 이게 수천 수만개의 쿼리를 집어넣어봐야 할테지만, 지금은 실험단계니까 Sample 10개만 해본다고 가정하자. 그러면 LLM에 의한 SQL2NL 정확도를 어떻게 파악할 것인가..?

1. LLM보고 SQL문을 NL로 바꾼 뒤에 스스로 결과 NL이 Gold NL과 같은지 O/X 여부 체크해보라고 하기

2. 사람의 눈으로 판단해보기

3. Lab실에서 타 연구원들이 연구중인 NL2SQL Model을 이용한다.
-> 이 경우 LLM으로 SQL(Gold) -> NL 변환을 진행하고, NL2SQL Model로 NL -> SQL을 진행하여 정확도 측정
-> 절대적인 정확도보단, 같은 실험환경에서 Option을 바꿔가며 상대적 정확도를 비교할 수 있을듯
-> NL2SQL Model의 자체적인 bias가 있으면 어떻게 하냐는 지적은 피하기 힘들듯

 

일단 실험 단계에선, 2번으로 진행해도 로드가 크지 않아 무난할 것으로 보인다.

 

Sample 10개 정도를 2번으로 진행해서 유의미한 내용이 보이면, Sample 개수를 100개 정도로 늘려 1번을 통해 진행해보자. 거기서도 유의미한 내용이 보인다면, 최종적으로 3번의 평가방법으로 넘어가면 되겠다.

 

오케이!

 

그러면 SQL Sample 10~20개 정도를 LLM에 던져보고 눈으로 한 번 비교해보자

 

Lab실 연구원의 NL2SQL 모델을 개발할 때, Benchmark 기준 Error가 발생했던 California_schools Gold Query/Text Pair를 기준으로 한 번 LLM을 돌려보자.

Gold SQL Predicted Text Gold Text
SELECT T2.Phone FROM frpm AS T1 INNER JOIN schools AS T2 ON T1.CDSCode = T2.CDSCode WHERE T1.`Charter Funding Type` = 'Directly funded' AND T1.`Charter School (Y/N)` = 1 AND T2.OpenDate > '2000-01-01' Get the phone numbers from the schools table for schools where the frpm table has "Directly funded" charter schools that opened after January 1, 2000. Please list the phone numbers of the direct charter-funded schools that are opened after 2000/1/1.
SELECT `Free Meal Count (Ages 5-17)` / `Enrollment (Ages 5-17)` FROM frpm WHERE `Educational Option Type` = 'Continuation School' AND `Free Meal Count (Ages 5-17)` / `Enrollment (Ages 5-17)` IS NOT NULL ORDER BY `Free Meal Count (Ages 5-17)` / `Enrollment (Ages 5-17)` ASC LIMIT 3 Retrieve the ratio of "Free Meal Count (Ages 5-17)" to "Enrollment (Ages 5-17)" from the frpm table for "Continuation Schools," filtering out null values and sorting in ascending order, returning the top 3 results. Please list the lowest three eligible free rates for students aged 5-17 in continuation schools.
SELECT T1.School, T1.Street FROM schools AS T1 INNER JOIN frpm AS T2 ON T1.CDSCode = T2.CDSCode WHERE T2.`Enrollment (K-12)` - T2.`Enrollment (Ages 5-17)` > 30 List the school names and streets from the schools table for schools where the difference between "Enrollment (K-12)" and "Enrollment (Ages 5-17)" in the frpm table is greater than 30. List the names of schools with more than 30 difference in enrollements between K-12 and ages 5-17? Please also give the full street adress of the schools.

 

GPT4.0 기준으로, Predicted Text는 내가 PSQL 내부에서 실행했던 SQL->NL 과 크게 다를 게 없다.

 

하지만, 일단 From 절의 Table을 잘 못 찾고 특히 Join이 들어간 경우 어디서 Data를 끌어와야 하는지 조차 갈피를 찾지 못한다.

 

역시, LLM도 Rule Based로 SQL문장을 해석할 수밖에 없나보다.

 

추가로 알아봐야할 사항은 위에 생짜 Naive LLM에다가 내 Parsing 기법을 더하면 정확도가 향상하는지와,

-> 아마 향상할 거 같다. 지금 LLM은 From절이 좀만 복잡해도 어디서 Data를 끌어오는지 NL로 반환하지 못한다.

 

그 정확도는 어떻게 측정하는지..?

 

'Data Science > Research' 카테고리의 다른 글

PostgreSQL SQL2NL(6)  (0) 2025.03.14
PostgreSQL SQL2NL(5)  (0) 2025.03.12
PostgreSQL SQL2NL(3) - PostgreSQL 코드 좀 더 일반화 하기 + Python 연결  (0) 2025.02.07
PostgreSQL SQL2NL(3)  (1) 2025.02.03
PostgreSQL SQL2NL(2)  (0) 2025.01.14