개요
Dify는 프로덕션 레디 LLM 애플리케이션 개발 플랫폼입니다. 시각적 워크플로우 빌더, RAG 파이프라인, AI 에이전트, 모델 관리, 관찰성 기능을 하나의 인터페이스에서 제공합니다. 프로토타입에서 프로덕션까지 빠르게 전환할 수 있으며, OpenAI, Anthropic, Ollama 등 수백 개의 LLM을 지원합니다.
| 항목 | 내용 |
|---|---|
| GitHub | https://github.com/langgenius/dify |
| 공식 사이트 | https://dify.ai |
| 문서 | https://docs.dify.ai |
| 라이선스 | Apache-2.0 (소스 공개) |
| GitHub Stars | 55K+ |
Dify란?
왜 Dify인가?
❌ 기존 LLM 개발의 어려움:
- 프로토타입 → 프로덕션 전환이 어려움
- RAG, 에이전트, 모델 관리를 각각 구축
- 관찰성/모니터링 도구 별도 필요
✅ Dify의 해결책:
- 올인원 LLM 앱 플랫폼
- 시각적 워크플로우 + 코드 없이 구축
- RAG, 에이전트, 프롬프트 IDE 통합
- 내장 LLMOps (로그, 분석, 어노테이션)
- Backend-as-a-Service API 제공
핵심 개념
"프로토타입에서 프로덕션까지"
- 시각적 캔버스에서 워크플로우 구축
- 수백 개 LLM 통합 지원
- RAG 파이프라인 내장
- AI 에이전트 + 도구 호출
- 플러그인 마켓플레이스
- MCP (Model Context Protocol) 지원
아키텍처
┌───────────────────────────────────────────────────┐
│ Dify Platform │
├─────────────┬─────────────┬─────────────┬─────────┤
│ Web UI │ API │ Worker │ Nginx │
├─────────────┴─────────────┴─────────────┴─────────┤
│ Plugin Daemon + Sandbox │
├─────────────┬─────────────┬─────────────┬─────────┤
│ PostgreSQL │ Redis │ Weaviate │ MinIO │
│ (Database) │ (Cache) │ (VectorDB) │(Storage)│
└─────────────┴─────────────┴─────────────┴─────────┘
주요 기능
🔄 워크플로우 빌더
| 노드 유형 | 설명 |
|---|---|
| LLM | LLM 호출 노드 |
| Knowledge Retrieval | RAG 검색 |
| Conditional | 조건 분기 |
| HTTP Request | API 호출 |
| Code | Python/Node 실행 |
| Template | Jinja 템플릿 |
| Iterator | 반복 처리 |
| Aggregator | 결과 집계 |
🤖 LLM 지원
| 카테고리 | 제공자 |
|---|---|
| 독점 모델 | OpenAI, Anthropic, Google Gemini, Azure |
| 오픈소스 | Llama, Mistral, Qwen, DeepSeek |
| 로컬 추론 | Ollama, LocalAI, vLLM, llama.cpp |
| 호환 API | OpenAI API 호환 모든 서버 |
📚 RAG 파이프라인
| 기능 | 설명 |
|---|---|
| 문서 수집 | PDF, PPT, Word, TXT, HTML, Notion 등 |
| 청킹 | 자동 청킹, 클리닝 |
| 임베딩 | 다양한 임베딩 모델 |
| 벡터 스토어 | Weaviate (기본), Qdrant, Milvus, Chroma, pgvector |
| 검색 | 벡터 검색, BM25, 하이브리드 |
| 리랭킹 | 선택적 리랭커 |
🛠️ 에이전트 & 도구
| 기능 | 설명 |
|---|---|
| 에이전트 프레임워크 | ReAct, Function Calling |
| 내장 도구 | 웹 검색, 계산기, DALL-E, Stable Diffusion 등 |
| 커스텀 도구 | OpenAPI 스펙으로 통합 |
| MCP 지원 | Model Context Protocol |
| 플러그인 | 마켓플레이스 확장 |
📊 LLMOps & 관찰성
| 기능 | 설명 |
|---|---|
| 로그 | 모든 요청/응답 기록 |
| 토큰 사용량 | 비용 추적 |
| 어노테이션 | 피드백 수집 |
| Langfuse 통합 | 외부 관찰성 |
| OpenTelemetry | 분산 추적 |
🔌 배포 & 통합
| 기능 | 설명 |
|---|---|
| REST API | 모든 기능 API 제공 |
| SDK | Python, JavaScript |
| 임베드 위젯 | 웹사이트 채팅 |
| Webhook | 외부 시스템 연동 |
| SSO | 엔터프라이즈 인증 |
시스템 요구 사항
| 항목 | 최소 | 권장 |
|---|---|---|
| CPU | 2 코어 | 4+ 코어 |
| RAM | 8GB | 16GB+ |
| 저장소 | 20GB | 50GB+ |
| 포트 | 80, 443 | – |
Docker 설치
방법 1: 공식 Docker Compose (권장)
# 최신 버전 클론
git clone https://github.com/langgenius/dify.git
cd dify/docker
# 환경 설정
cp .env.example .env
# 시작
docker compose up -d
접속: http://localhost → 관리자 계정 생성
방법 2: 간소화된 Docker Compose
# docker-compose.yml
services:
# API 서비스
api:
image: langgenius/dify-api:latest
restart: always
environment:
MODE: api
SECRET_KEY: your-secret-key-here
DB_USERNAME: postgres
DB_PASSWORD: difyai123456
DB_HOST: db
DB_PORT: 5432
DB_DATABASE: dify
REDIS_HOST: redis
REDIS_PORT: 6379
VECTOR_STORE: weaviate
WEAVIATE_ENDPOINT: http://weaviate:8080
depends_on:
- db
- redis
- weaviate
volumes:
- ./volumes/app/storage:/app/api/storage
# Worker 서비스
worker:
image: langgenius/dify-api:latest
restart: always
environment:
MODE: worker
SECRET_KEY: your-secret-key-here
DB_USERNAME: postgres
DB_PASSWORD: difyai123456
DB_HOST: db
DB_PORT: 5432
DB_DATABASE: dify
REDIS_HOST: redis
REDIS_PORT: 6379
depends_on:
- db
- redis
volumes:
- ./volumes/app/storage:/app/api/storage
# Web 프론트엔드
web:
image: langgenius/dify-web:latest
restart: always
environment:
CONSOLE_API_URL: http://api:5001
APP_API_URL: http://api:5001
# Nginx 게이트웨이
nginx:
image: nginx:latest
restart: always
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
depends_on:
- api
- web
# PostgreSQL
db:
image: postgres:15-alpine
restart: always
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: difyai123456
POSTGRES_DB: dify
volumes:
- ./volumes/db/data:/var/lib/postgresql/data
# Redis
redis:
image: redis:6-alpine
restart: always
volumes:
- ./volumes/redis/data:/data
# Weaviate (벡터 DB)
weaviate:
image: semitechnologies/weaviate:1.27.0
restart: always
environment:
QUERY_DEFAULTS_LIMIT: 25
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
volumes:
- ./volumes/weaviate:/var/lib/weaviate
방법 3: Qdrant 벡터 스토어
.env 파일 수정:
VECTOR_STORE=qdrant
QDRANT_URL=http://qdrant:6333
추가 서비스:
qdrant:
image: qdrant/qdrant:latest
restart: always
ports:
- "6333:6333"
volumes:
- ./volumes/qdrant:/qdrant/storage
방법 4: Milvus 벡터 스토어
.env 파일 수정:
VECTOR_STORE=milvus
MILVUS_URI=http://milvus:19530
방법 5: pgvector (PostgreSQL)
.env 파일 수정:
VECTOR_STORE=pgvector
PGVECTOR_HOST=db
PGVECTOR_PORT=5432
PGVECTOR_USER=postgres
PGVECTOR_PASSWORD=difyai123456
PGVECTOR_DATABASE=dify
방법 6: S3 스토리지
.env 파일 수정:
STORAGE_TYPE=s3
S3_ENDPOINT=https://s3.amazonaws.com
S3_BUCKET_NAME=your-bucket
S3_ACCESS_KEY=your-access-key
S3_SECRET_KEY=your-secret-key
S3_REGION=us-east-1
방법 7: OpenTelemetry 관찰성
.env 파일 수정:
ENABLE_OTEL=true
OTLP_BASE_ENDPOINT=http://otel-collector:4317
방법 8: Ollama 통합
# docker-compose.yml에 추가
ollama:
image: ollama/ollama:latest
restart: always
ports:
- "11434:11434"
volumes:
- ./volumes/ollama:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
Dify에서 설정:
- Settings → Model Provider → Ollama 추가
- API Base:
http://ollama:11434
환경 변수
기본 설정
| 변수 | 설명 | 기본값 |
|---|---|---|
SECRET_KEY | 세션/암호화 키 (필수) | – |
DEPLOY_ENV | 배포 환경 | PRODUCTION |
DEBUG | 디버그 모드 | false |
LOG_LEVEL | 로그 레벨 | INFO |
데이터베이스
| 변수 | 설명 |
|---|---|
DB_USERNAME | PostgreSQL 사용자 |
DB_PASSWORD | PostgreSQL 비밀번호 |
DB_HOST | PostgreSQL 호스트 |
DB_PORT | PostgreSQL 포트 |
DB_DATABASE | 데이터베이스 이름 |
Redis
| 변수 | 설명 |
|---|---|
REDIS_HOST | Redis 호스트 |
REDIS_PORT | Redis 포트 |
REDIS_PASSWORD | Redis 비밀번호 (선택) |
벡터 스토어
| 변수 | 설명 |
|---|---|
VECTOR_STORE | weaviate, qdrant, milvus, pgvector, chroma |
WEAVIATE_ENDPOINT | Weaviate URL |
QDRANT_URL | Qdrant URL |
MILVUS_URI | Milvus URL |
스토리지
| 변수 | 설명 |
|---|---|
STORAGE_TYPE | local, s3, azure-blob, aliyun-oss |
S3_ENDPOINT | S3 엔드포인트 |
S3_BUCKET_NAME | S3 버킷 |
S3_ACCESS_KEY | S3 액세스 키 |
S3_SECRET_KEY | S3 시크릿 키 |
관찰성
| 변수 | 설명 |
|---|---|
ENABLE_OTEL | OpenTelemetry 활성화 |
OTLP_BASE_ENDPOINT | OTLP 엔드포인트 |
초기 설정
1) 첫 접속
URL: http://localhost
→ 관리자 계정 생성
→ 이메일, 비밀번호 설정
2) 모델 프로바이더 설정
- Settings (우측 상단) → Model Provider
- 사용할 LLM 프로바이더 추가:
- OpenAI: API Key 입력
- Anthropic: API Key 입력
- Ollama: Base URL (
http://ollama:11434)
3) 첫 번째 앱 만들기
- Studio → Create Application
- 앱 유형 선택:
- Chatbot: 대화형 앱
- Agent: 도구 사용 에이전트
- Workflow: 복잡한 파이프라인
- Text Generator: 텍스트 생성
4) Knowledge Base (RAG) 설정
- Knowledge → Create Knowledge
- 문서 업로드 (PDF, Word, TXT 등)
- 청킹 설정 (자동 또는 커스텀)
- 앱에 Knowledge Base 연결
사용 가이드
워크플로우 만들기
- Studio → Create Application → Workflow
- 캔버스에서 노드 추가:
- Start → LLM → End (기본 흐름)
- Knowledge Retrieval 추가 (RAG)
- Conditional 추가 (분기)
- 각 노드 설정 후 Publish
에이전트 만들기
- Studio → Create Application → Agent
- LLM 모델 선택
- 도구 추가:
- 내장 도구 (웹 검색, 계산기 등)
- 커스텀 도구 (OpenAPI 스펙)
- 시스템 프롬프트 작성
API로 앱 호출
# 채팅 API
curl -X POST 'http://localhost/v1/chat-messages' \
-H 'Authorization: Bearer {api-key}' \
-H 'Content-Type: application/json' \
-d '{
"inputs": {},
"query": "안녕하세요!",
"response_mode": "blocking",
"conversation_id": "",
"user": "user-123"
}'
# 스트리밍
curl -X POST 'http://localhost/v1/chat-messages' \
-H 'Authorization: Bearer {api-key}' \
-H 'Content-Type: application/json' \
-d '{
"inputs": {},
"query": "안녕하세요!",
"response_mode": "streaming",
"user": "user-123"
}'
웹사이트에 임베드
<script>
window.difyChatbotConfig = {
token: 'your-app-token'
}
</script>
<script
src="http://localhost/embed.min.js"
id="dify-chatbot"
defer>
</script>
백업 및 복원
데이터 구조
./volumes/
├── db/data/ # PostgreSQL 데이터
├── redis/data/ # Redis 데이터
├── weaviate/ # 벡터 스토어
├── app/storage/ # 업로드 파일
└── ...
백업
# 컨테이너 정지
cd dify/docker
docker compose down
# 전체 백업
tar -czvf dify-backup-$(date +%Y%m%d).tar.gz volumes/
# PostgreSQL 덤프 (선택)
docker compose up -d db
docker exec dify-db pg_dump -U postgres dify > dify-db-backup.sql
복원
tar -xzvf dify-backup.tar.gz
docker compose up -d
업데이트
cd dify
# 최신 코드 가져오기
git pull
cd docker
# .env 업데이트 확인
# .env.example과 비교하여 새 변수 추가
# 업데이트 실행
docker compose down
docker compose pull
docker compose up -d
트러블슈팅
메모리 부족
최소 8GB RAM 필요. Docker VM 설정 확인.
데이터베이스 연결 오류
# PostgreSQL 로그 확인
docker compose logs db
# 연결 테스트
docker exec -it dify-db psql -U postgres -d dify
벡터 스토어 오류
# Weaviate 상태 확인
docker compose logs weaviate
# 다른 벡터 스토어로 변경
# .env에서 VECTOR_STORE 수정
LLM 연결 실패
- API 키 확인
- Ollama:
http://ollama:11434(Docker 네트워크) - 외부 Ollama:
http://host.docker.internal:11434
SSRF 프록시 오류
Dify는 보안을 위해 SSRF 프록시 사용. 내부 네트워크 접근이 필요하면 설정 조정.
대안 비교
| 기능 | Dify | Flowise | LangFlow | n8n |
|---|---|---|---|---|
| 목적 | LLM 플랫폼 | LLM 앱 | LLM 앱 | 워크플로우 |
| 시각적 빌더 | ✅ | ✅ | ✅ | ✅ |
| RAG 내장 | ✅ 풍부 | ✅ | ✅ | 제한적 |
| 에이전트 | ✅ | ✅ | ✅ | ✅ |
| LLMOps | ✅ 내장 | ❌ | ❌ | ❌ |
| 플러그인 | ✅ 마켓플레이스 | ❌ | ❌ | ✅ |
| 멀티 유저 | ✅ | 제한적 | 제한적 | ✅ |
| API 배포 | ✅ BaaS | ✅ | ✅ | ✅ |
| 설치 복잡도 | 중간 | 쉬움 | 쉬움 | 중간 |
선택 가이드
| 용도 | 추천 |
|---|---|
| 프로덕션 LLM 앱 | Dify |
| 빠른 프로토타입 | Flowise |
| LangChain 비주얼 | LangFlow |
| 비즈니스 자동화 | n8n |
| 엔터프라이즈 | Dify (SSO, 팀) |
활용 사례
1. 기업 지식 베이스 챗봇
구성:
- Knowledge Base에 사내 문서 업로드
- RAG 기반 Chatbot 앱 생성
- 웹사이트에 임베드
결과: 사내 정책, 매뉴얼 자동 답변
2. 고객 지원 에이전트
구성:
- Agent 앱 + 커스텀 도구
- CRM API 연동 (주문 조회)
- 티켓 생성 도구
결과: 자동 고객 응대 + 에스컬레이션
3. 콘텐츠 생성 파이프라인
구성:
- Workflow 앱
- 웹 검색 → LLM 분석 → 요약 → 번역
- API로 CMS 연동
결과: 자동 콘텐츠 생성
4. 코드 리뷰 봇
구성:
- GitHub 웹훅 연동
- 코드 분석 LLM
- PR 코멘트 자동 작성
결과: 자동 코드 리뷰
5. 다국어 번역 시스템
구성:
- Workflow: 언어 감지 → 번역 → 품질 검사
- 여러 LLM 비교
- 용어집 Knowledge Base
결과: 일관된 기업 번역
마무리
Dify는 프로덕션 레디 LLM 애플리케이션 개발을 위한 완전한 플랫폼입니다. 시각적 워크플로우, RAG, 에이전트, LLMOps를 하나의 인터페이스에서 제공하며, 프로토타입에서 프로덕션까지 빠르게 전환할 수 있습니다.
핵심 장점
| 장점 | 설명 |
|---|---|
| 올인원 | 워크플로우 + RAG + 에이전트 + LLMOps |
| 프로덕션 레디 | 엔터프라이즈급 안정성 |
| 다중 LLM | 수백 개 모델 지원 |
| RAG 내장 | 문서 수집부터 검색까지 |
| 관찰성 | 로그, 토큰, 어노테이션 |
| BaaS | 모든 기능 API 제공 |
| 플러그인 | 마켓플레이스 확장 |
이런 분께 추천
프로덕션급 LLM 앱을 구축하려는 팀
RAG + 에이전트를 통합하고 싶은 분
LLMOps (로그, 분석)가 필요한 기업
빠르게 MVP를 검증하려는 스타트업
엔터프라이즈 AI 플랫폼을 원하는 조직