TrendShift · LLM App Platform

Dify — 비주얼 캔버스로
LLM 앱을 조립하는 풀스택 키트

142k stars의 오픈소스 에이전트 워크플로우 플랫폼. 노코드 캔버스, RAG, 에이전트, 멀티 LLM 게이트웨이, LLMOps를 한 박스에 담은 셀프호스팅 시스템.

langgenius/dify · TypeScript+Python · Apache-2.0 · 142k★ 2026-05-21 · TrendShift 누적 8위
00 — 들어가며Context

먼저, Dify가 뭔가?

한 줄로는 부족한 프로젝트 — 기본 개념부터.

Dify(디파이)는 오픈소스 LLM 앱 개발 플랫폼이다. 사용자는 브라우저에서 들어가, 마우스로 노드를 끌어다 잇는 방식으로 챗봇·문서 Q&A·자동화 워크플로우·AI 에이전트를 만든다. 코드 없이도 동작하지만, 코드를 원하는 사람에게는 REST API와 SDK도 제공한다. Docker Compose 한 번이면 본인 서버에 통째로 띄울 수 있어 셀프호스팅이 가능하다.

제작사는 langgenius(중국 상하이 기반)이며, GitHub 기준 142,000 stars · 22,200 forks · 163개 릴리즈를 기록한 대형 OSS 프로젝트. 코드 분포는 TypeScript 53.1% / Python 42.2%로, 프론트엔드와 백엔드가 거의 동급의 무게를 차지한다.

Term · 용어
LLM (Large Language Model, 대규모 언어 모델)
GPT-4, Claude, Gemini, Llama 같은 거대한 텍스트 생성 AI. Dify는 특정 모델에 종속되지 않고 수십 개 모델을 한 인터페이스에서 갈아끼울 수 있게 해준다. 콘센트 규격을 통일한 멀티탭과 같다.
Term · 용어
Agentic Workflow (에이전틱 워크플로우, 자율 작업 흐름)
LLM이 단순히 답변만 하는 게 아니라, 도구를 호출하고 → 결과를 보고 → 다음 행동을 결정하는 자율 실행 흐름. Dify는 이걸 비주얼 캔버스에서 노드 연결로 표현한다.
Term · 용어
RAG (Retrieval-Augmented Generation, 검색 보강 생성)
"내 PDF 문서들에서 정답을 찾아서 답변해줘" 같은 요청을 가능하게 하는 기술. 문서를 잘게 잘라(청킹) 벡터로 변환해 저장해두고, 질문이 오면 비슷한 조각을 찾아 LLM에게 같이 전달한다.
01 — 한 줄 요약TL;DR

이 프로젝트의 핵심 메시지

한 문장으로 줄이면.

Core Message

"LLM 앱을 만들 때 필요한 모든 것을 한 박스에 담은 셀프호스팅 키트 — docker compose up -d 한 줄로 회사 서버 안에서 동작한다."

경쟁자들이 "프롬프트 관리만", "RAG만", "에이전트만" 식으로 부분을 다룰 때, Dify는 비주얼 워크플로우 · 모델 게이트웨이 · RAG 파이프라인 · 에이전트 · 관측 가능성을 한 번에 패키징했다.

"LLM 앱 시대의 Firebase"라는 비전을 가장 구체적으로 구현한 풀스택 플랫폼. 비개발자도 챗봇을 만들 수 있고, 개발자는 코드와 SDK로 더 깊이 들어갈 수 있다.

02 — 왜 주목받는가Why now

트렌딩 누적 8위에 올라온 이유

붐비는 시장에서 어떻게 차별화했나.

2024~2026년 LLM 앱 빌더 시장은 매우 붐비는 영역이다. LangChain(코드 라이브러리), LangFlow(오픈소스 캔버스), Flowise, n8n(자동화 + AI), 그리고 클로즈드 소스의 Zapier·Make, Microsoft Copilot Studio 등이 경합한다. Dify는 다음 세 가지로 차별화에 성공했다.

차별점 1 — 완전 셀프호스팅 가능한 풀스택 묶음

유사 SaaS 도구는 클라우드 종속이지만, Dify는 한 줄 docker compose로 본인 NAS·VPS·온프레미스에 완전히 떨어진 채 동작한다. 회사 내부 데이터가 외부로 한 비트도 나가지 않게 막을 수 있다 — 의료·금융·정부 영역의 가장 강력한 채택 이유.

차별점 2 — 30종 이상의 벡터 DB를 워크스페이스 플러그인으로 지원

