MCP와 시맨틱 게이트웨이로 NL2SQL 환각·권한 문제 해결
AI Agent에 데이터베이스를 직접 연결할 때 생기는 심각한 시맨틱 환각과 기업 데이터 권한 통제 문제를 MCP와 시맨틱 게이트웨이로 해결하는 방법을 다룬다.
중국어 원문을 AI로 번역했습니다. 고유명사와 수치는 원문 표기를 우선하며, 중요한 판단에는 아래 출처 원문을 함께 확인하세요.
2026년에는 AI Agent(Cursor, Claude Desktop, Dify, Coze 등)에 데이터베이스 연결을 덧붙이는 것이 이미 많은 개발자의 기본 세팅이 되었다. 간단한 공식 SQLite/MySQL MCP부터 각종 범용 클라이언트 확장까지, 대규모 언어 모델이 "데이터베이스를 직접 조회"하도록 하는 진입 장벽은 극히 낮아졌다.
그러나 실제 비즈니스 시나리오에 들어서면, 대부분의 팀은 곧바로 두 개의 높은 벽에 부딪힌다:
의미론적 환각이 심각함: 대규모 언어 모델은 기업의 "은어" 약어, 열거형 사전, 암시적 다중 테이블 연관 관계를 전혀 이해하지 못하며, 생성한 SQL은 흔히 테이블 Join조차 잘못한다;
프로덕션 권한 통제 불능: Agent에 데이터베이스 접속 자격 증명을 그대로 노출하는 것은 "알몸으로 뛰는 것"과 다름없으며, 권한을 넘어선 삭제·수정과 고위험 전 테이블 스캔을 막을 수 없다; 반면 읽기 전용 권한만으로는 Agent가 경량 CRUD 애플리케이션을 감당할 수 없다.
이 글은 우리가 전통 BI, 자체 구축 ChatBI에서 오픈소스 프로젝트 DatI (Data Intelligence)로 진화해 온 실전 경험을 출발점으로 삼아, 다음을 깊이 파헤친다: Agent 시대에 기업급 NL2SQL 스마트 질의와 경량 애플리케이션은 도대체 어떻게 만들어야 하는가?
1. 진화의 근원: 전통 BI, NL2DSL에서 MCP 의미 게이트웨이까지
나의 앞선 두 번의 커리어 경험은 모두 BI를 중심으로 했다.
가장 처음에는 주로 일선 비즈니스를 위한 리포트를 만들었다: SQL로 데이터 서비스를 작성하고, 하이코드로 대시보드를 개발했으며, Tableau, PowerBI, 永洪 BI를 사용해 셀프서비스 분석도 했다; 두 번째 직장에서는 자체 개발 BI 시스템으로 방향을 틀었는데, 마침 대규모 언어 모델의 물결이 폭발하던 시기라 팀의 중심축은 스마트 질의(ChatBI) 방향에 집중되었다.
하지만 당시의 스마트 질의는 종종 아주 화려한 Demo는 만들 수 있었지만, 비즈니스 일선에서 실제로 정착시키기는 극히 어려웠다. 핵심痛点은 두 가지였다:
NL2DSL의 딜레마: 초기 모델의 능력이 제한적이어서 데이터 추출 정확도를 높이기 위해, 사람들은 일반적으로 "자연어를 구조화된 DSL(예: 지표 모델)로 변환"하는 노선을 채택했다. 그러나 DSL은 통제 가능성을 높이는 동시에 복잡한 즉석 다차원 분석의 유연성을 심각하게 질식시켰다.
전달 형태의 분열: 실제 비즈니스에서 사용자가 원하는 것은 흔히 단독으로 고립된 "질의 대시보드"가 아니라, "데이터 조회와 변경 능력"을 각종 일상 워크플로(예: 협업 오피스, 자동화 고객 서비스, 순찰 로봇)에 매끄럽게 내장하는 것이었다.
Model Context Protocol (MCP)의 보급과 함께, 우리는 국면을 깨는 우아한 해법을 찾았다: 무거운 BI 플랫폼 없이, 데이터베이스를 규격화된 MCP 서비스로 직접 패키징하고, 경량화된 의미 계층과 통제된 도구 체인을 결합하여 임의의 Agent에 곧바로 무결점으로 꽂아 넣는 것이다.
이것이 바로 오픈소스 프로젝트 DatI (Data Intelligence)의 핵심 취지다:
DatI의 설계 철학은 매우 절제되어 있다: 다중 소스 데이터베이스 연결 ➔ 비즈니스 의미 계층 통합 유지 ➔ 사전 설정 및 사용자 정의 도구 조립 ➔ 클릭 한 번으로 표준 MCP 서비스로 게시. 터미널 Agent가 이 MCP를 마운트하면, 정확한 읽기 전용 질의를 완수할 수 있을 뿐만 아니라 화이트리스트 메커니즘을 통해 안전하게 생성·수정·삭제를 실행하여 손쉽게 로우코드 경량 애플리케이션을 구축할 수 있다.
2. 시나리오 실전: 데이터 분석에서 경량 애플리케이션 구축까지 (가계부 사례)
우리는 고전적인 "가정 2인 가계부 및 소비 분석" 시나리오를 통해 경량 의미 게이트웨이의 실제 정착 흐름을 살펴본다:
비즈니스 요구사항: 두 사용자가 하나의 가정 장부를 공유한다. 기장 시 자동으로 신원을 인식해 각자의 거래 내역에 계상한다; 분석 시에는 개인별로 분해할 수도 있고 가정 전체 기준으로 다차원 집계할 수도 있다.
기반 아키텍처: MySQL에는 3개의 테이블이 포함된다(account 계정 테이블, category 카테고리 테이블, transaction 거래 내역 테이블).
1. 의미 모델링과 도구 구성
플랫폼의 도움을 받아(dati-ops skill 자동화 구성 지원):
4개의 사전 설정 도구를 활성화한다: 메타데이터 검색, 테이블 목록, 테이블 구조 상세, 통제된 SQL 실행(SELECT만 허용하도록 제한).
4개의 매개변수화된 사용자 정의 도구를 구성한다: 계정 초기화, 기장, 계정 수정, 거래 내역 삭제.
2. 크로스 호스트 Agent 무결점 접속
MCP 서비스로 게시한 후, 사용자 1은 WorkBuddy에 접속하고, 사용자 2는 千问办公에 접속한다. 백엔드를 중복 개발할 필요 없이, 두 Agent는 호스트가 자체 제공하는 OCR 이미지 인식 경비 처리, 위챗 원격 대화, 차트 시각화 능력을 재사용하여 곧바로 기장과 소비 분석을 진행할 수 있다:
3. 심층 해부: 경량 데이터베이스 의미 게이트웨이의 아키텍처 설계
DatI는 전체적으로 세 가지 핵심 모듈로 구성된다:
1. 이종 데이터 소스 접속
현재 MySQL, PostgreSQL, ClickHouse, Doris, MariaDB 등 주류 관계형 및 분석형 데이터베이스를 네이티브로 지원하며, 빠른 수평 확장도 지원한다.
왜 백엔드는 Java로 구축하는 것을 고수하는가? AI 분야에서 Python과 TypeScript가 분명 유행하지만, 데이터 게이트웨이의 토대는 기업 프로덕션 데이터베이스다. Java 생태계의 JDBC 표준 규격과 HikariCP 커넥션 풀은 돌발적인 순간 고동시성, 장기 연결 관리, 트랜잭션 제어와 이종 드라이버 호환성에서 20여 년간 산업급 고가용성 검증을 거쳤으며, 그 안정성은 동적 언어가 따라가기 어렵다.
2. 비즈니스 의미 모델링 계층
대규모 언어 모델이 NL2SQL에서 실수하는 90%는 비즈니스 컨텍스트가 부족하기 때문이다. DatI는 테이블, 열, 열거형 사전 값, 도메인 용어에 대해 비즈니스 별칭과 상세 설명을 구성할 수 있게 한다:
예를 들어 txn_type=1을 명확히 "이체 지출"로 바인딩하고, "GMV"를 구체적인 집계 계산 공식에 바인딩한다.
대규모 언어 모델 추론에 정확하고 구조화된 Prompt 컨텍스트 보완을 제공한다.
3. MCP 서비스 동적 게시
선정된 데이터 범위, 도구 세트와 시스템 프롬프트(Prompt)를 클릭 한 번으로 표준 Streamable HTTP MCP 엔드포인트로 게시한다.
왜 서버 측 MCP 프로토콜을 선택하는가? 전통적인 로컬 Skill은 각 사용자 컴퓨터에 데이터베이스 계정 비밀번호를 평문으로 구성해야 하므로 위험이 극히 높다. 반면 서버 측 MCP는 데이터 소스 자격 증명을 중앙에서 위탁 관리하고 인증하며, 터미널 개발자와 Agent는 개인 Token 하나만 있으면 연결할 수 있어 "한 곳에서 의미를 구성하면 전원이 안전하게 재사용"하는 것을 실현한다.
4. 도구 체인의 핵심 설계: 사전 설정 탐색 + 매개변수화 템플릿
도구는 전체 MCP 게이트웨이가 대규모 언어 모델과 상호작용하는 핵심 중추다. DatI는 "사전 설정 탐색"과 "매개변수화 템플릿"이라는 이중 트랙 메커니즘을 채택했다:
1. 사전 설정 도구 체인(자율 탐색 공간)
Elasticsearch 메타데이터 연합 검색: 테이블 이름, 필드 주석, 열거형 사전과 비즈니스 용어를 평탄화하여 ES에 저장한다. Agent는 자연어 키워드 검색을 한 번만 발发起하면 역색인 기반으로 가장 관련성 높은 후보 테이블과 필드 컨텍스트를 정확히 리콜할 수 있어 Prompt Token 오버헤드를 크게 줄인다.
테이블 공간 탐색 도구(ListTables / DescribeTable): Agent가 필요할 때 요청에 따라 테이블 구조를 펼쳐 깊이 파고들 수 있게 한다.
통제된 SQL 실행기: 대규모 언어 모델이 자율적으로 즉석 쿼리를 작성하는 것을 지원하지만, AST 문법 수준의 작업 통제를 엄격히 적용한다(예: DROP 금지, 선택적으로 쓰기 작업 금지, 쿼리 타임아웃과 최대 행 수 제한).
메타데이터 자가 진화 갱신: Agent가 상호작용 중에 용어 메타데이터를 제출하거나 갱신할 수 있게 하여, 쓸수록 비즈니스를 더 잘 이해하는 자기 진화 폐루프를 형성한다.
2. 매개변수화 SQL 템플릿(고위험 작업과 멀티테넌트 안전 잠금)
복잡한 다중 테이블 조인 쿼리나 고위험 UPDATE/DELETE 작업에 대해, DatI는 매개변수화 SQL 템플릿 사용을 권장한다. 템플릿 엔진은 Handlebars와 유사한 선언형 동적 문법을 채택하며, 컨텍스트 세션 변수 주입을 지원한다(예: 현재 사용자의 {{_user.id}} 또는 {{_user.name}}):
UPDATE transaction SET {{#if amount}}amount = {{amount}},{{/if}} {{#if category}}category_id = (SELECT id FROM category WHERE name = {{category}}),{{/if}} updated_at = now()WHERE id = {{transaction_id}} AND user_name = {{_user.name}}
이 설계의 거대한 장점은 다음과 같다:
SQL 인젝션과 권한 초월 변조 방지: 대규모 언어 모델은 구체적인 매개변수만 채워 넣을 수 있을 뿐, 핵심 갱신 로직을 변조할 수 없다;
행 수준 데이터 격리: 설령 대규모 언어 모델이 "환각"을 일으키더라도, 최하층의 WHERE user_name = {{_user.name}}은 서버 측에서 인증 컨텍스트로부터 강제로 주입되어 권한 초월 접근을 완전히 차단한다.
5. 횡적 비교: DatI의 핵심 생태적 위치
AI에 데이터베이스를 연결하는 방안은 끝없이 쏟아져 나온다, 공식 단일 데이터베이스 MCP, DBHUB부터 상용 ChatBI까지, DatI는 대체 불가능한 어떤 가치를 지니는가?
평가 차원
DatI (의미 게이트웨이)
순수 코드 직접 작성
공식 오픈소스 단일 데이터베이스 MCP
DBHUB / 범용 툴박스
독립형 중량 ChatBI
접속 형태
서버 측 표준 MCP
임의 형태
로컬 프로세스 MCP
폐쇄형 독립 Web 애플리케이션
자격 증명 보안
서버 측 중앙 위탁 관리 / Token 격리
코드 구현에 따라 다름
로컬 구성 파일 평문 저장
로컬 평문 저장
서버 측 위탁 관리
비즈니스 의미 계층
완전 지원(용어/사전/ES 검색)
Prompt 하드코딩 필요
원시 DDL schema만 보유
사유 DSL 모델링 바인딩
복잡 쿼리 보장
사전 설정 탐색 + 매개변수화 SQL 템플릿
복잡한 Tool 로직 수작업 작성
보장 없음, 극히 쉽게 실패
단순 사용자 정의 도구
고정 지표 모델 바인딩
워크플로 내장도
극히 높음(임의 MCP 호스트에 즉시 플러그 앤 플레이)
극히 높음(단 개발량 큼)
높음
극히 낮음(제한적 iframe/API)
간단히 요약하면, DatI의 포지셔닝은 AI Agent를 위해 설계된 기업급 데이터베이스 의미 게이트웨이다:
공식 단일 데이터베이스 MCP보다 비즈니스를 더 잘 이해하고 더 안전하다(의미 계층, ES 검색과 매개변수화 인젝션 방지가 더해짐);
중량 ChatBI보다 더 경량이고 더 개방적이다(중량 패키지 배포가 불필요하고, 초 단위로 임의 Agent 워크플로에 내장됨);
순수 코드 직접 작성보다 더 민첩하다(시각적 구성, 전원 Token 재사용, 제로 유지보수 비용).
6. 오픈소스 공동 구축
어떤 개발 도구든 성숙하려면 실제 비즈니스 시나리오의 지속적인 단련이 필수적이다. 여러분이 DatI를 여러분의 Cursor, Dify 또는 자체 구축 Agent에 가져가 시도해 보시길 매우 기대하며, 체험, 비판과 공동 구축을 환영한다!
💻 GitHub 오픈소스 주소: https://github.com/yimindev/dati
🌟 프로젝트가 여러분의 Agent 아키텍처 설계에 영감을 주었다면, Star를 눌러 응원해 주시길 환영합니다!