[논문리뷰] Prompt 설정과 스키마 인식을 통한 향상된 SQL 쿼리 생성: PET-SQL

PET-SQL: A Prompt-enhanced Two-stage Text-to-SQL

13 Mar 2024 https://arxiv.org/pdf/2403.09732v1.pdf

 

reference-enhanced representation 이라는 새로운 프롬프트 표현을 소개한다.

이건 스키마 정보와 테이블에서 무작위로 샘플링된 셀 값들을 포함하여 LLM이 SQL 쿼리를 생성하는데 도움을 주는 것이다.

 

논문은 특정 모델을 훈련시키지 않고도 현재 LLMs의 성능을 촉진하는 Prompt-Enhanced Two-stage text-to-SQL 프레임워크를 제안한다.


💡 방법론

  1. 질문-SQL 쌍(사용자가 제시한 질문에 대해 SQL 쿼리가 어떻게 생성되는지를 보여주는 데이터)를 검색하여 LLM이 초기 SQL(PreSQL)을 생성하도록 유도한다.
  2. 그 후 PreSQL의 언급된 엔터티들은 스키마 linking을 수행하기 위해 파싱됩니다. 이는 유용한 정보를 크게 압축할 수 있다.

즉, 두번째 단계에서는 연결된 스키마를 사용하여 프롬프트의 스키마 정보를 간소화하고, LLM에게 최종 SQL을 생성하도록 지시합니다.

 

이 방법은 Spider 벤치마크에서 새로운 SOTA 결과를 달성했으며, 실행 정확도가 87.6%로 나타났다고 한다.


1. Text2sql의 여러운 점

 

Extensive databases across domains and intricate user intentions

여러 도메인에서 광범위한 데이터베이스와 복잡한 사용자 의도를 처리할 때 어려움이 있다. 이는 데이터베이스가 다양한 분야에 걸쳐 매우 많은 양의 정보를 포함하고 있으며, 사용자의 의도가 복잡하고 다양하기 떄문에 발생하는 문제.

 

Design of the prompt

최근 연구들은 스키마 정보의 표현/처리에 중점을 두고 있지만, 테이블의 셀 값 형식에 대한 사전 주의가 부족하다.

이는 조건부 처리에 관련이 있다. 그래서 프롬프트 내의 특별한 지시사항의 추가적인 최적화 필요성이 필요하다는 것과 복잡한 스키마를 단순화하여 무거운 컨텍스트를 줄이기 위한 방법이 있어야 한다고 한다. 이러한 복잡성을 줄이기 위해 일반적으로 대표적인 스키마 Linking 모듈이 도입된다. 이 모듈은 LLM 에게 간단한 질문에 대한 테이블과 열을 제공하도록 지시하는 독립적인 플러그인이다.

 

이 이미지는 자연어 질문을 SQL 쿼리로 변환하는 과정을 설명하는 프레임워크를 보여준다.

 

 

사용자의 질문을 받아 이를 SQL 쿼리로 만들기 위해 여러 단계를 거치는데, 크게 두 단계로 나눌 수 있다.

 

핵심!

첫 번째 단계
언어 모델을 사용하여 질문을 기반으로 초기 SQL 구문(PreSQL)을 생성하고, 데이터베이스 스키마와 연결합니다.

두 번째 단계
에서는 여러 SQL 후보들 사이의 일관성을 비교하여 최종 쿼리(FinSQL)를 결정한다.

2. Methodology

 

이 방법론은 LLM 기반의 Text2sql에서 자연어 질문 Q를 실행 가능한 SQL s로 변환하는 것을 목표로 합니다. LLM이 SQL 쿼리 s를 생성하는 확률은 위 식과 같이 조건부 확률 분포로 정의할 수 있다.

 

이해하기 쉽게 flow 정리 : PET-SQL 프레임 워크에 대한 설명

  1. 자세한 프롬프트 : 사용자 정의 지시사항, 기본 DB 정보 및 저장된 테이블의 샘플을 활용하는 프롬프트를 작성.
  2. LLM에게 PreSQL 생성 지시 : 질문 유사상 기반 전략을 사용하여 풀에서 일부 데모를 선택한 후 프롬프트 접두사로 추가하는 방식으로 PreSQL을 생성하도록 LLM에제 지시.
  3. PreSQL을 기반으로 질문 관련 테이블 찾기 : PreSQL을 기반으로 질문 관련 테이블(스키마 링킹)을 찾고, 이를 기반으로 FinSQL을 생성하도록 LLM에게 지시.
  4. 여러 LLM 간 예측 결과 일관성 보장.