Weaviate, Qdrant, Milvus, pgvector, OpenSearch, Chroma, Elasticsearch, TiDB Vector, OceanBase, Oracle, Upstash, Tencent VDB, Baidu, Lindorm 등 30+ 종을 플러그인 형태로 추가/제거할 수 있다. 이미 회사가 쓰는 DB가 있다면 그대로 활용 가능.

차별점 3 — 운영 관측(LLMOps)을 처음부터 내장

LLM 앱의 실제 어려움은 만드는 것이 아니라 운영이다. Dify는 Opik, Langfuse, Arize Phoenix, LangSmith, MLflow, Weave 등 외부 트레이싱 시스템과의 어댑터를 기본 제공하고, 자체적으로도 메시지/토큰/응답시간/비용 대시보드를 제공한다.

경쟁 비교 — 부분 제품 vs Dify

비교 항목경쟁 (부분 제품)Dify (풀스택)
비주얼 캔버스LangFlow / Flowise내장 (Workflow + Chatflow)
RAG 파이프라인LlamaIndex / Haystack내장 + 30+ 벡터 DB
모델 게이트웨이litellm / OpenRouter내장 (litellm 위에 자체 어댑터)
관측 가능성Langfuse / LangSmith내장 + 6개 외부 어댑터
셀프호스팅대부분 클라우드 종속docker compose up 한 줄
코드 격리 실행없음 (직접 구현 필요)Sandbox 컨테이너 내장
03 — 기술 스택Stack

전체 기술 지도

백엔드 · 프론트엔드 · 인프라 · 운영.

백엔드 (Python 42.2% · Flask 생태계)

Dify의 API 서버는 api/ 폴더에 있으며, 한국에서는 약간 의외일 수 있지만 Flask 3.x를 채택했다. FastAPI 전성기에도 Flask를 고른 이유는 거대한 플러그인 생태계와 성숙한 운영 패턴(gunicorn + gevent + Celery)에 있다.

웹 프레임워크

  • Flask 3.1.3 — 메인 API 프레임워크
  • Flask-RESTX 1.3.2 — Swagger 자동 생성
  • Flask-Migrate — Alembic 마이그레이션 래퍼
  • Flask-Login — 콘솔 세션 인증

비동기 처리 · 웹서버

  • Celery 5.6 — 백그라운드 작업 큐 (문서 인덱싱·임베딩 등)
  • Redis 7.4 — 브로커 + 캐시 + 세션
  • Gunicorn + Gevent — 코루틴 기반 동시성

DB · ORM

  • SQLAlchemy + Alembic — ORM + 마이그레이션
  • PostgreSQL 15 — 메인 메타데이터 저장소

LLM 어댑터 · 옵저버빌리티

  • litellm 1.83+ — 수십 개 LLM API를 통일된 인터페이스로 호출
  • OpenAI · Google Cloud AI Platform · Azure Identity — 자체 SDK 병행
  • OpenTelemetry distro 0.62b1 — Flask/Celery/HTTPX/Redis/SQLAlchemy 자동 계측

스토리지 · 패키지

  • opendal 0.46 — OpenDAL 추상화
  • boto3 / Azure Storage / GCP Storage / MinIO / OBS / OSS — 다중 백엔드
  • uv — Astral의 초고속 Python 패키지 매니저 + 워크스페이스
Term · 용어
Celery (셀러리, 분산 작업 큐)
"이 이메일 보내는 작업은 백그라운드로 돌려" 같은 비동기 작업을 처리하는 Python 표준 도구. Dify에서는 문서 인덱싱, 임베딩 계산, 외부 API 호출 같은 무거운 작업을 메인 요청에서 분리하는 데 쓴다.
Term · 용어
uv (Astral의 Rust 기반 Python 패키지 매니저)
pip + virtualenv + poetry를 한 번에 대체. 의존성 해결이 pip 대비 10~100배 빠르다. Dify는 pyproject.toml[tool.uv.workspace]로 30개 벡터 DB 어댑터를 하위 패키지로 분리해 관리한다.

프론트엔드 (TypeScript 53.1% · Next.js · pnpm 모노레포)

웹 UI는 web/ 폴더에 있고, Next.js 기반에 최근 빌드 도구를 Vite로 갈아끼우는 중이다. 루트 package.json은 pnpm 워크스페이스 + vite-plus를 채택해 모노레포로 운영한다.

런타임 · 빌드

  • Node.js 22.22.1 / pnpm 11.6.0
  • Next.js (App Router) + React
  • Vite + vite-plus — 커스텀 모노레포 빌더, 일부 Turbopack 잔존

