감사 데이터 조회와 문서 검색을 나눈 챗봇 엔진
감사 데이터를 Gold 테이블로 정리한 뒤에는 SQL을 직접 작성하지 않아도 질문할 수 있는 인터페이스를 준비했습니다. “지난달 등록이 몇 건인가” 같은 데이터 질문과 “배포 절차가 무엇인가” 같은 문서 질문은 필요한 근거가 달랐습니다.
그래서 질문을 데이터 조회와 문서 검색으로 나눴습니다. 이 글은 2026년 초 직접 구성한 Text-to-SQL·RAG 엔진의 기록입니다. 이후 Text-to-SQL을 Genie로 바꾼 내용은 후속 글에서 다룹니다.
질문 분류와 두 처리 경로
라우터는 데이터 조회를 sql, 문서 검색을 wiki로 분류했습니다. 경로에 따라 검색할 자료와 프롬프트, 결과의 형태를 다르게 구성했습니다.
처음에는 분류가 불분명하면 문서 경로로 넘기는 방식도 사용했습니다. 하지만 그 경로라고 항상 맞거나 안전한 답이 되는 것은 아닙니다. 데이터와 문서가 함께 필요한 질문이나 의도가 모호한 질문은 추가로 확인하는 흐름이 필요합니다.
스키마와 예시 SQL 검색
Text-to-SQL에는 관련 테이블의 설명·컬럼 정보를 찾는 인덱스와 질문·검증된 SQL 쌍을 찾는 인덱스를 따로 뒀습니다. 질문과 관련된 자료를 모아 SQL 생성에 전달하는 구성입니다.
예시 쿼리는 문법뿐 아니라 어떤 기준으로 집계하는지도 맞아야 했습니다. 일별 집계 테이블에서 한 달의 이벤트 수를 구한다면 행 수가 아니라 event_count를 합산해야 합니다.
SELECT action_type, SUM(event_count) AS total_events
FROM audit_daily_summary
WHERE event_date >= '2026-01-01'
AND event_date < '2026-02-01'
GROUP BY action_type;기간과 테이블 이름은 설명용 예시입니다. 일별 고유 사용자 수를 단순히 더하면 월간 고유 사용자 수가 되는 것도 아닙니다. 지표에 따라 원본이나 다른 집계가 필요하므로, 자주 묻는 질문과 올바른 SQL을 함께 검토해야 했습니다.
생성된 SQL의 실행 범위
초기 구현에서는 읽기 쿼리를 사용하고 반환 행 수와 실행 시간을 제한했습니다. 다만 프롬프트에 SELECT만 쓰라고 적거나 특정 키워드를 차단하는 것만으로 실행 범위를 보장할 수는 없습니다.
실행 계정의 읽기 권한과 허용할 테이블·함수, 파싱한 쿼리 구조를 함께 제한해야 합니다. 여러 문장과 CTE·중첩 쿼리도 확인할 대상입니다. LIMIT은 반환 크기를 줄이는 기준이지 스캔 비용이나 민감 데이터 접근까지 제한하는 장치는 아닙니다.
앱 공통 계정으로 실행한다면 질문한 사용자에게 보여줄 데이터 범위도 별도로 맞춰야 합니다. 앱 인증과 사용자 권한의 차이와 연결되는 부분입니다.
Confluence 문서 기반 답변
문서는 페이지를 수집해 청크로 나누고, URL과 제목을 함께 저장해 검색했습니다. 당시에는 약 8천 개 청크를 인덱스에 넣었습니다. 검색 결과를 바탕으로 답변하고 출처 링크도 전달했습니다.
문서가 검색됐다는 사실만으로 질문을 뒷받침하는 근거가 되는 것은 아닙니다. 적용 환경과 문서의 시점, 접근 권한을 확인해야 합니다. 한국어 질문도 사용하는 임베딩 모델과 실제 질문 묶음으로 검색 결과를 확인할 필요가 있었습니다.
문서 수집과 인덱스 동기화
Confluence 페이지 변경, Delta 소스 테이블 갱신, 검색 인덱스 동기화는 서로 다른 단계입니다. Delta Sync 인덱스가 Confluence를 직접 읽어 주는 것은 아닙니다.
문서를 다시 수집하고 청크를 갱신한 뒤 인덱스를 동기화해야 새 내용이 검색됩니다. 삭제와 권한 변경도 반영해야 합니다. Continuous와 Triggered 등 인덱스 설정에 따라 갱신을 시작하는 방식도 달라집니다.
스키마와 예시도 마찬가지였습니다. 컬럼이 바뀌거나 잘못된 쿼리 예시를 고치면 소스 데이터와 인덱스까지 이어서 확인해야 했습니다.
구현한 엔진은 데이터 질문에는 스키마와 예시 SQL을, 문서 질문에는 Confluence 검색 결과와 출처를 전달하는 구성이었습니다. 두 질문을 같은 자료와 프롬프트로 처리하던 문제를 나눴지만, 집계 기준과 권한, 문서 갱신을 확인하는 일은 남았습니다. 이후에는 이 엔진을 챗봇 화면에 연결하고, SQL 생성 부분은 다시 Genie로 바꾸는 작업으로 이어졌습니다.
다음 글에서는 이 엔진을 스트리밍 답변과 차트가 있는 화면에 연결한 과정을 다룹니다.