3. Prompting

 

LLMs에게 SQL 쿼리를 생성하도록 지시할 때, 프롬프트에 사용되는 스타일이나 템플릿은 LLMs의 성능에 상당한 영향을 미칩니다.

**OpenAI** Demonstration Format :
### How many singers do we have ?
SELECT count (*) FROM singers

Code Representation Format :
/* How many singers do we have ? */
SELECT count (*) FROM singers

 

" ### " 이렇게 prompt를 작성해서 LLM에게 정보를 주는거다.

 

직업 지시에는 LLM에 대한 다중 작업 제약 규칙을 설정한다.

즉, LLM에게 “SQL 실행시간을 최소화하면서 정확도를 보장하도록” 한다.

이 규칙의 이유는 실행 정확도에만 초점을 맞추는 것이 아니라 LLM에게 SQL 문의 효율성도 인식시키는 것이다.

 

### Answer the question by SQLite SQL query only and with no explanation . You must minimize SQL execution time while ensuring correctness .
### Sqlite SQL tables , with their properties :
#
# singer ( Singer_ID ,Name , Country , Song_Name , Song_release_year ,Age , Is_male );
# singer_in_concert ( concert_ID , Singer_ID );
#
### Here is some data information about database references .
#
# singer ( Singer_ID [1 ,2 ,3] , Name [Joe , Timbaland , Justin Brown ] , Country [ Netherlands , United States , France ] , Song_Name [You , Dangerous ,Hey Oh] , Song_release_year [1992 ,2008 ,2013] , Age [52 ,32 ,29] , Is_male [F,T,T]);
# singer_in_concert ( concert_ID [1 ,1 ,1] , Singer_ID [2 ,3 ,5]);
#
### Foreign key information of SQLite tables , used for table joins :
#
# singer_in_concert ( Singer_ID ) REFERENCES singer ( Singer_ID );
#
### Question : How many singers do we have ?
### SQL :

 

각 테이블에서 세 개의 행이 무작위로 샘플링되어 프롬프트에 삽입된다.

샘플된 셀 값은 참조로 사용되어 LLM이 데이터베이스의 형식과 사양을 이해하는 데 도움이 된다.

 

이는 서로 다른 테이블을 채우는 데 있어 표준화의 부족으로 인한 조건으로 어떤 요소를 쿼리해야 할지 확실하지 않은 딜레마를 완화합니다.

 

예를 들어, "M", "Male", "male" 모두 성별의 가능한 표현이다.

 

셀 값의 사전 지식이 없으면 테이블에서 남성의 수를 쿼리하는 조건 문을 조직하는 것이 혼란스러울 수 있다.

그리고 스키마에 있는 외래 키 관계가 프롬프트에 접미사로 추가된다.

 

이렇게 하면 LLM이 데이터베이스에 연결된 테이블 간의 관계를 인식하는 데 도움이 되며, 사용자의 의도를 이해하고 쿼리에서 적절한 연결을 자동으로 선택하는 데 도움이 된다.


4. Question skeleton-based PreSQL generation

이 과정은 자연어 질문에서 SQL쿼리를 생성하는 시스템을 설명한다.

 

1단계 : 질문의 의미 제거(De-semanticization)

먼저, 데이터베이스에 대해 사람들이 물을 수 있는 다양한 질문들이 있다.

 

예를 들어 농장, 책, 배우 같은 구체적인 세부사항을 <mask> 와 같은 특별한 토큰으로 대체한다.

 

이것은 질문을 “스켈레톤” 형태로 변환하여 도메인 특정 세부 정보를 제거하고 질문의 구조만을 유지한다. 이 스켈레톤은 구체적인 세부사항에 얽매이지 않고 질문의 의도를 나타낸다.

Q : “도서관에 존 도우의 책이 몇 권이 있나요?”

DB 스키마 : library, books, author 등의 테이블이 포함되어 있다. books 테이블에는 book_id, title, author_id 등의 컬럼이 있다.

1단계 : 도메인 특정 용어 식별 및 마스킹
질문에서 언급된 테이블 이름, 컬럼 이름, 특정 값들을 식별한다.책, 도서관, 존 도우가 해당된다.식별된 용어들을 <mask> 토큰으로 대체한다.

