Post

로컬 LLM + 벡터검색으로 자연어→SQL 파이프라인

도메인 분류→소스 선택→SQL 생성 3단계로 자연어 질문을 실행 가능한 SQL로 변환하는 파이프라인을 만들었다

로컬 LLM + 벡터검색으로 자연어→SQL 파이프라인

로컬 LLM + 벡터검색으로 자연어→SQL 파이프라인

자연어로 “지난달 매출 상위 10개”라고 입력하면 SELECT 쿼리가 바로 나오면 좋겠다고 생각했다. 스키마를 모르는 LLM은 존재하지 않는 테이블·컬럼을 만들어냈다. 도메인 분류 → 소스 선택 → SQL 생성 3단계 파이프라인으로 나눴다.

1. 서론 (Introduction)

  • 문제/상황 (Problem): LLM에 SQL 생성을 맡기면 존재하지 않는 테이블이나 컬럼을 써서 실행 오류가 났다. 스키마를 모르는 상태에서 정확한 SQL을 기대할 수 없었다.
  • 목적 (Purpose): 자연어 질문에서 도메인을 분류하고, 해당 도메인의 테이블(소스)을 선택하고, 그 테이블 기준으로 SQL을 생성하는 3단계 파이프라인을 만든다.
  • 대상 (Target Audience): 자연어 쿼리 인터페이스를 데이터베이스에 붙이고 싶은 개발자.

2. 방법 및 과정 (Methods & Process)

  • 배경 조사 및 데이터 (Data Collection): 질문 4건으로 도메인 분류 정확도를 확인했다.

    질문분류된 도메인선택된 테이블
    지난달 매출 상위 10개 보여줘salessales_orders
    재고 부족한 상품 알려줘inventoryinventory_stock
    이번 주 신규 가입 회원 수는useruser_accounts
    오늘 날씨 어때unknown(테이블 없음)
  • 접근 방법 (Approach Methods):
    • [방법 1]: 질문에 포함된 키워드(매출/판매/주문, 재고/입고/출고, 가입/회원/유저)로 도메인을 분류한다. 실제 운영에서는 이 자리를 임베딩 + 벡터검색으로 대체할 수 있다.
    • [방법 2]: 분류된 도메인을 딕셔너리로 조회해 담당 테이블명을 선택하고, 질문과 테이블명을 문자열 템플릿에 넣어 최소 SELECT ... LIMIT 10 문을 생성한다.
  • 분석 및 해결 프로세스 (Analysis Flow):
    • 도구/기술: 외부 임베딩 모델 없이 키워드 매칭 + 딕셔너리 조회로 파이프라인의 형태만 먼저 검증. 벡터 유사도는 코사인 유사도 목 함수로 개념만 확인.
    • 주요 단계: classify_domain(question) $\rightarrow$ select_source(domain) $\rightarrow$ generate_sql(question, table).
    • 결과 도출 및 검증: sales/inventory/user 세 질문 모두 올바른 테이블로 이어지는 SQL이 생성됐다. 도메인 키워드가 전혀 없는 질문(“오늘 날씨 어때”)은 unknown으로 분류돼 SQL 생성 없이 None을 반환했다.

3. 결과 (Results)

  • 분석 결과 요약: 도메인 키워드가 있는 질문 3건은 각각 sales_orders, inventory_stock, user_accounts 테이블 기준 SQL로 정확히 이어졌다. 키워드가 없는 질문은 도메인 미분류로 처리돼 잘못된 테이블로 SQL이 생성되는 사고를 막았다. 코사인 유사도 목 함수는 거의 동일한 벡터 두 개에 대해 0.9986을 반환해 유사도 계산 개념 자체는 정상 동작함을 확인했다.

4. 인사이트 및 액션 (Insights & Action)

  • 인사이트 (Insight): LLM이 SQL을 못 만드는 이유는 대개 모델 능력이 아니라 스키마 지식 부재다. 도메인만 정확히 좁혀줘도 SQL 생성 단계의 부담이 크게 줄어든다.
  • 실행 방안 (Action Plan): 키워드 매칭을 실제 임베딩 기반 벡터검색으로 교체하면 동의어·오타에도 도메인 분류가 흔들리지 않는다. 테이블 설명에 예시 질문을 함께 색인해두면 검색 정확도가 더 올라간다.
  • 한 줄 결론 (Key Takeaway): 자연어→SQL의 핵심은 모델보다 정확한 도메인·스키마 매칭이다. 올바른 테이블만 짚어주면 SQL 생성은 그 다음이다. 샘플 코드
  • 다음 스텝 (Next Step): 키워드 매칭은 도메인 키워드가 애매하게 겹치는 질문(예: “매출 재고 둘 다 알려줘”)에서는 하나의 도메인만 고르고 나머지를 놓친다. 다중 도메인 질문을 분리해 각각 SQL을 생성하는 처리가 남아 있다.
This post is licensed under CC BY 4.0 by the author.