简介
Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等,让您可以快速从原型到生产。以下是其核心功能列表:
1. 工作流: 在画布上构建和测试功能强大的 AI 工作流程,利用以下所有功能以及更多功能。
2. 全面的模型支持: 与数百种专有/开源 LLMs 以及数十种推理提供商和自托管解决方案无缝集成,涵盖 GPT、Mistral、Llama3 以及任何与 OpenAI API 兼容的模型。完整的支持模型提供商列表可在此处找到。
3. Prompt IDE: 用于制作提示、比较模型性能以及向基于聊天的应用程序添加其他功能(如文本转语音)的直观界面。
4. RAG Pipeline: 广泛的 RAG 功能,涵盖从文档摄入到检索的所有内容,支持从 PDF、PPT 和其他常见文档格式中提取文本的开箱即用的支持。
5. Agent 智能体: 您可以基于 LLM 函数调用或 ReAct 定义 Agent,并为 Agent 添加预构建或自定义工具。Dify 为 AI Agent 提供了50多种内置工具,如谷歌搜索、DELL·E、Stable Diffusion 和 WolframAlpha 等。
6. LLMOps: 随时间监视和分析应用程序日志和性能。您可以根据生产数据和标注持续改进提示、数据集和模型。
7. 后端即服务: 所有 Dify 的功能都带有相应的 API,因此您可以轻松地将 Dify 集成到自己的业务逻辑中。
Dify 架构图如下:
功能比较
功能 | LangChain | Flowise | OpenAI Assistant API | |
---|---|---|---|---|
编程方法 | API + 应用程序导向 | Python 代码 | 应用程序导向 | API 导向 |
支持的 LLMs | 丰富多样 | 丰富多样 | 丰富多样 | 仅限 OpenAI |
RAG引擎 | ✅ | ✅ | ✅ | ✅ |
Agent | ✅ | ✅ | ❌ | ✅ |
工作流 | ✅ | ❌ | ✅ | ❌ |
可观测性 | ✅ | ✅ | ❌ | ❌ |
企业功能(SSO/访问控制) | ✅ | ❌ | ❌ | ❌ |
本地部署 | ✅ | ✅ | ✅ | ❌ |
参照官网文档部署
https://github.com/langgenius/dify
先创建必须的文件和路径
mkdir -pv /data/dify/nginx/conf.d mkdir -pv /data/dify/volumes/ssrf_proxy cat > /data/dify/nginx/nginx.conf << EOF user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; #gzip on; client_max_body_size 15M; include /etc/nginx/conf.d/*.conf; } EOF cat > /data/dify/nginx/proxy.conf << EOF proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_buffering off; proxy_read_timeout 3600s; proxy_send_timeout 3600s; EOF cat /data/dify/nginx/conf.d/default.conf << EOF server { listen 80; server_name _; location /console/api { proxy_pass http://api:5001; include proxy.conf; } location /api { proxy_pass http://api:5001; include proxy.conf; } location /v1 { proxy_pass http://api:5001; include proxy.conf; } location /files { proxy_pass http://api:5001; include proxy.conf; } location / { proxy_pass http://web:3000; include proxy.conf; } # If you want to support HTTPS, please uncomment the code snippet below #listen 443 ssl; #ssl_certificate ./../ssl/your_cert_file.cer; #ssl_certificate_key ./../ssl/your_cert_key.key; #ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #ssl_prefer_server_ciphers on; #ssl_session_cache shared:SSL:10m; #ssl_session_timeout 10m; } EOF cat /data/dify/volumes/ssrf_proxy/squid.conf << EOF acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 "this" network (LAN) acl localnet src 10.0.0.0/8 # RFC 1918 local private network (LAN) acl localnet src 100.64.0.0/10 # RFC 6598 shared address space (CGN) acl localnet src 169.254.0.0/16 # RFC 3927 link-local (directly plugged) machines acl localnet src 172.16.0.0/12 # RFC 1918 local private network (LAN) acl localnet src 192.168.0.0/16 # RFC 1918 local private network (LAN) acl localnet src fc00::/7 # RFC 4193 local private network range acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines acl SSL_ports port 443 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localhost manager http_access deny manager http_access allow localhost include /etc/squid/conf.d/*.conf http_access deny all ################################## Proxy Server ################################ http_port 3128 coredump_dir /var/spool/squid refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern \/(Packages|Sources)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims refresh_pattern \/Release(|\.gpg)$ 0 0% 0 refresh-ims refresh_pattern \/InRelease$ 0 0% 0 refresh-ims refresh_pattern \/(Translation-.*)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims refresh_pattern . 0 20% 4320 # upstream proxy, set to your own upstream proxy IP to avoid SSRF attacks # cache_peer 172.1.1.1 parent 3128 0 no-query no-digest no-netdb-exchange default ################################## Reverse Proxy To Sandbox ################################ http_port 8194 accel vhost cache_peer sandbox parent 8194 0 no-query originserver acl src_all src all http_access allow src_all EOF
dify-compose.yml
version: '3' services: api: image: langgenius/dify-api:0.6.11 restart: always environment: MODE: api LOG_LEVEL: INFO SECRET_KEY: sk-9f73s3ljTXVcMT3Blb3ljTqtsKiGHXVcMT3BlbkFJLK7U CONSOLE_WEB_URL: '' INIT_PASSWORD: '' CONSOLE_API_URL: '' SERVICE_API_URL: '' APP_WEB_URL: '' FILES_URL: '' FILES_ACCESS_TIMEOUT: 300 MIGRATION_ENABLED: 'true' DB_USERNAME: postgres DB_PASSWORD: difyai123456 DB_HOST: db DB_PORT: 5432 DB_DATABASE: dify REDIS_HOST: redis REDIS_PORT: 6379 REDIS_USERNAME: '' REDIS_PASSWORD: difyai123456 REDIS_USE_SSL: 'false' REDIS_DB: 0 CELERY_BROKER_URL: redis://:difyai123456@redis:6379/1 WEB_API_CORS_ALLOW_ORIGINS: '*' CONSOLE_CORS_ALLOW_ORIGINS: '*' STORAGE_TYPE: local STORAGE_LOCAL_PATH: storage S3_USE_AWS_MANAGED_IAM: 'false' S3_ENDPOINT: 'https://xxx.r2.cloudflarestorage.com' S3_BUCKET_NAME: 'difyai' S3_ACCESS_KEY: 'ak-difyai' S3_SECRET_KEY: 'sk-difyai' S3_REGION: 'us-east-1' AZURE_BLOB_ACCOUNT_NAME: 'difyai' AZURE_BLOB_ACCOUNT_KEY: 'difyai' AZURE_BLOB_CONTAINER_NAME: 'difyai-container' AZURE_BLOB_ACCOUNT_URL: 'https://<your_account_name>.blob.core.windows.net' GOOGLE_STORAGE_BUCKET_NAME: 'yout-bucket-name' GOOGLE_STORAGE_SERVICE_ACCOUNT_JSON_BASE64: 'your-google-service-account-json-base64-string' TENCENT_COS_BUCKET_NAME: 'your-bucket-name' TENCENT_COS_SECRET_KEY: 'your-secret-key' TENCENT_COS_SECRET_ID: 'your-secret-id' TENCENT_COS_REGION: 'your-region' TENCENT_COS_SCHEME: 'your-scheme' VECTOR_STORE: weaviate WEAVIATE_ENDPOINT: http://weaviate:8080 WEAVIATE_API_KEY: WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih QDRANT_URL: http://qdrant:6333 QDRANT_API_KEY: difyai123456 QDRANT_CLIENT_TIMEOUT: 20 QDRANT_GRPC_ENABLED: 'false' QDRANT_GRPC_PORT: 6334 MILVUS_HOST: 127.0.0.1 MILVUS_PORT: 19530 MILVUS_USER: root MILVUS_PASSWORD: Milvus MILVUS_SECURE: 'false' RELYT_HOST: db RELYT_PORT: 5432 RELYT_USER: postgres RELYT_PASSWORD: difyai123456 RELYT_DATABASE: postgres PGVECTOR_HOST: pgvector PGVECTOR_PORT: 5432 PGVECTOR_USER: postgres PGVECTOR_PASSWORD: difyai123456 PGVECTOR_DATABASE: dify TIDB_VECTOR_HOST: tidb TIDB_VECTOR_PORT: 4000 TIDB_VECTOR_USER: xxx.root TIDB_VECTOR_PASSWORD: xxxxxx TIDB_VECTOR_DATABASE: dify CHROMA_HOST: 127.0.0.1 CHROMA_PORT: 8000 CHROMA_TENANT: default_tenant CHROMA_DATABASE: default_database CHROMA_AUTH_PROVIDER: chromadb.auth.token_authn.TokenAuthClientProvider CHROMA_AUTH_CREDENTIALS: xxxxxx MAIL_TYPE: '' MAIL_DEFAULT_SEND_FROM: 'YOUR EMAIL FROM (eg: no-reply <no-reply@dify.ai>)' SMTP_SERVER: '' SMTP_PORT: 465 SMTP_USERNAME: '' SMTP_PASSWORD: '' SMTP_USE_TLS: 'true' SMTP_OPPORTUNISTIC_TLS: 'false' RESEND_API_KEY: '' RESEND_API_URL: https://api.resend.com SENTRY_DSN: '' SENTRY_TRACES_SAMPLE_RATE: 1.0 SENTRY_PROFILES_SAMPLE_RATE: 1.0 NOTION_INTEGRATION_TYPE: public NOTION_CLIENT_SECRET: you-client-secret NOTION_CLIENT_ID: you-client-id NOTION_INTERNAL_SECRET: you-internal-secret CODE_EXECUTION_ENDPOINT: "http://sandbox:8194" CODE_EXECUTION_API_KEY: dify-sandbox CODE_MAX_NUMBER: 9223372036854775807 CODE_MIN_NUMBER: -9223372036854775808 CODE_MAX_STRING_LENGTH: 80000 TEMPLATE_TRANSFORM_MAX_LENGTH: 80000 CODE_MAX_STRING_ARRAY_LENGTH: 30 CODE_MAX_OBJECT_ARRAY_LENGTH: 30 CODE_MAX_NUMBER_ARRAY_LENGTH: 1000 SSRF_PROXY_HTTP_URL: 'http://ssrf_proxy:3128' SSRF_PROXY_HTTPS_URL: 'http://ssrf_proxy:3128' INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH: 1000 depends_on: - db - redis volumes: - ./volumes/app/storage:/app/api/storage networks: - ssrf_proxy_network - default worker: image: langgenius/dify-api:0.6.11 restart: always environment: CONSOLE_WEB_URL: '' MODE: worker LOG_LEVEL: INFO SECRET_KEY: sk-9f73s3ljTXVcMT3Blb3ljTqtsKiGHXVcMT3BlbkFJLK7U DB_USERNAME: postgres DB_PASSWORD: difyai123456 DB_HOST: db DB_PORT: 5432 DB_DATABASE: dify REDIS_HOST: redis REDIS_PORT: 6379 REDIS_USERNAME: '' REDIS_PASSWORD: difyai123456 REDIS_DB: 0 REDIS_USE_SSL: 'false' CELERY_BROKER_URL: redis://:difyai123456@redis:6379/1 STORAGE_TYPE: local STORAGE_LOCAL_PATH: storage S3_USE_AWS_MANAGED_IAM: 'false' S3_ENDPOINT: 'https://xxx.r2.cloudflarestorage.com' S3_BUCKET_NAME: 'difyai' S3_ACCESS_KEY: 'ak-difyai' S3_SECRET_KEY: 'sk-difyai' S3_REGION: 'us-east-1' AZURE_BLOB_ACCOUNT_NAME: 'difyai' AZURE_BLOB_ACCOUNT_KEY: 'difyai' AZURE_BLOB_CONTAINER_NAME: 'difyai-container' AZURE_BLOB_ACCOUNT_URL: 'https://<your_account_name>.blob.core.windows.net' GOOGLE_STORAGE_BUCKET_NAME: 'yout-bucket-name' GOOGLE_STORAGE_SERVICE_ACCOUNT_JSON_BASE64: 'your-google-service-account-json-base64-string' TENCENT_COS_BUCKET_NAME: 'your-bucket-name' TENCENT_COS_SECRET_KEY: 'your-secret-key' TENCENT_COS_SECRET_ID: 'your-secret-id' TENCENT_COS_REGION: 'your-region' TENCENT_COS_SCHEME: 'your-scheme' VECTOR_STORE: weaviate WEAVIATE_ENDPOINT: http://weaviate:8080 WEAVIATE_API_KEY: WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih QDRANT_URL: http://qdrant:6333 QDRANT_API_KEY: difyai123456 QDRANT_CLIENT_TIMEOUT: 20 QDRANT_GRPC_ENABLED: 'false' QDRANT_GRPC_PORT: 6334 MILVUS_HOST: 127.0.0.1 MILVUS_PORT: 19530 MILVUS_USER: root MILVUS_PASSWORD: Milvus MILVUS_SECURE: 'false' MAIL_TYPE: '' MAIL_DEFAULT_SEND_FROM: 'YOUR EMAIL FROM (eg: no-reply <no-reply@dify.ai>)' SMTP_SERVER: '' SMTP_PORT: 465 SMTP_USERNAME: '' SMTP_PASSWORD: '' SMTP_USE_TLS: 'true' SMTP_OPPORTUNISTIC_TLS: 'false' RESEND_API_KEY: '' RESEND_API_URL: https://api.resend.com RELYT_HOST: db RELYT_PORT: 5432 RELYT_USER: postgres RELYT_PASSWORD: difyai123456 RELYT_DATABASE: postgres TENCENT_VECTOR_DB_URL: http://127.0.0.1 TENCENT_VECTOR_DB_API_KEY: dify TENCENT_VECTOR_DB_TIMEOUT: 30 TENCENT_VECTOR_DB_USERNAME: dify TENCENT_VECTOR_DB_DATABASE: dify TENCENT_VECTOR_DB_SHARD: 1 TENCENT_VECTOR_DB_REPLICAS: 2 PGVECTOR_HOST: pgvector PGVECTOR_PORT: 5432 PGVECTOR_USER: postgres PGVECTOR_PASSWORD: difyai123456 PGVECTOR_DATABASE: dify TIDB_VECTOR_HOST: tidb TIDB_VECTOR_PORT: 4000 TIDB_VECTOR_USER: xxx.root TIDB_VECTOR_PASSWORD: xxxxxx TIDB_VECTOR_DATABASE: dify CHROMA_HOST: 127.0.0.1 CHROMA_PORT: 8000 CHROMA_TENANT: default_tenant CHROMA_DATABASE: default_database CHROMA_AUTH_PROVIDER: chromadb.auth.token_authn.TokenAuthClientProvider CHROMA_AUTH_CREDENTIALS: xxxxxx NOTION_INTEGRATION_TYPE: public NOTION_CLIENT_SECRET: you-client-secret NOTION_CLIENT_ID: you-client-id NOTION_INTERNAL_SECRET: you-internal-secret INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH: 1000 depends_on: - db - redis volumes: - ./volumes/app/storage:/app/api/storage networks: - ssrf_proxy_network - default web: image: langgenius/dify-web:0.6.11 restart: always environment: CONSOLE_API_URL: '' APP_API_URL: '' SENTRY_DSN: '' db: image: postgres:15-alpine restart: always environment: PGUSER: postgres POSTGRES_PASSWORD: difyai123456 POSTGRES_DB: dify PGDATA: /var/lib/postgresql/data/pgdata volumes: - ./volumes/db/data:/var/lib/postgresql/data healthcheck: test: [ "CMD", "pg_isready" ] interval: 1s timeout: 3s retries: 30 redis: image: redis:6-alpine restart: always volumes: - ./volumes/redis/data:/data command: redis-server --requirepass difyai123456 healthcheck: test: [ "CMD", "redis-cli", "ping" ] weaviate: image: semitechnologies/weaviate:1.19.0 restart: always volumes: - ./volumes/weaviate:/var/lib/weaviate environment: QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' DEFAULT_VECTORIZER_MODULE: 'none' CLUSTER_HOSTNAME: 'node1' AUTHENTICATION_APIKEY_ENABLED: 'true' AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih' AUTHENTICATION_APIKEY_USERS: 'hello@dify.ai' AUTHORIZATION_ADMINLIST_ENABLED: 'true' AUTHORIZATION_ADMINLIST_USERS: 'hello@dify.ai' sandbox: image: langgenius/dify-sandbox:0.2.1 restart: always environment: API_KEY: dify-sandbox GIN_MODE: 'release' WORKER_TIMEOUT: 15 ENABLE_NETWORK: 'true' HTTP_PROXY: 'http://ssrf_proxy:3128' HTTPS_PROXY: 'http://ssrf_proxy:3128' SANDBOX_PORT: 8194 volumes: - ./volumes/sandbox/dependencies:/dependencies networks: - ssrf_proxy_network ssrf_proxy: image: ubuntu/squid:latest restart: always volumes: - ./volumes/ssrf_proxy/squid.conf:/etc/squid/squid.conf networks: - ssrf_proxy_network - default nginx: image: nginx:latest restart: always volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/proxy.conf:/etc/nginx/proxy.conf - ./nginx/conf.d:/etc/nginx/conf.d depends_on: - api - web ports: - "80:80" networks: ssrf_proxy_network: driver: bridge internal: true
添加评论