품질 · 다국어 · 테스트

  • ESLint 9 (Antfu config) + 100k+ 줄의 eslint-suppressions.json 관리
  • pnpm-workspace.yaml — web/ · packages/ · sdks/ · e2e/ · cli/ 분리
  • i18n 20+ 언어 — 한국어 README 공식 제공
  • Playwright E2Ee2e/ 폴더
Term · 용어
pnpm workspace (피엔피엠 워크스페이스)
한 깃 레포 안에 여러 npm 패키지를 두고 서로 참조하게 해주는 구조. 디스크 공간 절약과 빠른 설치가 강점. Dify처럼 web/ + packages/ + sdks/를 한 레포에서 굴리는 큰 프로젝트가 즐겨 쓴다.

인프라 (Docker Compose · 멀티 컨테이너 오케스트레이션)

docker/docker-compose.yaml은 약 1200줄 분량으로, 다음 핵심 컨테이너들을 묶는다.

필수 컨테이너 (10종)

  • api (langgenius/dify-api:1.13.3) — Flask 메인 API 서버
  • worker — Celery 워커 (같은 이미지, 다른 명령)
  • web (langgenius/dify-web:1.13.3) — Next.js 프론트엔드
  • db (postgres:15-alpine) — 메인 DB
  • redis (redis:6-alpine) — Celery 브로커 + 캐시 + 세션
  • sandbox (langgenius/dify-sandbox:0.2.14) — 사용자 코드 격리 실행
  • plugin_daemon (langgenius/dify-plugin-daemon:0.5.3-local) — 플러그인 호스트
  • ssrf_proxy (ubuntu/squid:latest) — 외부 요청 SSRF 보호
  • nginx — 리버스 프록시 + 정적 자원
  • certbot — 옵션, Let's Encrypt 자동 갱신

선택 컨테이너 — 벡터 DB

  • profile 기반으로 켜는 옵션: Weaviate 1.27 · Qdrant 1.8 · Milvus 2.6 · pgvector pg16 · pgvecto-rs · Chroma 0.5 · OpenSearch · OceanBase · OpenGauss · IRIS · Oracle · Vastbase
  • 사용하지 않는 DB는 띄우지 않음 — 리소스 절약
Trap · 함정
SSRF Proxy를 왜 넣었지?

Dify는 사용자가 임의의 URL을 호출하는 도구·웹훅을 만들 수 있다. 만약 사용자가 http://169.254.169.254/(AWS 메타데이터 서비스) 같은 내부 URL을 호출하면 클라우드 자격증명이 새어나갈 수 있다. Squid 프록시가 이를 화이트리스트 기반으로 차단한다.

Fix · 해결책
멀티 레이어 격리 (Defense in Depth)

① 외부 요청은 SSRF Proxy 통과 강제 → ② 사용자 코드 실행은 sandbox 컨테이너에서 → ③ 플러그인은 plugin_daemon이 별도 프로세스로 실행. 한 레이어가 뚫려도 다음 레이어가 막는 심층 방어 구조.

04 — 아키텍처Design

시스템 구조와 4가지 설계 패턴

전체 구조도 → 핵심 패턴 하나하나.

시스템 전체 구조도

