Search

21. Text-to-SQL 2차 개선

섹션
6. Text-to-SQL: 어제 서울에서 가장 많이 팔린 물건은?

Text-to-SQL 2차 개선

기존 방식의 문제점

스키마 과다 로드 문제

강의 예제: 이커머스에서 26개 테이블 사용
실제 쿼리에서는 3개 테이블만 사용 (items, orders, products)
전체 스키마를 가져오지만 실제로는 일부만 필요
실제 서비스에서는 100개, 200개 테이블과 더 많은 컬럼 존재

토큰 사용량 증가 문제

스키마가 복잡해지면 컨텍스트가 가득 참
토큰 한계 초과 가능성
불필요한 토큰 사용으로 비용 증가
처리 시간 증가 및 사용자 경험 악화

개선 방향

2단계 접근법

1.
테이블 목록 먼저 가져오기 (이름, 설명, 컬럼 정보)
2.
사용자 질문 기반으로 필요한 테이블만 선별
3.
선별된 테이블의 스키마만 가져오기
4.
토큰 사용량 감소 및 효율성 향상

구현 단계

1단계: 테이블 목록 가져오기

PostgreSQL에 쿼리 추가 (암기 불필요)
테이블명, 설명, 컬럼 정보 추출
초기에는 테이블 설명이 비어있음 (의도적)

2단계: 테이블 설명 추가

Comment on table 스크립트 실행
테이블에 설명 추가 (예: address → 배송 주소, 결제 주소 구분)
AI가 테이블 용도를 더 정확히 파악할 수 있도록 컨텍스트 제공

3단계: 테이블명 추출 LLM 체인

26개 테이블명을 한 번에 처리
이전처럼 루프 대신 전체 데이터를 한 번에 처리
코드 노드를 사용하여 결합

4단계: n8n 노드 구성

노드 복사 및 붙여넣기 활용
PostgreSQL과 LLM 체인 간 연결 재구성
코드 재사용으로 26개에서 1개로 출력 감소

5단계: 테이블 선별 LLM 설정

시스템 프롬프트에 테이블 설명 포함
사용자 질문과 관련된 테이블명만 추출 요청
GPT-4.1 사용 (어려운 작업이므로)
문자열 대신 리스트 반환 필요

6단계: JavaScript 처리

테이블명을 문자열 리스트로 변환
JavaScript map 메서드 사용
각 항목을 문자열로 변환 후 따옴표로 감싸기
WHERE 조건에 사용할 수 있도록 튜플 형태로 래핑

결과 및 트레이드오프

장점

실제 서비스에서 더 확장 가능한 구현
토큰 사용량 감소
스키마 로드 최적화

단점

기존 방식보다 처리 시간 증가
더 많은 작업 단계 필요

다음 단계

Text-to-SQL 워크플로우를 Slackbot에 연결
Slack에서 답변을 받을 수 있도록 구현