Skip to content

Text‐to‐SQL 성능을 높이기 위한 테이블 카테고라이징 전략

bongkyunSON edited this page May 15, 2025 · 2 revisions

1. 문제 인식

Text-to-SQL 작업에서 대규모 데이터베이스(DB)에는 수백~수천, 때로는 수만 개의 테이블이 존재할 수 있습니다.

**LLM(대형언어모델)이 자연어 질문을 SQL로 변환할 때

테이블 이름이나 구조를 모두 한 번에 인지하도록 하는 것은 현실적으로 어렵고, 많은 테이블 이름을 동시에 주입해서 처리하면 오류(잘못된 선택, 누락 등)가 늘어납니다. 유사도 기반 RAG(Retrieval-Augmented Generation)를 활용해도, 비슷한 테이블을 찾을 수는 있지만 정확히 일치하는 테이블을 반드시 검색해오긴 어렵다는 한계가 존재합니다.

→ 따라서, 수많은 테이블을 체계적으로 관리하고, LLM이 더 정확하게 테이블을 선택·참조할 수 있도록 만드는 방법이 필요합니다.

2. 해결 아이디어: 테이블 카테고라이징

카테고라이징이 필요한 이유

  • LLM이 모든 테이블을 한 번에 다루지 않고,
  • 계층적(피라미드형)으로 테이블을 분류해 제한된 검색 후보 내에서 SQL을 생성하게 하면 오류를 줄일 수 있습니다.

테이블 이름 패턴 활용

  • 대부분의 테이블은 이름이 first_list_second_list_third_list ... (언더스코어(_)로 구분) 형식으로 정의되어 있습니다.

  • 이를 활용해 다음과 같이 자동 카테고리화가 가능합니다.

    • 가장 앞의 이름 → 대분류
    • 두 번째 이름 → 중분류
    • 세 번째 이름 → 소분류
    • ...

3. 카테고라이징 방법론

  1. 테이블 명칭 파싱

    • DB 내 모든 테이블명을 _ 구분자로 분해합니다.
    • 각각 대분류, 중분류, 소분류 ... 필드를 추출합니다.
  2. 중복 제거 및 리스트 생성

    • 분해한 각 부분(대분류, 중분류, 소분류 ...)별로 중복을 제거한 리스트를 만듭니다.

    -예시: - 대분류: customer, order, product, ... - 중분류: info, detail, history, ... - 소분류: korea, us, 2023, ...

  3. 카테고리 구조 저장 분류된 정보를 구조적으로 저장(예: JSON, DB, 파일 등)합니다.

4. 사용 예시 및 응용

  • 사용자가 자연어로 질문을 하면, 질문의 의미에 맞는 카테고리 리스트(대분류-중분류-소분류)를 적극 참고하여 LLM이 더 효율적으로 예상 테이블명을 추론하도록 설계합니다.
  • 이렇게 하면,
    • 실제 테이블이 수천/수만개여도,
    • LLM이 대~소분류별 후보군을 점차 좁혀가며 정확한 테이블명 예측이 가능해집니다.
  • 최종적으로 추론된 테이블명을 vectorDB 등 RAG 프로세스로 검색하여 높은 정확도의 SQL 쿼리 생성을 도울 수 있습니다.

5. 결론

  • 대규모 DB 환경에서 text-to-sql 작업 효율을 높이기 위해 카테고리 기반 피라미드 구조를 활용하는 것이 매우 효과적입니다.

  • 이는 LLM의 한계(모든 테이블명을 즉시 알 수 없음, RAG의 유사도 검색 불확실성)를 보완하는 현실적인 접근법입니다.

⇒ 테이블 네이밍 규칙을 적극적으로 활용해 계층별 리스트를 만들고, LLM의 테이블 추론 단계를 체계화하는 것이 핵심 전략입니다.


Architecture

...


Code

...

Clone this wiki locally