-
Notifications
You must be signed in to change notification settings - Fork 6
Text‐to‐SQL 성능을 높이기 위한 테이블 카테고라이징 전략
Text-to-SQL 작업에서 대규모 데이터베이스(DB)에는 수백~수천, 때로는 수만 개의 테이블이 존재할 수 있습니다.
**LLM(대형언어모델)이 자연어 질문을 SQL로 변환할 때
테이블 이름이나 구조를 모두 한 번에 인지하도록 하는 것은 현실적으로 어렵고, 많은 테이블 이름을 동시에 주입해서 처리하면 오류(잘못된 선택, 누락 등)가 늘어납니다. 유사도 기반 RAG(Retrieval-Augmented Generation)를 활용해도, 비슷한 테이블을 찾을 수는 있지만 정확히 일치하는 테이블을 반드시 검색해오긴 어렵다는 한계가 존재합니다.
→ 따라서, 수많은 테이블을 체계적으로 관리하고, LLM이 더 정확하게 테이블을 선택·참조할 수 있도록 만드는 방법이 필요합니다.
- LLM이 모든 테이블을 한 번에 다루지 않고,
- 계층적(피라미드형)으로 테이블을 분류해 제한된 검색 후보 내에서 SQL을 생성하게 하면 오류를 줄일 수 있습니다.
-
대부분의 테이블은 이름이 first_list_second_list_third_list ... (언더스코어(_)로 구분) 형식으로 정의되어 있습니다.
-
이를 활용해 다음과 같이 자동 카테고리화가 가능합니다.
- 가장 앞의 이름 → 대분류
- 두 번째 이름 → 중분류
- 세 번째 이름 → 소분류
- ...
-
테이블 명칭 파싱
- DB 내 모든 테이블명을 _ 구분자로 분해합니다.
- 각각 대분류, 중분류, 소분류 ... 필드를 추출합니다.
-
중복 제거 및 리스트 생성
- 분해한 각 부분(대분류, 중분류, 소분류 ...)별로 중복을 제거한 리스트를 만듭니다.
-예시: - 대분류: customer, order, product, ... - 중분류: info, detail, history, ... - 소분류: korea, us, 2023, ...
-
카테고리 구조 저장 분류된 정보를 구조적으로 저장(예: JSON, DB, 파일 등)합니다.
- 사용자가 자연어로 질문을 하면, 질문의 의미에 맞는 카테고리 리스트(대분류-중분류-소분류)를 적극 참고하여 LLM이 더 효율적으로 예상 테이블명을 추론하도록 설계합니다.
- 이렇게 하면,
- 실제 테이블이 수천/수만개여도,
- LLM이 대~소분류별 후보군을 점차 좁혀가며 정확한 테이블명 예측이 가능해집니다.
- 최종적으로 추론된 테이블명을 vectorDB 등 RAG 프로세스로 검색하여 높은 정확도의 SQL 쿼리 생성을 도울 수 있습니다.
-
대규모 DB 환경에서 text-to-sql 작업 효율을 높이기 위해 카테고리 기반 피라미드 구조를 활용하는 것이 매우 효과적입니다.
-
이는 LLM의 한계(모든 테이블명을 즉시 알 수 없음, RAG의 유사도 검색 불확실성)를 보완하는 현실적인 접근법입니다.
⇒ 테이블 네이밍 규칙을 적극적으로 활용해 계층별 리스트를 만들고, LLM의 테이블 추론 단계를 체계화하는 것이 핵심 전략입니다.
...
...