Dify 入门、安装部署及高级技巧
Dify是一个开源的LLM应用开发平台,提供可视化编排、多模型支持、知识库管理等功能。其架构包含用户界面、API网关、核心服务层和数据层。安装方式推荐使用Docker单机部署,最低配置要求4核CPU/8GB内存,需预装Docker和Docker Compose。通过docker-compose.yml配置文件可快速启动服务,包含PostgreSQL、Redis等组件。生产环境建议采用完整配置,优化
·
Dify 入门、安装部署及高级技巧
一、Dify 核心概念与架构
1.1 Dify 是什么?
Dify 是一个开源的 LLM 应用开发平台,旨在让开发者更容易地构建和部署基于大语言模型的应用程序。它提供了可视化的编排界面、多模型支持、知识库、插件系统等能力。
1.2 核心特性
| 特性 | 描述 |
|---|---|
| 可视化编排 | 拖拽式构建复杂 LLM 应用工作流 |
| 多模型支持 | 支持 OpenAI、Claude、本地模型等 |
| 知识库 | RAG 能力,支持多种文档格式 |
| API 接口 | 提供 REST API,方便集成 |
| 插件系统 | 可扩展的自定义工具 |
| 监控分析 | 应用使用情况追踪与分析 |
| 多租户 | 企业级用户管理 |
1.3 系统架构
┌─────────────────────────────────────────┐
│ 用户界面 (Web App) │
├─────────────────────────────────────────┤
│ API Gateway (FastAPI) │
├─────────────────────────────────────────┤
│ 核心服务层 │
│ ├─ 应用编排服务 │
│ ├─ 知识库服务 │
│ ├─ 模型推理服务 │
│ └─ 插件管理服务 │
├─────────────────────────────────────────┤
│ 数据层 │
│ ├─ PostgreSQL (元数据) │
│ ├─ 向量数据库 (知识库索引) │
│ └─ Redis (缓存/队列) │
└─────────────────────────────────────────┘
二、快速安装部署
2.1 系统要求
- 最低配置:4核 CPU,8GB RAM,50GB 存储
- 推荐配置:8核 CPU,16GB RAM,100GB SSD 存储
- 操作系统:Ubuntu 20.04+,CentOS 8+,macOS 12+
- 软件依赖:Docker 20.10+,Docker Compose 2.0+
2.2 Docker 单机部署(推荐)
基础部署
# 创建项目目录
mkdir dify && cd dify
# 下载 docker-compose 文件
curl -o docker-compose.yml https://raw.githubusercontent.com/langgenius/dify/main/docker/docker-compose.yml
# 创建环境变量文件
cat > .env << 'EOF'
# 基础配置
PROJECT_NAME=dify
APP_SECRET_KEY=$(openssl rand -hex 32)
SECRET_KEY=$(openssl rand -hex 32)
# 数据库配置
DB_USERNAME=postgres
DB_PASSWORD=$(openssl rand -hex 16)
DB_DATABASE=dify
DB_HOST=postgres
DB_PORT=5432
# Redis配置
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=$(openssl rand -hex 16)
# 向量数据库配置(可选,默认使用内置向量存储)
VECTOR_STORE=weaviate
WEAVIATE_ENDPOINT=http://weaviate:8080
WEAVIATE_API_KEY=
# 外部访问URL
CONSOLE_API_URL=http://localhost:5001
CONSOLE_WEB_URL=http://localhost:3000
API_BASE_URL=http://localhost:5001
# 邮件配置(用于用户注册/密码重置)
MAIL_TYPE=smtp
MAIL_DEFAULT_SENDER=noreply@yourdomain.com
MAIL_SERVER=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=your-email@gmail.com
MAIL_PASSWORD=your-app-password
MAIL_USE_TLS=true
# 模型配置(可在界面中设置,这里设默认值)
OPENAI_API_KEY=your-openai-api-key
EOF
# 启动服务
docker-compose up -d
访问应用
- Web 控制台: http://localhost:3000
- API 服务: http://localhost:5001
- 初始账号: admin@example.com / difyai123456
2.3 生产环境部署(完整配置)
# docker-compose.production.yml
version: '3.8'
services:
postgres:
image: postgres:15-alpine
container_name: dify-postgres
restart: unless-stopped
environment:
POSTGRES_USER: ${DB_USERNAME:-postgres}
POSTGRES_PASSWORD: ${DB_PASSWORD:-please_change_me}
POSTGRES_DB: ${DB_DATABASE:-dify}
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
command:
- "postgres"
- "-c"
- "max_connections=200"
- "-c"
- "shared_buffers=256MB"
- "-c"
- "work_mem=8MB"
networks:
- dify-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME:-postgres}"]
interval: 30s
timeout: 10s
retries: 3
redis:
image: redis:7-alpine
container_name: dify-redis
restart: unless-stopped
command: redis-server --requirepass ${REDIS_PASSWORD:-please_change_me}
volumes:
- redis_data:/data
networks:
- dify-network
healthcheck:
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD:-please_change_me}", "ping"]
interval: 30s
timeout: 10s
retries: 3
weaviate:
image: semitechnologies/weaviate:1.22.7
container_name: dify-weaviate
restart: unless-stopped
environment:
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
QUERY_DEFAULTS_LIMIT: 25
DEFAULT_VECTORIZER_MODULE: 'none'
CLUSTER_HOSTNAME: 'node1'
volumes:
- weaviate_data:/var/lib/weaviate
networks:
- dify-network
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/v1/.well-known/ready"]
interval: 30s
timeout: 10s
retries: 3
api:
image: langgenius/dify-api:latest
container_name: dify-api
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
weaviate:
condition: service_healthy
environment:
# 应用配置
- MODE=api
- FLASK_ENV=production
- SECRET_KEY=${APP_SECRET_KEY}
- WTF_CSRF_SECRET_KEY=${SECRET_KEY}
# 数据库配置
- DB_USERNAME=${DB_USERNAME}
- DB_PASSWORD=${DB_PASSWORD}
- DB_HOST=postgres
- DB_PORT=5432
- DB_DATABASE=${DB_DATABASE}
- SQLALCHEMY_DATABASE_URI=postgresql://${DB_USERNAME}:${DB_PASSWORD}@postgres:5432/${DB_DATABASE}
- SQLALCHEMY_ENGINE_OPTIONS={"pool_size": 20, "max_overflow": 30, "pool_recycle": 300}
# Redis配置
- REDIS_HOST=redis
- REDIS_PORT=6379
- REDIS_PASSWORD=${REDIS_PASSWORD}
- CELERY_BROKER_URL=redis://:${REDIS_PASSWORD}@redis:6379/0
- CELERY_RESULT_BACKEND=redis://:${REDIS_PASSWORD}@redis:6379/0
# 向量数据库
- VECTOR_STORE=weaviate
- WEAVIATE_ENDPOINT=http://weaviate:8080
- WEAVIATE_API_KEY=${WEAVIATE_API_KEY}
# 外部访问URL
- CONSOLE_API_URL=${CONSOLE_API_URL:-http://localhost:5001}
- CONSOLE_WEB_URL=${CONSOLE_WEB_URL:-http://localhost:3000}
- API_BASE_URL=${API_BASE_URL:-http://localhost:5001}
# 邮件配置
- MAIL_TYPE=${MAIL_TYPE:-smtp}
- MAIL_SERVER=${MAIL_SERVER}
- MAIL_PORT=${MAIL_PORT:-587}
- MAIL_USERNAME=${MAIL_USERNAME}
- MAIL_PASSWORD=${MAIL_PASSWORD}
- MAIL_USE_TLS=${MAIL_USE_TLS:-true}
- MAIL_DEFAULT_SENDER=${MAIL_DEFAULT_SENDER}
# 文件存储(可选S3/MinIO)
- STORAGE_TYPE=local
- STORAGE_LOCAL_PATH=/storage
- UPLOAD_FOLDER=/storage/uploads
# 性能优化
- WORKERS=4
- WORKER_CLASS=uvicorn.workers.UvicornWorker
- LOG_LEVEL=info
volumes:
- api_storage:/storage
- ./logs/api:/app/logs
networks:
- dify-network
expose:
- "5001"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5001/health"]
interval: 30s
timeout: 10s
retries: 3
worker:
image: langgenius/dify-api:latest
container_name: dify-worker
restart: unless-stopped
depends_on:
api:
condition: service_healthy
environment:
- MODE=worker
- FLASK_ENV=production
# ...(共享api服务的环境变量)
command: >
sh -c "celery -A app.celery.celery worker
--loglevel=info
--concurrency=2
--queues=celery,dataset,mail"
volumes:
- worker_storage:/storage
- ./logs/worker:/app/logs
networks:
- dify-network
web:
image: langgenius/dify-web:latest
container_name: dify-web
restart: unless-stopped
environment:
- CONSOLE_API_URL=${CONSOLE_API_URL:-http://localhost:5001}
- APP_API_URL=${API_BASE_URL:-http://localhost:5001}
networks:
- dify-network
ports:
- "3000:3000"
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000"]
interval: 30s
timeout: 10s
retries: 3
nginx:
image: nginx:alpine
container_name: dify-nginx
restart: unless-stopped
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl:ro
ports:
- "80:80"
- "443:443"
depends_on:
- api
- web
networks:
- dify-network
volumes:
postgres_data:
redis_data:
weaviate_data:
api_storage:
worker_storage:
networks:
dify-network:
driver: bridge
2.4 手动安装(开发环境)
# 1. 克隆仓库
git clone https://github.com/langgenius/dify.git
cd dify
# 2. 安装后端依赖
cd api
pip install -r requirements.txt
# 3. 配置环境变量
cp .env.example .env
# 编辑 .env 文件,设置数据库、Redis等
# 4. 初始化数据库
flask db upgrade
# 5. 启动后端服务
# 开发模式
python -m flask run --host=0.0.0.0 --port=5001
# 生产模式
gunicorn -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:5001 app:app
# 6. 启动前端(另一个终端)
cd web
npm install
npm run dev
# 7. 启动Celery worker(另一个终端)
cd api
celery -A app.celery.celery worker --loglevel=info
三、核心功能使用指南
3.1 创建第一个应用
对话型应用
- 登录控制台 → 创建应用 → 选择"对话型应用"
- 配置提示词:在提示词编排界面设计系统提示词
- 添加上下文:可关联知识库或手动添加上下文
- 模型配置:选择 OpenAI GPT-4、Claude 或其他模型
- 测试与发布:在测试窗口调试,完成后发布
文本生成型应用
- 选择"文本生成型应用"
- 设计工作流:通过可视化编排构建复杂流程
- 添加变量:使用 {{variable}} 语法添加动态变量
- 配置模型链:可串联多个模型调用
3.2 知识库管理
# Python SDK 示例:知识库操作
from dify_client import DifyClient
client = DifyClient(api_key="your-api-key", base_url="http://localhost:5001")
# 1. 创建知识库
knowledge_base = client.knowledge_bases.create(
name="产品手册",
description="公司产品使用手册",
embedding_model="text-embedding-ada-002"
)
# 2. 上传文档
document = client.knowledge_bases.upload_document(
knowledge_base_id=knowledge_base.id,
file_path="./产品手册.pdf",
process_rule={
"mode": "automatic",
"rules": {
"chunk_size": 1000,
"chunk_overlap": 200
}
}
)
# 3. 查询知识库
results = client.knowledge_bases.search(
knowledge_base_id=knowledge_base.id,
query="如何安装产品?",
top_k=5,
score_threshold=0.7
)
3.3 工作流编排
基础工作流示例
# 示例工作流配置
workflow:
nodes:
- id: start
type: start
position: {x: 100, y: 100}
- id: knowledge_retrieval
type: knowledge_retrieval
position: {x: 300, y: 100}
data:
knowledge_base_id: "kb_123"
query_template: "{{question}}"
top_k: 3
- id: llm_process
type: llm
position: {x: 500, y: 100}
data:
model: "gpt-4"
prompt: |
基于以下上下文回答问题:
{{knowledge_retrieval.output}}
问题:{{question}}
要求:
1. 答案基于上下文
2. 如果上下文没有相关信息,请说"我不知道"
3. 用中文回答
- id: end
type: end
position: {x: 700, y: 100}
edges:
- source: start
target: knowledge_retrieval
- source: knowledge_retrieval
target: llm_process
- source: llm_process
target: end
四、高级技巧与最佳实践
4.1 性能优化
数据库优化
-- PostgreSQL 优化配置
ALTER SYSTEM SET shared_buffers = '2GB';
ALTER SYSTEM SET effective_cache_size = '6GB';
ALTER SYSTEM SET maintenance_work_mem = '512MB';
ALTER SYSTEM SET work_mem = '16MB';
-- 创建索引
CREATE INDEX idx_messages_conversation_id ON messages(conversation_id);
CREATE INDEX idx_document_segments_document_id ON document_segments(document_id);
CREATE INDEX idx_app_logs_created_at ON app_logs(created_at DESC);
Redis 缓存策略
# 自定义缓存装饰器
from functools import wraps
import json
import hashlib
def cached(timeout=300):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
# 生成缓存键
key_parts = [
func.__name__,
str(args),
str(sorted(kwargs.items()))
]
cache_key = hashlib.md5(
json.dumps(key_parts).encode()
).hexdigest()
# 尝试从Redis获取
cached_result = redis_client.get(cache_key)
if cached_result:
return json.loads(cached_result)
# 执行函数并缓存结果
result = func(*args, **kwargs)
redis_client.setex(
cache_key,
timeout,
json.dumps(result)
)
return result
return wrapper
return decorator
4.2 自定义模型集成
# 自定义模型适配器
from typing import List, Dict, Any
from dify.core.model.base import BaseModel
class CustomLocalModel(BaseModel):
"""自定义本地模型适配器"""
def __init__(self, model_name: str, **kwargs):
super().__init__(model_name, **kwargs)
# 初始化本地模型
from transformers import AutoModelForCausalLM, AutoTokenizer
self.tokenizer = AutoTokenizer.from_pretrained(model_name)
self.model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map="auto",
torch_dtype=torch.float16
)
async def generate(
self,
messages: List[Dict[str, str]],
**kwargs
) -> Dict[str, Any]:
# 构建提示
prompt = self._build_prompt(messages)
# 生成回复
inputs = self.tokenizer(prompt, return_tensors="pt")
outputs = self.model.generate(
**inputs,
max_new_tokens=kwargs.get("max_tokens", 512),
temperature=kwargs.get("temperature", 0.7),
do_sample=True
)
response = self.tokenizer.decode(
outputs[0],
skip_special_tokens=True
)
return {
"choices": [{
"message": {
"content": response,
"role": "assistant"
}
}]
}
def _build_prompt(self, messages: List[Dict]) -> str:
"""将消息列表转换为模型所需的提示格式"""
prompt = ""
for msg in messages:
role = msg["role"]
content = msg["content"]
prompt += f"{role}: {content}\n"
return prompt
# 注册自定义模型
from dify.core.model.registry import ModelRegistry
ModelRegistry.register("custom/local-llama", CustomLocalModel)
4.3 高级提示词技巧
# 结构化提示词模板
prompt_template: |
# 角色定义
你是一位专业的{profession}助手,专门帮助用户解决{domain}领域的问题。
# 任务描述
你的任务是:{task_description}
# 约束条件
你必须遵守以下规则:
1. {rule_1}
2. {rule_2}
3. {rule_3}
# 输出格式
请按照以下格式回答:
## 答案摘要
{summary}
## 详细解释
{explanation}
## 参考来源
{sources}
# 上下文信息
{context}
# 用户问题
问题:{question}
# 思考过程
让我们一步步思考:
4.4 监控与日志
# 自定义监控中间件
from flask import request, g
import time
import logging
from prometheus_client import Counter, Histogram
# 定义指标
REQUEST_COUNT = Counter(
'http_requests_total',
'Total HTTP requests',
['method', 'endpoint', 'status']
)
REQUEST_LATENCY = Histogram(
'http_request_duration_seconds',
'HTTP request latency',
['method', 'endpoint']
)
class MonitoringMiddleware:
def __init__(self, app):
self.app = app
self.app.before_request(self.before_request)
self.app.after_request(self.after_request)
def before_request(self):
g.start_time = time.time()
def after_request(self, response):
if hasattr(g, 'start_time'):
latency = time.time() - g.start_time
REQUEST_LATENCY.labels(
method=request.method,
endpoint=request.endpoint
).observe(latency)
REQUEST_COUNT.labels(
method=request.method,
endpoint=request.endpoint,
status=response.status_code
).inc()
return response
# 结构化日志配置
logging_config = {
'version': 1,
'formatters': {
'json': {
'()': 'pythonjsonlogger.jsonlogger.JsonFormatter',
'format': '''
%(asctime)s %(name)s %(levelname)s
%(module)s %(funcName)s %(lineno)d
%(message)s %(user_id)s %(request_id)s
'''
}
},
'handlers': {
'file': {
'class': 'logging.handlers.RotatingFileHandler',
'formatter': 'json',
'filename': '/var/log/dify/app.log',
'maxBytes': 10485760, # 10MB
'backupCount': 10
},
'console': {
'class': 'logging.StreamHandler',
'formatter': 'json'
}
},
'root': {
'level': 'INFO',
'handlers': ['file', 'console']
}
}
五、企业级部署方案
5.1 高可用架构
# docker-compose.high-availability.yml
version: '3.8'
services:
postgres:
image: bitnami/postgresql:15
container_name: dify-postgres-primary
environment:
- POSTGRESQL_REPLICATION_MODE=master
- POSTGRESQL_REPLICATION_USER=replicator
- POSTGRESQL_REPLICATION_PASSWORD=${PG_REPLICATION_PASSWORD}
- POSTGRESQL_USERNAME=${DB_USERNAME}
- POSTGRESQL_PASSWORD=${DB_PASSWORD}
- POSTGRESQL_DATABASE=${DB_DATABASE}
volumes:
- postgres_primary_data:/bitnami/postgresql
networks:
- dify-network
postgres-replica:
image: bitnami/postgresql:15
container_name: dify-postgres-replica
depends_on:
- postgres
environment:
- POSTGRESQL_REPLICATION_MODE=slave
- POSTGRESQL_REPLICATION_USER=replicator
- POSTGRESQL_REPLICATION_PASSWORD=${PG_REPLICATION_PASSWORD}
- POSTGRESQL_MASTER_HOST=postgres
volumes:
- postgres_replica_data:/bitnami/postgresql
networks:
- dify-network
redis-cluster:
image: bitnami/redis-cluster:7.2
container_name: dify-redis-cluster
environment:
- REDIS_PASSWORD=${REDIS_PASSWORD}
- REDIS_CLUSTER_REPLICAS=1
- REDIS_CLUSTER_CREATOR=yes
volumes:
- redis_cluster_data:/bitnami/redis/data
networks:
- dify-network
api:
image: langgenius/dify-api:latest
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
restart_policy:
condition: on-failure
max_attempts: 3
resources:
limits:
memory: 2G
reservations:
memory: 1G
networks:
- dify-network
worker:
image: langgenius/dify-api:latest
deploy:
replicas: 2
update_config:
parallelism: 1
delay: 10s
command: >
sh -c "celery -A app.celery.celery worker
--loglevel=info
--concurrency=4
--queues=celery,dataset,mail"
networks:
- dify-network
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl:ro
networks:
- dify-network
volumes:
postgres_primary_data:
postgres_replica_data:
redis_cluster_data:
networks:
dify-network:
driver: overlay
5.2 备份与恢复
#!/bin/bash
# backup-dify.sh
set -e
BACKUP_DIR="/backup/dify"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/dify_backup_$DATE.tar.gz"
# 创建备份目录
mkdir -p "$BACKUP_DIR"
echo "🔧 开始备份 Dify..."
# 1. 备份 PostgreSQL
echo "📦 备份数据库..."
docker exec dify-postgres-primary pg_dumpall -U ${DB_USERNAME} \
| gzip > "$BACKUP_DIR/postgres_$DATE.sql.gz"
# 2. 备份 Redis(如果使用持久化)
if docker ps | grep -q redis; then
echo "📦 备份 Redis..."
docker exec dify-redis redis-cli --rdb /data/dump.rdb
docker cp dify-redis:/data/dump.rdb "$BACKUP_DIR/redis_$DATE.rdb"
fi
# 3. 备份向量数据库(Weaviate)
echo "📦 备份 Weaviate..."
docker exec dify-weaviate curl -X GET \
"http://localhost:8080/v1/backups/filesystem/dify_$DATE" \
-H "Content-Type: application/json" \
-d '{"include": "ALL"}'
# 4. 备份配置文件和数据
echo "📦 备份配置文件..."
tar -czf "$BACKUP_FILE" \
docker-compose.yml \
.env \
"$BACKUP_DIR/postgres_$DATE.sql.gz" \
"$BACKUP_DIR/redis_$DATE.rdb" \
/var/lib/dify/storage 2>/dev/null || true
# 5. 上传到云存储(可选)
if [ -n "$AWS_ACCESS_KEY_ID" ]; then
echo "☁️ 上传到 S3..."
aws s3 cp "$BACKUP_FILE" "s3://your-backup-bucket/dify/$DATE.tar.gz"
fi
# 6. 清理旧备份(保留最近30天)
find "$BACKUP_DIR" -name "dify_backup_*.tar.gz" -mtime +30 -delete
echo "✅ 备份完成: $BACKUP_FILE"
5.3 安全配置
# 安全配置示例
security:
# 1. API 认证
api_auth:
enabled: true
rate_limit: 100 # 每分钟请求数
jwt_expiry: 24h # JWT 过期时间
# 2. 网络隔离
network:
internal_only: true # 仅内部网络访问
allowed_cidrs: ["10.0.0.0/8", "172.16.0.0/12"]
# 3. 数据加密
encryption:
at_rest: true # 静态数据加密
in_transit: true # 传输加密
# 4. 审计日志
audit:
enabled: true
retention_days: 90
# 5. 漏洞扫描
vulnerability_scan:
schedule: "0 2 * * *" # 每天2点
六、故障排除
6.1 常见问题
问题1:服务启动失败
# 查看日志
docker-compose logs -f api
docker-compose logs -f postgres
# 常见解决方法
# 1. 端口冲突
sudo lsof -i :5001
# 或修改 docker-compose.yml 中的端口映射
# 2. 内存不足
docker stats # 查看容器资源使用情况
# 3. 权限问题
sudo chmod -R 777 ./storage # 临时解决
问题2:知识库索引失败
# 调试知识库处理
from dify.core.knowledge_base.processor import DocumentProcessor
processor = DocumentProcessor()
result = processor.process_document(
file_path="document.pdf",
chunk_size=1000,
chunk_overlap=200,
debug=True # 启用调试模式
)
print(result.stats) # 查看处理统计
问题3:API 响应慢
# 性能分析
# 1. 数据库查询优化
docker exec dify-postgres psql -U postgres -d dify -c "EXPLAIN ANALYZE SELECT * FROM messages WHERE created_at > NOW() - INTERVAL '1 day';"
# 2. Redis 监控
docker exec dify-redis redis-cli info stats | grep -E "(instantaneous_ops_per_sec|total_connections_received)"
# 3. 启用性能分析
export PYTHONPROFILE=1
docker-compose restart api
6.2 监控仪表板
# grafana-dashboard.yaml
apiVersion: 1
providers:
- name: 'Dify'
orgId: 1
folder: 'Dify'
type: file
disableDeletion: false
editable: true
options:
path: /etc/grafana/provisioning/dashboards
dashboards:
- name: 'Dify 应用监控'
orgId: 1
path: 'dify-monitoring.json'
七、扩展开发
7.1 自定义插件开发
# 自定义工具插件
from dify.core.tools.base import BaseTool
from dify.core.tools.registry import ToolRegistry
class WeatherTool(BaseTool):
"""天气查询工具"""
name = "weather"
description = "查询指定城市的天气信息"
parameters = {
"city": {
"type": "string",
"description": "城市名称",
"required": True
},
"unit": {
"type": "string",
"description": "温度单位 (celsius/fahrenheit)",
"default": "celsius"
}
}
async def execute(self, **kwargs):
city = kwargs.get("city")
unit = kwargs.get("unit", "celsius")
# 调用天气API
import requests
response = requests.get(
f"https://api.weatherapi.com/v1/current.json",
params={
"key": self.config.get("weather_api_key"),
"q": city,
"aqi": "no"
}
)
data = response.json()
temp = data["current"]["temp_c"] if unit == "celsius" else data["current"]["temp_f"]
return {
"temperature": temp,
"condition": data["current"]["condition"]["text"],
"humidity": data["current"]["humidity"],
"wind_speed": data["current"]["wind_kph"]
}
# 注册插件
ToolRegistry.register(WeatherTool)
# 配置插件
plugin_config = {
"weather_api_key": "your-api-key",
"cache_ttl": 300 # 缓存5分钟
}
7.2 API 客户端开发
# 高级 API 客户端
import asyncio
from typing import Dict, List, Optional
import aiohttp
class DifyAsyncClient:
def __init__(self, api_key: str, base_url: str = "http://localhost:5001"):
self.api_key = api_key
self.base_url = base_url
self.session = None
async def __aenter__(self):
self.session = aiohttp.ClientSession(
headers={
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
)
return self
async def __aexit__(self, exc_type, exc_val, exc_tb):
await self.session.close()
async def chat_completion(
self,
app_id: str,
query: str,
stream: bool = False,
**kwargs
):
"""流式对话接口"""
url = f"{self.base_url}/v1/chat-messages"
payload = {
"inputs": {},
"query": query,
"response_mode": "streaming" if stream else "blocking",
"conversation_id": kwargs.get("conversation_id"),
"user": kwargs.get("user", "anonymous"),
"files": kwargs.get("files", [])
}
async with self.session.post(url, json=payload) as response:
if stream:
async for line in response.content:
if line:
yield line.decode('utf-8')
else:
return await response.json()
async def batch_process(
self,
app_id: str,
queries: List[str],
max_concurrent: int = 5
):
"""批量处理"""
semaphore = asyncio.Semaphore(max_concurrent)
async def process_one(query):
async with semaphore:
return await self.chat_completion(app_id, query)
tasks = [process_one(q) for q in queries]
return await asyncio.gather(*tasks, return_exceptions=True)
# 使用示例
async def main():
async with DifyAsyncClient(api_key="your-api-key") as client:
# 流式响应
async for chunk in client.chat_completion(
app_id="your-app-id",
query="你好,介绍一下Dify",
stream=True
):
print(chunk, end="", flush=True)
# 批量处理
results = await client.batch_process(
app_id="your-app-id",
queries=["问题1", "问题2", "问题3"],
max_concurrent=3
)
asyncio.run(main())
总结
通过本指南,您应该已经掌握了:
- Dify 的核心概念和架构
- 多种部署方式(从开发到生产环境)
- 核心功能的使用方法(应用创建、知识库、工作流)
- 高级技巧(性能优化、自定义模型、监控等)
- 企业级部署方案(高可用、备份恢复、安全配置)
- 故障排除和扩展开发
Dify 作为一个功能强大的 LLM 应用开发平台,适合从个人项目到企业级应用的各种场景。随着不断实践和探索,您将能够构建出更复杂、更智能的 AI 应用。
关键建议:
- 从简单的用例开始,逐步增加复杂度
- 重视监控和日志,建立完善的运维体系
- 根据业务需求选择合适的部署架构
- 积极参与社区,分享经验和获取帮助
祝您在 Dify 上构建出卓越的 AI 应用!
更多推荐
所有评论(0)