Dify 실습 (5): Text to SQL

자연어의 SQL 자동 변환을 통한 쉬운 질의응답 챗봇 구현하기
Dec 19, 2025
Dify 실습 (5): Text to SQL

이번 실습에서는 사용자가 자연어로 질문하면 LLM이 이를 유효한 SQL Query로 변환하여 데이터베이스에 질의하고, 가져온 데이터를 다시 자연어로 가공하여 사용자에게 답변하는 채팅플로우를 구성해 보겠습니다.

1단계: 데이터베이스(DB) 환경 구축

먼저 dify에서 사용할 데이터베이스를 생성하고 초기 데이터를 준비합니다.

예시로 Books 테이블을 생성합니다.

CREATE TABLE Books (
    book_id INT PRIMARY KEY,              -- 도서 고유 ID
    title VARCHAR(200) NOT NULL,          -- 도서 제목
    author VARCHAR(100) NOT NULL,         -- 저자
    genre VARCHAR(50),                    -- 장르
    published_year INT,                   -- 출판 연도
    is_available BOOLEAN DEFAULT TRUE     -- 대출 가능 여부 (TRUE: 대출 가능, FALSE: 대출 중)
);

필드는 book_id(책 번호), title(제목), author(저자), genre(장르), published_year(출판 연도), is_available(대출 가능 여부)을 사용하겠습니다.

테스트를 위해 예시 데이터를 5개 정도 추가하였습니다.

INSERT INTO Books (book_id, title, author, genre, published_year, is_available) VALUES
(1, 'The Great Gatsby', 'F. Scott Fitzgerald', 'Fiction', 1925, TRUE),
(2, 'Sapiens: A Brief History of Humankind', 'Yuval Noah Harari', 'History', 2011, FALSE),
(3, 'Clean Code', 'Robert C. Martin', 'Technology', 2008, TRUE),
(4, 'Interstellar', 'Kip Thorne', 'Science', 2014, TRUE),
(5, 'Harry Potter and the Sorcerer''s Stone', 'J.K. Rowling', 'Fantasy', 1997, FALSE);

2단계: Database Client 도구 설치

Dify에서 데이터베이스에 접근하고 쿼리를 실행할 수 있도록 Database Client 도구를 설치합니다.

API 인증 키 구성을 클릭하여 사용할 데이터베이스의 접속 정보(Host, Port, DB Name, User, Password 등)를 입력하고 연동을 완료합니다.

(이 Database Client 도구가 LLM이 생성한 SQL Query를 실제 DB에 전달하고 결과를 JSON 형태로 받아오는 게이트웨이 역할을 합니다.)

3단계: 채팅플로우 구성

채팅플로우 기반의 Text to SQL 앱을 생성합니다.

LLM 노드에 설치한 도구인 Database Client를 연동합니다.

그 후 추가한 Database Client 노드를 클릭하여 설정한 database를 선택합니다.

LLM이 유효한 SQL을 생성할 수 있도록 시스템 프롬프트를 구성하여 DB 스키마(테이블명, 필드명)를 제공합니다.

당신은 사용자의 질문을 유효한 sql query로 변환하여 db query를 하는 전문가입니다.

- 테이블 명: books
- 필드명 : 
book_id (int): 책 번호,
title(string): 제목,
author(string): 저자,
genre(string): 장르,
published_year(int): 출판 연도,
is_available(boolean): 대출 가능 여부 

위 정의된 테이블명, 필드명을 사용하여 사용자 질문을 단 하나의 유효한 SQL Query로 만들어서 답변하세요.
절대로 코드블럭으로 감싸지 마세요.

그리고 LLM이 생성한 SQL Query text를 Database Client 도구의 SQL Query 변수로 사용합니다.

Database Client에서 가져온 데이터는 가공되지 않은 JSON 형식이기 때문에, 사람이 이해하기 어렵습니다.

템플릿 노드를 추가하여 JSON 형태에서 자연어의 형태로 변환을 합니다.

dify는 현재 템플릿에서 jinja2 언어를 주로 사용하기 때문에 jinja2 문법을 통해 JSON으로 들어온 데이터를 사용자가 원하는 출력 형식으로 정의합니다.

마지막으로 답변 노드에 이 템플릿 노드의 output을 연결하면 text to sql 채팅플로우 구성이 완료됩니다.

4단계: 테스트하기

구성된 플로우가 정상적으로 작동하는지 테스트합니다.

DB에 넣어둔 Interstellar 책의 정보를 조회하는 자연어 질문을 입력합니다.

템플릿에 정의한 순서대로 가공된 답변이 출력되는 것을 볼 수 있습니다.

워크플로우 과정을 살펴보면, LLM이 Insterstellar 책의 정보라고 입력한 사용자의 자연어 질문을

“SELECT book_id, title, author, genre, published_year, is_available FROM books WHERE title = ‘Interstellar’;” 로 변환하여 조회한 것을 알 수 있습니다.

오픈네트웍시스템 이승헌

Share article