2단계 : 질문 스켈레톤 생성
"책"을 <mask>로, "도서관"을 <mask>로, "존 도우"를 <mask>로 대체합니다.

스켈레톤화된 질문
"<mask>에 <mask>의 <mask>이 몇 권 있나요?"

 

이렇게하면 우리는 질문의 일반화된 형태를 얻을 수 있으며, 이를 통해 도메인의 구체적인 세부 사항보다는 구조와 의도에 초점을 맞출 수 있다.

 

2단계 : 유사한 질문 스켈레톤 검색

사용자가 다른 질문, 예를 들어 "지난 해 가장 많이 본 영화는 무엇인가요?"를 제출했다고 가정해 본다.

이 질문도 동일한 방식으로 스켈레톤화한다.

 

원본 질문
"지난 해 가장 많이 본 영화는 무엇인가요?"

질문 스켈레톤
"<mask>에 가장 많이 본 <mask>는 무엇인가요?"

 

이제 사전 훈련된 문장 Transformer를 사용하여 이 질문 스켈레톤과 훈련 세트의 시연 풀에 있는 스켈레톤들 사이의 유사성을 계산한다.

 

"이번 달에 가장 많이 팔린 책은 무엇인가요?"의 스켈레톤이 가장 유사하다고 판단되면, 해당 질문-SQL 쌍을 타겟 질문에 대한 예시로 선택한다.

 

 

3단계: LLM을 통한 PreSQL 생성

선택된 질문-SQL 쌍을 LLM에게 제시하면서, 새 질문("지난 해 가장 많이 본 영화는 무엇인가요?")에 대한 SQL 쿼리를 생성하도록 한다. 이때, LLM은 제공된 예시를 참고하여 유사한 구조의 SQL 쿼리를 생성하게 된다.

 

 

이 과정을 통해, LLM은 다양한 질문에 대해 적절한 SQL 쿼리를 생성할 수 있는 능력을 향상시킬 수 있으며, 이는 데이터베이스 질의 생성의 정확성과 효율성을 개선하는 데 기여합니다.


5. Schema linking and FinSQL generation

이 내용은 스키마 연결과 최종 SQL 생성에 관한 과정을 설명한다.

복잡한 DB 스키마 정보가 언어 모델의 성능을 저해할 수 있기에, 이를 개선하기 위한 방법을 소개한다.

 

스키마 연결(Schema Linking)

자연어 질문과 관련된 DB 스키마(테이블/컬럼) 및 조건 값들을 식별하여 LLM 성능저해 요소를 줄인다.

질문에 연관된 스키마 정보(PreSQL에서 언급된 테이블/컬럼)는 간결해지고, 이 정보는 직접적으로 스키마 연결의 결과로 파싱될 수 있다.

즉, 복잡한 정렬이나 추출 전략을 디자인하는 것보다, 직접 완전한 SQL 문을 생성하는 것이 더 효율적이라고 말 한다.

 

최종 SQL 생성

대부분의 LLM은 Text2sql 또는 SQL 관련 코퍼스로 사전 훈련되어 있으므로, SQL 생성에 대한 능력이 스키마 출력보다 강하다고 한다.

SQL 생성은 더 일반적이며, 코드 작성에 특화된 LLM(CodeLlama)에도 적용 가능하다.

관련 없는 테이블 링크 컨텍스트를 포함한 모든 정보를 제거하여 프롬프트를 단순화한다.

이렇게 단순화된 프롬프트는 LLM에 다시 입력되어 FinSQL을 생성한다.

 

6. Cross consistency

교차 일관성에서는 DB 엔진에서 SQL 쿼리의 실행 결과를 기반으로 설계된 일관성 모듈에 대해 설명한다. 여러 LLM에 걸친 Naive voting 와 PreSQL 복잡성에 따른 fine-grained voting 이 있다.

 

1. 자체 일관성 접근 방식

