本文详细介绍如何利用 Dify、RustFS 和 Milvus 搭建一个文档多语言翻译工作流。该工作流能够将中文文档高效翻译为英语、日语、俄语、韩语,并可根据需求扩展至更多语种。AI 技术的应用极大地提升了文档撰写和多语种翻译的效率。
关于 Dify
Dify 是一款开源的大语言模型(LLM)应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。即使是非技术人员,也能参与到 AI 应用的定义和数据运营过程中。目前 Dify 在 GitHub 上的 Star 已经超过116k。
关于 RustFS 和 Milvus
有关 RustFS 和 Milvus 的更多信息,可查阅相关文章:
安装 Dify
Dify 官方提供了docker-compose.yaml文件,支持通过 Docker Compose 方式私有化部署 Dify 实例。官方也提供了这种安装模式下各组件的架构示意图:

从架构图中可以看出,Dify 会将向量数据存储到向量数据库。官方支持多款向量数据库,如weaviate、qdrant、opensearch、milvus等。用户需通过VECTOR_STORE指定使用的向量数据库。本实践将使用milvus,因此需要对docker-compose.yaml文件进行相应变更。
Milvus 配置修改
配置修改如下:
- 指定使用 milvus 向量数据库
VECTOR_STORE: ${VECTOR_STORE:-milvus}
- 镜像更换
将当前官方默认的 2.5.15 替换为 2.6.0 或 2.6.2
image: milvusdb/milvus:v2.6.0
使用默认的
2.5.15镜像曾出现 IndexNode 19530 端口被占用的问题,更换镜像后问题消失。
- 修改 milvus 地址
MILVUS_URI: ${MILVUS_URI:-http://milvus-standalone:19530}
Minio 配置修改
在之前的文章中提到,Milvus 支持将 Minio 配置为对象存储后端。由于 RustFS 可以完全替代 Minio,因此可以将 RustFS 配置为 Milvus 的对象存储后端。在docker-compose.yaml文件中添加以下内容:
rustfs: container_name: dify-rustfs image: rustfs/rustfs:1.0.0-alpha.60 environment: - RUSTFS_VOLUMES=/data/rustfs0,/data/rustfs1,/data/rustfs2,/data/rustfs3 - RUSTFS_ADDRESS=0.0.0.0:9000 - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001 - RUSTFS_CONSOLE_ENABLE=true - RUSTFS_EXTERNAL_ADDRESS=:9000 - RUSTFS_CORS_ALLOWED_ORIGINS=* - RUSTFS_CONSOLE_CORS_ALLOWED_ORIGINS=* - RUSTFS_ACCESS_KEY=rustfsadmin - RUSTFS_SECRET_KEY=rustfsadmin ports: - "9000:9000"# S3 API port - "9001:9001"# Console port volumes: - rustfs_data_0:/data/rustfs0 - rustfs_data_1:/data/rustfs1 - rustfs_data_2:/data/rustfs2 - rustfs_data_3:/data/rustfs3 - logs_data:/app/logs restart: unless-stopped healthcheck: test: [ "CMD", "sh", "-c", "apk add curl && curl -f http://localhost:9001/health" ] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - milvus
同时注释掉与 Minio 相关的内容:
minio: container_name: milvus-minio image: minio/minio:RELEASE.2023-03-20T20-16-18Z profiles: - milvus environment: MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-minioadmin} MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:-minioadmin} volumes: - ./volumes/milvus/minio:/minio_data command: minio server /minio_data --console-address ":9001" healthcheck: test: ["CMD","curl","-f","http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 networks: - milvus
更新以下环境变量信息:
MINIO_ACCESS_KEY: ${RUSTFS_ACCESS_KEY:-rustfsadmin} MINIO_SECRET_KEY: ${RUSTFS_SECRET_KEY:-rustfsadmin}
此外,需要告知 Dify 使用 S3 存储而非本地存储:
STORAGE_TYPE: ${STORAGE_TYPE:-s3}
将 S3 相关的环境变量信息更改为 RustFS 实例的具体信息:
S3_ENDPOINT: ${S3_ENDPOINT:-http://rustfs:9000} S3_REGION: ${S3_REGION:-cn-east-1} S3_BUCKET_NAME: ${S3_BUCKET_NAME:-difyai} S3_ACCESS_KEY: ${S3_ACCESS_KEY:-rustfsadmin} S3_SECRET_KEY: ${S3_SECRET_KEY:-rustfsadmin} S3_USE_AWS_MANAGED_IAM: ${S3_USE_AWS_MANAGED_IAM:-false}
以上是本次部署所需的配置修改。接下来将正式开始安装部署。
安装 Dify
首先将 Dify 代码克隆到本地,然后按照前面步骤中的变更修改docker-compose.yaml文件,并执行以下命令进行安装:
docker compose -f docker-compose.yaml up -d
查看安装结果,确认所有服务均正常运行:
docker compose psNAME IMAGE COMMAND SERVICE CREATED STATUS PORTSdify-rustfs rustfs/rustfs:1.0.0-alpha.58 "/entrypoint.sh rust…" rustfs 3 days ago Up 3 days (healthy) 0.0.0.0:9000-9001->9000-9001/tcp, [::]:9000-9001->9000-9001/tcpdocker-api-1 langgenius/dify-api:1.9.0 "/bin/bash /entrypoi…" api 3 days ago Up 3 days 0.0.0.0:5001->5001/tcp, [::]:5001->5001/tcpdocker-db-1 postgres:15-alpine "docker-entrypoint.s…" db 3 days ago Up 3 days (healthy) 5432/tcpdocker-nginx-1 nginx:latest "sh -c 'cp /docker-e…" nginx 3 days ago Up 3 days 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcpdocker-plugin_daemon-1 langgenius/dify-plugin-daemon:0.3.0-local "/bin/bash -c /app/e…" plugin_daemon 3 days ago Up 3 days 0.0.0.0:5003->5003/tcp, [::]:5003->5003/tcpdocker-redis-1 redis:6-alpine "docker-entrypoint.s…" redis 3 days ago Up 3 days (healthy) 6379/tcpdocker-sandbox-1 langgenius/dify-sandbox:0.2.12 "/main" sandbox 3 days ago Up 3 days (healthy) docker-ssrf_proxy-1 ubuntu/squid:latest "sh -c 'cp /docker-e…" ssrf_proxy 3 days ago Up 3 days 3128/tcpdocker-web-1 langgenius/dify-web:1.9.0 "/bin/sh ./entrypoin…" web 3 days ago Up 3 days 3000/tcpdocker-worker-1 langgenius/dify-api:1.9.0 "/bin/bash /entrypoi…" worker 3 days ago Up 3 days 5001/tcpdocker-worker_beat-1 langgenius/dify-api:1.9.0 "/bin/bash /entrypoi…" worker_beat 3 days ago Up 3 days 5001/tcpmilvus-etcd quay.io/coreos/etcd:v3.5.5 "etcd -advertise-cli…" etcd 3 days ago Up 3 days (healthy) 2379-2380/tcp milvus-standalone milvusdb/milvus:v2.6.0 "/tini -- milvus run…" milvus-standalone 3 days ago Up 4 seconds (health: starting) 0.0.0.0:9091->9091/tcp, [::]:9091->9091/tcp, 0.0.0.0:19530->19530/tcp, [::]:19530->19530/tcp
所有服务正常运行后,可通过localhost/install访问 Dify Web 页面(在云端服务器安装时,需将localhost替换为服务器 IP)。
初始化登录时需设置邮箱地址和密码,设置完毕并登录后,即可看到 Dify Web 页面:

本指南将演示如何利用 Dify 构建一个工作流,实现将 RustFS 与 Milvus 集成的中文 Markdown 文档翻译成英语、日语、俄语以及韩语。
构建 Dify 工作流
整体流程图如下:

上传文件
Dify 工作流支持文件上传,且支持多种文件格式,包括TXT、PDF、MARKDOWN、DOCS等。
在 Dify Start 节点的SETTINGS --> INPUT FIELD中选择文件类型和文件上传方式:

本实践使用 RustFS 和 Milvus 集成的 Markdown 文档,因此文件类型选择Document,上传方式选择Local Upload。
读取文件内容
由于大语言模型(LLM)无法直接读取文件内容,Dify 提供了文档提取器来读取 Start 节点中上传的内容,并将其作为输入传递给 LLM 进行翻译。
在 Start 节点后添加一个DOC EXTRACTOR节点。其输入为 Start 节点上传的 Markdown 文件,输出为提取的文本内容(生成一个名为 text 的变量,可供后续引用)。这些内容将作为 LLM 的输入,因此在DOC EXTRACTOR节点的NEXT STEP中均连接 LLM 节点。

用 LLM 翻译文档
Dify 的 LLM 节点能够调用大模型的能力,对上一个节点的输出内容进行处理。Dify 支持主流大模型,用户可在Web 页面 –> Plugins中搜索并安装可用的大模型,例如 DeepSeek:

选择模型后点击Install即可完成安装。
安装完毕后,需在模型提供商(Model Provider)中配置 API Key,以便后续在工作流中调用:
接着添加 LLM 节点:

配置时需要完成以下步骤:
- 在MODEL下拉菜单中选择所需模型(提前安装且配置了 API Key 的模型将在此列表中显示),例如本指南选择
DeepSeek; - 设置提示词,明确告知大模型执行何种任务。例如,本次使用的提示词为:
假设你是一位 RustFS 专家,将下面的内容翻译成英文/日语/俄语/韩语,同样按照 Markdown 格式输出,内容如下:
重要提示:在系统提示词中,务必选择DOCS EXTRACTOR节点的输出(即 text 变量,输入
/可直接选择)。
为每个DOC EXTRACTOR节点都配置了一个 LLM 节点,并使用了类似的提示词(仅翻译语种有所不同)。整体配置如下:

接下来,将 LLM 的输出直接上传到 RustFS。
Dify 内置的 API 服务支持预览和下载上一步生成的文件。为了简化部署,本指南直接使用现有的 RustFS 实例作为文档的最终输出载体,同时演示了 Dify 的工具功能。
将文档上传至 RustFS
Dify 工具节点允许用户选择不同的工具来处理上一个节点的内容。目前官方支持的工具有三种类型:
- 内置工具:Dify 官方提供的工具;
- 自定义工具:用户自行导入或配置的工具;
- 工作流:将编排好的工作流发布为工具使用。
本实践使用 Dify 提供的内置工具 MinIO 来存储翻译后的内容。
工具在使用前需要先安装。在 Dify Web 首页的Tools中搜索可用工具:

如果 MinIO 尚未安装,可在搜索结果中点击蓝色的install按钮完成安装。
在节点添加时点击Tool,选择已安装的工具 MinIO:

由于是上传文件,因此选择 MINIO_WRITER,并输入 RustFS 实例的相关信息:

主要信息包括:
- MinIO Endpoint URL:RustFS 实例地址(例如
localhost:9000); - MinIO Access Key:RustFS Access Key ID(例如默认的
rustfsadmin); - MinIO Secret Key:RustFS Secret Key ID(例如默认的
rustfsadmin); - Bucket Name:存储文件的存储桶名称,需提前在 RustFS 上创建;
- Object Name:文件上传到存储中的对象名称,可自定义;
- Content:工具节点的输入,即 LLM 节点的输出,选择
text即可;
为了将中文文档翻译为四种不同语言,本工作流添加了 4 个 MINIO_WRITER 节点:

结束节点
Dify 的每个工作流末尾都需要添加一个结束节点。

运行工作流
点击右上角的Run按钮即可启动工作流。在弹出的界面中上传需要翻译的中文文档(Markdown 格式),然后点击Start Run:

界面上会清晰显示工作流的执行进度:

当流程全部执行完毕后,所有节点的右上角都会显示绿色的通过标志。

结果验证
本次操作将上传的 Markdown 文档(文件名为milvus.md)翻译成英语、日语、俄语、韩语,并分别上传到 RustFS 实例的四个存储桶中:en-translation、jp-translation、ru-translation、kr-translation。每个存储桶内对应有一个对象,分别为:en-milvus.md、jp-milvus.md、ru-milvus.md、kr-milvus.md:

存储桶中的存储对象如下:

用户可以直接选择某个对象文件,点击Preview查看内容,例如查看韩语文档:

韩语文档内容如下:
可通过类似方法查看其他语言的文档内容。审核无误后,即可直接下载并进行文档提交。
总结
Dify 提供了一种灵活的方式,使用户能够自行构建 AI 应用。整个过程通过拖拽和少量编程即可完成,相比于全程使用 API 串联各项服务或工具的纯编程模式,Dify 的用户体验更佳。然而,要熟练运用 Dify,需要解决两个核心问题:
- 深入了解 Dify 的架构和各项功能的使用,这可通过阅读文档和大量实践来实现;
- 用户需清晰地规划所需的 AI 应用或工作流,即明确如何将 AI 能力融入实际需求中,这样 Dify 才能发挥最大作用。
此外,尽管 MinIO 作为全球知名的对象存储系统广泛使用,但 RustFS 完全可以作为其平替方案。
一旦掌握 Dify 工作流,用户便会倾向于通过 DIY 各种有趣的工作流来优化工作方式。后续也将继续探索 Dify 与其他应用的集成实践。
