RAG 챗봇 앱 — 5분 완성부터 고급 설정까지
Chatbot은 Dify 워크플로우에서 가장 빠르게 만들 수 있는 앱 유형입니다. 지식베이스 연결만으로 즉시 문서 기반 Q&A 봇이 완성됩니다. 단, 검색 결과를 정밀 제어하려면 Chat Flow가 필요합니다.
Studio → Create App → Chatbot → 앱 이름 입력
Basic Orchestration(간단) 또는 Expert Mode(고급) 선택 — 처음엔 Basic 권장
INSTRUCTION에 시스템 프롬프트 작성
봇의 역할, 응답 언어, 출처 인용 방식, 모르는 것 처리 방법 명시
Context에서 지식베이스 연결
+ Add → 지식베이스 선택 → Top K: 5~8, Score Threshold: 0.3~0.5
Features 설정 — Speech to Text, File Upload 활성화
사용자가 음성 입력이나 파일을 직접 업로드할 수 있게 설정
Publish → 채널별 배포
웹 앱, 임베드 코드, API Access, Slack/Discord 봇으로 배포 가능
고품질 시스템 프롬프트 예시
당신은 [회사명]의 내부 지식 관리 AI 어시스턴트입니다. [역할] - 제공된 지식베이스 문서를 바탕으로 정확한 정보를 제공합니다. - 임직원의 업무 질문에 친절하고 전문적으로 답변합니다. [응답 규칙] 1. 반드시 제공된 컨텍스트(지식베이스 문서)에 기반해서 답변하세요. 2. 컨텍스트에 없는 내용이라면 "제공된 문서에서 해당 정보를 찾을 수 없습니다. 관련 담당자에게 문의하시거나 문서를 업데이트해 주세요"라고 안내하세요. 3. 답변 말미에 참고한 문서명을 [출처: 문서명] 형식으로 명시하세요. 4. 단계별 절차가 있는 질문에는 번호 목록으로 구조화해서 답변하세요. 5. 한국어로 답변하세요. [금지 사항] - 외부 인터넷 정보나 학습 데이터로 추측하여 답변하지 마세요. - 법률, 의료, 재무 관련 전문 조언을 직접 제공하지 마세요.
Chat Flow — Workflow 기반 고급 RAG 챗봇
Chat Flow는 Dify 워크플로우의 정밀한 노드 제어와 대화형 UI를 결합합니다. 검색 전처리, 다중 지식베이스 라우팅, 답변 후처리가 필요한 경우에 사용하세요.
Studio → Create App → Chat Flow
비어있는 캔버스에서 Start → Answer 노드 기본 구조로 시작
언어 감지 Condition 노드 추가 (선택)
sys.query 언어를 감지해서 한국어/영어 지식베이스를 다르게 검색
Knowledge Retrieval 노드 추가
Query: sys.query, 지식베이스 선택, Top K: 5, Search Mode: Hybrid Search
LLM 노드 추가
System: 시스템 프롬프트 / User: {{#context#}} + {{sys.query}} — context에 Knowledge Retrieval 결과 연결
Answer 노드에 LLM 출력 연결 → Publish
LLM.text를 Answer에 연결
Condition 노드에서 질문 카테고리를 분류하고, 각 카테고리에 맞는 전문 지식베이스로 라우팅하면 검색 정확도가 크게 향상됩니다. 예: “IT 질문” → IT 매뉴얼 KB, “HR 질문” → HR 정책 KB, “재무 질문” → 재무 규정 KB
Workflow 기초 — 노드 체이닝과 변수 라우팅
Dify 워크플로우의 핵심은 변수(Variable)입니다. 모든 노드는 이전 노드의 출력을 변수로 받아 처리하고, 결과를 다음 노드에 전달합니다.
변수 참조 문법
-- 시스템 변수 -- {{sys.query}} 사용자 입력 텍스트 {{sys.user_id}} 사용자 ID {{sys.conversation_id}} 대화 ID -- 노드 출력 변수 -- {{노드이름.output}} 노드의 text 출력 {{llm1.text}} LLM 노드 "llm1"의 텍스트 출력 {{code1.result}} Code 노드 "code1"의 result 변수 {{retriever1.result}} Knowledge Retrieval 결과 -- Start 노드 입력 변수 -- {{input_text}} Start 노드에서 정의한 변수 {{language}} Start 노드에서 정의한 언어 선택 변수
노드 간 데이터 흐름 예시
Start (input: document_text, target_lang)
↓
LLM #1 "summarizer"
System: "다음 문서를 핵심 포인트 5개로 요약하세요"
User: {{document_text}}
↓ summarizer.text
LLM #2 "translator"
System: "다음 텍스트를 {{target_lang}}로 번역하세요"
User: {{summarizer.text}}
↓ translator.text
End (output: translator.text)실전 Dify 워크플로우 패턴
패턴 1 — 다중 문서 일괄 처리 (Iteration 노드)
Start (input: document_list Array)
↓
Iteration (items: document_list)
├── LLM: 개별 문서 요약
└── Code: 결과 포맷팅
↓
Variable Aggregator (각 문서 요약 통합)
↓
LLM: 통합 인사이트 생성
↓
HTTP Request: Slack으로 결과 전송
↓
End패턴 2 — 조건 분기 라우팅 (Condition 노드)
Start (input: user_query)
↓
LLM #1: 의도 분류 → "technical" / "billing" / "general"
↓
Condition
├── IF intent == "technical" → Knowledge Retrieval (기술 문서 KB)
├── IF intent == "billing" → Knowledge Retrieval (청구 정책 KB)
└── ELSE → LLM (일반 답변)
↓
Variable Aggregator
↓
LLM #2: 최종 답변 생성
↓
End실전 워크플로우 활용 사례
| 활용 사례 | 핵심 노드 구성 | 예상 효과 |
|---|---|---|
| 이메일 자동 분류 & 답변 초안 | HTTP → LLM(분류) → Condition → LLM(초안) → HTTP | 응답 시간 70% 단축 |
| 주간 보고서 자동 생성 | HTTP(데이터) → Code(파싱) → LLM(분석) → LLM(보고서) → HTTP(전송) | 보고서 작성 공수 90% 절감 |
| 코드 리뷰 자동화 | HTTP(GitHub) → Code(파싱) → LLM(리뷰) → HTTP(댓글) | 리뷰 대기 시간 제거 |
| 다국어 콘텐츠 처리 | LLM(감지) → Condition → LLM(번역/요약) → End | 다국어 지원 즉시 확장 |
| 지식베이스 자동 업데이트 | HTTP(RSS/API) → LLM(요약) → Knowledge Retrieval(저장) | 실시간 지식 갱신 |
Dify 워크플로우 에이전트(Agent) 설계 — Tool 활용과 ReAct 패턴
Agent 앱은 LLM이 스스로 어떤 도구(Tool)를 사용할지 판단하는 자율적인 AI입니다. 웹 검색, 코드 실행, 지식베이스 검색을 AI가 상황에 맞게 선택합니다.
Dify 내장 도구 목록
| 도구 | 기능 | 활용 예시 |
|---|---|---|
| 웹 검색 (Google/Bing/DuckDuckGo) | 실시간 인터넷 검색 | 최신 뉴스, 현재 정보 조회 |
| Wikipedia | 위키피디아 검색 | 일반 지식 조회 |
| 계산기 (Calculator) | 수식 계산 | 재무 계산, 통계 |
| 코드 실행 (Code Interpreter) | Python 코드 실행 | 데이터 분석, 그래프 생성 |
| 지식베이스 (Knowledge Base) | 벡터 검색 | 내부 문서 참조 |
| 날씨 (Weather) | 날씨 정보 조회 | 기후 기반 추천 |
Agent는 Reasoning(추론) + Acting(행동)을 반복하는 ReAct 패턴으로 동작합니다. “현재 상황 분석 → 필요한 도구 선택 → 실행 → 결과 분석 → 다음 행동 결정”을 목표 달성까지 자율적으로 반복합니다. 복잡한 리서치나 다단계 문제 해결에 강력합니다.
Dify 워크플로우 API 엔드포인트 & n8n 자동화 연동
Dify는 모든 앱을 즉시 REST API로 노출합니다. 이 API를 통해 n8n, Zapier, 자체 서비스 등 외부 시스템과 완전히 연동할 수 있습니다.
API 키 발급 & 기본 테스트
# Chatbot: 메시지 전송 (blocking) curl -X POST 'http://YOUR_DIFY_URL/v1/chat-messages' \ -H 'Authorization: Bearer app-YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{ "inputs": {}, "query": "안녕하세요, 테스트 질문입니다.", "response_mode": "blocking", "conversation_id": "", "user": "user-001" }' # 응답 구조 # { # "answer": "AI 응답 내용", # "conversation_id": "xxxx", # "message_id": "xxxx" # }
# Workflow 실행
curl -X POST 'http://YOUR_DIFY_URL/v1/workflows/run' \
-H 'Authorization: Bearer app-YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"inputs": {
"document_text": "분석할 문서 내용",
"target_language": "한국어"
},
"response_mode": "blocking",
"user": "user-001"
}'n8n HTTP Request 노드로 Dify 연동
n8n에서 HTTP Request 노드 추가
Method: POST / URL: http://dify서버IP/v1/chat-messages
Authentication → Header Auth
Name: Authorization / Value: Bearer app-YOUR_API_KEY
Body (JSON)
query: 이전 노드의 텍스트 값, user: 고정값 또는 동적 user ID
응답에서 answer 추출
{{ $json.answer }} 로 Dify 응답 텍스트 추출
Streaming vs Blocking 응답 방식
| 방식 | 특징 | 권장 사용 |
|---|---|---|
| blocking | 생성 완료 후 전체 응답 반환. 처리 단순 | n8n, 자동화 연동, API 호출 |
| streaming | 토큰 생성 시마다 실시간 전송 (SSE) | 웹 UI, 사용자 직접 인터페이스 |
프롬프트 엔지니어링 & 버전 관리
Dify 워크플로우의 강력한 기능 중 하나는 배포 없이 프롬프트를 수정하고 버전 히스토리로 롤백할 수 있다는 점입니다.
효과적인 프롬프트 작성 원칙
| 원칙 | 설명 | 예시 |
|---|---|---|
| 역할 명시 | AI의 역할과 전문성 명확히 정의 | “당신은 10년 경력의 시니어 백엔드 개발자입니다” |
| 출력 형식 지정 | 응답 구조를 구체적으로 요구 | “결과를 JSON 형식으로: {score, reason, recommendation}” |
| 제약 사항 명시 | 하면 안 되는 것을 명확히 | “컨텍스트에 없는 내용은 추측하지 마세요” |
| 예시 제공 (Few-shot) | 원하는 출력 패턴을 예시로 보여주기 | 입력/출력 예시 2~3개 포함 |
| 언어 명시 | 응답 언어를 명확히 | “반드시 한국어로 답변하세요” |
프롬프트 버전 관리
앱 편집 → Publish → Save as Draft
현재 프롬프트를 버전으로 저장 (배포 전 안전하게 보관)
Publish History에서 버전 히스토리 확인
이전 버전 내용 조회 및 특정 버전으로 롤백 가능
A/B 테스트 — 복수 앱 운영
동일 지식베이스에 다른 프롬프트를 가진 앱 2개를 만들어 성능 비교
다음 단계: 앱 운영이 시작됐다면 다음 글에서 하이브리드 RAG 검색 튜닝, 데이터 백업 전략, 모니터링으로 프로덕션 품질을 완성합니다.