기존 방법인 자체 일관성 접근 방식은 실행 결과를 후처리하여 정제하는 데 널리 사용된다. 이 방식은 LLM의 출력에 무작위성을 높게 증가시켜 다양한 결과를생성한 다음, 여러 실행 결과 중 다수결로 투표하는 방식으로 진행된다. 이렇게 하면 문제점이 높은 temperatures 때문에 LLM성능을 저하시킬수있으며(환각), 특히 결정적인 작업에 문제가 발생될 확률이 있다.

  1. 다양한 출력 생성
    • 언어 모델에게 "도서관에서 가장 많이 대여된 책은 무엇인가?"라는 질문을 주고 SQL 쿼리를 생성하도록 요청한다.
    • 모델의 무작위성 정도를 조절하여 같은 질문에 대해 다양한 SQL 쿼리를 생성하게 한다. 여기서 temperatures은 모델의 무작위성 정도를 조절하는 매개변수이다. 더 다양하고 예측 불가능한 결과를, 낮은 온도에서는 더 일관되고 예측 가능한 결과를 생성한다.
  2. 결과의 다수결 투표
    • 생성된 여러 SQL 쿼리 중에서 가장 일관되게 나타나는 쿼리를 선택한다. 이것이 voting이다.
      1. SELECT title FROM books ORDER BY rentals DESC LIMIT 1;
      2. SELECT title FROM books ORDER BY rentals DESC LIMIT 1;
      3. SELECT book_title FROM library_books ORDER BY count DESC LIMIT 1;
      4. SELECT title FROM books ORDER BY rentals DESC LIMIT 1;
      5. SELECT name FROM book_list ORDER BY number_of_rentals DESC LIMIT 1;
    • 이 중에서 SELECT title FROM books ORDER BY rentals DESC LIMIT 1; 쿼리가 세 번 반복되어 가장 일관된 결과로 선택되는거다.

 

교차 일관성 전략(Cross consistency)

자체 일관성을 시행하는 대신, 낮은 무작위성에서 여러 LLM을 지시하여 SQL을 생성하고, 이 SQL의 실행 결과에 대해 투표를 진행하는 방식이다.

 

이 방식은 SQL 쿼리를 다양하게 뽑을 수 있을 뿐만 아니라 낮은 무작위성으로 설정하여 LLM 성능을 저해시키지 않고 쓸 수 있다는 것이 핵심이다.

  • naive voting : 여러 LLM의 결과를 단순히 모아 다수결
  • fine-grained voting : PreSQL의 복잡성을 고려하여 투표를 진행
  1. 여러 LLM으로부터 SQL 쿼리 생성
    • 동일한 자연어 질문, 예를 들어 "이번 달에 가장 많이 판매된 상품은 무엇인가?"에 대해 여러 다른 LLM(예: GPT-3, BERT, CodeLlama)을 사용하여 SQL 쿼리를 생성하도록 요청한다.
    • 각 LLM은 낮은 무작위성 설정에서 작동하도록 설정하여, 높은 신뢰도와 일관성을 가진 쿼리를 생성하도록 한다.
  2. 생성된 SQL 쿼리 실행 및 결과 투표
    • 각 모델이 생성한 SQL 쿼리를 실제 데이터베이스에 실행한다.
    • 실행된 결과(예: 판매된 상품의 이름)를 비교하여, 가장 일관되고 정확한 결과를 도출하는 SQL 쿼리를 선택한다.
  3. 다양한 모델의 출력 통합:
    • 예를 들어 다음과 같이 다양한 SQL 쿼리가 생성되었다고 가정합니다:
      • 모델 A: SELECT product_name FROM sales ORDER BY quantity_sold DESC LIMIT 1;
      • 모델 B: SELECT name FROM products WHERE id = (SELECT product_id FROM orders GROUP BY product_id ORDER BY SUM(quantity) DESC LIMIT 1);
      • 모델 C: SELECT name FROM product_sales ORDER BY total_sold DESC LIMIT 1;
    • 각 쿼리의 실행 결과를 비교하고, 가장 많이 나온 결과 혹은 가장 신뢰할 수 있는 로직을 따른 결과를 최종 선택한다.

 

투표에 대해서 구체적으로 설명하면 다음과 같다.

