Dify:自建 LLM 应用开发平台,可视化构建 AI 工作流
Dify:自建 LLM 应用开发平台,可视化构建 AI 工作流
随着大型语言模型(LLM)的快速普及,越来越多的开发者和企业希望将 AI 能力集成到自己的产品中。然而,从零开始搭建一个完整的 AI 应用涉及模型接入、Prompt 管理、RAG 检索、工作流编排等大量重复工作。Dify 正是为解决这一痛点而生——它是一款开源的 LLM 应用开发平台,提供可视化的工作流构建器、RAG 文档问答、AI 聊天机器人搭建、多模型提供商支持以及 API 发布能力,让你无需重复造轮子,专注于业务逻辑本身。无论是构建企业知识库问答、AI 客服机器人,还是搭建多步骤 AI Agent 流程,Dify 都能在可视化界面中完成,支持对接 OpenAI、Anthropic、Ollama 本地模型等主流提供商。本文将带你用 Docker Compose 在自有服务器上完整部署 Dify,并演示从创建应用到发布 API 的全流程。
服务器配置
Dify 内部包含多个服务组件:API 服务、异步 Worker、Web 前端、PostgreSQL 数据库、Redis 缓存、Weaviate 向量数据库以及 nginx 内部路由,对内存的需求相对较高。推荐选择 4 核 8GB 机型,以保证各服务能稳定并发运行,磁盘建议至少 40GB SSD(用于存储向量索引和上传的文档文件)。
推荐使用雨云服务器 rainyun+com 进行部署,线路质量优秀、控制台操作简便,注册填码 2026off 领 5 折券,大幅降低上手成本。
推荐配置一览:
| 项目 | 推荐规格 |
|---|---|
| CPU | 4 核 |
| 内存 | 8 GB |
| 磁盘 | 40 GB SSD |
| 操作系统 | Ubuntu 22.04 LTS |
| Docker | 24.x+ |
| Docker Compose | v2.x |
安装 Docker:
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker
docker --version
docker compose version
Docker Compose 部署
克隆官方仓库
Dify 官方在 GitHub 上提供了完整的 Docker Compose 配置,直接克隆并进入 docker 目录即可:
git clone https://github.com/langgenius/dify.git
cd dify/docker
配置环境变量
复制示例环境变量文件并进行修改:
cp .env.example .env
nano .env
重点修改以下配置项:
# 应用密钥(必须修改,可用 openssl rand -hex 32 生成)
SECRET_KEY=your-very-long-random-secret-key-change-this
# 数据库连接字符串
DATABASE_URL=postgresql://dify:difypassword@db:5432/dify
# Redis 连接字符串
REDIS_URL=redis://:difyredispassword@redis:6379/0
# 文件存储类型(local = 本地磁盘,也可配置 s3)
STORAGE_TYPE=local
# 向量数据库(使用内置 Weaviate)
VECTOR_STORE=weaviate
WEAVIATE_ENDPOINT=http://weaviate:8080
WEAVIATE_API_KEY=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih
# 对外访问的域名(Caddy 代理的地址)
CONSOLE_WEB_URL=https://dify.example.com
APP_WEB_URL=https://dify.example.com
# PostgreSQL 认证
POSTGRES_USER=dify
POSTGRES_PASSWORD=difypassword
POSTGRES_DB=dify
# Redis 密码
REDIS_PASSWORD=difyredispassword
完整 docker-compose.yml
以下是覆盖全部核心服务的编排文件:
version: '3'
services:
# API 服务:处理 HTTP 请求、业务逻辑
api:
image: langgenius/dify-api:latest
restart: always
environment:
MODE: api
SECRET_KEY: ${SECRET_KEY}
DATABASE_URL: ${DATABASE_URL}
REDIS_URL: ${REDIS_URL}
STORAGE_TYPE: ${STORAGE_TYPE}
VECTOR_STORE: ${VECTOR_STORE}
WEAVIATE_ENDPOINT: ${WEAVIATE_ENDPOINT}
WEAVIATE_API_KEY: ${WEAVIATE_API_KEY}
CONSOLE_WEB_URL: ${CONSOLE_WEB_URL}
APP_WEB_URL: ${APP_WEB_URL}
volumes:
- ./volumes/app/storage:/app/api/storage
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
networks:
- dify
# Worker:处理异步任务(文档解析、向量化、邮件发送等)
worker:
image: langgenius/dify-api:latest
restart: always
environment:
MODE: worker
SECRET_KEY: ${SECRET_KEY}
DATABASE_URL: ${DATABASE_URL}
REDIS_URL: ${REDIS_URL}
STORAGE_TYPE: ${STORAGE_TYPE}
VECTOR_STORE: ${VECTOR_STORE}
WEAVIATE_ENDPOINT: ${WEAVIATE_ENDPOINT}
WEAVIATE_API_KEY: ${WEAVIATE_API_KEY}
volumes:
- ./volumes/app/storage:/app/api/storage
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
networks:
- dify
# Web 前端
web:
image: langgenius/dify-web:latest
restart: always
environment:
CONSOLE_API_URL: ${CONSOLE_WEB_URL}
APP_API_URL: ${APP_WEB_URL}
networks:
- dify
# PostgreSQL 关系型数据库
db:
image: postgres:15-alpine
restart: always
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- ./volumes/db/data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
networks:
- dify
# Redis 缓存与消息队列
redis:
image: redis:6-alpine
restart: always
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- ./volumes/redis/data:/data
networks:
- dify
# Weaviate 向量数据库(用于 RAG 检索)
weaviate:
image: semitechnologies/weaviate:1.19.0
restart: always
environment:
QUERY_DEFAULTS_LIMIT: 25
AUTHENTICATION_APIKEY_ENABLED: "true"
AUTHENTICATION_APIKEY_ALLOWED_KEYS: ${WEAVIATE_API_KEY}
AUTHENTICATION_APIKEY_USERS: admin@dify.local
PERSISTENCE_DATA_PATH: /var/lib/weaviate
DEFAULT_VECTORIZER_MODULE: none
volumes:
- ./volumes/weaviate:/var/lib/weaviate
networks:
- dify
# nginx 内部路由(将请求分发给 api 和 web)
nginx:
image: nginx:1.25-alpine
restart: always
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/conf.d:/etc/nginx/conf.d:ro
ports:
- "127.0.0.1:8080:80"
depends_on:
- api
- web
networks:
- dify
networks:
dify:
driver: bridge
注意: nginx 仅监听本地回环地址
127.0.0.1:8080,由外层 Caddy 做 HTTPS 终结后反向代理到此端口,避免直接暴露 HTTP 到公网。
启动并验证
# 后台启动所有服务
docker compose up -d
# 查看各容器运行状态
docker compose ps
# 实时查看 API 服务日志
docker compose logs -f api
# 等待约 2-3 分钟,待数据库迁移完成
所有容器状态变为 healthy 或 running 后,继续配置反向代理。
配置反向代理
使用 Caddy 作为外层反向代理,它能自动向 Let’s Encrypt 申请 TLS 证书并定期续期,配置极为简洁。
安装 Caddy
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \
| sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \
| sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install caddy
Caddyfile 配置
编辑 /etc/caddy/Caddyfile(将 dify.example.com 替换为你的真实域名,并确保该域名已解析到服务器 IP):
dify.example.com {
# 代理到内部 nginx
reverse_proxy 127.0.0.1:8080
# 文件上传大小限制(Dify 支持大文档上传)
request_body max_size 100MB
# 超时配置(AI 推理响应可能较慢)
header_up Host {host}
log {
output file /var/log/caddy/dify-access.log
level INFO
}
}
# 重载 Caddy 使配置生效
sudo systemctl reload caddy
# 确认证书申请成功
sudo systemctl status caddy
初始设置
创建管理员账号
浏览器访问 https://dify.example.com,首次访问会进入初始化向导:
- 设置管理员邮箱和密码(请使用强密码并妥善保管)
- 完成后自动跳转到 Dify 控制台主界面
配置 LLM 模型提供商
在控制台右上角点击头像 → 设置 → 模型供应商:
接入 OpenAI:
供应商:OpenAI
API Key:sk-xxxxxxxxxxxxxxxx
(可选)API Base URL:https://api.openai.com/v1
接入 Anthropic Claude:
供应商:Anthropic
API Key:sk-ant-xxxxxxxxxxxxxxxx
接入 Ollama(本地模型,零费用):
供应商:Ollama
Base URL:http://host.docker.internal:11434
模型名称:llama3.1(或其他已拉取的模型)
配置完成后,在模型列表中勾选希望在应用中使用的具体模型版本。
核心功能演示
1. 创建聊天机器人应用
进入 工作室 → 创建应用 → 聊天助手:
- 填写应用名称,如"产品客服助手"
- 在 编排 页面设置系统提示词:
你是一位专业、友善的产品客服助手。
请根据用户问题提供准确、简洁的解答。
若遇到无法确认的问题,请明确告知用户并建议联系人工客服。
回答语言始终与用户保持一致。
- 选择模型(如 GPT-4o),调整 Temperature(创意性)、Max Tokens(最大输出长度)
- 右侧实时预览对话效果
- 点击 发布 生成分享链接,或获取嵌入代码
2. 构建 RAG 文档知识库
第一步:上传文档建库
进入 知识库 → 创建知识库:
- 上传文件(支持 PDF、DOCX、TXT、Markdown、网页 URL、Notion 页面等)
- 选择 自动分块(推荐)或自定义分块大小(默认 500 tokens,重叠 50 tokens)
- 选择 Embedding 模型(如
text-embedding-3-small,成本低、效果好) - 点击 保存并处理
系统会自动完成:文档解析 → 文本分块 → 向量化 → 写入 Weaviate,处理进度可在知识库详情页查看。
第二步:在应用中挂载知识库
在聊天机器人编排界面,展开 上下文 面板:
- 点击 + 添加,选择刚创建的知识库
- 配置召回策略:
- 语义检索:基于向量相似度(适合语义理解场景)
- 全文检索:基于关键词匹配(适合精确查找)
- 混合检索:两者结合(推荐,效果最佳)
- 设置 TopK = 3(召回最相关的 3 段文本),相似度阈值 = 0.5
发布后,用户提问时 Dify 会自动检索知识库并将相关段落注入 Prompt,实现基于私有文档的精准问答。
3. 可视化工作流构建
进入 工作室 → 创建应用 → 工作流,使用拖拽画布构建多步骤 AI 流程。
示例:构建一个"客户反馈分类 + 自动回复"工作流
[开始]
↓ 用户输入反馈文本
[LLM 节点 - 情感分析]
提示词:分析以下文本的情感,返回 JSON:{"sentiment": "positive/negative/neutral", "category": "..."}
↓
[条件分支]
├── sentiment == "negative" → [LLM 节点 - 生成道歉回复] → [HTTP 请求 - 发送工单]
└── 其他 → [LLM 节点 - 生成感谢回复]
↓
[结束 - 输出回复文本]
支持的节点类型:
- LLM 节点:调用语言模型,支持自定义 Prompt 模板和变量引用
- 知识检索节点:从知识库检索相关文档
- 代码节点:执行 Python 或 JavaScript 自定义逻辑
- HTTP 请求节点:调用第三方 API(Webhook、REST 接口等)
- 条件分支:根据变量值走不同分支
- 迭代节点:对列表逐项处理
4. 发布为 API 并集成网站
在应用详情页点击 访问 API,获取:
- API 密钥(
Bearer Token) - API 端点(
https://dify.example.com/v1)
Python 流式调用示例:
import requests
API_KEY = "app-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
BASE_URL = "https://dify.example.com/v1"
def chat(question: str, conversation_id: str = "") -> str:
response = requests.post(
f"{BASE_URL}/chat-messages",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
},
json={
"inputs": {},
"query": question,
"response_mode": "streaming",
"conversation_id": conversation_id,
"user": "user-001"
},
stream=True
)
result = ""
for line in response.iter_lines():
if line and line.startswith(b"data: "):
import json
data = json.loads(line[6:])
if data.get("event") == "message":
result += data.get("answer", "")
return result
print(chat("Dify 支持哪些模型提供商?"))
网站嵌入(iframe):
<iframe
src="https://dify.example.com/chatbot/YOUR_APP_TOKEN"
style="width: 100%; height: 700px; border: none; border-radius: 8px;"
allow="microphone">
</iframe>
5. 查看监控与对话日志
在左侧菜单 监控 页面可查看:
- 各应用的调用次数、Token 消耗趋势图
- 完整对话历史(可标注好/差,用于后续 Fine-tuning 数据收集)
- 工作流运行记录(每个节点的输入/输出、耗时、错误信息)
- 按时间范围筛选的费用统计报表
总结
Dify 将繁琐的 LLM 应用开发流程高度封装,让开发者能在几分钟内构建出可用于生产的 AI 应用。可视化工作流降低了 AI 编排的技术门槛,RAG 知识库让私有文档问答触手可及,多模型提供商支持(包括本地 Ollama)让你在成本和能力之间灵活权衡。自托管部署意味着数据完全私有、无供应商锁定,是企业级 AI 应用的理想基础设施。
想要快速上手,推荐选择雨云服务器 rainyun+com 的 4 核 8GB 机型 进行部署,注册填码 2026off 领 5 折券,以极具竞争力的价格获得稳定可靠的云计算资源,让你的 AI 应用平台长期稳定运行。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)