**生成式 AI 和[大语言模型](https://aws.amazon.com/cn/what-is/large-language-model/?trk=cndc-detail)(LLM)不仅大大提升了个人的信息获取和工作效率,也正在重塑企业应用**。很多企业正在探索基于 LLM、RAG 和 Agent 的生成式 AI 应用,通过与私域数据和现有的应用结合,来打造更创新、更具价值和更个性化的用户体验。
### **Dify 架构及核心组件**
Dify 是一款开源 LLM 应用开发平台,提供了三种使用模式:商业化版本 Dify Cloud(SaaS 模式),自建 Dify 社区版(免费),自建企业版。**本文主要介绍如何基于 [Amazon EKS](https://aws.amazon.com/cn/eks/?trk=cndc-detail) 自建高可用 Dify 社区版。**
下图为基于 [Amazon EKS](https://aws.amazon.com/cn/eks/?trk=cndc-detail) 部署 Dify 的架构。
![image.png](https://dev-media.amazoncloud.cn/db10ccc1e1004de6997074b6a79cc023_image.png "image.png")
Dify 基于 [Amazon EKS](https://aws.amazon.com/cn/eks/?trk=cndc-detail) 的架构图
Dify 包括3个业务服务组件 api/worker/web(Frontend),除此之外,还有6个基础组件 vector db/db/redis/nginx/ssrf_proxy/sandbox。为了实现生产级高可用性,我们使用多个亚马逊云科技托管服务用作基础组件,包括 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail)、[Amazon ElastiCache](https://aws.amazon.com/cn/elasticache/?trk=cndc-detail) for Redis、[Amazon Aurora](https://aws.amazon.com/cn/rds/aurora/?trk=cndc-detail) PostgreSQL、ALB 等。Dify 支持多种向量数据库产品,包括 OpenSearch、Zilliz/Milvus、Qrdrant、Weaviate 等,**本文使用部署在 [Amazon EKS](https://aws.amazon.com/cn/eks/?trk=cndc-detail) 中的 Milvus。**
#### **一、前置条件**
Dify 有几个关键组件需要提前部署,包括:
* **[Amazon EKS](https://aws.amazon.com/cn/eks/?trk=cndc-detail) 和 Milvus**,可参考**链接1。**
* **[Amazon Aurora](https://aws.amazon.com/cn/rds/aurora/?trk=cndc-detail) PostgreSQL**,可以使用 Serverless 版,具体请参考**链接2。**
* **[Amazon ElastiCache](https://aws.amazon.com/cn/elasticache/?trk=cndc-detail) for Redis**,可以使用 Serverless 版,具体请参考**链接3。**
本方案中的所有组件都支持使用 Amazon Graviton3 芯片的 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)实例,在部署时选择 Amazon Graviton3 实例可以获得更高的性价比。在**基于 Amazon Graviton3 的 Milvus** 博客中,测试结果显示 Amazon Graviton3 可以实现**高达 31%** 的性价比提升。
> **链接1**
>
> https\://aws.amazon.com/cn/blogs/china/build-open-source-vector-database-milvus-based-on-amazon-eks/?trk=cndc-detail
>
> **链接2**
>
> https\://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html?trk=cndc-detail
>
> **链接3**
>
> https\://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/GettingStarted.html?trk=cndc-detail
>
> **基于 Amazon Graviton3 的 Milvus**
>
> https\://aws.amazon.com/cn/blogs/china/milvus-achieves-up-to-31-price-performance-improvement-using-amazon-graviton3-instances/?trk=cndc-detail
#### **二、Dify 基于 Amazon EKS 部署步骤**
Dify 官方支持 Docker Composer,以及源码部署的方式,具体参考下方链接。但是这两种方式未能照顾到高可用环境,更多是用于开发和测试环境的快速部署。
> https\://docs.dify.ai/v/zh-hans/getting-started/install-self-hosted?trk=cndc-detail
作为生产高可用环境,推荐以 Helm Charts 的方式部署在 [Amazon EKS](https://aws.amazon.com/cn/eks/?trk=cndc-detail) 上。本文使用该 Chart 进行部署,具体参考下方链接。
> https\://github.com/douban/charts/tree/master/charts/dify\?trk=cndc-detail
**在部署的时候需要做一些调整**,比如使用 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail) 替代 minio 用作对象存储,使用 Amazon Application Load Balancer 用作 [Amazon EKS](https://aws.amazon.com/cn/eks/?trk=cndc-detail) Ingress,使用 [Amazon Aurora](https://aws.amazon.com/cn/rds/aurora/?trk=cndc-detail) PostgreSQL 替代内置 PostgreSQL 等,使用 [Amazon ElastiCache](https://aws.amazon.com/cn/elasticache/?trk=cndc-detail) for Redis 代替内置 Redis。
部署中要使用到 Amazon AK/SK、数据库的账号密码等敏感信息,**我们使用 K8s Secret 进行存储,并推荐使用 Amazon KMS 进行加密**,具体参考以下链接。
> https\://docs.aws.amazon.com/eks/latest/userguide/enable-kms.html\?trk=cndc-detail
**请注意,进行以下步骤前,请确保已经完成前置条件。**
1.安装 Helm,具体参考下方链接;
> https\://helm.sh/docs/intro/install/\?trk=cndc-detail
2.添加 Helm repo。
```
helm repo add douban https://douban.github.io/charts/
helm update
```
3.确保 kubectl 可以连接到您的 [Amazon EKS](https://aws.amazon.com/cn/eks/?trk=cndc-detail) 集群。使用如下命令创建 Secret 对象,用于存储 Amazon AK/SK 及 PostgreSQL、Milvus 和 Redis 的密码。这些密码需要转换为 base64 编码,可以使用 echo -n "\<password>" | base64 命令快速获取 base64 编码。SECRET_KEY 是 Dify 用来安全地签名会话 cookie 并加密数据库中的敏感信息的密钥,可以使用 openssl rand -base64 42 命令生成强密钥。MILVUS_PASSWORD 可以在 Milvus 向量数据库中进行设置,默认为 Milvus。[Amazon ElastiCache](https://aws.amazon.com/cn/elasticache/?trk=cndc-detail) for Redis 除了用作缓存,也被用作 Celery 的消息队列,CELERY_BROKER_URL 就是用来配置 Celery 的 Broker,格式为 redis\://\<redis_username>:\<redis_password>@\<redis_host>:\<redis_port>/\<redis_database> 因为这个 URL 中涉及到 Redis 的密码,所以我们将其放在 Secret 中。
```
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: dify
type: Opaque
data:
SECRET_KEY: <Replace your SECRET KEY here>
S3_ACCESS_KEY: <Replace your S3 ACCESS KEY here>
S3_SECRET_KEY: <Replace your S3 SECRET KEY here>
DB_PASSWORD: <Replace your PostgreSQL PASSWORD here>
MILVUS_PASSWORD: <Replace your MILVUS PASSWORD here>
REDIS_PASSWORD: <Replace your REDIS PASSWORD here>
CELERY_BROKER_URL: <Replace your CELERY BROKER URL here>
EOF
```
4.创建 values.yaml。需要替换<>中的内容,包括 host、image tag、vector store、MILVUS_HOST、S3\_ENDPOINT、S3\_REGION、S3\_BUCKET_NAME、DB_USERNAME、DB_HOST、REDIS_HOST 和 ingress 等。我们禁用了 Dify 自带的对象存储 minio、Redis 和 PostgreSQL,使用 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail)、[Amazon ElastiCache](https://aws.amazon.com/cn/elasticache/?trk=cndc-detail) for Redis 和 [Amazon Aurora](https://aws.amazon.com/cn/rds/aurora/?trk=cndc-detail) 替代。
* host:ALB 对应的自定义域名,建议开启 TLS,host 需要保持和 DNS 提供商注册的自定义域名一致。
* image tag:具体查看下方链接,建议选择新版本的 Dify。
> https\://github.com/langgenius/dify/releases\?trk=cndc-detail
* vector store 和 MILVUS_HOST:向量数据库配置。可选的配置有如下选项,本次案例使用的是 Milvus。
1. weaviate;
1. qdrant;
1. milvus;
1. zilliz,与 milvus 一致;
1. OpenSearch;
1. tidb_vector。
* S3\_ENDPOINT、S3\_REGION 和 S3\_BUCKET_NAME:修改为您自己的 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail) Endpoint、Region、Bucket name。
* DB_HOST、DB_USERNAME 和 DB_DATABASE:修改为您自己的 PostgreSQL 数据库的信息,本例子中使用的是 Aurora PostgreSQL。
* REDIS_HOST 和 REDIS_USERNAME:修改为您自己的 [Amazon ElastiCache](https://aws.amazon.com/cn/elasticache/?trk=cndc-detail) for Redis 的信息,建议开启密码认证,同时设置 REDIS_USE_SSL 为 true。
* ingress:您的 [Amazon EKS](https://aws.amazon.com/cn/eks/?trk=cndc-detail) 的 Ingress 配置,使用 Amazon Load Balancer Controller 来创建 Ingress。强烈建议开启 HTTPS,并进行对应的设置,详见下方链接。开启 HTTPS 同时需要设置 enableTLS 为 true,并将 alb.ingress.kubernetes.io/certificate-arn 替换为域名的 ACM 证书 ARN。请确保您的 [Amazon EKS](https://aws.amazon.com/cn/eks/?trk=cndc-detail) Ingress 是正常工作的。
```
global:
host: "<your domain name>"
enableTLS: true
image:
# Set to the latest version of dify
# Check the version here: https://github.com/langgenius/dify/releases
# If not set, Using the default value in Chart.yaml
tag: "0.7.2"
extraBackendEnvs:
# The log output level. Default is INFO. For production environments, it's recommended to set this to ERROR
- name: LOG_LEVEL
value: "ERROR"
- name: SECRET_KEY
valueFrom:
secretKeyRef:
name: dify
key: SECRET_KEY
# milvus
- name: VECTOR_STORE
value: "milvus"
- name: MILVUS_HOST
value: "<your Milvus endpoint>"
- name: MILVUS_PORT
value: "19530"
- name: MILVUS_USER
value: "root"
- name: MILVUS_PASSWORD
valueFrom:
secretKeyRef:
name: dify
key: MILVUS_PASSWORD
- name: MILVUS_SECURE
value: "false"
# External S3 bucket
- name: S3_ENDPOINT
value: "https://s3.<your region code>.amazonaws.com"
- name: S3_REGION
value: "<your region code>"
- name: S3_BUCKET_NAME
value: "<your bucket name>"
- name: S3_ACCESS_KEY
valueFrom:
secretKeyRef:
name: dify
key: S3_ACCESS_KEY
- name: S3_SECRET_KEY
valueFrom:
secretKeyRef:
name: dify
key: S3_SECRET_KEY
# External postgresql
- name: DB_USERNAME
value: "<your postgres username>"
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: dify
key: DB_PASSWORD
- name: DB_HOST
value: "<your postgres endpoint>"
- name: DB_PORT
value: "5432"
- name: DB_DATABASE
value: "<your postgres database>"
# External Redis
- name: REDIS_HOST
value: "<your redis endpoint>"
- name: REDIS_PORT
value: "6379"
- name: REDIS_DB
value: "0"
- name: REDIS_USE_SSL
value: "true"
- name: REDIS_USERNAME
value: "<your redis username>"
# it is adviced to use secret to manage you sensitive info including password
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: dify
key: REDIS_PASSWORD
# CELERY_BROKER_URL, format: "redis://<redis_username>:<redis_password>@<redis_host>:<redis_port>/<redis_database>"
- name: CELERY_BROKER_URL
valueFrom:
secretKeyRef:
name: dify
key: CELERY_BROKER_URL
- name: BROKER_USE_SSL
value: "true"
ingress:
enabled: true
className: "alb"
annotations:
kubernetes.io/ingress.class: "alb" # Annotation: set ALB ingress type
alb.ingress.kubernetes.io/scheme: "internet-facing" #Places the load balancer on public subnets
alb.ingress.kubernetes.io/target-type: "ip" #The Pod IPs should be used as the target IPs (rather than the node IPs)
alb.ingress.kubernetes.io/certificate-arn: "<your domain URL certificate ARN>"
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
alb.ingress.kubernetes.io/ssl-redirect: '443'
minio:
embedded: false
postgresql:
embedded: false
redis:
embedded: false
```
> https\://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html?trk=cndc-detail
1.执行如下命令进行安装。
```
helm install dify douban/dify -f values.yaml
```
2.Dify 的核心服务如 api、worker、frontend、sandbox 默认配置为一个副本,为了提高高可性,需要增加副本数量。使用以下配置创建 new_values.yaml,并运行 helm upgrade dify douban/dify -- reuse-values -f new_values.yaml 命令进行更新。
```
frontend:
replicaCount: 2
api:
replicaCount: 2
worker:
replicaCount: 2
sandbox:
replicaCount: 2
```
3.验证安装。使用 kubectl get ingress 命令获取 Endpoint,如果能正确获取,浏览器打开 HOSTS 即可访问。
```
NAME CLASS HOSTS ADDRESS PORTS AGE
dify alb dify.yourcompany.com dify-xxxx.us-west-2.elb.amazonaws.com 80, 443 10d
```
### **总结**
**本文基于 [Amazon EKS](https://aws.amazon.com/cn/eks/?trk=cndc-detail),自建部署了 Dify 社区版**,使用 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail)、[Amazon Aurora](https://aws.amazon.com/cn/rds/aurora/?trk=cndc-detail) Postgre SQL、[Amazon ElastiCache](https://aws.amazon.com/cn/elasticache/?trk=cndc-detail) for Redis 等替代了 Dify 内置对象存储、PostgreSQL 和 Redis,**并且增加了 Dify 核心服务的副本数量,实现了生产级别高可用。**
关于 Dify 的使用,请参考亚马逊云科技博客。感兴趣的读者快亲自动手尝试吧!
> **亚马逊云科技博客**
>
> https\://aws.amazon.com/cn/blogs/china/get-started-with-generative-ai-by-integrating-bedrock-claude3-with-dify/?trk=cndc-detail
#### **参考资料**
1.Dify:
https\://docs.dify.ai/?trk=cndc-detail
2.基于 [Amazon EKS](https://aws.amazon.com/cn/eks/?trk=cndc-detail) 的 Milvus
https\://aws.amazon.com/cn/blogs/china/build-open-source-vector-database-milvus-based-on-amazon-eks/?trk=cndc-detail
3.[Amazon Aurora](https://aws.amazon.com/cn/rds/aurora/?trk=cndc-detail) PostgreSQL:
https\://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html?trk=cndc-detail
4.Dify 与 [Amazon Bedrock](https://aws.amazon.com/cn/bedrock/?trk=cndc-detail) 中的大语言模型集成:
https\://aws.amazon.com/cn/blogs/china/get-started-with-generative-ai-by-integrating-bedrock-claude3-with-dify/?trk=cndc-detail
> **生成式 AI**:前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。
![image.png](https://dev-media.amazoncloud.cn/050ad0bb91594206a566b28d4764268c_image.png "image.png")
![image.png](https://dev-media.amazoncloud.cn/9096d9326c7b4e0aa9d3fec2e5826fe9_image.png "image.png")
![image.png](https://dev-media.amazoncloud.cn/2d10c5f5fc5b4004ab52606635de4a47_image.png "image.png")
![image.png](https://dev-media.amazoncloud.cn/8de76be8457d4ed0a15e9416fefd8244_image.png "image.png")