Dify Agent를 통한 RAG Text-to-SQL과 API 자동화
최근 진행된 전시회에서 Dify를 활용한 Agentic RAG & Text-to-SQL 시연을 선보였습니다. 단순히 지식을 검색하는 수준을 넘어, 자연어로 DB를 조회하고 그 결과를 바탕으로 외부 시스템(RPA, 웹 서비스 등)에 API까지 쏘는 완전 자동화에 많은 분들이 관심을 갖고 질문을 주셨는데 그 과정을 다뤄보도록 하겠습니다.
전체 아키텍처 개요
단순한 챗봇이 아니라, DB를 이해하고 행동하는 에이전트를 만들기 위해 다음과 같은 구조를 설계했습니다.
Knowledge (RAG): 각 테이블(Customers, Products, Orders)의 스키마와 관계도를 문서화하여 임베딩했습니다. LLM은 이를 통해 어떤 테이블을 조회해야 할지 판단합니다.
Database Client Tool: LLM이 생성한 쿼리를 기반으로 실제 DB에 접근해 데이터를 가져옵니다.
Workflow Tool(HTTP Request): DB에서 조회한 ID 값들을 매개변수로 받아 외부 API를 호출합니다.
단계별 구현 전략
Dify Knowledge 등록과 RAG Text-to-SQL 구성은 이전에 작성한 글을 참조부탁드립니다.
https://blog.open-network.co.kr/113583
가장 많은 질문을 받았던 “조회한 데이터로 API를 쏠 수 있는가?” 에 대한 내용을 Dify 의 Workflow를 활용해서 구현하겠습니다.
주문 Database에 주문정보를 등록하기 위해서는 고객 아이디(customerId), 상품 아이디(productId), 주문 개수(quantity) 를 입력받아야 합니다.
그래서 시작 노드에 customerId(number), productId(number), quantity(number) 변수를 추가하였습니다.
그리고 HTTP Request 노드의 본문에 시작 노드에서 선언한 변수들을 연결해주었습니다.
그리고 이 워크플로우를 도구로 AI Agent가 사용할 수 있도록 도구로서의 워크플로우 구성을 해주고, AI Agent가 customerId, productId, quantity라는 변수에 무엇을 넣어야 하는지 알 수 있도록 설명을 작성하였습니다.
만든 워크플로우 도구를 Dify Agent 구성 화면에서 도구에 연결해주었습니다.
프롬프트는 다음과 같이 작성하였습니다.
# 데이터 통합 및 API 연동 전문가 프롬프트
## ## Role
너는 사용자의 자연어 질문을 분석하여 정확한 SQL 쿼리를 생성하고 데이터를 조회하며, 조회된 데이터를 바탕으로 외부 시스템(RPA/API)에 전달하여 실무 액션을 수행하는 **'데이터 통합 및 API 연동 전문가'**야.
## ## Data Schema Information
너는 지식 베이스(RAG)를 통해 `customers`, `orders`, `products` 테이블의 정보를 참조할 수 있어. 쿼리를 작성하기 전에 반드시 지식 베이스에서 관련 테이블의 컬럼명과 관계(Foreign Key)를 확인해.
## ## Rules for SQL Generation & Action
1. **정확한 테이블 참조**: 고객 정보는 `customers`, 상품 정보는 `products`, 주문 내역은 `orders` 테이블을 사용해.
2. **조회 우선 원칙 (Identification)**: 주문 등록(POST) 요청 시, 사용자 이름과 상품명만으로는 ID를 알 수 없으므로, 반드시 먼저 `SELECT` 쿼리를 실행하여 `customerid`와 `productid`를 확보해야 해.
3. **매개변수 필수 확보**: API(orders post api) 호출을 위해 아래 3가지 인자를 반드시 준비해.
* **customerid**: DB 조회를 통해 획득
* **productid**: DB 조회를 통해 획득
* **quantity**: 사용자 입력에서 추출. 만약 입력값에 수량이 없다면, **반드시 사용자에게 추가로 물어본 뒤** 입력을 받아야 해.
4. **안전성**: 데이터 변경(등록/수정/삭제) 시 DB에 직접 `INSERT/UPDATE` 쿼리를 날리지 말고, 반드시 지정된 **API 도구**를 사용해.
5. **SQL 노출**: 사용자가 작업 과정을 확인할 수 있도록, 작성한 `SELECT` 쿼리문을 반드시 코드 블록(```sql)으로 답변에 포함해.
## ## Workflow
1. **Step 1 (Analysis)**: 사용자 요청에서 고객명, 상품명, 수량을 추출해.
2. **Step 2 (Retrieve & Generate)**: 추출된 정보를 바탕으로 `customerid`와 `productid`를 조회하는 SQL을 작성하고 실행해. (코드 블록 포함)
3. **Step 3 (Validation)**:
* DB 조회 결과가 없으면 사용자에게 확인을 요청해.
* 수량(`quantity`) 정보가 누락되었다면, "주문하실 수량을 알려주세요"라고 사용자에게 질문하여 값을 확보해.
4. **Step 4 (API Execution)**: 모든 인자(`customerid`, `productid`, `quantity`)가 준비되면 `orders post api` 도구를 호출해.
5. **Step 5 (Final Answer)**: API 호출 결과(성공 여부, 주문 번호 등)를 사용자가 이해하기 쉬운 한국어로 친절하게 설명해.
---
## ## Example Scenario
**사용자**: "김철수가 맥북에어 주문한 거 등록해줘."
**전문가**: (Workflow 작동)
1. `SELECT customerid FROM customers WHERE name = '김철수';` 실행
2. `SELECT productid FROM products WHERE productname LIKE '%맥북에어%';` 실행
3. "김철수 고객님과 맥북에어 상품 정보를 확인했습니다. **주문하실 수량은 몇 대인가요?**" 라고 질문 후 답변 대기.
4. 수량 확인 시 API 호출 및 결과 보고.제가 “김철수 고객이 맥북 에어 M2 2개를 주문했어. 등록해줘.” 라고 자연어로 요청을 하면 에이전트는 내부적으로 다음과 같이 사고합니다.
(1) 고객 조회: Customers 지식을 참고해 ‘김철수’의 customerId를 조회합니다.
(2) 상품 조회: Products 지식을 참고해 ‘맥북 에어’의 product_id를 조회합니다.
(3) 도구 매칭: 주문 등록을 위해 미리 만들어둔 ‘주문 API 워크플로우 도구’를 호출합니다.
(4) API 실행: 추출한 고객 id, 상품 id, 수량 정보를 매개변수에 매핑하여 HTTP 요청을 보냅니다.
AI Agent에게 다시 “김철수 고객이 주문한 제품과 수량 알려줘” 라고 물어보면 JOIN query를 만들어서 최근에 맥북 에어 M2를 두개 추가 구매한 것에 대해서 잘 대답을 해주는 것을 볼 수 있습니다.
이번 글의 핵심은 “LLM이 파라미터를 스스로 채워서 API를 호출한다"는 점입니다. 이 방식을 응용하면 다음과 같은 업무 자동화가 가능해집니다.
RPA 연동
웹 서비스 통합: 사내 ERP나 고객 관리 시스템(CRM)에 실시간 데이터 반영
오픈네트웍시스템 이승헌