-
Notifications
You must be signed in to change notification settings - Fork 6
Lang2SQL 평가 데이터셋 제작
이 문서는 lang2SQL
프로젝트의 핵심 목표인 Text-to-SQL 변환 정확도 향상을 위해 개발된 보조 도구, lang2SQL-eval
의 사용법과 활용 방안을 안내합니다.
lang2SQL-eval
은 특정 데이터베이스 스키마(Datahub 메타데이터 기반)와 가상의 사용자 페르소나를 바탕으로 자연어 질문과 그에 대응하는 SQL 쿼리 쌍을 자동으로 생성합니다. 이 생성된 데이터셋은 다음과 같은 목적으로 lang2SQL
프로젝트 개선에 활용될 수 있습니다:
-
lang2SQL
모델 성능 평가: 생성된 질문-SQL 쌍을 벤치마크로 사용하여 현재lang2SQL
모델이 얼마나 정확하게 SQL을 생성하는지 정량적으로 평가합니다. - 모델 취약점 분석: 어떤 유형의 질문(예: 복잡한 조인, 집계 함수, 특정 조건절)에서 모델이 오류를 보이는지 파악합니다.
-
워크플로우 개선 방향 설정: 평가 결과를 바탕으로
lang2SQL
모델의 프롬프트 엔지니어링, 학습 데이터 보강, 또는 langgraph 기반 답변 생성 로직 등 개선이 필요한 부분을 구체적으로 식별합니다.
lang2SQL-eval
은 Text-to-SQL 모델 평가를 위한 데이터셋(자연어 질문, SQL 답변)을 생성하고, 그 결과를 시각화하는 도구입니다. Datahub 메타데이터를 활용하여 실제 데이터 스키마를 반영한 페르소나를 만들고, 이를 기반으로 다양한 질문과 SQL 답변을 생성합니다.
참고: 코드 및 자세한 내용은 lang2sql-eval GitHub 리포지토리에서 확인할 수 있습니다.
lang2sql-eval/
├── app/
│ └── viz_eval.py # Streamlit 기반 평가 결과 시각화 도구
├── src/
│ ├── datahub_cls/ # Datahub 메타데이터 관련 클래스
│ ├── persona_class.py # 페르소나 클래스 정의
│ ├── gen_persona.py # 페르소나 생성 스크립트
│ ├── gen_question.py # 질문 생성 스크립트
│ ├── gen_answer.py # SQL 답변 생성 스크립트 (langgraph 모델 필요)
│ └── utils.py # 유틸리티 함수
├── data/
│ ├── persona/ # 생성된 페르소나 데이터 (personas.json)
│ ├── questions/ # 생성된 질문 데이터 (테이블별 json)
│ └── q_sql/ # 생성된 SQL 답변 데이터 (테이블별 json)
└── .env # 환경 변수 설정 파일
lang2SQL-eval
도구를 사용하기 위한 설정 과정입니다.
-
.env
파일 생성 및 설정:# lang2sql-eval 루트 디렉토리에서 실행 cp .env.sample .env
.env
파일을 열고 필요한 환경 변수를 설정합니다. 최소한 다음 값들이 필요합니다:-
DATAHUB_SERVER
: 연결할 Datahub 서버 주소 -
OPENAI_API_KEY
: 질문 및 페르소나 생성을 위한 OpenAI API 키
-
-
가상환경 생성 및 활성화:
python -m venv .venv # Linux/macOS source .venv/bin/activate # Windows # .venv\Scripts\activate
-
필요한 패키지 설치:
pip install -r requirements.txt
다음 단계를 순서대로 실행하여 평가 데이터셋을 생성합니다.
-
페르소나 생성: Datahub 서버에서 테이블 메타데이터를 가져와 분석하고, 이를 기반으로 각 테이블을 주로 사용할 가상의 사용자 페르소나를 생성합니다.
python src/gen_persona.py
-
결과: 생성된 페르소나 정보는
data/persona/personas.json
파일에 저장됩니다.
-
결과: 생성된 페르소나 정보는
-
질문 생성: 생성된 페르소나를 기반으로, 해당 페르소나가 할 법한 자연어 질문들을 생성합니다.
python src/gen_question.py
-
결과: 생성된 질문들은
data/questions/
디렉토리 내에 테이블별 JSON 파일로 저장됩니다.
-
결과: 생성된 질문들은
-
SQL 답변 생성 (주의:
langgraph
모델 필요): 생성된 자연어 질문에 대한 SQL 쿼리 답변을 생성합니다. 이 단계는 별도로 준비된langgraph
기반의 Text-to-SQL 모델 로드가 필요합니다.python src/gen_answer.py
-
사전 조건:
src/gen_answer.py
내load_graph()
함수가 여러분의langgraph
모델을 로드하도록 구현되어 있어야 합니다.# src/gen_answer.py 예시 if __name__ == "__main__": graph = load_graph() # 사용자의 langgraph 모델 로드 로직 구현 필요 get_eval_result(graph)
-
결과: 생성된 질문-SQL 쌍 데이터는
data/q_sql/
디렉토리 내에 테이블별 JSON 파일로 저장됩니다. 이 파일들이 최종 평가 데이터셋이 됩니다.
-
사전 조건:
생성된 평가 데이터셋(질문, 생성된 SQL, (선택적) 실제 모델의 답변 및 정확도)을 웹 인터페이스에서 확인하고 분석할 수 있습니다.
streamlit run app/viz_eval.py
현재 lang2SQL
모델의 주요 한계점 중 하나는 생성된 SQL 쿼리가 구문적으로는 유효하더라도, 사용자의 실제 의도를 정확하게 반영하는지 자동으로 검증하기 어렵다는 점입니다. 즉, '정답' SQL인지 판단하기 위한 명확한 기준 설정 및 자동화된 검증 프로세스가 필요합니다.
이러한 한계를 일부 보완하기 위한 대안 중 하나로, 생성된 SQL 쿼리를 다시 자연어 설명으로 변환(SQL-to-NL)하고, 이 설명을 사용자의 초기 자연어 질문과 비교하는 방법이 제안되었습니다. 두 자연어 표현 간의 의미적 유사성을 평가하여, 생성된 SQL이 사용자의 질문 의도에서 크게 벗어나지 않았는지 간접적으로 확인하는 방식입니다.
하지만 이 방법 역시 한계가 있습니다.
- SQL-to-NL 변환의 정확성: 변환 과정 자체의 품질에 의존하며, 미묘한 의미 차이를 완벽하게 잡아내지 못할 수 있습니다.
-
결과 검증 불가: SQL이 의도와 다른 데이터를 반환하더라도, 자연어 설명만으로는 이를 감지하기 어렵습니다. (예:
WHERE age > 20
을 의도했으나WHERE age >= 20
으로 생성된 경우, 자연어 설명은 비슷할 수 있지만 결과는 다릅니다.)
검증 방법으로 생성된 SQL 쿼리를 실제 데이터베이스(또는 대표적인 샘플 데이터)에 직접 실행해볼 수 있는 테스트베드(Testbed) 환경을 구축하는 것이 이상적으로 보입니다. 테스트베드를 통해 쿼리 실행 결과를 예상 결과와 비교하거나, 적어도 쿼리가 오류 없이 실행되는지 확인함으로써 정확성을 보다 직접적으로 검증할 수 있습니다. 이는 lang2SQL
모델의 신뢰도를 높이는 데 필수적인 요소가 될 수 있으며, 향후 lang2SQL
프로젝트의 중요한 개발 방향 중 하나가 될 수 있습니다.