┌─────────────────────────────────────────────────────────────────┐
│                       Browser (사용자)                           │
└──────────────────────────┬──────────────────────────────────────┘
                           │ HTTPS
                           ▼
                  ┌────────────────┐
                  │ nginx (80/443) │  ← 리버스 프록시
                  └───┬────────┬───┘
                      │        │
        /api/* 요청   │        │  /, /static/* 요청
                      ▼        ▼
              ┌──────────┐  ┌──────────┐
              │  api     │  │  web     │  ← Next.js SSR
              │ (Flask)  │  └──────────┘
              └─────┬────┘
                    │
       ┌────────────┼──────────────┬────────────┬─────────────┐
       ▼            ▼              ▼            ▼             ▼
  ┌─────────┐ ┌──────────┐  ┌──────────┐  ┌──────────┐ ┌──────────┐
  │postgres │ │  redis   │  │ sandbox  │  │  plugin  │ │ssrf_proxy│
  │ (메인)  │ │ (브로커) │  │  (코드)  │  │  _daemon │ │  (squid) │
  └─────────┘ └────┬─────┘  └──────────┘  └──────────┘ └─────┬────┘
                   │                                          │
                   ▼ celery tasks                             ▼ 외부 호출
              ┌──────────┐                                ┌─────────┐
              │  worker  │ ─────────────────────────────► │ LLM API │
              │ (celery) │                                │ (GPT/   │
              └────┬─────┘                                │  Claude)│
                   │                                      └─────────┘
                   ▼ embedding query
              ┌──────────────────────┐
              │   Vector DB          │  ← 30+ 종 중 선택
              │ (Weaviate/Qdrant/    │
              │  Milvus/pgvector...) │
              └──────────────────────┘

패턴 1 — 워크스페이스 플러그인 아키텍처

30개 벡터 DB를 메인 코드에 직접 박지 않고, api/providers/vdb/* 하위 패키지로 분리했다. pyproject.toml에서 [tool.uv.sources]로 워크스페이스 멤버 등록 후 dependency group vdb-qdrant, vdb-milvus처럼 필요한 것만 골라 설치 가능.

uv sync --group vdb-qdrant   # Qdrant만 설치 (의존성 최소화)
uv sync --group vdb-milvus   # Milvus만 설치
uv sync --all-groups         # 전부 (디스크 큼)
Analogy · 비유

레스토랑이 모든 양념을 한꺼번에 사두지 않고, 그날 주문 들어온 요리에 필요한 양념만 꺼내는 것과 같다. 30개 벡터 DB의 의존성을 한 번에 설치하면 도커 이미지가 1GB를 넘기는데, group 분리로 운영 환경에서 필요한 어댑터만 가벼운 빌드가 가능해진다.

패턴 2 — 플러그인 데몬 분리 (외부 프로세스)

플러그인은 메인 API 프로세스에서 실행하지 않고, plugin_daemon이라는 별도 컨테이너가 호스팅한다. 이렇게 하면 ① 플러그인이 죽어도 메인 서버는 살아있고 ② 다른 언어(Go·Node)로도 플러그인 작성 가능 ③ 보안 격리 확보.

패턴 3 — BFF (Backend-for-Frontend) 분리 + 공통 API

Dify는 ① 웹 콘솔용 내부 API와 ② 외부 사용자가 만든 앱을 호출하기 위한 퍼블릭 API를 분리했다. api/controllers/ 안에 console, web, service_api 폴더가 따로 있다. 권한 모델과 rate limit이 완전히 다르기 때문에 코드 레이어로 갈라놨다.

패턴 4 — 관측 추상화 (Trace Provider Interface)

Langfuse, Opik, Arize Phoenix, Weave, MLflow 등 외부 트레이싱 시스템을 어댑터 패턴으로 통일했다. api/providers/trace/* 하위에 각 시스템 어댑터가 있고, 사용자는 환경변수 한 줄로 갈아끼울 수 있다.

컴포넌트역할대체 가능 여부
litellmLLM 호출 통일모델 변경 = 환경변수 1줄
Vector DB임베딩 저장·검색30+종, uv group으로 선택
Storage파일 저장S3/MinIO/Azure/GCS 등
Trace Provider관측·추적Langfuse/Opik/Phoenix 등
Plugin Daemon플러그인 실행별 컨테이너, 언어 비종속
05 — 디렉토리Repo map

레포 구조 해부

어디에 뭐가 있는지.

dify/
├── api/                  # Python 백엔드 (Flask + Celery)
│   ├── controllers/      # API 엔드포인트 (console / web / service_api)
│   ├── core/             # LLM 호출, RAG, 에이전트 코어 로직
│   ├── models/           # SQLAlchemy DB 모델
│   ├── services/         # 비즈니스 로직 레이어
│   ├── providers/        # 워크스페이스 (vdb/*, trace/*)
│   ├── migrations/       # Alembic DB 마이그레이션
│   └── pyproject.toml    # uv 워크스페이스 설정
│
├── web/                  # Next.js 프론트엔드 (TypeScript)
│   ├── app/              # App Router 페이지
│   ├── service/          # API 클라이언트
│   ├── context/          # React Context 상태
│   └── i18n-config/      # 20+ 언어 메시지
│
├── docker/               # Docker Compose + 환경설정
│   ├── docker-compose.yaml  # 메인 오케스트레이션 (~1200줄)
│   ├── .env.example      # 필수 환경변수 템플릿
│   └── envs/             # 테마별 분리된 옵션 변수
│
├── docs/                 # 다국어 README (zh-CN, ko-KR, ja-JP …)
├── sdks/                 # Python · Node SDK
├── packages/             # 공용 TypeScript 패키지
├── e2e/                  # Playwright E2E 테스트
├── dify-agent/           # 에이전트 코어 패키지 (별도 추출)
├── scripts/stress-test/  # 부하 테스트 스크립트
│
├── .agents/skills/       # Claude Code 에이전트 스킬 (커밋된 .skill)
├── .claude/              # Claude Code 설정
├── .gemini/              # Gemini CLI 설정
├── .devcontainer/        # VS Code Dev Container
│
├── CLAUDE.md             # Claude Code용 프로젝트 가이드
├── AGENTS.md             # 에이전트용 컨텍스트 문서
├── Makefile              # 빌드/테스트 단축 명령
└── package.json          # 루트 pnpm 워크스페이스
Analogy · 비유

이 구조는 식당의 백오피스 + 홀과 같다. api/는 주방(요리를 만드는 곳, 외부에 안 보임), web/은 홀(손님이 보는 메뉴와 좌석), docker/는 건물 자체(배관·전기·인테리어), sdks/는 배달원에게 주는 매뉴얼이다. 흥미로운 점 — .agents/skills/, CLAUDE.md, AGENTS.md가 커밋되어 있다. 에이전트가 이 레포에서 작업할 때 읽으라고 만든 문서 — 메타 시대를 보여주는 시그널.

06 — 학습 포인트What to learn

분야별 배울 것

Dify를 분해하면 7가지 학습 트랙이 나온다.

트랙 1 — Flask 운영 패턴

  • Blueprint 기반 라우트 분리 — console / web / service_api
  • Flask-RESTX의 Swagger 자동 생성 — 문서화 자동화
  • Alembic 마이그레이션 — 실전 스키마 진화 사례
  • Celery 비동기 작업 분리 — 무거운 작업 백그라운드 이동
  • gevent monkey patch + psycogreen — 코루틴 운영 노하우

실습: 빈 Flask 프로젝트에 Celery + Redis + Postgres를 붙여, PDF 업로드 → 백그라운드 텍스트 추출 → 임베딩 → DB 저장 → 진행률 폴링 API 구현

트랙 2 — Next.js 모노레포

  • pnpm + vite-plus — 대형 프론트엔드 빌드 최적화
  • eslint-suppressions.json — 레거시 경고를 점진적으로 정리하는 운영 패턴
  • .vite-hooks/ — 빌드 파이프라인 훅
  • web/ + packages/ + sdks/를 한 레포에서 굴리는 현실 케이스

실습: 본인 프로젝트에 pnpm 워크스페이스를 적용해 shared/ 폴더를 만들고, 두 개의 앱이 동일한 디자인 토큰을 공유하도록 구성

트랙 3 — Docker Compose 멀티 컨테이너

  • profiles — 옵션 컨테이너(벡터 DB)의 켜고 끄기
  • depends_on + condition: service_healthy — 시작 순서 제어
  • restart 정책 / env_file 분리 / volume 명시
  • network 분리 — 보안 격리

실습: 사이드 프로젝트에서 DB + 캐시 + 워커 + 웹을 Compose로 묶고, vector DB를 profile 옵션으로 켜고 끌 수 있게 구성

트랙 4 — 멀티 LLM 추상화

  • litellm 위에 자체 어댑터 한 층 더 — 왜 그렇게 했는지 추적
  • 모델 제공자별 토큰 카운트 방식, 스트리밍 형식, 함수 호출 스펙 차이 통일
  • 폴백 전략 — 모델 다운 시 다음 모델로 자동 전환

실습: litellm으로 OpenAI · Claude · Gemini · Ollama 4개를 같은 코드로 호출하는 비교 앱을 만들고, 응답 속도/토큰 비용/품질을 표로 정리

트랙 5 — RAG 파이프라인 구현

  • PDF/PPT/Word/Markdown 자동 추출 + 다양한 청킹 전략 (고정·의미·부모-자식)
  • 30+ 벡터 DB 어댑터 추상화
  • 하이브리드 검색 — 키워드 (BM25) + 벡터
  • 리랭킹 모델 (cross-encoder)로 정확도 끌어올리기

실습: 본인 PDF 100개를 인덱싱하는 미니 RAG를 처음부터 짜본다 — pgvector + sentence-transformers + Flask 한 페이지면 충분

트랙 6 — 사용자 코드 격리 (Sandbox)

  • Dify Sandbox — 사용자가 워크플로우에 넣은 Python/JavaScript 코드를 격리 컨테이너에서 실행
  • 시스템 콜 제한 / 네트워크 격리 / 시간 제한 구현 패턴
  • gVisor · nsjail 같은 컨테이너 격리 기술

실습: Docker + gVisor 또는 nsjail로 미니 코드 실행 서비스를 만들어본다

트랙 7 — OpenTelemetry 자동 계측

  • opentelemetry-distro로 Flask · Celery · Redis · SQLAlchemy · HTTPX 자동 계측
  • 환경변수 한 줄로 Jaeger · Grafana Tempo · Honeycomb 백엔드로 전송
  • 분산 trace ID 전파 — Celery 작업까지 같은 trace로 묶기

실습: 본인 Flask/FastAPI 앱에 opentelemetry-distro를 붙이고 Grafana Tempo + Loki로 trace + log를 한 화면에서 보는 환경 구성

07 — 요구사항Setup

하드웨어·시스템 요구사항

셀프호스팅 전 체크리스트.

공식 README가 제시하는 최소 사양은 의외로 낮다 — 그러나 실전에서는 늘 함정이 있다.

구성최소 사양외부 의존성용도
공식 최소2 Core / 4 GiB / Docker없음 (전부 컨테이너)학습, 단일 사용자
개인 시험판4 Core / 8 GiB / 50 GB SSDOpenAI API 키 정도개인 프로젝트
소규모 팀 (10~30명)8 Core / 16 GiB / 200 GB SSD벡터 DB 별 컨테이너 권장사내 챗봇·문서 QA
NAS 자가호스팅Synology DS920+/DS923+ (8GB)Qdrant·pgvector 권장홈랩, 개인 데이터 보관
+ 로컬 임베딩 모델위에 GPU 추가HuggingFace 모델API 호출 비용 절감
Trap · 함정
"최소 4GB라며?" — 실전 함정

최소 사양은 빈 Dify를 띄우기만 한 상태 기준이다. ① 벡터 DB를 같은 호스트에 띄우면 Milvus만 2~4GB, Weaviate도 1~2GB 추가로 먹는다. ② LLM API 호출은 외부지만 임베딩 모델을 로컬로 돌리면 별도 GPU/RAM이 필요하다. ③ 동시 사용자 10명 + 문서 1만 건이면 8GB는 부족하다.

Fix · 해결책
실전 권장 사양 · 스토리지 분리

벡터 DB는 별도 호스트로 분리하고 Dify는 API/Web/Worker만 책임지게 하자. 파일 스토리지는 로컬 디스크 대신 S3 호환 객체 스토리지(MinIO, R2, B2 등)를 쓰면 백업·확장이 쉽다. STORAGE_TYPE 환경변수 한 줄로 갈아낄 수 있다.

Trap · Windows 사용자 주의

WSL2 위에서 docker compose를 돌리는 게 가장 안정적. PowerShell 직접 사용 시 볼륨 권한 이슈가 잦다. Hyper-V 활성화, Docker Desktop 최신 버전, 최소 8GB RAM 할당(WSL .wslconfig)을 권장. 또한 Windows 경로(C:\)와 Linux 경로(/mnt/c/)가 혼동되지 않게 .env의 경로 변수는 Linux 스타일로 통일.

08 — 실습 과제Hands-on

직접 해볼 수 있는 5단계

난이도별 실습 — Easy → Hard.

실습 1 — 로컬에 Dify 띄우기Easy

1) Docker 설치된 머신에서 git clone https://github.com/langgenius/dify 2) cd dockercp .env.example .env 3) docker compose up -d 4) 5분 후 http://localhost/install 접속 → 관리자 계정 생성 5) OpenAI API 키 한 줄만 넣으면 GPT 기반 챗봇을 클릭 몇 번으로 완성.

배우는 것: Docker Compose 멀티 컨테이너 실전, 환경변수 분리, 초기 설정 흐름

실습 2 — PDF Q&A 챗봇 (RAG)Easy

1) Dify 콘솔에서 "지식(Knowledge)" 메뉴 진입 2) 본인 PDF 5~10개 업로드 → 자동 청킹 확인 3) 임베딩 모델로 text-embedding-3-small 선택 (저렴) 4) 챗봇 앱을 만들고 지식 베이스 연결 5) 같은 질문을 ① 단순 LLM 호출 ② RAG 적용 두 가지로 비교해 답변 품질 차이 확인.

배우는 것: RAG 파이프라인 흐름, 청킹 전략, 임베딩 모델 선택

실습 3 — 비주얼 워크플로우 + 외부 APIMedium

1) 워크플로우 캔버스 구성: 시작 → LLM 노드(질문 분류) → 조건 분기 → HTTP 요청 노드(OpenWeather API) → LLM 노드(자연어 응답) → 종료 2) "내일 서울 날씨 알려줘"가 들어오면 분류 LLM이 "날씨 질문"이라 판정 3) HTTP 노드가 외부 API 호출 4) 결과를 다시 LLM이 자연스러운 문장으로 응답 5) trace 화면에서 각 노드의 토큰·응답시간 확인.

배우는 것: 노드 기반 흐름 설계, 조건 분기, 외부 API 통합, 변수 전파

실습 4 — 외부 앱에 Dify 임베드 (Service API)Medium

1) Dify 앱마다 발급되는 API 키 발급 2) 본인의 Next.js/React 사이트에서 직접 호출 3) 스트리밍 응답(SSE)을 받아 토큰별로 화면에 표시 4) 사용자 인증은 본인 시스템에서 처리, Dify에는 user_id만 전달 5) Dify를 백엔드처럼 쓰는 LLM-as-BaaS 패턴 완성.

배우는 것: Service API 인증, SSE 스트리밍 처리, 백엔드 분리 패턴

실습 5 — Dify 플러그인 직접 작성Hard

1) .agents/skills/ 참고해 본인 도구를 플러그인으로 정의 (예: 사내 위키 Confluence 검색) 2) plugin manifest 작성 → 호출 스펙 정의 3) plugin_daemon에 등록 4) 캔버스에서 새 노드로 사용 5) docs.dify.ai의 Plugin 섹션을 참고해 marketplace 배포까지.

배우는 것: 플러그인 아키텍처, manifest 스펙, 사내 도구 통합

09 — 학습 로드맵5 weeks

5주 심화 학습 로드맵

주차별로 따라가면 Dify 전체 스택 마스터.

Week 01
LLM API 기본기

OpenAI · Anthropic · Google 세 회사 API 키 발급. 같은 프롬프트로 세 모델 비교. 스트리밍 vs 일반 응답, 토큰 카운트와 비용 계산, JSON mode와 함수 호출, 컨텍스트 윈도우 관리. Dify 같은 추상 도구로 넘어가기 전에 직접 호출 경험이 필수.

Week 02
RAG 이론과 구현

sentence-transformers · Hugging Face 모델로 임베딩 직접 생성. 코사인 유사도 vs 내적 vs L2. pgvector 또는 Qdrant 설치 후 인덱싱. 청크 크기 256 vs 512 vs 1024 비교. 하이브리드 검색(BM25 + 벡터). Re-ranking (cross-encoder)로 정확도 끌어올리기.

Week 03
에이전트 패턴 (ReAct · MCP)

LLM이 도구를 호출하는 패턴들 — function calling (OpenAI), tool use (Anthropic), ReAct loop (생각→행동→관찰 반복), Plan-and-Execute, MCP (Model Context Protocol). Dify 캔버스에서 각 패턴이 어떻게 노드로 표현되는지 매핑.

Week 04
인프라와 셀프호스팅

Compose로 Dify 띄우기 → Helm Chart로 K8s 배포 → AWS CDK 또는 Terraform으로 한 클릭 배포. nginx 설정, certbot HTTPS, PostgreSQL 백업 전략, Redis 영속화, Grafana 대시보드 임포트까지.

Week 05
LLMOps와 평가 (캡스톤)

Langfuse · Opik · Arize Phoenix 중 하나를 골라 Dify와 연결. 트레이스 데이터로 ① 가장 오래 걸린 요청 추적 ② 환각 탐지 ③ 사용자 피드백 분석 ④ A/B 프롬프트 비교. LLM-as-judge 평가 자동화 파이프라인 구축.

10 — 키워드 사전Glossary

핵심 용어 한눈에

Dify 학습 과정에서 자주 마주칠 단어들.

Workflow / Chatflow
Dify의 두 가지 앱 모드. Workflow는 한 번 실행하고 끝나는 파이프라인(예: 기사 요약), Chatflow는 대화 상태를 유지하는 챗봇.
Knowledge Base
RAG에 쓰는 문서 묶음. PDF·PPT·Markdown 업로드 → 청킹 → 임베딩 → 벡터 DB 저장까지 자동.
Function Calling / Tool Use
LLM이 "지금 외부 도구를 써야겠다"고 판단하고 JSON으로 호출 명세를 내놓는 기능. Dify는 50+개 내장 도구 + 사용자 정의 도구 지원.
MCP (Model Context Protocol)
2024년 말 Anthropic이 제안한 LLM 도구 표준. 각 사 다른 함수 호출 스펙을 USB 같은 공용 규격으로 통일. Dify의 GitHub 토픽에도 mcp 포함.
Embedding (임베딩)
텍스트를 1024차원 같은 숫자 배열로 바꾸는 작업. "강아지"와 "개"는 가까운 벡터가, "강아지"와 "자동차"는 먼 벡터가 된다. RAG의 핵심.
Re-ranking (재순위)
벡터 검색으로 top 20개를 뽑은 뒤, cross-encoder 모델로 한 번 더 정렬해 top 5만 LLM에 넘기는 단계. 정확도가 크게 올라간다.
LLMOps
DevOps · MLOps에 이어 등장한 "LLM 운영 관리". 프롬프트 버저닝, 토큰 비용 추적, 응답 품질 모니터링, 환각 탐지, 비용 알람 등.
SSE (Server-Sent Events)
서버가 클라이언트로 한 방향 데이터를 흘려보내는 표준. LLM 응답을 토큰별로 스트리밍할 때 거의 표준처럼 쓰인다. Dify chat API도 SSE 기반.
SSRF
Server-Side Request Forgery — 서버가 사용자 입력 URL을 그대로 요청해 내부 자원에 접근당하는 취약점. Dify에 squid 프록시가 들어간 이유.
BaaS
Backend-as-a-Service. 백엔드를 직접 짜지 않고 외부 서비스 API를 호출해 쓰는 모델. Firebase, Supabase 대표. Dify는 "LLM 앱을 위한 BaaS"로도 불린다.
litellm
100+개 LLM API를 통일된 OpenAI 호환 인터페이스로 호출하게 해주는 Python 라이브러리. Dify가 LLM 추상화 기반으로 채택.
Celery
Python 표준 분산 작업 큐. Redis/RabbitMQ를 브로커로 두고 워커가 작업을 가져가 처리. Dify의 인덱싱·임베딩 등 무거운 작업 담당.
pgvector
PostgreSQL의 벡터 검색 확장. 기존 Postgres 운영팀이 그대로 RAG를 도입할 수 있어 인기. Dify가 기본 권장하는 벡터 DB 중 하나.
Sandbox
사용자가 워크플로우에 넣은 임의 Python/JS 코드를 안전하게 실행하는 격리 컨테이너. 시스템 콜·네트워크·시간 제한 적용.
Plugin Daemon
메인 API와 분리된 플러그인 호스트 프로세스. 플러그인이 죽어도 메인 서버는 살아 있게 격리하고, 다른 언어로도 플러그인 작성 가능.
profile (Compose)
Docker Compose에서 옵션 컨테이너를 그룹화해 켜고 끄는 기능. Dify는 벡터 DB마다 profile을 두어 필요한 것만 띄운다.
11 — 참고 링크Refs

더 깊이 파고들 자료

공식 · 코드 · 학습 리소스.

공식 자료

코드 직접 읽기

생태계 · 배포 · 운영

Action · 이번 주에 해볼 것

Dify를 처음 만났다면 이 순서로 5단계.

  1. 오늘 30분 — 일단 띄워본다. docker compose up -d 한 줄로 localhost에서 첫 챗봇을 만든다. OpenAI 키 한 줄만 있으면 충분. 캔버스가 어떻게 생겼는지 직접 보는 게 어떤 글보다 강력한 학습.
  2. 이번 주 — RAG를 손으로. 본인 PDF 5개를 업로드해 "지식 베이스"에 넣고, 같은 질문을 RAG 적용 전/후로 비교한다. 문서가 답변에 어떻게 인용되는지 trace 화면에서 토큰별로 확인.
  3. 이번 달 — 워크플로우 1개 완성. 본인 업무 중 반복되는 작업 하나(예: 이메일 분류, 회의록 요약, 문서 번역)를 캔버스에서 노드로 조립해 자동화. LLM 노드 + 조건 분기 + HTTP 노드 조합이 핵심.
  4. 다음 분기 — 코드와 함께 읽는다. api/controllers/console/app/workflow.py 같은 핵심 컨트롤러를 열어 라우트가 어떻게 정의되는지, 비동기 Celery 작업이 언제 시작되는지 따라간다. Flask + Celery 운영 패턴이 통째로 들어있다.
  5. 여유 있을 때 — 본인 플러그인 작성. 사내 시스템(노션, Confluence, GitHub Issues 등) 검색 도구를 플러그인으로 만들어 사내용 사설 어시스턴트 구성. .agents/skills/ 폴더가 좋은 출발점.
원문 · langgenius/dify (GitHub) · 2026-05-21 · TrendShift 누적 8위 · 142k stars