NL2SQL 멀티턴 설계
LHG 2026-08-27
처음 보는 사람도 이해되게 먼저 풀어둔다
첫 질문: 급여계좌의 최근 한 달 거래내역 보여줘 다음 질문: 출금만 보여줘
두 번째 문장만 보면 계좌도 기간도 알 수 없다. 사람은 앞선 대화를 보고 이렇게 이해한다.
급여계좌의 최근 한 달 출금 거래내역을 보여줘
이 설계의 목적은 불완전한 질문을 혼자서도 실행할 수 있는 정확한 질문으로 완성하는 것이다.
보안 검사를 통과한 뒤, Planner가 계획을 세우기 전에 끝낸다
오타 교정, 문장 분석, 이전 대화 참고를 한 작업으로 뭉개지 않는다. 각 단계의 입력과 결과를 남겨야 어디서 의미가 달라졌는지 확인할 수 있다.
사용자가 입력한 원문을 직접 덮어쓰지 않는다
원문: 그중 지냔달 천마넌 이상 출금만 교정문: 그중 지난달 천만원 이상 출금만 완성 질문: 직전 조회 계좌에서 지난달 출금 거래 중 천만원 이상인 내역을 조회해줘
숫자, 날짜, 계좌번호, 회사명은 교정 전에 보호하고 교정 후에도 같은지 확인한다.
명사인지 아닌지보다, 조회에서 어떤 역할인지가 중요하다
{ "originalQuery": "올해 고객별 매출 상위 5개 보여줘", "semanticSlots": { "metrics": ["매출"], "dimensions": ["고객"], "timeRange": {"kind": "THIS_YEAR"}, "aggregation": "SUM", "sort": {"key": "매출", "direction": "DESC"}, "limit": 5 }, "normalizedIntent": "올해 고객별 매출 합계를 내림차순으로 정렬해 상위 5개를 조회해줘" }
pos
role
METRIC
DIMENSION
TIME_RANGE
SORT
LIMIT
답변 문장을 다시 요약하지 않는다
AI가 답변을 다시 요약하면 이전 오류가 사실처럼 굳어질 수 있다
<nl2sql_turn complete="true"> 질의: 올해 고객별 매출 합계 상위 5개 지표: 매출 합계 | 분류: 고객 | 기간: 2026년 정렬: 매출 합계 내림차순 | 결과: 5건 | 순위참조: 1~5 </nl2sql_turn>
생성된 SQL문과 전체 결과 데이터는 일반 대화 기록에 넣지 않는다.
현재 질문과 맞는 값만 재사용한다
계좌, 기간처럼 조회에 필요한 빈칸을 채운다
사용자: 거래내역 보여줘 필요한 값: 계좌, 기간 / 현재 값: 없음 시스템: 어느 계좌인가요? [급여계좌] [운영계좌] 사용자: 급여계좌 시스템: 기간을 선택해 주세요. [1주일] [1개월] [3개월]
선택지는 AI가 임의로 만들지 않고 관리자가 등록한 값이나 실제 조회 후보에서 만든다.
일곱 가지로 정리한다
질의 정규화 및 분석은 단순한 오타 교정이 아니다. 원문·교정문·완성 질문을 따로 관리하고 이전 대화는 구조로 기억해 후속 질문에서 맞는 값만 가져다 쓴다. 확인할 수 없는 내용은 만들지 않고 꼭 필요한 것만 되묻는다는 원칙 하나가 꼬리물기 질문을 안정적으로 처리하는 핵심이다.