NL2SQL 슬롯필링 설계
LHG 2026-08-27
신청서에 빈칸을 채우는 과정이라고 생각하면 쉽다
빈칸이 있는 조회 신청서를 채우는 과정이다
의도: 거래내역 조회 필요한 슬롯: 계좌, 기간 현재 채워진 슬롯: 없음 부족한 슬롯: 계좌, 기간
현재 발화 추출 → 이전 대화 재사용 → 후보 자동 조회 → 기본값 적용 → 그래도 부족하면 되묻기
사용자 말이 실제 조회와 답변으로 바뀌는 세 단계다
Lex, Dialogflow, Rasa, Copilot Studio를 찾아봤다
사용자가 말한 값과 SQL로 해석하는 값은 다르다
metrics
dimensions
filters
timeRange
aggregation
comparison
sort
limit
negation
문장을 바로 SQL로 바꾸지 않는다
예시 네 가지로 살펴본다
"급여계좌의 최근 한 달 출금 내역을 금액 큰 순서로 10건"
{ "slots": {"account": "급여계좌", "period": "최근 한 달", "direction": "출금", "limit": 10}, "missing": [], "status": "COMPLETE" }
되묻기 없이 바로 완성한다.
사용자: 거래내역 보여줘 시스템: 어느 계좌의 거래내역을 조회할까요? [급여계좌] [운영계좌] 사용자: 급여계좌 시스템: 조회 기간을 선택해 주세요. [1주일] [1개월] [3개월]
한 번에 여러 값을 묻지 않고 우선순위 높은 것부터 확인한다.
"급여계좌 지난달 출금 내역" 다음에 "그 계좌 잔액은?"
"운영계좌 잔액 알려줘" → 후보: 연구운영계좌, 사업운영계좌
{ "kind": "clarify", "text": "어느 운영계좌를 조회할까요?", "choices": [{"id": "ACC_01", "label": "연구운영계좌"}, {"id": "ACC_02", "label": "사업운영계좌"}] }
AI가 후보 중 하나를 임의로 고르면 안 된다.
각자 맡는 일이 다르다
의미 판단과 구조 판정을 분리한다
작은 모델도 한 번에 하나의 판단에 집중하게 한다
새 질문인지 후속 질문인지부터 정한다
CONTINUE라고 해서 채워진 슬롯을 전부 이어받으면 위험하다. 새 타입이 허용하는 슬롯만 선택적으로 이어받는다.
되묻기는 최후 수단이다
판단이 여러 곳에 있으면 정본이 갈라진다