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이 더 정확하게 테이블을 선택·참조할 수 있도록 만드는 방법이 필요합니다.

  1. 해결 아이디어: 테이블 카테고라이징 카테고라이징이 필요한 이유 LLM이 모든 테이블을 한 번에 다루지 않고, 계층적(피라미드형)으로 테이블을 분류해 제한된 검색 후보 내에서

SQL을 생성하게 하면 오류를 줄일 수 있습니다. 테이블 이름 패턴 활용 대부분의 테이블은 이름이 first_list_second_list_third_list

(언더스코어(_)로 구분) 형식으로 정의되어 있습니다. 이를 활용해 다음과 같이 자동 카테고리화가 가능합니다. 가장 앞의 이름 → 대분류 두 번째 이름 → 중분류 세 번째 이름 → 소분류 3. 카테고라이징 방법론 테이블 명칭 파싱 DB 내 모든 테이블명을 _ 구분자로 분해합니다. 각각 대분류, 중분류, 소분류 필드를 추출합니다. 중복 제거 및 리스트 생성 분해한 각 부분(대분류, 중분류, 소분류)별로

중복을 제거한 리스트를 만듭니다. 예시: 대분류: customer, order, product, ... 중분류: info, detail, history, ... 소분류: korea, us, 2023, ... 카테고리 구조 저장 분류된 정보를 구조적으로 저장(예: JSON, DB, 파일 등)합니다. 4. 사용 예시 및 응용 사용자가 자연어로 질문을 하면,

질문의 의미에 맞는 카테고리 리스트(대분류-중분류-소분류)를 적극 참고하여

LLM이 더 효율적으로 예상 테이블명을 추론하도록 설계합니다. 이렇게 하면, 실제 테이블이 수천/수만개여도, LLM이 대~소분류별 후보군을 점차 좁혀가며 정확한 테이블명 예측이 가능해집니다. 최종적으로 추론된 테이블명을 vectordb 등 RAG 프로세스로 검색하여

높은 정확도의 SQL 쿼리 생성을 도울 수 있습니다. 5. 결론 대규모 DB 환경에서 text-to-sql 작업 효율을 높이기 위해

카테고리 기반 피라미드 구조를 활용하는 것이 매우 효과적입니다. 이는 LLM의 한계(모든 테이블명을 즉시 알 수 없음, RAG의 유사도 검색 불확실성)를

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


Architecture


Code

Clone this wiki locally