2편 전체 목차
모델 선택 전략 — 비용·성능·프라이버시 트레이드오프
Dify CUDA 환경 구축으로 로컬 LLM을 선택할 수 있는데 LLM 선택은 단순히 “어떤 모델이 좋은가”의 문제가 아닙니다. 비용, 성능, 데이터 프라이버시, 응답 속도, 컨텍스트 길이 등 여러 요소를 고려해서 용도별로 최적 모델을 배치하는 것이 핵심입니다.
| 모델 유형 | 비용 | 성능 | 프라이버시 | 속도 | 적합한 용도 |
|---|---|---|---|---|---|
| Ollama 로컬 (7B) | 무료 | 중 | 완전 로컬 | GPU: 빠름 / CPU: 느림 | 내부 문서, 민감 데이터 |
| Ollama 로컬 (14B+) | 무료 | 높음 | 완전 로컬 | GPU 필수 | 고품질 로컬 처리 |
| Claude Haiku | 저렴 | 중 | 외부 전송 | 매우 빠름 | 간단한 분류, 요약 |
| Claude Sonnet | 중간 | 높음 | 외부 전송 | 빠름 | RAG, 코드, 분석 |
| GPT-4o-mini | 저렴 | 중-상 | 외부 전송 | 빠름 | 일반 챗봇, 요약 |
| GPT-4o | 비쌈 | 최고 | 외부 전송 | 중간 | 복잡한 추론, 이미지 |
임베딩: bge-m3 로컬 (비용 0원, 한국어 포함) + LLM: 민감 데이터는 Ollama qwen2.5:14b, 일반 처리는 Claude Sonnet, 대량 처리는 Claude Haiku — 이 구성으로 비용과 품질을 동시에 최적화할 수 있습니다.
Ollama 설치 & GPU 최적화
Ollama 설치 (모든 OS 공통)
# 공식 설치 스크립트 curl -fsSL https://ollama.com/install.sh | sh # 서비스 등록 sudo systemctl enable --now ollama # 버전 확인 ollama --version
NVIDIA GPU CUDA/VRAM 매핑 — 모델별 최소 VRAM
| 모델 | 파라미터 | 양자화 | 최소 VRAM | 권장 GPU | CPU 폴백 |
|---|---|---|---|---|---|
| qwen2.5:7b | 7B | Q4_K_M | 5GB | RTX 3060 6GB+ | 가능 (느림) |
| qwen2.5:14b | 14B | Q4_K_M | 9GB | RTX 3060 12GB | 가능 (매우 느림) |
| mistral-nemo:12b | 12B | Q4_K_M | 7GB | RTX 3060 12GB | 가능 |
| gemma4:e4b | 4B | E4B | 10GB | RTX 3060 12GB | 비권장 |
| llama3.1:70b | 70B | Q4_K_M | 40GB+ | A100 / 2x RTX 4090 | 불가 |
| bge-m3 | 567M | F16 | 1.5GB | 어떤 GPU든 | 빠름 |
Ollama GPU 최적화 환경변수
# Ollama 서비스 환경변수 편집 sudo systemctl edit ollama # 아래 내용 추가 # [Service] # Environment="OLLAMA_HOST=0.0.0.0" # 외부 접근 허용 # Environment="OLLAMA_FLASH_ATTENTION=1" # Flash Attention 활성화 # Environment="OLLAMA_NUM_PARALLEL=2" # 동시 요청 처리 수 # Environment="OLLAMA_MAX_LOADED_MODELS=1" # 메모리 보존 # Environment="OLLAMA_KEEP_ALIVE=24h" # 모델 메모리 유지 시간 # Environment="CUDA_VISIBLE_DEVICES=0" # GPU 0번만 사용 # 재시작 sudo systemctl restart ollama # GPU 인식 확인 ollama ps # 모델 실행 중이면 GPU 사용량 표시 nvidia-smi # GPU 메모리 사용량 확인
Dify에서 Ollama 연결 Base URL
| 구성 | Base URL | 설명 |
|---|---|---|
| Dify Docker + Ollama 호스트 설치 | http://host.docker.internal:11434 | Linux: host.docker.internal 동작 확인 필요 |
| Linux Docker + Ollama 호스트 | http://172.17.0.1:11434 | Docker 브릿지 게이트웨이 IP |
| 별도 서버에 Ollama | http://올라마서버IP:11434 | 방화벽에서 11434 포트 허용 필요 |
| Docker Compose 동일 네트워크 | http://ollama:11434 | 컨테이너 이름으로 직접 통신 |
Ollama 모델 카탈로그 — 최적 선택 가이드
한국어/영어 LLM 추천 모델
# ── 한국어/영어 균형 (RTX 3060 12GB 적합) ── ollama pull qwen2.5:7b # 가장 가볍고 빠름 ollama pull qwen2.5:14b-instruct-q4_K_M # 고품질, 한국어 최우수 # ── 영어 기술문서/논문 특화 ── ollama pull mistral-nemo:12b # 128K 컨텍스트 # ── 코드 생성 특화 ── ollama pull qwen2.5-coder:7b # 코드 생성 최적화 ollama pull deepseek-coder-v2:16b # 고성능 코드 모델 # ── 임베딩 모델 (RAG 필수) ── ollama pull bge-m3 # 한국어 포함 100개+ 언어 ollama pull nomic-embed-text # 영어 전용, 빠름 # 설치된 모델 목록 확인 ollama list
| 모델 | 한국어 | 영어 | 코딩 | VRAM | 컨텍스트 | 추천 용도 |
|---|---|---|---|---|---|---|
qwen2.5:14b-instruct-q4_K_M | 최우수 | 우수 | 우수 | ~9GB | 128K | 한국어 RAG, 종합 |
qwen2.5:7b | 우수 | 양호 | 양호 | ~5GB | 128K | 가볍고 빠른 처리 |
mistral-nemo:12b | 보통 | 최우수 | 우수 | ~7GB | 128K | 영어 문서, 논문 |
qwen2.5-coder:7b | 양호 | 우수 | 최우수 | ~5GB | 32K | 코드 생성/리뷰 |
OpenAI API 연동 & 호환 엔드포인트
OpenAI API는 Dify에서 가장 간단하게 연동됩니다. 또한 OpenAI 호환 엔드포인트 기능을 통해 vLLM, LM Studio, LocalAI, Azure OpenAI도 동일한 방식으로 연동할 수 있습니다.
platform.openai.com → API Keys → Create new secret key
발급 즉시 복사 필수. 이후 재확인 불가. 프로젝트별 키 분리 권장
Dify → 우측 상단 프로필 → Settings → Model Provider → OpenAI
API Key 입력 후 Save. gpt-4o, gpt-4o-mini, text-embedding-3 시리즈 자동 추가
사용량 모니터링 설정
platform.openai.com → Usage → 월별 한도 설정으로 예상치 못한 비용 방지
OpenAI 호환 엔드포인트 연동 (vLLM, LM Studio 등)
Model Provider: OpenAI-API-compatible Model Name: 실제 모델 이름 (예: qwen2.5-72b-instruct) API Key: 없으면 임의 값 입력 (예: none) API endpoint URL: └── vLLM: http://YOUR_SERVER:8000/v1 └── LM Studio: http://localhost:1234/v1 └── LocalAI: http://localhost:8080/v1 └── Azure: https://YOUR_RESOURCE.openai.azure.com/openai/deployments/YOUR_DEPLOY
| OpenAI 모델 | 컨텍스트 | 멀티모달 | 권장 용도 | 비용 수준 |
|---|---|---|---|---|
| gpt-4o | 128K | ✅ 이미지 | 복잡한 추론, 이미지 분석 | 높음 |
| gpt-4o-mini | 128K | ✅ 이미지 | 일반 챗봇, RAG, 코드 | 중간 |
| text-embedding-3-large | 8K | ❌ | 고품질 영어 임베딩 | 저렴 |
| text-embedding-3-small | 8K | ❌ | 대량 처리, 비용 절감 | 매우 저렴 |
Anthropic Claude API 연동
Claude는 200K 컨텍스트, 정밀한 지시 따르기, 뛰어난 한국어 품질이 강점입니다. 특히 긴 문서 처리와 정교한 프롬프트 엔지니어링이 필요한 작업에서 GPT-4o 대비 우수한 결과를 냅니다.
console.anthropic.com → API Keys → Create Key
sk-ant-로 시작하는 키 발급. 발급 즉시 복사
Dify → Settings → Model Provider → Anthropic
API Key 입력 후 Save
모델 선택 및 파라미터 조정
Temperature, Max Tokens, Top P 등 앱별로 최적값 설정
| Claude 모델 | 컨텍스트 | 특징 | 권장 용도 | 비용 |
|---|---|---|---|---|
| claude-opus-4 | 200K | 최고 성능, 복잡한 멀티스텝 추론 | 정교한 분석, 복잡한 워크플로우 | 최고 |
| claude-sonnet-4 | 200K | 성능/비용 최적, 한국어 우수 | RAG 챗봇, 코드, 문서 처리 | 중간 |
| claude-haiku-4-5 | 200K | 초고속, 저비용 | 분류, 요약, 간단한 Q&A | 낮음 |
Claude가 유리한 경우: 긴 문서(50페이지+) 분석, 정교한 지시 따르기, 한국어 자연스러운 응답, 복잡한 추론. GPT-4o가 유리한 경우: 이미지 분석(Vision), 함수 호출(Function Calling), Code Interpreter 기능이 필요한 경우. 비용 효율만 따진다면 Claude Haiku가 GPT-4o-mini 대비 동급 성능에 더 저렴합니다.
임베딩 모델 심층 비교 & 최적 선택
임베딩 모델은 RAG 검색 품질의 80%를 결정합니다. 특히 한국어 문서를 처리한다면 영어 전용 임베딩 모델을 사용해서는 안 됩니다 — 검색 결과가 현저히 나빠집니다.
| 임베딩 모델 | 언어 | Dimensions | Max Tokens | 실행 | 비용 | 품질 |
|---|---|---|---|---|---|---|
| bge-m3 (권장) | 100개+ 언어 | 1024 | 8192 | Ollama 로컬 | 무료 | 최고 |
| text-embedding-3-large | 주로 영어 | 3072 | 8191 | OpenAI API | 유료 | 높음 |
| text-embedding-3-small | 주로 영어 | 1536 | 8191 | OpenAI API | 저렴 | 중간 |
| nomic-embed-text | 영어 | 768 | 8192 | Ollama 로컬 | 무료 | 중간 |
| BAAI/bge-large-zh | 중국어/영어 | 1024 | 512 | 로컬 | 무료 | 중간 |
지식베이스 생성 후 임베딩 모델을 변경하면 기존의 모든 벡터가 새 모델과 호환되지 않아 전체 재인덱싱이 필요합니다. 대용량 지식베이스에서는 수 시간이 걸릴 수 있습니다. 처음부터 올바른 임베딩 모델을 선택하세요. 한국어가 포함되어 있다면 무조건 bge-m3를 권장합니다.
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는 Workflow의 정밀한 노드 제어와 대화형 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 기초 — 노드 체이닝과 변수 라우팅
Workflow의 핵심은 변수(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)실전 워크플로우 패턴
패턴 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(저장) | 실시간 지식 갱신 |
에이전트(Agent) 설계 — Tool 활용과 ReAct 패턴
Agent 앱은 LLM이 스스로 어떤 도구(Tool)를 사용할지 판단하는 자율적인 AI입니다. 웹 검색, 코드 실행, 지식베이스 검색을 AI가 상황에 맞게 선택합니다.
Dify 내장 도구 목록
| 도구 | 기능 | 활용 예시 |
|---|---|---|
| 웹 검색 (Google/Bing/DuckDuckGo) | 실시간 인터넷 검색 | 최신 뉴스, 현재 정보 조회 |
| Wikipedia | 위키피디아 검색 | 일반 지식 조회 |
| 계산기 (Calculator) | 수식 계산 | 재무 계산, 통계 |
| 코드 실행 (Code Interpreter) | Python 코드 실행 | 데이터 분석, 그래프 생성 |
| 지식베이스 (Knowledge Base) | 벡터 검색 | 내부 문서 참조 |
| 날씨 (Weather) | 날씨 정보 조회 | 기후 기반 추천 |
Agent는 Reasoning(추론) + Acting(행동)을 반복하는 ReAct 패턴으로 동작합니다. “현재 상황 분석 → 필요한 도구 선택 → 실행 → 결과 분석 → 다음 행동 결정”을 목표 달성까지 자율적으로 반복합니다. 복잡한 리서치나 다단계 문제 해결에 강력합니다.
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 검색 튜닝, 데이터 백업 전략, 모니터링으로 프로덕션 품질을 완성합니다.