- Naive Voting

  1. PreSQL 생성: 강력한 LLM(예: GPT-4)을 사용하여 전체 스키마 정보를 기반으로 PreSQL을 생성한다. 이 단계에서는 질문의 구조를 파악하고 관련 스키마 정보를 연결한다.
  2. 스키마 연결: 생성된 PreSQL을 분석하여 스키마 연결을 수행한다. 이는 최종 SQL 쿼리 생성을 위한 준비 단계.
  3. 단순화된 프롬프트 사용: 전체 스키마 프롬프트를 단순화하여 여러 LLM에 지시합니다. 각 LLM은 낮은 무작위성 설정을사용하여 최종 SQL(FinSQL)을 생성한다.
  4. SQL 실행 및 결과 통합: 모든 FinSQL과 재사용된 PreSQL은 SQL 데이터베이스 엔진을 통해 실행되며, 쿼리 결과를 얻는다. 각 SQL의 실행 결과를 검토하고, 다수결 결과를 최종 답변으로 선택한다.

- Fine-grained Voting

  1. PreSQL 복잡성에 따른 분류: PreSQL의 복잡성을 기준으로 투표 규칙을 더 세밀하게 조정한다. PreSQL의 추상 구문 트리를 분석하여 질문의 복잡성을 네 가지 등급(쉬움, 중간, 어려움, 매우 어려움)으로 분류한다.
  2. 등급별 LLM 선택: 서로 다른 복잡성 등급의 질문에 특화된 LLM을 선택하여 투표 풀에 넣는다. 이는 편향된 결과를 줄이고 각 LLM의 잠재력을 최대한 활용하기 위함이다.
  3. 세밀한 투표 실행: 각 등급의 질문에 대해 지정된 후보 LLM들을 통해 투표를 진행한다. 이렇게 함으로써, 각 질문의 복잡성에 가장 적합한 LLM의 결과를 통합하여 최종 결과의 정확도와 일관성을 높일 수 있다.

7. 평가

 

1. 데이터셋 및 평가 지표

  • 데이터셋: PET-SQL의 성능은 크로스-도메인 Text2SQL 데이터셋인 Spider 벤치마크를 사용하여 평가된다. 이 데이터셋은 200개의 데이터베이스에 걸쳐 훈련용 8659개 인스턴스와 개발용 1034개 인스턴스를 포함하며, 각 세트에는 중복되지 않는 데이터베이스가 있다. 또한, 다른 34개의 데이터베이스에 걸쳐 2147개 인스턴스가 테스트 세트로 홀드아웃된다.
  • 평가 지표: 방법의 Text2SQL 성능 평가는 실행 정확도(EX)에 의해 수행되며, 이는 예측된 쿼리와 실제 쿼리의 실행 결과가 동일한 질문의 비율을 측정한다.

2. 평가된 LLM

  • 다섯 가지 LLM(CodeLlama-34B, SQLCoder-34B, InternLM-70B, SenseChat, GPT4-0613)이 프레임워크의 우수성을 검증하기 위해 참여하며, 테스트 세트에서 최상의 결과를 보고한다. 이들 중 첫 두 모델은 특히 SQL에 특화된 코딩LLM, 나머지는 일반적인 LLM이다.

3. 구현 세부 사항

  • LLM 출력의 무작위성을 줄이기 위해, 온도는 매우 낮게 설정된다.(GPT4의 경우 0, 그 외 LLM은 10^-7). 입력 및 출력 토큰의 최대 길이는 각각 4096과 200이다. 질문 스켈레톤 기반 데모 검색에서는 모든 데이터베이스 스키마를 순회하고 질문에서 테이블 또는 컬럼 이름이 나타나는지 확인합니다. 매치된 엔티티는 <mask> 토큰으로 마스킹된다. 타겟 및 후보 질문 스켈레톤의 문장 임베딩 간 유사성을 기반으로, 상위 9개 유사 질문-SQL 쌍이 선택되어 인-컨텍스트로 구성된다.교차 일관성을 위해, 위에서 언급한 다섯 LLM의 실행 결과는 동일한 가중치로 투표된다.


8. 전체 성능

1. Spider 리더보드

  • 리더보드가 닫혀 새로운 제출을 받지 않기 때문에, 공식 테스트 스위트를 사용하여 오프라인에서 접근 방식의 성능을 테스트했습니다. 그 결과, PET-SQL은 모든 비학습 기반 방법 중에서 가장 높은 실행 정확도를 달성했다. (87.6%) 구체적으로, PET-SQL은 DAIL-SQL을 1% 이상 뛰어넘어 리더보드 상에서 오픈소스 방법 중 최고의 성능을 보였습니다. Naive Voting 투표 전략을 사용하더라도, PET-SQL의 우수성은 여전히 유지된다고 한다.
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유