Skip to content

Lang2SQL 평가 데이터셋 제작

DShomin edited this page Apr 8, 2025 · 3 revisions

Lang2SQL 평가 데이터셋 생성 도구 (lang2SQL-eval) 활용 가이드

목적

이 문서는 lang2SQL 프로젝트의 핵심 목표인 Text-to-SQL 변환 정확도 향상을 위해 개발된 보조 도구, lang2SQL-eval의 사용법과 활용 방안을 안내합니다.

lang2SQL-eval은 특정 데이터베이스 스키마(Datahub 메타데이터 기반)와 가상의 사용자 페르소나를 바탕으로 자연어 질문과 그에 대응하는 SQL 쿼리 쌍을 자동으로 생성합니다. 이 생성된 데이터셋은 다음과 같은 목적으로 lang2SQL 프로젝트 개선에 활용될 수 있습니다:

  1. lang2SQL 모델 성능 평가: 생성된 질문-SQL 쌍을 벤치마크로 사용하여 현재 lang2SQL 모델이 얼마나 정확하게 SQL을 생성하는지 정량적으로 평가합니다.
  2. 모델 취약점 분석: 어떤 유형의 질문(예: 복잡한 조인, 집계 함수, 특정 조건절)에서 모델이 오류를 보이는지 파악합니다.
  3. 워크플로우 개선 방향 설정: 평가 결과를 바탕으로 lang2SQL 모델의 프롬프트 엔지니어링, 학습 데이터 보강, 또는 langgraph 기반 답변 생성 로직 등 개선이 필요한 부분을 구체적으로 식별합니다.

lang2SQL-eval 개요

lang2SQL-eval은 Text-to-SQL 모델 평가를 위한 데이터셋(자연어 질문, SQL 답변)을 생성하고, 그 결과를 시각화하는 도구입니다. Datahub 메타데이터를 활용하여 실제 데이터 스키마를 반영한 페르소나를 만들고, 이를 기반으로 다양한 질문과 SQL 답변을 생성합니다.

Lang2SQL 평가 데이터셋 생성 도구 데모

참고: 코드 및 자세한 내용은 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 도구를 사용하기 위한 설정 과정입니다.

  1. .env 파일 생성 및 설정:

    # lang2sql-eval 루트 디렉토리에서 실행
    cp .env.sample .env

    .env 파일을 열고 필요한 환경 변수를 설정합니다. 최소한 다음 값들이 필요합니다:

    • DATAHUB_SERVER: 연결할 Datahub 서버 주소
    • OPENAI_API_KEY: 질문 및 페르소나 생성을 위한 OpenAI API 키
  2. 가상환경 생성 및 활성화:

    python -m venv .venv
    # Linux/macOS
    source .venv/bin/activate
    # Windows
    # .venv\Scripts\activate
  3. 필요한 패키지 설치:

    pip install -r requirements.txt

평가 데이터셋 생성 절차

다음 단계를 순서대로 실행하여 평가 데이터셋을 생성합니다.

  1. 페르소나 생성: Datahub 서버에서 테이블 메타데이터를 가져와 분석하고, 이를 기반으로 각 테이블을 주로 사용할 가상의 사용자 페르소나를 생성합니다.

    python src/gen_persona.py
    • 결과: 생성된 페르소나 정보는 data/persona/personas.json 파일에 저장됩니다.
  2. 질문 생성: 생성된 페르소나를 기반으로, 해당 페르소나가 할 법한 자연어 질문들을 생성합니다.

    python src/gen_question.py
    • 결과: 생성된 질문들은 data/questions/ 디렉토리 내에 테이블별 JSON 파일로 저장됩니다.
  3. SQL 답변 생성 (주의: langgraph 모델 필요): 생성된 자연어 질문에 대한 SQL 쿼리 답변을 생성합니다. 이 단계는 별도로 준비된 langgraph 기반의 Text-to-SQL 모델 로드가 필요합니다.

    python src/gen_answer.py
    • 사전 조건: src/gen_answer.pyload_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 정확성 검증 방안

현재 lang2SQL 모델의 주요 한계점 중 하나는 생성된 SQL 쿼리가 구문적으로는 유효하더라도, 사용자의 실제 의도를 정확하게 반영하는지 자동으로 검증하기 어렵다는 점입니다. 즉, '정답' SQL인지 판단하기 위한 명확한 기준 설정 및 자동화된 검증 프로세스가 필요합니다.

이러한 한계를 일부 보완하기 위한 대안 중 하나로, 생성된 SQL 쿼리를 다시 자연어 설명으로 변환(SQL-to-NL)하고, 이 설명을 사용자의 초기 자연어 질문과 비교하는 방법이 제안되었습니다. 두 자연어 표현 간의 의미적 유사성을 평가하여, 생성된 SQL이 사용자의 질문 의도에서 크게 벗어나지 않았는지 간접적으로 확인하는 방식입니다.

하지만 이 방법 역시 한계가 있습니다.

  • SQL-to-NL 변환의 정확성: 변환 과정 자체의 품질에 의존하며, 미묘한 의미 차이를 완벽하게 잡아내지 못할 수 있습니다.
  • 결과 검증 불가: SQL이 의도와 다른 데이터를 반환하더라도, 자연어 설명만으로는 이를 감지하기 어렵습니다. (예: WHERE age > 20을 의도했으나 WHERE age >= 20으로 생성된 경우, 자연어 설명은 비슷할 수 있지만 결과는 다릅니다.)

검증 방법으로 생성된 SQL 쿼리를 실제 데이터베이스(또는 대표적인 샘플 데이터)에 직접 실행해볼 수 있는 테스트베드(Testbed) 환경을 구축하는 것이 이상적으로 보입니다. 테스트베드를 통해 쿼리 실행 결과를 예상 결과와 비교하거나, 적어도 쿼리가 오류 없이 실행되는지 확인함으로써 정확성을 보다 직접적으로 검증할 수 있습니다. 이는 lang2SQL 모델의 신뢰도를 높이는 데 필수적인 요소가 될 수 있으며, 향후 lang2SQL 프로젝트의 중요한 개발 방향 중 하나가 될 수 있습니다.

Clone this wiki locally