RAG를 사용한 Text to SQL

Dify의 RAG를 결합한 Text-to-SQL 구현을 통해 다중 테이블 JOIN 및 쿼리 정확도를 높이는 방법입니다.
승헌's avatar
May 11, 2026
RAG를 사용한 Text to SQL

최근 LLM을 활용해 자연어를 SQL 쿼리로 변환하는 Text-to-SQL 기술이 주목을 받고 있습니다. 하지만 실제 복잡한 비즈니스 데이터베이스에 적용해 보면, 모델이 테이블 구조를 헷갈리거나 존재하지 않는 컬럼을 사용하는 등 일명 ‘환각(Hallucination)’이 빈번하게 발생합니다.

Dify의 RAG 기능을 활용하여, 여러 테이블 사이에서도 정확하게 JOIN 쿼리를 뽑아내는 지능형 DB 에이전트 구축 방법을 소개합니다.

  1. 왜 단순 프롬프트가 아닌 ‘RAG’ 인가? 단순히 LLM 컨텍스트에 “이 테이블들 참고해서 SQL 짜줘” 라고 프롬프트에 모든 스키마를 넣는 방식은 두 가지 한계가 있습니다.

  • 토큰 소모량: 테이블이 수십 개가 넘어가면 프롬프트 비용이 급증합니다.

  • 정확도 저하: 관련 없는 테이블 정보까지 입력되면 모델이 혼란을 느껴 엉뚱한 테이블을 JOIN 하기 시작합니다.

RAG 방식을 도입하면, 사용자의 질문을 분석해 관련된 테이블 정보만 지식베이스에서 검색해 모델에게 전달하므로 훨씬 경제적이고 정확합니다.

  1. DB 생성
    먼저 DB의 메타데이터를 문서화하여 Dify의 지식에 등록해야 합니다. 컬럼에 대한 상세 설명과 테이블 간 관계(FK)를 명시하는 것이 핵심입니다. 예시로 3가지 테이블을 생성하고 각각 테이블 정보를 문서화 하여 지식으로 등록하겠습니다.

customers
products
orders
  • customers: 고객 기본 정보(가입일, 이메일 등)

  • products: 상품 마스터(단가, 카테고리 등)

  • orders: 주문 이력(고객ID와 상품ID를 매개로 연결)

    3. DB 스키마 정보 문서화

customers schema

products schema

orders
  1. Dify 지식 베이스 등록

Dify 지식 베이스 등록

Dify 지식 베이스에 DB 스키마들을 등록합니다.

  1. Dify 에이전트 생성

Dify 에이전트 생성

컨텍스트에 방금 등록한 DB 스키마 정보 지식 베이스를 추가하고, 도구에 DB Client tool을 추가하여 에이전트가 DB에 접근하여 데이터를 가져올 수 있도록 합니다.

그리고 컨텍스트에 다음과 같이 작성하였습니다.

## Role
너는 사용자의 자연어 질문을 분석하여 정확한 SQL 쿼리를 생성하고 데이터를 조회하는 '데이터베이스 전문가'야.

## Data Schema Information
너는 지식 베이스(RAG)를 통해 `customers`, `orders`, `products` 테이블의 정보를 참조할 수 있어. 쿼리를 작성하기 전에 반드시 지식 베이스에서 관련 테이블의 컬럼명과 관계(Foreign Key)를 확인해.

## Rules for SQL Generation
1. **정확한 테이블 참조**: 질문에 '고객'이 포함되면 `customers`, '상품'이 포함되면 `products`, '주문/구매'가 포함되면 `orders` 테이블을 사용해.
2. **JOIN 활용**: 여러 테이블의 정보가 필요할 경우 아래 관계를 사용하여 JOIN해.
   - `customers.customer_id = orders.customer_id`
   - `products.product_id = orders.product_id`
3. **표준 SQL 사용**: 가능한 표준 SQL을 사용하며, 문자열 비교 시 `LIKE``LOWER()`를 적절히 활용해.
4. **안전성**: `SELECT` 문만 생성하며 `DROP`, `DELETE`, `UPDATE` 등의 변경 쿼리는 절대 작성하지 마.

## Workflow
1. **Step 1 (Retrieve)**: 질문을 분석하고 지식 베이스에서 필요한 테이블 스키마 정보를 가져와.
2. **Step 2 (Generate)**: 가져온 스키마를 바탕으로 최적의 SQL 쿼리를 작성해.
3. **Step 3 (Execute)**: 생성된 쿼리를 DB 도구를 통해 실행해. (도구가 연결된 경우)
4. **Step 4 (Answer)**: DB 결과 데이터(Raw Data)를 사용자가 이해하기 쉬운 한국어 문장으로 설명
  1. SQL 생성 테스트

SQL 생성 테스트

Q. 고객별로 지금까지 지불한 총 금액이 얼마인지 계산해서 금액이 높은 순서대로 정렬해줘 라는 질문에 에이전트가 알아서 문서의 schema 정보를 검색해서 SQL 쿼리를 만들고 데이터를 조회하여 답변한 것을 볼 수 있습니다.

LLM의 Retrieval
LLM의 SQL 생성

지금까지 Dify와 RAG를 이용해 SQL 에이전트를 만드는 과정을 살펴보았습니다. Dify의 RAG 기능을 활용하면 LLM의 고질적인 문제인 환각을 제어하고, 복잡한 다중 테이블 환경에서도 신뢰할 수 있는 SQL 에이전트를 구축할 수 있습니다. 정확한 스키마 문서화와 명확한 가이드라인이 결합된다면 지능형 DB 에이전트가 탄생할 수 있습니다.

오픈네트웍시스템 이승헌

Share article